Repository navigation
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
Description
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)
packages/plugin-form/src/ModalForm.tsxlines 258–266: the size mapsm→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 thefullwidth.packages/app-shell/src/views/ObjectView.tsxline 3014 reads the authoredsize('auto' | 'sm' | 'md' | 'lg' | 'xl' | 'full') for the form the list opens.packages/plugin-form/src/FormSection.tsxlines 72–89: a section'scolumnsis1 | 2 | 3 | 4and sets the field grid;packages/types/src/form.tslines 1911–1923 and 2401:FormField.colSpan/span: 'auto' | 'full'and the form'scolumns, aligned with@objectstack/specFormField.- 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
- The default dialog for a create/edit form that declares no
sizeis bounded (lgorxlof the existing map, chosen by the field count and the inferred columns, neverfull);fullstays available to an author who asks for it. The auto-upgrade at line 391 picks within that bound. - The default field grid for a section with no authored
columnsis two columns frommdup (the spec's owncolumns/colSpanpath, so an authored layout still wins); atextarea, a rich text, a line-items panel and a field withspan: 'full'take the whole row; every other field takes one cell, so same-kind fields have one width. - Required markers, labels, help text and the footer unchanged; the phone sheet unchanged.
Acceptance
ModalForm/FormSectiontests: an object form with twelve fields and no authored layout renders a dialog with thelgorxlclass (notsm:max-w-[95vw]), a two-column grid frommdup, atextareaspanning both columns; an authoredsize: 'full'and an authoredcolumns: 1are honoured as written; belowsmthe sheet is one column.- Browser reading by the landing seat at 1440 on HotCRM Leads → New: the dialog is no wider than the
xlbound, the fields sit in two columns of one width each, nothing scrolls for the first eight fields. pnpm testfrom the repo root green on the affected files; a changeset (minor) for@object-ui/plugin-form(and@object-ui/app-shellif 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
Create Lead at 390: the full-screen sheet, which is right as it is


Activity
objectstack-fleet commentedon Oct 15, 2026
Claim: PM loop round 1 (
priority:p1; filed on the maintainer's 「同意开卡,使用 pm-dispatch 创建卡片」)Session:
session_01JZnppgHRp4sREcouhkQYDBAccount:
sunhaolinBranch:
claude/issue-12521-form-dialog-layoutWorktree:
objectui-issue-12521Domain:
domain:uiSeat:
domain:ui#1File surface:
packages/plugin-form/src/ModalForm.tsx: the default size when none is authored (the size map:258–:266and the auto-upgrade:391onmain720f6d4).packages/plugin-form/src/FormSection.tsx: the default field grid when a section authors nocolumns(:72–:89).packages/app-shell/src/views/ObjectView.tsx's form-size read (:3014), only if the default is chosen there. That is the same file as seat 2's objectui#12493 and Studio flow checker: a flow CEL guard readingvars.xorcurrent_user.xis flagged "not a reference in scope", though the engine binds both roots, whileuser.x, which the engine does not bind, passes silently #12499, in a different region. Mergemainbefore opening the PR, and whichever lands second merges again..changeset/12521-*.md.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/objectuinames no path-derived mandate)Clause-②: no
Responsibility:
@object-ui/plugin-form's defaults for a form with no authored layout. The size auto-upgrades tofull, and the section has no default grid.columns/colSpan/spanand the dialogsize, which already exist. Only the default is wrong.Thread-read: none
Serial constraints cleared: read at objectui
main. Nopm:dispatchedclaim namesModalForm.tsx,FormSection.tsxorplugin-form(scanned in this act).ObjectView.tsxis held by this seat's objectui#12518 (a reference only; its PR does not touch the file) and by seat 2's objectui#12493 and Studio flow checker: a flow CEL guard readingvars.xorcurrent_user.xis flagged "not a reference in scope", though the engine binds both roots, whileuser.x, which the engine does not bind, passes silently #12499, each in a different region.Generated by Claude Code
objectstack-fleet commentedon Oct 15, 2026
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
objectstack-fleet commentedon Oct 15, 2026
Decision needed ·
domain:uiseat 1 ·session_01JZnppgHRp4sREcouhkQYDB· 2026-10-15T16:38Z一句话问题: 字段多(≥12 个)的对象,在桌面上「新建 / 编辑」时,该铺满整屏(今天 HotCRM 新建线索是 1368 × 810 的 95vw 窗口),还是开一个有边界的对话框?本卡的「永不默认 full」与协议现行的默认值相反。
背景
6197105887,探针在 objectuimain521817ce9d):crm_lead的表单视图写了 6 个分节,列数 2/3/2/2/1/2,见 hotcrmsrc/sales/views/lead.view.ts:245–:380,席位已在本 fire 复读确认。@object-ui/plugin-form的默认值,而是 console 宿主。packages/app-shell/src/console/AppContent.tsx:1200把@objectstack/specderiveRecordFlowSurface(def, 'create'|'edit')的size: 'full'展开成modalSize: 'full'。columnsdoes 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(p1,进队列),它不等本决策。Part of #12521):宿主没给尺寸时,对话框默认lg/xl,永不full。它不改变 HotCRM 新建线索,因为宿主给了full。Governing text
@objectstack/specpackages/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:RECORD_SURFACE_PAGE_THRESHOLD = 12(:52),以及手机 ⇒{ container: 'overlay', surface: 'modal', size: 'full' },理由原文 "same big canvas, overlay return semantics"(Design: record create/edit/subtable surface + return-flow model (follow-up to #2578) objectstack#2604,2026-07-05 关闭)。navigation.mode/navigation.size,FormView.type/modalSize, or an assigned page win",即作者显式写的尺寸胜出。HotCRM 线索没写modalSize。前提(各带 re-check 命令)
git -C objectstack show origin/main:packages/spec/src/data/record-surface.ts | sed -n '145,152p',应见size: 'full'一行。git -C objectui grep -n "deriveRecordFlowSurface" origin/main -- packages/app-shell/src/console/AppContent.tsx,应见:1200与modalSize: 'full'。modalSize。re-check:git -C hotcrm grep -n "modalSize" origin/HEAD -- src/sales/views/lead.view.ts,应零命中。选项 × 真实代价 × 工作量
AppContent不再展开推导出的full,由ModalForm的有界默认(#12546)决定xl对话框(约 1024 px 宽);其它读同一推导的消费方仍全屏,协议文档说的与 console 做的不一致domain:ui· 1 PR,S(AppContent.tsx一处 + pins)+ #12546;无先例deriveRecordFlowSurface:桌面上的重任务流推导为有界模态(size: 'auto'),手机仍全屏domain:spec1 PR(S–M,含record-surface.test.ts与文档)+ spec 发版 + objectui 升级;objectui 侧除 #12546 外零代码;无先例业务含义直译
四轴(从业务立场)
① 项目长远合理性(权重 ≥50%): 两年后,平台上「记录怎么打开」应该仍是 spec 里的一条推导。桌面上新建、编辑一条记录用有边界的对话框或侧面板,只读的重记录用整页。参照:
B 把这个终态放在唯一的源头。A 在 console 造出第二种说法,即 objectui AGENTS #0.1 禁止的渲染端方言。C 保留现状,终态不变。
② 实际业务拉动: 今天就有人撞上。桌面上新建或编辑任何字段 ≥12 的对象都会撞上:HotCRM 的线索,以及多数业务主对象。证据是本卡 1440 实测与审计 F3。
③ 防 AI 犯错:
full、console 画xl,AI 照 spec 推断会出错,而且没人报错,是静默分歧。④ 创业阶段不扩散: A、B、C 都不新增可写键。B 改的是一个默认值,A 多出一处 console 特例。B 的一次发版成本最高,但不留永久义务。
推荐 B,回退 C。只看①选 B;②③④ 是否翻转:否。B 比 A 多一次 spec 发版,工作量约 2×,不到 3×。
置信缺口:
deriveRecordFlowSurface在 console 之外的消费方数量。xl宽度里是否够用。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 选全屏可能就是为它;若是,B 可以只对没有内嵌子表的表单收边界,这要 spec 席测量后再定。columnsdoes 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 修好后,95vw 与xl的实际观感。裁后执行
domain:spec卡(引本裁决)。pm:blocked+Blocked-by:该卡。FormSectionSchema.columns的default(1)(packages/spec/src/ui/view.zod.ts:3783)是否相容,再浏览器验收后落地关卡。AppContent一处并补 pins,同样重核上条,浏览器验收后落地。席位另立 spec 文档滞后卡。columnsdoes 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 承担。os-decision-facets
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.tsdocblock); ADR-0085 §2 and §5; thread: none.相关: dev report
6197105887· PR #12546(draft,等本裁决)· 子卡 #12548 · objectstack-ai/objectstack#2604 · objectui#12080(兄弟裁决:对话框宽度随内容)。Generated by Claude Code
objectstack-fleet commentedon Oct 15, 2026
席位意见(增量)· director seat (summon #42,
session_01AKVFxqmRLqktJspVXwPE9A), read as batch #352 item 2, 2026-10-15T22:17ZOn the
domain:uiseat 1 presentation 6197229681 (B recommended, C the fallback) after the dev'spremise_still_valid: falsereport 6197105887.Premises re-run in this act, spec at objectstack
origin/main9bb93706fb, objectuiorigin/mainf96f771140, hotcrmorigin/main63db83e2da:packages/spec/src/data/record-surface.ts:RECORD_SURFACE_PAGE_THRESHOLD = 12(:52); a task flow whose base surface ispagederives{ container: 'overlay', surface: 'modal', size: 'full' }(:150), 「Field-heavy (or mobile …) → full-screen modal」.AppContent.tsx:1200-1206spreadsmodalSize: 'full'when the derived size isfull;ModalForm.tsx:265-267mapslg/xl/full(sm:max-w-[95vw]).src/sales/views/lead.view.tswrites nomodalSizeand authors six sections (columns2 / 3 / 2 / 2 / 1 / 2 at:251–:380), so the Leads dialog is not a no-layout form; the one-column symptom was the mixed-density defect, and console record forms: a section whose authoredcolumnsdoes 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 is already closed (landed), so that half is done.completed(the D1 mapping the docblock cites); PR fix(plugin-form): a record dialog with no authored layout opens bounded with a two-column grid (objectui#12521) #12546 (the bounded default when the host gives no size) is a draft waiting on this letter.--terms form,dialog,columns,colSpan,ModalForm,size): 49 hits; ADR-0035 §2/§3/§6, ADR-0139 D6, ADR-0019 D3, ADR-0021 D2, ADR-0030 §4 are term matches; none rules a record dialog's default size. Governing: ADR-0085 §5 (one shared derivation, every surface) and 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 through therecord-surface.tsdocblock; thread: none.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:
domain:speccard in objectstack citing this ruling: on desktop a heavy task flow (create / edit / child-*) derives a bounded modal (size: 'auto', so the renderer'slg/xlbound 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.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 againstFormSectionSchema.columns'default(1); the browser acceptance at 1440 is re-read then (the dialog within thexlbound; sections as authored).columnsdoes 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:spec1 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;②③④ 是否翻转:否。
objectstack-fleet commentedon Oct 15, 2026
Ruling: batch #352 item 2 · letter B · maintainer 「B (推荐)」 2026-10-15T22:37Z
Director seat, summon #42,
session_01AKVFxqmRLqktJspVXwPE9A, on thedomain:uiseat 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):
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'slg/xlbound 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.pm:blocked+Blocked-by: objectstack-ai/objectstack#23734. objectui needs no code for the bound (AppContent.tsx:1200-1206keys onsize === '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 againstFormSectionSchema.columns'default(1), then the browser acceptance at 1440 (the dialog within thexlbound; sections as authored). console record forms: a section whose authoredcolumnsdoes 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.Workload of the letter:
domain:spec1 PR (S–M) + a spec release + the objectui bump; objectui PR #12546 as drafted.Execution:
needs-user-decision→pm:blockedin this act (priority:p1,area:recordsstand); the body's first line carriesRuled:with theBlocked-by:line under it. The assignee (the seat's claim) stays.objectstack-fleet commentedon Oct 15, 2026
Fork ruled · section
columnsdefault ·domain:uiseat 1 ·session_01JZnppgHRp4sREcouhkQYDB· 2026-10-15T23:16ZRuling
6203721639item 3 asked for one re-check before PR #12546 lands. The question was whether its default (nocolumnsdeclared ⇒ two per row from@md) is compatible with@objectstack/specFormSectionSchema.columns'default(1)(view.zod.ts:3789). The seat raised it now, before objectstack-ai/objectstack#23734 ships.The conflict:
columnscarriescolumns: 1.FormViewSchema.columns(:4320), is optional with no default, so the two levels already disagree.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:
FormSectionSchema.columnsdropsdefault(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.@md, and an undeclared form the same. A declaredcolumns(1included) is drawn as written.pm:blocked, nowBlocked-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), keepingdefault(1), which would leave wide dialogs one column wherever an author wrote no density.Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
Interim ruled: the fast path ·
domain:uiseat 1 ·session_01JZnppgHRp4sREcouhkQYDB· 2026-10-16T00:17ZLetter 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:
packages/app-shell/src/console/AppContent.tsx, thederiveRecordFlowSurface(...).size === 'full'spread), a desktop create / edit / child task flow no longer opens atmodalSize: '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 authoredmodalSizestill wins.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 (objectuiAGENTS.md#0.1).columnsis the renderer's choice: two per row from@md. A declared value,1included, is drawn as written.main; the conflicts with PR fix(plugin-form): each form section draws its own columns count per row (objectui#12548) #12556 and fix(plugin-form): a record dialog's collapsed section opens in place, not behind the console's loading screen (objectui#12559) #12571 inModalForm.tsx) and closes this card on landing.pm:blockedon #23734 / #23740 being installable at objectui's pin. The seat files it with the PR's ACCEPT.pm:blocked→pm:dispatched, and itsBlocked-by:line leaves the body.Not changed: letter B and the fork stand. The interim is their outcome, early, with a fixed exit.
Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
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_01JZnppgHRp4sREcouhkQYDBAccount:
sunhaolinBranch:
claude/issue-12521-form-dialog-layoutWorktree:
objectui-issue-12521Domain:
domain:uiSeat:
domain:ui#1File surface:
packages/app-shell/src/console/AppContent.tsx: the create / edit / child task-flow size spread aroundderiveRecordFlowSurfaceonly, which gets the interim desktop bound.packages/plugin-form/src/ModalForm.tsxandpackages/plugin-form/src/autoLayout.ts: the bounded default PR fix(plugin-form): a record dialog with no authored layout opens bounded with a two-column grid (objectui#12521) #12546 already carries, rebased onto PR fix(plugin-form): each form section draws its own columns count per row (objectui#12548) #12556's per-section 12-track grid, with the undeclared-section density rule (two per row from@md).content/docs/plugins/plugin-form.mdxparagraph PR fix(plugin-form): a record dialog with no authored layout opens bounded with a two-column grid (objectui#12521) #12546 already carries.Outside the surface:
@objectstack/specand any objectstack file;FormSection.tsxandObjectView.tsxunless measured on the path; any type, prop or export; an authoredmodalSize/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/objectuinames 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
maindaeb77fc84.AppContent.tsxorplugin-form/src/{ModalForm,autoLayout,FormSection}. PR refactor(app-shell,types,data-objectstack)!: retire the toolbar-to-view write family and DataSource.updateViewConfig (objectui#12504) #12586 (objectui#12504) was checked, as were seat 4's branches for objectui#12513, Field creation: a searchable type picker; Add field asks for label and type before creating #12516, Publish opens the pending-changes sheet in a confirmation posture; Changes opens it in review posture #12517 and The draft status chip sits in the same place in every pillar's item header #12524: 0 hits.ModalForm.tsx. This round mergesmainand resolves against both.Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
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
objectstack-fleet commentedon Oct 16, 2026
Landed ·
domain:uiseat 1 ·session_01JZnppgHRp4sREcouhkQYDB· 2026-10-16T01:35Zmain7b5e55893bat 2026-10-16T01:33Z. It has one parent,ae923ece22, and is an ancestor oforigin/main.7b5e55893bto the accepted head91fd2dbe68.7571037de96a).Fixes #12521. The only issue closed with this merge is this card, ascompleted.ModalForm'slg/xl, not at 95vw. HotCRM Leads → New and Edit at 1440 measure 1024 × 810 (1368 × 810 before).interimBoundedTaskFlowSurfaceinAppContent.tsx, ruled at6205068311. Its exit pin turns red, naming the deletion, once the installed spec derives a bounded size itself.columnsper row (HotCRM's lead form: 2 / 3 / 2 / 2 / 1 / 2).columns, an undeclared section draws two per row from@md. On authored stacks this stays dormant until 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 drops the upstreamdefault(1).pm:blockeduntil objectui installs an@objectstack/speccarrying 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 (closed) and #23740 (open).finding): betweensmand 1024 px, anxldialog runs edge to edge.6203721639, section-columns fork6204264665, interim ruling6205068311on the maintainer's 「可以,12521 走快速方案」, rework claim6205076950, ACCEPT6205856787.Generated by Claude Code