Skip to content

console record form: a create/edit dialog with no authored layout opens at 95vw with one column of unequal field widths — a bounded dialog with a two-column field grid and one width per field kind #12521

Closed

Description

@objectstack-fleet

Ruled: 6203721639 · letter B; fork 6204264665 (section columns default); interim 6205068311 (the fast path)

Letter B was ruled at 2026-10-15T22:39Z; the fork on the section columns default is ruled in 6204264665.

Filing gate ① (a user-visible layout defect, measured on main), filed on the maintainer's word (chat, 2026-10-15, session session_019YFzJp4o8Ck4NsT1toC4UP, seat account os-bill): the seat ran a functional audit of the HotCRM console on objectui main 720f6d4 (report, private to the maintainer: https://claude.ai/artifact/XPrn5eZMsQaKUgasMJEMmR, finding F3, figure 5), and the maintainer answered 「同意开卡,使用 pm-dispatch 创建卡片」. Quota note: the audit's cards exceed the filing gate's three-per-fire quota on that word, which approved the report's card list as a set.

Parent: #12444. Blocks nothing; nothing blocks it.

Reader who acts: the domain:ui lane's next dispatch (seat post #9800), one dev round in @object-ui/plugin-form (ModalForm.tsx, FormSection.tsx) with the console's form host in @object-ui/app-shell if the size is chosen there, size M.

Dedupe (MCP search_issues, scope objectstack-ai/objectui, all states, read 2026-10-15T14:14Z): "create record form dialog too wide single column fields inconsistent widths two column grid modal form layout" → 20, top 8 read: #12480 (open, the Studio Records grid's row gap), #11903 (the record picker's one layout), #11775 (the drawer's direction), #11542, #10563, #12080 (a screen flow's fixed 448 px dialog, the sibling ruling: a dialog's width follows its content), #4755, #4574 (closed). None is this card.

What happens

On the HotCRM Leads list at 1440 × 900, New opens "Create Lead" as a dialog of 1368 × 810 px (95 % of the viewport each way) whose content is 1099 px tall, so it scrolls. Inside, fourteen fields stand in a single column: most text inputs are 841 px wide, Last Name alone spans 1270 px, the selects are 413 px, and the right third of the dialog is empty. The phone form (390) is a full-screen sheet with one column and stacked Cancel / Create, which is the right shape there.

Readings (objectui origin/main 720f6d4, read 2026-10-15T14:15Z)

  1. packages/plugin-form/src/ModalForm.tsx lines 258–266: the size map sm → sm:max-w-sm, default → sm:max-w-lg, lg → sm:max-w-2xl, xl → sm:max-w-5xl, full → sm:max-w-[95vw] sm:w-full; line 391: the size auto-upgrades when auto-layout infers multiple columns and the author set none. The measured dialog is the full width.
  2. packages/app-shell/src/views/ObjectView.tsx line 3014 reads the authored size ('auto' | 'sm' | 'md' | 'lg' | 'xl' | 'full') for the form the list opens.
  3. packages/plugin-form/src/FormSection.tsx lines 72–89: a section's columns is 1 | 2 | 3 | 4 and sets the field grid; packages/types/src/form.ts lines 1911–1923 and 2401: FormField.colSpan / span: 'auto' | 'full' and the form's columns, aligned with @objectstack/spec FormField.
  4. Browser reading (1440): input widths 841 (first_name, company, title, email, phone, mobile, website), 1270 (last_name), 413 (the selects, estimated_amount); fourteen controls; dialog 1368 × 810, scroll height 1099.

So the keys exist (section columns, field colSpan / span, dialog size); what the console renders by default for an object form with no authored layout is the widest dialog and one column with per-kind widths.

What to build

  1. The default dialog for a create/edit form that declares no size is bounded (lg or xl of the existing map, chosen by the field count and the inferred columns, never full); full stays available to an author who asks for it. The auto-upgrade at line 391 picks within that bound.
  2. The default field grid for a section with no authored columns is two columns from md up (the spec's own columns / colSpan path, so an authored layout still wins); a textarea, a rich text, a line-items panel and a field with span: 'full' take the whole row; every other field takes one cell, so same-kind fields have one width.
  3. Required markers, labels, help text and the footer unchanged; the phone sheet unchanged.

Acceptance

  • ModalForm / FormSection tests: an object form with twelve fields and no authored layout renders a dialog with the lg or xl class (not sm:max-w-[95vw]), a two-column grid from md up, a textarea spanning both columns; an authored size: 'full' and an authored columns: 1 are honoured as written; below sm the sheet is one column.
  • Browser reading by the landing seat at 1440 on HotCRM Leads → New: the dialog is no wider than the xl bound, the fields sit in two columns of one width each, nothing scrolls for the first eight fields.
  • pnpm test from the repo root green on the affected files; a changeset (minor) for @object-ui/plugin-form (and @object-ui/app-shell if touched).

Out of scope

  • Authored HotCRM form layouts (the demo's forms are generated); a side-sheet variant; field ordering.

Attribution: written by the domain:ui seat in session session_019YFzJp4o8Ck4NsT1toC4UP (account os-bill) on the maintainer's words quoted above.

Screenshots (added 2026-10-15T14:39Z, on the maintainer's word 「专用分支存图,卡里嵌 raw 链接」)

The images live on the attachment branch claude/ui-audit-2026-10-15-shots of objectstack-ai/objectui (commit 918a251, never merged; index at https://github.com/objectstack-ai/objectui/blob/918a2510a54bd6875b90eb6996d098c3ec0451dd/docs/design/console-audit-2026-10-15/README.md). Full set and figure numbers: the audit report linked above.

Create Lead at 1440: a 1368 × 810 dialog, one column, unequal widths, the right third empty

new-form-1440.png

Create Lead at 390: the full-screen sheet, which is right as it is

new-form-390.png

Activity

  1. added
    bugSomething isn't working
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    area:recordsBusiness objects, records, the views that show data, usable forms, search
    and removed on Oct 15, 2026
  2. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1 (priority:p1; filed on the maintainer's 「同意开卡,使用 pm-dispatch 创建卡片」)
    Session: session_01JZnppgHRp4sREcouhkQYDB
    Account: sunhaolin
    Branch: claude/issue-12521-form-dialog-layout
    Worktree: objectui-issue-12521
    Domain: domain:ui
    Seat: domain:ui#1
    File surface:

    Outside the surface: authored HotCRM forms, a side-sheet variant, field ordering, the phone sheet, and any type, prop or export (stop on breach; explain in the report).
    Container & model: M, mode:subagent, model: opus (default tier; dispatch-gates --tier --repo objectstack-ai/objectui names no path-derived mandate)
    Clause-②: no
    Responsibility:


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 12521,
      "status": "needs_decision",
      "branch": "claude/issue-12521-form-dialog-layout",
      "pr": "https://github.com/objectstack-ai/objectui/pull/12546",
      "session": "session_01JZnppgHRp4sREcouhkQYDB (this run's harness-stamped id; a subagent, so it is the parent seat's session)",
      "premise_still_valid": false,
      "summary": "The premise fails for the measured dialog. I checked it on objectui main 521817ce9d with a real-ModalForm probe. HotCRM Leads → New is NOT a no-layout form. crm_lead authors form.sections with columns 2/3/2/2/1/2 and last_name span 'full'. Its 95vw comes from the console host: AppContent spreads modalSize 'full' whenever @objectstack/spec deriveRecordFlowSurface(def, 'create'|'edit').size === 'full', which is every object with 12 or more authorable fields. The spec documents that mapping as the protocol's single-source default; this is Q1. The 'one column of unequal widths' (841/1270/413 px) is the authored mixed-density layout drawn on one 3-wide grid. A columns:2 section gets Math.round(3/2)=2 cells per field, so one field per row; last_name gets 3 cells; the columns:3 fields get 1 cell. That is a finding below, not a plugin-form default. The PM's mechanism assumptions were measured and moved. A1: the producer of 'full' is the console host plus the spec, and ModalForm's own auto-upgrade would also say 'full'. A2: FormSection.tsx is used only by WizardForm, and the widths come from section density, not field kind. A3: the host file is AppContent.tsx; ObjectView.tsx's size read belongs to the detail overlay. Draft PR #12546 ('Part of #12521') implements the surviving, decision-independent part of rulings 1 and 2 inside ModalForm. With no modalSize, the size is lg or xl, never full: inferModalSize maps 1 column to lg and 2+ to xl, from min(grid, inferColumns(fieldCount)). With no columns on the form or any section, the grid is two columns from @md through the explicit-columns route, so each field is one cell and wide kinds or span 'full' take the row. Authored modalSize, columns, colSpan and span are unchanged, and a CONTROL pin proves it. HotCRM Leads → New is therefore UNCHANGED by this PR; it moves only with Q1 and the mixed-density card. Merge interplay for the PM: until Q1 is ruled, a console object with 12+ fields and no layout keeps the host's 95vw but now draws 2 columns instead of 3–4. Hold the merge until Q1 is ruled if that state is unwanted. Deviations: (1) PR body line 1 is 'Part of #12521', not the closing-keyword line the dispatch asked for. My definition of done requires Part-of when the merge must not close the card, and forbids Fixes on a card headed to the decision box. This is a conflict with the dispatch, named here. (2) I added content/docs/plugins/plugin-form.mdx, which is outside the named file surface, per objectui AGENTS #2 (docs-driven). (3) FormSection.tsx and ObjectView.tsx are untouched because they are not on the path, so no main merge was needed before pr_create. (4) The dispatch did not carry the decision-axes framework, so the open questions give options, costs and a recommendation on contract-first grounds. The per-axis analysis is owed once the PM pastes the framework.",
      "tests": "Every vitest run went through objectstack os-verify-lock.sh. (1) New pins packages/plugin-form/src/__tests__/dialogDefaultLayout-12521.test.tsx, 9 cases, plus the updated inferModalSize pins in autoLayout.test.ts. Run with a throwaway probe (deleted, never committed): 'Test Files 3 passed (3), Tests 55 passed (55)', VERDICT command-exit 0. (2) Ablation. A trap-protected script restored the old defaults: git checkout of the BASE 521817ce9d blobs of ModalForm.tsx and autoLayout.ts. Landing was proven by git hash-object equal to the BASE blob (7b295fa7 / f97afabe) and anchor counts DIALOG_DEFAULT_COLUMNS=0 and \"return 'full';\"=1. Result: 'Tests 9 failed | 43 passed (52)'. Both inferModalSize pins and 7 dialog pins went red. Both authored-wins pins (modalSize 'full', columns 1) stayed green under both trees, as designed. The CONTROL went red only at its size line (line 219, expected sm:max-w-5xl, received sm:max-w-[95vw]) after its grid and col-span lines passed on the old tree, so authored classes are byte-identical before and after. Restore was proven by git hash-object equal to the HEAD blob (f9f69b0e / 9ac9d0e0) and an empty git diff HEAD. No dist leg: the subjects are imported relatively from src. (3) Final head d6ff845dde: the whole packages/plugin-form/ plus 45 dialog-host files. The host files are git grep -l -E 'ModalForm|useActionModal|openRecordForm|form=new|createTitle|editTitle|formType: .modal.|resolveFormViewLayout|deriveRecordFlowSurface' over packages/app-shell and apps/console tests, plus plugin-designer ObjectManager x2, ObjectFormDesigner.test.tsx, and 3 packages/types census files reading ModalForm. Result: 'Test Files 229 passed (229), Tests 2674 passed | 1 skipped (2675)', VERDICT command-exit 0 (held 886s). (4) pnpm --filter @object-ui/plugin-form type-check: exit 0 after turbo built the 11-package dependency closure (all 11 cached). The first attempt exited 2 on 'Cannot find module @object-ui/types' because no dist existed: precondition, read as NOT MEASURED. The run covers tsc --noEmit plus tsc -p tsconfig.test.json, whose include src/**/*.test.tsx covers the new pin file.",
      "gates": "No dispatch-gates.mjs in objectui, so the list was derived by hand from package.json check:* and lint.yml / ci.yml / changeset-guard.yml / changeset-presence.yml for the six changed paths. Exit codes were captured to files before any pipe; all 0: check-changeset-presence ('4 source file(s) of 1 released package(s) changed, and this change declares 1 changeset'), check-changeset-no-major, check-changeset-overwrite, check-changeset-fixed, check:changeset-claims, check:pending-changeset-literals, check:control-bytes ('OK (scanned 8872 tracked text file(s))'), check:new-line-citations ('VERDICT new-cross-file-line-citations: 0 new citation(s)'), check:spec-symbols, check-doc-links ('Links are valid across 17 scan roots'), check:doc-fences, check:doc-json, check:doc-types, check-doc-expression-carriage, check-test-path-roots, check-vi-mock-override-shape. eslint on the 4 changed TS files: exit 0, 0 errors (35 no-explicit-any warnings, pre-existing pattern). check-governed-queue-guard --test on the 6 paths: NOT GOVERNED. NOT MEASURED locally, declared to CI: check:doc-snippets (exit 2, 'PRECONDITION NOT MET', needs a scoped 34-package build; the doc edit adds no code fence). check:readme-exports is not in the derived set (it reads READMEs; none touched); its local run collapsed for unbuilt dist and was NOT MEASURED. PR #12546 check-runs at report time: Changeset Fixed Group Check success; Changeset Bump Policy success; label success; Test (coverage) and its shard matrix skipped; dependabot skipped. Still in_progress: Type Check, Test (shard 1–16/16), Build & E2E, Build Docs, Test (dist pins), Live E2E (informational), Changeset Declaration, Changeset Claim Re-read, Bundle Analysis, Repo Gates, Changeset Overwrite Report, Spec Main Shape Gate, Lint, Governed Surface Queue Guard, Line Citation Gate. Lock: the first probe queued 2x540s (exit 99, NOT MEASURED) behind an alive holder running vitest on plugin-detail and fields; the slot was kept and the third try acquired.",
      "mcp_calls": "7, all reads: issue_read get #12521; issue_read get_comments #12521 (claim check); issue_read get #12080; pull_request_read get #12546 (body read-back); pull_request_read get_check_runs #12546; issue_read get_comments #12521 (report read-back); ToolSearch is not GitHub. No MCP write tool used.",
      "api_writes": "2 relay dispatches, each POST /repos/objectstack-ai/objectstack/dispatches, executed as objectstack-fleet[bot]. (1) pr_create → POST /repos/objectstack-ai/objectui/pulls (draft forced) + POST /repos/objectstack-ai/objectui/issues/12546/assignees [sunhaolin]; read-back '10130 byte(s) sent, 10130 stored — identical'. (2) comment → POST /repos/objectstack-ai/objectui/issues/12521/comments (this report). git push x3 of claude/issue-12521-form-dialog-layout (empty-branch probe, c8bb6c1180, d6ff845dde) is not REST. No label writes.",
      "open_questions": [
        {
          "question": "Q1 (contract). On HotCRM Leads → New, and on every object with 12+ authorable fields, the console's create/edit dialog is 'full' (95vw). AppContent spreads it from @objectstack/spec deriveRecordFlowSurface. The spec's record-surface.ts calls itself 'the single source for how an object's create / edit / detail record opens by DEFAULT'. It maps heavy task flows to a FULL-SCREEN MODAL whose size 'Maps onto navigation.size / FormView.modalSize' (objectstack#2604 D1). Ruling 1 of #12521 says the default is never 'full'. Which ruling governs heavy objects, and where is it implemented?",
          "options": [
            "A — objectui only. AppContent stops spreading the derived 'full', so ModalForm's bound (lg/xl, landed in #12546) decides. Cost: one hunk in packages/app-shell/src/console/AppContent.tsx plus its pins, size S. The console then disagrees with the spec's documented default (any other consumer of deriveRecordFlowSurface still opens full-screen), and the spec's doc claim goes stale. That is the renderer-side second dialect objectui AGENTS #0.1 forbids, unless B follows.",
            "B — spec first. objectstack changes deriveRecordFlowSurface so a heavy task flow on desktop derives a bounded modal (size 'auto'). A phone still derives full-screen; the console's sheet already is. Docs and record-surface.test.ts move with it. objectui then needs no code: AppContent keys on size === 'full', and the spec bump carries it. Cost: an objectstack PR (S–M), a spec release and an objectui bump. It reverses objectstack#2604 D1, a prior design ruling, so it needs the maintainer's word.",
            "C — keep full-screen for heavy objects. Ruling 1 then covers only dialogs the host does not size; HotCRM Leads → New stays 95vw, and #12521's browser acceptance must be rewritten to name a no-layout object under 12 fields. Cost: no code; the card's measured case remains."
          ],
          "recommendation": "B. The spec owns 'how a record opens by default' by its own header, so the bound belongs in deriveRecordFlowSurface. Flipping it in the console alone (A) is the consumer-side divergence that contract-first rules out. A is acceptable only as the objectui half of B: land it after B's card is filed, if the maintainer wants the console bounded before the spec release. Note: the dispatch did not carry the decision-axes framework, so this is not yet a per-axis analysis; it is owed when the PM pastes it."
        },
        {
          "question": "Q2 (scope). The card's title symptom, 'one column of unequal field widths', is a renderer defect in honouring an AUTHORED mixed-density layout (finding 1 below), not a no-layout default. Ruling 3 and the PM's CONTROL pin keep authored layouts unchanged in this card. Where does the fix go, and what happens to #12521's browser acceptance ('two columns of one width each' on HotCRM Leads)?",
          "options": [
            "A — a sub-issue of #12521 for the mixed-density rule. Make a section's authored columns render as written on any form grid: for example a 12-track grid where 2/3/4-per-row are spans 6/4/3, or per-section field containers inside the one form. It touches autoLayout resolveColSpan / CONTAINER_GRID_COLS, the components form renderer's span ladder, and every sectioned arm (ModalForm, ObjectForm, SplitForm, TabbedForm, WizardForm). Size M–L. #12521 closes when Q1's choice and this sub-issue land.",
            "B — widen #12521 to include it. That drops the CONTROL pin's 'authored renders unchanged' for mixed densities, and the card's out-of-scope line would need amending. Same work as A, in one card.",
            "C — leave the rule. Document that a form's sections must declare densities that divide the form's grid. Cost: none; HotCRM Leads keeps one field per row in its contact section."
          ],
          "recommendation": "A. It is its own defect class, reaches every sectioned host (not just the dialog), and changes how authored layouts render, which this card ruled out. A sub-issue keeps #12521 honest about what each change moves. Same caveat as Q1 on the missing decision-axes framework."
        }
      ],
      "out_of_scope_findings": [
        "class: a · reach: the console's public create door, HotCRM Leads → New at 1440 (the card's own browser reading: contact fields 841 px one per row with the right third empty, last_name 1270 px, classification fields 413 px) · evidence: a real-ModalForm probe on objectui main 521817ce9d with crm_lead's authored sections (columns 2 and 3) rendered the grid 'grid gap-4 grid-cols-1 @md:grid-cols-2 @2xl:grid-cols-3'. The columns:2 section's fields carry '@md:col-span-2' (2 of 3 cells, one per row), last_name span 'full' carries '@md:col-span-2 @2xl:col-span-3', and the columns:3 section's fields carry none (1 cell). Mechanism: autoLayout resolveColSpan, 'Math.round(grid / secCols)'. The form's ONE grid is the widest section's, so a density that does not divide it is rounded. By the same arithmetic, NOT run in a probe, a columns:3 section on a 4-wide grid would draw 4 per row. Shared call sites: applyAutoColSpan(body, formColumns, section columns) in ModalForm, ObjectForm, SplitForm, TabbedForm and WizardForm. Recommend filing as a sub-issue of #12521 (Q2 option A). · dedupe words: 'mixed section columns one per row', 'resolveColSpan Math.round section density', 'col-span-2 three-column grid two-column section', 'sectioned form widest section grid'",
        "carrier: none (承接者:无) · noted, not filed: content/docs/plugins/plugin-form.mdx 'Column width of a sectioned form' says a sectioned form with no columns anywhere is single-column in every host, but ObjectForm's simple path falls back to inferColumns(approxInputs). That is pre-existing doc looseness, recorded in PR #12546 Acceptance notes.",
        "carrier: the seat (card readings), noted, not filed. #12521's readings cite ObjectView.tsx's size read, which belongs to the detail-navigation overlay (detailNavigation / overlayWidthFor) and not to the create form. They also cite FormSection.tsx, whose FormSectionContainer is imported only by WizardForm, and say HotCRM's forms are generated, while crm_lead's form view is authored in hotcrm src/sales/views/lead.view.ts."
      ]
    }

    Generated by Claude Code

  4. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    Decision needed · domain:ui seat 1 · session_01JZnppgHRp4sREcouhkQYDB · 2026-10-15T16:38Z

    一句话问题: 字段多(≥12 个)的对象,在桌面上「新建 / 编辑」时,该铺满整屏(今天 HotCRM 新建线索是 1368 × 810 的 95vw 窗口),还是开一个有边界的对话框?本卡的「永不默认 full」与协议现行的默认值相反。

    背景

    Governing text

    • @objectstack/spec packages/spec/src/data/record-surface.ts 文件头:"the single source for how an object's create / edit / detail record opens by DEFAULT"(ADR-0085 §5,"one shared derivation, every surface")。
    • 同文件 deriveRecordFlowSurface 的 docblock 与 :148–:150:
    • 同 docblock:"explicit navigation.mode / navigation.size, FormView.type / modalSize, or an assigned page win",即作者显式写的尺寸胜出。HotCRM 线索没写 modalSize。
    • 协议声明与是否改协议: console 今天与协议一致。要让重对象在桌面上开有边界的对话框,只有改协议(选项 B)或在 console 偏离协议(选项 A)两条路。按「协议为基准」,改协议须单独立卡,⛔ 不作本缺陷卡的选项,所以 B 的执行是在 objectstack 另立 spec 卡。

    前提(各带 re-check 命令)

    1. 默认值来自 spec。re-check:git -C objectstack show origin/main:packages/spec/src/data/record-surface.ts | sed -n '145,152p',应见 size: 'full' 一行。
    2. console 原样透传。re-check:git -C objectui grep -n "deriveRecordFlowSurface" origin/main -- packages/app-shell/src/console/AppContent.tsx,应见 :1200 与 modalSize: 'full'。
    3. HotCRM 线索没写 modalSize。re-check:git -C hotcrm grep -n "modalSize" origin/HEAD -- src/sales/views/lead.view.ts,应零命中。

    选项 × 真实代价 × 工作量

    选项 做什么 客户看到什么 工作量
    A 只改 objectui AppContent 不再展开推导出的 full,由 ModalForm 的有界默认(#12546)决定 重对象新建是 xl 对话框(约 1024 px 宽);其它读同一推导的消费方仍全屏,协议文档说的与 console 做的不一致 domain:ui · 1 PR,S(AppContent.tsx 一处 + pins)+ #12546;无先例
    B 先改协议 objectstack 改 deriveRecordFlowSurface:桌面上的重任务流推导为有界模态(size: 'auto'),手机仍全屏 与 A 相同的对话框,所有消费方一致,协议文档随之更新 domain:spec 1 PR(S–M,含 record-surface.test.ts 与文档)+ spec 发版 + objectui 升级;objectui 侧除 #12546 外零代码;无先例
    C 保持全屏 不改尺寸;重对象继续 95vw,靠 #12548 让分节按作者列数铺开 宽画布,双列分节每格约 650 px;本卡的浏览器验收要改写成「12 个字段以下的无布局对象」 本决策零代码;#12546 收窄后落地或关闭

    业务含义直译

    • A: 前台改了,规章没改,下一个照规章办事的人还是按旧样子做。
    • B: 先改规章,所有窗口一起照新规章办。
    • C: 维持「大表单开大窗口」,只把窗口里的排版摆整齐。

    四轴(从业务立场)

    • ① 项目长远合理性(权重 ≥50%): 两年后,平台上「记录怎么打开」应该仍是 spec 里的一条推导。桌面上新建、编辑一条记录用有边界的对话框或侧面板,只读的重记录用整页。参照:

      • Salesforce Lightning 的 New Record 是固定宽度模态,内部双列分节、内部滚动;
      • Dynamics 365 新建用 Quick Create 侧板,完整表单走整页;
      • HubSpot 新建用右侧面板;
      • 主流都不开 95vw 的任务画布。

      B 把这个终态放在唯一的源头。A 在 console 造出第二种说法,即 objectui AGENTS #0.1 禁止的渲染端方言。C 保留现状,终态不变。

    • ② 实际业务拉动: 今天就有人撞上。桌面上新建或编辑任何字段 ≥12 的对象都会撞上:HotCRM 的线索,以及多数业务主对象。证据是本卡 1440 实测与审计 F3。

    • ③ 防 AI 犯错:

      • B 后,AI 读 spec 就能预测 console 的样子,只有一处规则。
      • A 后,spec 说 full、console 画 xl,AI 照 spec 推断会出错,而且没人报错,是静默分歧。
      • C 没有分歧,但 AI 生成的重对象表单默认就是一块很宽的画布。
    • ④ 创业阶段不扩散: A、B、C 都不新增可写键。B 改的是一个默认值,A 多出一处 console 特例。B 的一次发版成本最高,但不留永久义务。

    推荐 B,回退 C。只看①选 B;②③④ 是否翻转:否。B 比 A 多一次 spec 发版,工作量约 2×,不到 3×。

    置信缺口:

    裁后执行

    os-decision-facets

    • ① 长远:B 收敛到唯一推导,不增特例;A 增一处 console 特例;C 不变。
    • ② 拉动:今天在桌面上新建或编辑任何 ≥12 字段对象的用户都会撞上(HotCRM 线索实测 1368 × 810)。
    • ③ 防错:B 让 spec 与渲染一致、可预测;A 造成静默分歧;C 一致但默认画布过宽。
    • ④ 不扩散:三项都不新增键;B 只改一个默认值,A 留一处永久特例。

    Prior rulings read: "record create edit full-screen modal field-heavy deriveRecordFlowSurface size full bounded dialog" → 1 hit (objectstack, unrelated); objectstack-ai/objectstack#2604 (the D1 mapping, closed 2026-07-05; the body names no D1 heading, so it is cited from the record-surface.ts docblock); ADR-0085 §2 and §5; thread: none.

    相关: dev report 6197105887 · PR #12546(draft,等本裁决)· 子卡 #12548 · objectstack-ai/objectstack#2604 · objectui#12080(兄弟裁决:对话框宽度随内容)。


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    席位意见(增量)· director seat (summon #42, session_01AKVFxqmRLqktJspVXwPE9A), read as batch #352 item 2, 2026-10-15T22:17Z

    On the domain:ui seat 1 presentation 6197229681 (B recommended, C the fallback) after the dev's premise_still_valid: false report 6197105887.

    Premises re-run in this act, spec at objectstack origin/main 9bb93706fb, objectui origin/main f96f771140, hotcrm origin/main 63db83e2da:

    Facets: ① agree — how a record opens by default belongs to the spec's one derivation; B changes it there; A forks it in the console (the second dialect objectui AGENTS.md #0.1 forbids); C keeps a 95 vw task canvas for every heavy object; the mainstream shape is a bounded modal or side panel for create / edit (Salesforce's fixed-width New Record with internal scroll; Dynamics' quick-create panel; HubSpot's side panel) · ② agree — the maintainer's own audit (F3) found it, and every desktop create / edit of a ≥12-field object hits it · ③ agree · ④ agree — no new key; B moves one default.

    Recommend B; fallback C. A is not recommended (the consumer-side divergence). 口径 for the executor, binding with the letter:

    1. B is executed as a domain:spec card in objectstack citing this ruling: on desktop a heavy task flow (create / edit / child-*) derives a bounded modal (size: 'auto', so the renderer's lg / xl bound applies); a phone keeps full-screen; record-surface.test.ts, the docblock and the docs move with it; feat(detail+fields+components+app-shell): record inline-edit polish — expanded-value passthrough, approval-lock preflight, numeric inputs, edit-CTA gate, keyboard shortcuts (#2572) #2604 D1's note gets a dated amendment line naming this ruling, ⛔ not rewritten.
    2. Premise the spec seat measures first: a heavy task flow WITH an embedded child or line-items table. If feat(detail+fields+components+app-shell): record inline-edit polish — expanded-value passthrough, approval-lock preflight, numeric inputs, edit-CTA gate, keyboard shortcuts (#2572) #2604 D1 chose full-screen for that case, the bounded modal applies only to forms without an embedded subtable, and the spec card states that split; a fork reports back here.
    3. This card goes pm:blocked + Blocked-by: the spec card. fix(plugin-form): a record dialog with no authored layout opens bounded with a two-column grid (objectui#12521) #12546 lands after the spec is installable in objectui, its no-section two-column default re-checked against FormSectionSchema.columns' default(1); the browser acceptance at 1440 is re-read then (the dialog within the xl bound; sections as authored).
    4. console record forms: a section whose authored columns does not divide the form's one grid draws the wrong number of fields per row (HotCRM Leads → New: a two-column section draws one field per row) #12548 already carries the Leads dialog's section layout; nothing of it waits on this letter.

    Workload: B = domain:spec 1 PR (S–M) + a spec release + the objectui bump + #12546 (drafted). A = 1 S PR. C = none. B against A is about 2×, under the 3× line.

    自检:只看①选 B;②③④ 是否翻转:否。

  6. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    Ruling: batch #352 item 2 · letter B · maintainer 「B (推荐)」 2026-10-15T22:37Z

    Director seat, summon #42, session_01AKVFxqmRLqktJspVXwPE9A, on the domain:ui seat 1 presentation 6197229681, the dev's readings 6197105887 and this seat's delta 6203428034; the maintainer's answer takes the recommendation (batch #352 presented in this seat's session, answered with the option 「B (推荐)」).

    What the ruling binds (letter B):

    1. The protocol changes first: deriveRecordFlowSurface (packages/spec/src/data/record-surface.ts) derives, for a field-heavy task flow on desktop, a bounded modal (size: 'auto', so the renderer's lg / xl bound applies); a mobile posture keeps full-screen. The spec card is spec(record-surface): a field-heavy create/edit flow on desktop derives a bounded modal, not full-screen; mobile keeps full (objectui#12521 letter B) objectstack#23734 (domain:spec, filed by this seat). objectstack#2604 D1's note gets a dated amendment line naming this ruling, ⛔ not rewritten.
    2. Premise the spec seat measures first: a field-heavy task flow with an embedded child or line-items table. If feat(detail+fields+components+app-shell): record inline-edit polish — expanded-value passthrough, approval-lock preflight, numeric inputs, edit-CTA gate, keyboard shortcuts (#2572) #2604 D1 chose full-screen for it, the bounded modal applies only to forms without an embedded subtable, stated in the derivation and its test; a fork reports back here.
    3. This card is pm:blocked + Blocked-by: objectstack-ai/objectstack#23734. objectui needs no code for the bound (AppContent.tsx:1200-1206 keys on size === 'full'); PR fix(plugin-form): a record dialog with no authored layout opens bounded with a two-column grid (objectui#12521) #12546 lands after the spec is installable at objectui's pin, its no-section two-column default re-checked against FormSectionSchema.columns' default(1), then the browser acceptance at 1440 (the dialog within the xl bound; sections as authored). console record forms: a section whose authored columns does not divide the form's one grid draws the wrong number of fields per row (HotCRM Leads → New: a two-column section draws one field per row) #12548 (the mixed-density defect) already landed and waits on nothing.
    4. Not taken: A (the console diverging from the spec's documented default) and C (a 95 vw task canvas for every heavy object).

    Workload of the letter: domain:spec 1 PR (S–M) + a spec release + the objectui bump; objectui PR #12546 as drafted.

    Execution: needs-user-decision → pm:blocked in this act (priority:p1, area:records stand); the body's first line carries Ruled: with the Blocked-by: line under it. The assignee (the seat's claim) stays.

  7. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    Fork ruled · section columns default · domain:ui seat 1 · session_01JZnppgHRp4sREcouhkQYDB · 2026-10-15T23:16Z

    Ruling 6203721639 item 3 asked for one re-check before PR #12546 lands. The question was whether its default (no columns declared ⇒ two per row from @md) is compatible with @objectstack/spec FormSectionSchema.columns' default(1) (view.zod.ts:3789). The seat raised it now, before objectstack-ai/objectstack#23734 ships.

    The conflict:

    Ruled by the maintainer, in this seat's session (session_01JZnppgHRp4sREcouhkQYDB), 2026-10-15, without a decision card: 「不用决策卡,我同意 b) 改协议(推荐): 去掉分节 columns 的 default(1)」.

    What it binds:

    1. Spec. FormSectionSchema.columns drops default(1). A declared value is the author's ceiling, which a renderer collapses on narrow containers. An undeclared value is the renderer's choice by available width. The card is spec(view): FormSectionSchema.columns drops default(1) — an undeclared section density is the renderer's (by available width), a declared one is the author's ceiling (objectui#12521 fork) objectstack#23740 (domain:spec, priority:p1), meant to ride the same release as #23734.
    2. objectui. PR fix(plugin-form): a record dialog with no authored layout opens bounded with a two-column grid (objectui#12521) #12546's rework draws an undeclared section two per row from @md, and an undeclared form the same. A declared columns (1 included) is drawn as written.
    3. This card stays pm:blocked, now Blocked-by: both spec(record-surface): a field-heavy create/edit flow on desktop derives a bounded modal, not full-screen; mobile keeps full (objectui#12521 letter B) objectstack#23734 and #23740. PR fix(plugin-form): a record dialog with no authored layout opens bounded with a two-column grid (objectui#12521) #12546 lands once objectui's pin installs a spec carrying both. Not taken: (a), keeping default(1), which would leave wide dialogs one column wherever an author wrote no density.

    Generated by Claude Code

  8. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    Interim ruled: the fast path · domain:ui seat 1 · session_01JZnppgHRp4sREcouhkQYDB · 2026-10-16T00:17Z

    Letter B (6203721639) and its fork (6204264665) put the fix behind a spec release: objectstack-ai/objectstack#23734 and #23740, then objectui's bump. The seat proposed an interim that lands in objectui now and retires itself when the spec ships.

    The maintainer's answer, in this seat's session (session_01JZnppgHRp4sREcouhkQYDB), 2026-10-16: 「可以,12521 走快速方案」.

    What it binds:

    1. The interim bound. On the console host (packages/app-shell/src/console/AppContent.tsx, the deriveRecordFlowSurface(...).size === 'full' spread), a desktop create / edit / child task flow no longer opens at modalSize: 'full' (95vw). ModalForm's own bounded default decides instead (lg / xl). This is what letter B makes the spec derive. The phone sheet is unchanged, and an authored modalSize still wins.
    2. The retirement condition, pinned. A test reads the INSTALLED spec's derivation for a field-heavy desktop task flow. While it answers size: 'full', the interim applies. Once objectui installs a spec carrying #23734, the test goes red and names the deletion. Without that, the interim would become a permanent second dialect (objectui AGENTS.md #0.1).
    3. Section density, the fork's renderer side. An undeclared section columns is the renderer's choice: two per row from @md. A declared value, 1 included, is drawn as written.
    4. This card.

    Not changed: letter B and the fork stand. The interim is their outcome, early, with a fixed exit.


    Generated by Claude Code

  9. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1 · rework round 1 of PR #12546 (priority:p1; the interim ruled in 6205068311 on the maintainer's 「可以,12521 走快速方案」, under letter B 6203721639 and its fork 6204264665)
    Session: session_01JZnppgHRp4sREcouhkQYDB
    Account: sunhaolin
    Branch: claude/issue-12521-form-dialog-layout
    Worktree: objectui-issue-12521
    Domain: domain:ui
    Seat: domain:ui#1
    File surface:

    Outside the surface: @objectstack/spec and any objectstack file; FormSection.tsx and ObjectView.tsx unless measured on the path; any type, prop or export; an authored modalSize / columns / span, which are honoured as written (stop on breach; explain in the report).
    Container & model: M, mode:subagent, model: opus (default tier; dispatch-gates --tier --repo objectstack-ai/objectui names no path-derived mandate)
    Clause-②: no
    Responsibility: the console host spreads the spec's field-heavy size: 'full' derivation into a 95vw dialog | the platform path is letter B's spec change (objectstack-ai/objectstack#23734 / #23740), which needs a release and a bump; this interim bridges it with a pinned exit | every desktop user who creates or edits a record of an object with 12 or more authorable fields (HotCRM Leads → New measured at 1368 × 810)
    Thread-read: 6205068311
    Serial constraints cleared: read at objectui main daeb77fc84.


    Generated by Claude Code

  10. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 12521,
      "status": "done",
      "branch": "claude/issue-12521-form-dialog-layout",
      "pr": "https://github.com/objectstack-ai/objectui/pull/12546",
      "session": "session_01JZnppgHRp4sREcouhkQYDB — this run's harness-stamped id (Claude-Session line); a subagent, so it is the parent seat's",
      "premise_still_valid": true,
      "summary": "Rework round 1 of PR #12546, final head 91fd2dbe68, draft. origin/main daeb77fc84 was merged in as merge commit 277feffff6 (no rebase, no force-push). The ModalForm.tsx conflict with PR #12556 / PR #12571 was resolved by laying every sectioned dialog out through sectionedGridLayout and leaving the Suspense boundary untouched. (1) app-shell: one module-private function, interimBoundedTaskFlowSurface in AppContent.tsx, maps the installed deriveRecordFlowSurface's size 'full' to 'auto' at its one call site. Its docblock cites interim 6205068311 and names the exit (objectstack-ai/objectstack#23734). So a desktop create, edit, child-create or child-edit on a 12+-field object is handed no derived modalSize, and ModalForm's lg/xl bound decides. (2) The exit pin, AppContent.recordDialogInterimBound-12521.test.tsx, calls the installed derivation (the plugin-view import AppContent uses, no viewport). It asserts the interim while the derivation answers 'full', and fails naming the deletion once it does not; there is no skip. (3) plugin-form: in a form with no columns, an undeclared section draws two per row from @md through objectui#12548's rule. It is 12-track span 6 beside a non-fitting count, and the 2-wide grid when every count fits. A declared count, 1 included, is drawn as written; a form-level columns still sets an undeclared section's count. Line 1 of the PR body is 'Fixes #12521' and line 2 starts 'Clause-②: no'. No type, prop, export or spec change. Mechanism readings: A1 — no posture signal is needed. AppContent passes no viewport, and every ModalForm size class is sm:-prefixed over MobileDialogContent's 'fixed inset-0 w-full h-[100dvh]'. Pinned by class parity, and in Chromium at 390x844 both trees give a 390x844 sheet with 358 px fields. A2 — the default is applied UPSTREAM. On installed spec 18.0.0-next.1, FormViewSchema.parse and defineView (HotCRM's call) both turn sections declaring nothing / 1 / 3 into [1,1,3], and strict defineStack returns the parse's result.data. objectui never parses form views client-side; resolveFormViewLayout hands objectDef.form.sections through. So the undeclared rule is dormant on authored stacks until objectstack-ai/objectstack#23740; it is not worked around, and a pin holds that a declared 1 draws one column. NOT MEASURED: the HTTP leg and runtime-saved views, because neither objectstack nor hotcrm is installed here. A3 — CONTROLs green. A4 — the no-section default never meets FormSectionSchema. Deviations, each declared: (a) The ruling's 'on PR #12556's 12-track grid (span 6)' holds where an undeclared section sits beside a count that does not fit (3 or 4). When every count fits the 2-wide grid, #12556's own rule keeps grid-cols-2 with one cell per field: the same drawing, two per row from @md, and byte-identical to #12556's single-density path. (b) 'An authored modalSize / form-view size still wins' has no path at the console host: resolveFormViewLayout passes only sections, contentLayout and subforms. So the host file's authored-size CONTROL hands modalSize 'full' to the real ModalForm directly. (c) turbo 2.10.9 used its shared worktree cache, the main checkout's gitignored .turbo/cache, for build artifacts: entries went from 1194 to 1293. No tracked file there changed, and its branch and status are unchanged. Worktree removed after node_modules.",
      "tests": "All vitest runs went through objectstack os-verify-lock.sh with OS_VERIFY_LOCK_SLOT=issue-12521-r1, at head 91fd2dbe68. (1) Pins plus CONTROLs, one run: 8 files, 'Tests 123 passed (123)', VERDICT command-exit 0. The files: AppContent.recordDialogInterimBound-12521 (new, 8 cases); dialogDefaultLayout-12521 (14 cases, 5 new density cases, CONTROL re-expressed on #12556's classes '@md:grid-cols-12' / '@md:col-span-6' / '@md:col-span-12' / '@md:col-span-6 @2xl:col-span-4'); autoLayout.test.ts; PR #12556's mixedSectionColumns-12548 and form-twelve-track-span-12548; PR #12571's modalSectionToggleSuspense-12559 and sectionedFormValues; plugin-view recordSurface.test.ts. (2) Whole packages/plugin-form/ plus form-twelve-track-span-12548: 'Test Files 187 passed (187), Tests 2294 passed | 1 skipped (2295)', VITEST_EXIT=0 (held 365s). (3) Dialog hosts plus census/ratchet sweep, 88 files, 'Tests 2558 passed (2558)', VERDICT command-exit 0. The set: the 40 app-shell/console tests the round-1 git grep finds on the merged tree; ObjectManager x2; ObjectFormDesigner.test.tsx; 3 packages/types ModalForm files; plugin-view ObjectView.formTitleI18n and recordSurface; and the 43 census/ratchet files whose subject the diff touches. (4) type-check: 'pnpm --workspace-concurrency=1 --filter @object-ui/plugin-form --filter @object-ui/app-shell run type-check' echoed both script names, VERDICT command-exit 0. It ran after turbo built the app-shell^... closure (29 packages, 28 tasks, VERDICT 0). Both tsconfig.test.json include src/**/*.test.tsx, so both pin files are covered. (5) Ablation of the interim, a tested behaviour: interimBoundedTaskFlowSurface was made the identity via objectstack scripts/ablation-replace.mjs inside a trap-restoring script. Evidence: anchor 1→0, replacement 0→1, blob 91e724d1d8 → a9cf6e490d. Result 'Tests 5 failed | 3 passed (8)'. Red: create, edit, child-create, child-edit and EXIT, each at \"expected 'full' to be undefined\". Green: the precondition, the phone cell and the authored-size CONTROL. Restore was proven by blob == HEAD 91e724d1d8 and an empty git diff HEAD. No dist leg: the subjects resolve to src (relative ../AppContent; vitest aliases @object-ui/* to src). (6) Exit-message proof, one-off: the exit cell's own read was mutated to size 'auto' (anchor 1→0). The cell failed with 'The installed @objectstack/spec no longer derives size full ... Delete the interim interimBoundedTaskFlowSurface in packages/app-shell/src/console/AppContent.tsx ... (objectui#12521, interim ruled in comment 6205068311).: expected auto to be full'. Restore proven the same way; no permanent file. (7) Browser reading: a throwaway probe (deleted, never committed) dumped the real ModalForm DOM for a HotCRM-Leads-shaped form and a flat 14-field form. Headless Chromium 1194 measured it against a Tailwind 4.3.3 compile of those classes. At 1440x900: interim 1024x810, before 1368x810; contact 2 per row at 455 px, last_name 926 px, classification 3 per row at 298 px. At 390x844: both 390x844, every field 358 px. At 1024: 1024 vs 973.",
      "gates": "objectui has no dispatch-gates.mjs, so the local subset was derived by hand from package.json check:* and lint.yml / ci.yml / changeset-guard.yml / changeset-presence.yml / repo-gates.yml / line-citation-gate.yml for the 9 changed paths. Each exit was written to a file before any pipe; all 0: check-changeset-presence ('6 source file(s) of 2 released package(s) changed, and this change declares 2 changeset(s)'), check-changeset-no-major, check-changeset-overwrite ('2 changeset(s) added, 0 modified'), check-changeset-fixed, check-changeset-claims, check-pending-changeset-literals, check-control-bytes ('OK (scanned 8986 tracked text file(s)'), check-new-cross-file-line-citations ('VERDICT new-cross-file-line-citations: 0 new citation(s)'), check-doc-links ('Links are valid across 17 scan roots'), check-doc-fence-languages, check-doc-json-fences, check-doc-component-types, check-doc-expression-carriage, check-doc-example-ids, check-doc-snippet-types ('796 of 796 block(s) judged, 0 failed'), check-installed-spec-pin-claims, check-spec-symbol-derivation, check-test-path-roots, check-vi-mock-override-shape, check-vi-mock-specifiers, check-vi-mock-inherit. check-doc-snippet-types first exited 2 on PRECONDITION NOT MET, read as not measured; it passed after its scoped turbo build (35 tasks, VERDICT 0). eslint on the 6 changed TS files: exit 0, 0 errors, 73 warnings, all no-explicit-any. check-governed-queue-guard --test on the 9 paths: NOT GOVERNED. CI-owned and not re-run locally: repo-wide pnpm lint and performance-budget. PR #12546 check-runs on head 91fd2dbe68, read as two pages (30 + 7 = total_count 37). Success: Type Check; Lint; Test (shard 1-16/16, all 16); Test; Test (dist pins); Build & E2E; Build Docs; Repo Gates; Bundle Analysis; Live E2E (informational); Spec Main Shape Gate; Changeset Fixed Group Check; Changeset Declaration; Changeset Claim Re-read; Changeset Bump Policy; Changeset Overwrite Report; Line Citation Gate; Governed Surface Queue Guard; label. Skipped: Test (coverage), its shard matrix, dependabot. None was in progress when read. The PR body patch came after that read and may re-run the body-reading changeset checks; those would read in_progress until they finish.",
      "mcp_calls": "6, all reads: issue_read get #12521; issue_read get_comments #12521 (claim check: newest Claim 6205076950 names Branch claude/issue-12521-form-dialog-layout); pull_request_read get #12546 (prior body); pull_request_read get_check_runs #12546 pages 1 and 2; issue_read get_comments #12521 (this report's read-back, made after posting). No MCP write tool used.",
      "api_writes": "2 relay dispatches, each POST /repos/objectstack-ai/objectstack/dispatches, executed as objectstack-fleet[bot]. (1) issue_patch → PATCH /repos/objectstack-ai/objectui/issues/12546 (PR body): run 38832388716 success, read-back '15018 byte(s) sent, 15018 stored — identical'. (2) comment → POST /repos/objectstack-ai/objectui/issues/12521/comments (this report). No label writes. git push x3 of claude/issue-12521-form-dialog-layout (277feffff6 merge, b70351266a, 91fd2dbe68) is not REST.",
      "open_questions": [],
      "out_of_scope_findings": [
        "carrier: none (承接者:无) · noted, not filed (zero pull): the console's global record dialog never reads FormView.modalSize or FormView.columns. AppContent spreads resolveFormViewLayout, which returns only sections, contentLayout and subforms. The spec docblock's 'FormView.type / modalSize ... win' therefore has no path at this host. No producer writes FormView.modalSize: git grep finds 0 hits in hotcrm HEAD, objectstack origin/main examples/, and objectui examples/ and apps/. Recorded in the PR's Acceptance notes.",
        "carrier: the seat (the interim-deletion follow-up card) · noted, not filed: this round is dialog-only, like round 1. Once objectstack-ai/objectstack#23740 drops default(1), the page ObjectForm, SplitForm, TabbedForm and WizardForm will meet undeclared sections and draw them at the widest declared count, or single-column when none declares; the dialog draws two per row. Whether the fork's 'renderer's choice by available width' should reach those hosts is the seat's call for that card. Dedupe words: 'undeclared section columns page form', 'sectionedGridLayout undeclared density', 'FormSectionSchema columns default(1) renderer'.",
        "carrier: whoever lands the spec bump carrying objectstack-ai/objectstack#23734 · noted, not filed: besides this PR's exit pin, packages/plugin-view/src/recordSurface.test.ts ('task flows never route: heavy → full-screen modal overlay') also pins size 'full' for every heavy task flow and will go red on the same bump; update it with the interim's deletion. While the interim stands, it also bounds a field-heavy form with an embedded child table, the case letter B item 2 may keep full-screen."
      ]
    }

    Generated by Claude Code

  11. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · domain:ui seat 1 · session_01JZnppgHRp4sREcouhkQYDB · 2026-10-16T01:35Z


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:recordsBusiness objects, records, the views that show data, usable forms, searchbugSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p1

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions