You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
view form: layout horizontal is stored and served, but the label stays above the input #29676
Filing gate: ① declared but not honoured (ADR-0049). Filed on the maintainer's word in direct chat with the epic PM seat, 2026-11-03: 「发记录并立卡」. ⛔ Not a claim.
QA-source: #29672 · studio-authoring.no-entry-property-matrix · acceptance[1]
Reader: domain:ui (the form renderer).
Dedupe: form layout horizontal. The checklist's knownGaps[0] records it from QA run #26715, which has no card of its own. New as a card.
type: Bug
Runner reading on main at 3482f3d8d2, on two fresh loads, not re-derived by the PM seat. PUT /api/v1/meta/view/qa_doc.k1?mode=draft&package=PKG with config.layout: 'horizontal', publish, open /_console/studio/PKG/interfaces?surface=view%3Aqa_doc.k1, Design and Run. Expected: the label beside the input. Actual: label at (257,209), input at (257,226), stacked. Read on the Studio surface only, not on the end-user form.
Studio's form-view inspector now offers Layout, so a person can pick this and see nothing change. Wanted: honour it, or retire the value (enforce-or-remove).
Claim: PM loop round 29 · 2026-11-03T02:06Z
Session: session_01QsR2jSTfFyWwerNYfs13mT (card thread, os-dev); dispatched by seat session session_01QsR2jV4dWohojjbTJTQq5m
Account: zhuangjianguo
Branch: claude/project-thread-n3jojj (platform-assigned to the card thread; it can push only this branch)
Worktree: objectstack-issue-29676
Domain: domain:ui
Seat: domain:ui#3
File surface: the producer that drops a form view's layout before ObjectForm (first read: ui/packages/app-shell/src/views/metadata-admin/previews/ViewPreview.tsxbuildFormPreviewSchema, which copies type / sections / fields but not layout), plus any end-user form host the live measurement shows dropping it too; their tests; and one changeset with patches for the touched packages. The exact files are named in the thread before the first edit (stop on breach; explain in the report). Not the renderer's horizontal branch (components/src/renderers/form/form.tsx), which already honours it (#26843).
Container & model: S/M, mode:thread, model: default tier (dispatch-gates --tier: no path-derived mandate), effort: high
Clause-②: no
Metadata-protocol: none
Responsibility: open — recorded at review
Thread-read: none
Premise: holds per the QA runner (#29672, two fresh loads at 3482f3d8d2): a published form view with config.layout: 'horizontal' draws its labels stacked in Studio Design and Run. The card thread re-measures it live before editing.
Serial constraints cleared: none in flight. No open PR edits ViewPreview.tsx (checked by the os-dev before the first edit).
Claim amended · 2026-11-03T02:29Z · first amendment, on the os-dev's live measurement. This adds to claim 6593560214; session, branch and seat are unchanged.
Clause-②: no
Metadata-protocol: none
Dropping site measured:ui/packages/app-shell/src/views/metadata-admin/previews/ViewPreview.tsxbuildFormPreviewSchema (~L82), shared by Studio Design and Run, copies type / sections / fields only. The end-user hosts (/forms/NAME, RecordFormPage, AppContent's modal) forward layout through resolveFormViewChrome and draw it horizontally (label x 429, control x 605, one row), so no end-user file changes.
Scope widened within the same function: the preview also forwards the other form chrome keys the end-user hosts honour and it drops today: columns, title, description, defaultTab, tabPosition, allowSkip and showStepIndicator. Where resolveFormViewChrome is importable, the preview reuses it, so the canvas and the runtime read one mapping. The file surface is unchanged: ViewPreview.tsx, the new ViewPreview.formLayout-29676.test.tsx, and the changeset (@object-ui/app-shell: patch).
{
"issue": 29676,
"status": "done",
"branch": "claude/project-thread-n3jojj",
"pr": "https://github.com/objectstack-ai/objectstack/pull/29759",
"head": "0d3b9c05",
"session": "session_01QsR2jSTfFyWwerNYfs13mT",
"premise_still_valid": true,
"summary": "Measured live at c76cdebf: a published form view with config.layout horizontal drew stacked in Studio Design and Run (label 274,282, control 274,300) while the console /forms page drew it beside (label 429,191, control 605,177). Dropping site: ViewPreview.tsx buildFormPreviewSchema, shared by Design and Run, built the object-form schema from type/sections/fields only. It now reads layout through resolveFormViewChrome (the console form hosts' mapping, only its layout taken) and, per amendment 6593906746, forwards columns, defaultTab, tabPosition, allowSkip and showStepIndicator as RecordFormPage does. title and description are not forwarded: simple/tabbed/wizard read neither key (only Drawer/Modal/MasterDetail do, and the canvas folds drawer/modal to simple), so they would be inert pins (seat agreed). Live after: horizontal draws label 274,290 beside control 450,276 in Design and Run; vertical and unset unchanged; 390 px stacks by design on both surfaces. No end-user host drops layout.",
"files_changed": [
"ui/packages/app-shell/src/views/metadata-admin/previews/ViewPreview.tsx (buildFormPreviewSchema: layout via resolveFormViewChrome, five keys forwarded, named export, locale param)",
"ui/packages/app-shell/src/views/metadata-admin/previews/ViewPreview.formLayout-29676.test.tsx (new, 9 tests)",
".changeset/29676-view-preview-form-layout.md (patch @object-ui/app-shell, Clause-② no, Metadata-protocol none)"
],
"line_budget": "3 files, +220 / -2 vs origin/main (test 179, ViewPreview +29/-2, changeset 12)",
"tests": "New file 9/9 (623f76a6). Ablations via ablation-replace.mjs on 623f76a6, src-resolved, each restored blob == HEAD and git diff HEAD empty: A layout -> undefined gives 4 failed 5 passed; B defaultTab -> undefined gives 2 failed 7 passed; C columns -> undefined gives 1 failed 8 passed. Neighbour sweep (18 ui test files naming ViewPreview or resolveFormViewChrome, locked, 2 workers): 443/443 at 17181560 and again at 0d3b9c05. app-shell turbo type-check 65/65 at 623f76a6 and 0d3b9c05. eslint touched files 0 errors (+1 react-refresh warning for the new export). Live before/after PNGs and the measure scripts in project files issue-29676.",
"gates": "dispatch-gates --commands at 17181560: 35 derived, all 35 exit 0, incl. check-sdui-manifest and its self-test, check:type-check-debt (locked), pnpm --dir ui exec vitest run scripts/ (170 files passed, 2 skipped). --ran: 35 run, 0 NOT-MEASURED, 0 UNRUN. At final head 0d3b9c05: check-sdui-manifest exit 0; PR body gates on the sent body: check-changeset-no-major, check-adr-0087-registration, check-closing-keyword-parity, check-partof-closing-keyword all exit 0. CI check-runs on PR 29759: in_progress at report time.",
"dogfood_battery": "n/a: no ! in the PR title and no (narrowing) arm",
"deviations": [
"Scope widened by amendment 6593906746 (five more keys); title and description left out with the seat's agreement, explained in the PR body.",
"buildFormPreviewSchema is now a named export for its pin; one new react-refresh/only-export-components warning, same kind as the file's existing resolveObjectName export.",
"First run of pnpm --dir ui exec vitest run scripts/ was SIGKILLed at default workers while my two dev servers were still up (one 15 s tree-scan timeout too). Stopped the servers by recorded PID, reran at --maxWorkers=2: 170 passed, 2 skipped. ran.txt records the rerun.",
"The full derived sweep ran at 17181560. Main was merged again before pr_create (0d3b9c05: 9 commits, none touching the three files); after a full rebuild only the scoped re-check ran there (neighbour sweep, type-check, sdui, PR body gates)."
],
"mcp_calls": "0 GitHub MCP calls (issue and comment reads went through gh api REST GETs)",
"api_writes": "2: fleet-write pr_create (PR 29759, read back byte-identical), this post-stamped comment. git push x4 (not REST).",
"open_questions": [],
"security_findings": "none",
"out_of_scope_findings": [
"carrier: none · the Studio form view canvas draws no form heading or description (config.title / config.description): its inline layouts read neither key, while the console /forms page draws both · noted, not filed (seat ruling)",
"carrier: none · the form view inspector's View type picker still shows a stored simple type as simple (not found) (after-w1440-horizontal-studio-design.png) · noted, not filed"
]
}
PR #29759 merged at 2026-11-03T04:09Z as 7ba8b11f. Fixes #29676 closed this card, and pm:dispatched is removed. The seat's ACCEPT is 6595042161.
Delivered: Studio's form view canvas, in both Design and Run, now draws layout: 'horizontal' with each label beside its control, as the console's form pages already did. It reads the value through the same resolveFormViewChrome mapping. The canvas also forwards columns, defaultTab, tabPosition, allowSkip and showStepIndicator. title and description are left out on purpose, because none of the canvas's layouts reads them. Nothing is left on this card.
Activity
objectstack-fleet commentedon Nov 3, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: first-touch audit · p2 kept ·
domain:uikept ·pm:queue· 2026-11-03T01:54Z⛔ Not a claim.
layout: 'horizontal'is stored and served, but the form still stacks the label above the input, and Studio's inspector now offers the choice. Declared but not honoured (ADR-0049): honour it, or retire it. p2 kept, from QA run QA run · studio-authoring-42-plus-2 (44/44) · 3482f3d8 · 2026-11-03 · 33 PASS / 3 PARTIAL / 7 FAIL / 1 BLOCKED / 0 NOT-RUN #29672.Generated by Claude Code
objectstack-fleet commentedon Nov 3, 2026
domain:ui#3 · zhuangjianguo · session_01QsR2jV4dWohojjbTJTQq5m
Claim: PM loop round 29 · 2026-11-03T02:06Z
Session:
session_01QsR2jSTfFyWwerNYfs13mT(card thread, os-dev); dispatched by seat sessionsession_01QsR2jV4dWohojjbTJTQq5mAccount:
zhuangjianguoBranch:
claude/project-thread-n3jojj(platform-assigned to the card thread; it can push only this branch)Worktree:
objectstack-issue-29676Domain:
domain:uiSeat:
domain:ui#3File surface: the producer that drops a form view's
layoutbeforeObjectForm(first read:ui/packages/app-shell/src/views/metadata-admin/previews/ViewPreview.tsxbuildFormPreviewSchema, which copies type / sections / fields but notlayout), plus any end-user form host the live measurement shows dropping it too; their tests; and one changeset with patches for the touched packages. The exact files are named in the thread before the first edit (stop on breach; explain in the report). Not the renderer's horizontal branch (components/src/renderers/form/form.tsx), which already honours it (#26843).Container & model: S/M,
mode:thread,model: default tier (dispatch-gates --tier: no path-derived mandate),effort: highClause-②: no
Metadata-protocol: none
Responsibility:
open — recorded at reviewThread-read: none
Premise: holds per the QA runner (#29672, two fresh loads at
3482f3d8d2): a published form view withconfig.layout: 'horizontal'draws its labels stacked in Studio Design and Run. The card thread re-measures it live before editing.Serial constraints cleared: none in flight. No open PR edits
ViewPreview.tsx(checked by the os-dev before the first edit).objectstack-fleet commentedon Nov 3, 2026
domain:ui#3 · zhuangjianguo · session_01QsR2jV4dWohojjbTJTQq5m
Claim amended · 2026-11-03T02:29Z · first amendment, on the os-dev's live measurement. This adds to claim 6593560214; session, branch and seat are unchanged.
Clause-②: no
Metadata-protocol: none
ui/packages/app-shell/src/views/metadata-admin/previews/ViewPreview.tsxbuildFormPreviewSchema(~L82), shared by Studio Design and Run, copiestype/sections/fieldsonly. The end-user hosts (/forms/NAME,RecordFormPage, AppContent's modal) forwardlayoutthroughresolveFormViewChromeand draw it horizontally (label x 429, control x 605, one row), so no end-user file changes.columns,title,description,defaultTab,tabPosition,allowSkipandshowStepIndicator. WhereresolveFormViewChromeis importable, the preview reuses it, so the canvas and the runtime read one mapping. The file surface is unchanged:ViewPreview.tsx, the newViewPreview.formLayout-29676.test.tsx, and the changeset (@object-ui/app-shell: patch).objectstack-fleet commentedon Nov 3, 2026
domain:ui#3 · zhuangjianguo · session_01QsR2jSTfFyWwerNYfs13mT
os-dev-report
{ "issue": 29676, "status": "done", "branch": "claude/project-thread-n3jojj", "pr": "https://github.com/objectstack-ai/objectstack/pull/29759", "head": "0d3b9c05", "session": "session_01QsR2jSTfFyWwerNYfs13mT", "premise_still_valid": true, "summary": "Measured live at c76cdebf: a published form view with config.layout horizontal drew stacked in Studio Design and Run (label 274,282, control 274,300) while the console /forms page drew it beside (label 429,191, control 605,177). Dropping site: ViewPreview.tsx buildFormPreviewSchema, shared by Design and Run, built the object-form schema from type/sections/fields only. It now reads layout through resolveFormViewChrome (the console form hosts' mapping, only its layout taken) and, per amendment 6593906746, forwards columns, defaultTab, tabPosition, allowSkip and showStepIndicator as RecordFormPage does. title and description are not forwarded: simple/tabbed/wizard read neither key (only Drawer/Modal/MasterDetail do, and the canvas folds drawer/modal to simple), so they would be inert pins (seat agreed). Live after: horizontal draws label 274,290 beside control 450,276 in Design and Run; vertical and unset unchanged; 390 px stacks by design on both surfaces. No end-user host drops layout.", "files_changed": [ "ui/packages/app-shell/src/views/metadata-admin/previews/ViewPreview.tsx (buildFormPreviewSchema: layout via resolveFormViewChrome, five keys forwarded, named export, locale param)", "ui/packages/app-shell/src/views/metadata-admin/previews/ViewPreview.formLayout-29676.test.tsx (new, 9 tests)", ".changeset/29676-view-preview-form-layout.md (patch @object-ui/app-shell, Clause-② no, Metadata-protocol none)" ], "line_budget": "3 files, +220 / -2 vs origin/main (test 179, ViewPreview +29/-2, changeset 12)", "tests": "New file 9/9 (623f76a6). Ablations via ablation-replace.mjs on 623f76a6, src-resolved, each restored blob == HEAD and git diff HEAD empty: A layout -> undefined gives 4 failed 5 passed; B defaultTab -> undefined gives 2 failed 7 passed; C columns -> undefined gives 1 failed 8 passed. Neighbour sweep (18 ui test files naming ViewPreview or resolveFormViewChrome, locked, 2 workers): 443/443 at 17181560 and again at 0d3b9c05. app-shell turbo type-check 65/65 at 623f76a6 and 0d3b9c05. eslint touched files 0 errors (+1 react-refresh warning for the new export). Live before/after PNGs and the measure scripts in project files issue-29676.", "gates": "dispatch-gates --commands at 17181560: 35 derived, all 35 exit 0, incl. check-sdui-manifest and its self-test, check:type-check-debt (locked), pnpm --dir ui exec vitest run scripts/ (170 files passed, 2 skipped). --ran: 35 run, 0 NOT-MEASURED, 0 UNRUN. At final head 0d3b9c05: check-sdui-manifest exit 0; PR body gates on the sent body: check-changeset-no-major, check-adr-0087-registration, check-closing-keyword-parity, check-partof-closing-keyword all exit 0. CI check-runs on PR 29759: in_progress at report time.", "dogfood_battery": "n/a: no ! in the PR title and no (narrowing) arm", "deviations": [ "Scope widened by amendment 6593906746 (five more keys); title and description left out with the seat's agreement, explained in the PR body.", "buildFormPreviewSchema is now a named export for its pin; one new react-refresh/only-export-components warning, same kind as the file's existing resolveObjectName export.", "First run of pnpm --dir ui exec vitest run scripts/ was SIGKILLed at default workers while my two dev servers were still up (one 15 s tree-scan timeout too). Stopped the servers by recorded PID, reran at --maxWorkers=2: 170 passed, 2 skipped. ran.txt records the rerun.", "The full derived sweep ran at 17181560. Main was merged again before pr_create (0d3b9c05: 9 commits, none touching the three files); after a full rebuild only the scoped re-check ran there (neighbour sweep, type-check, sdui, PR body gates)." ], "mcp_calls": "0 GitHub MCP calls (issue and comment reads went through gh api REST GETs)", "api_writes": "2: fleet-write pr_create (PR 29759, read back byte-identical), this post-stamped comment. git push x4 (not REST).", "open_questions": [], "security_findings": "none", "out_of_scope_findings": [ "carrier: none · the Studio form view canvas draws no form heading or description (config.title / config.description): its inline layouts read neither key, while the console /forms page draws both · noted, not filed (seat ruling)", "carrier: none · the form view inspector's View type picker still shows a stored simple type as simple (not found) (after-w1440-horizontal-studio-design.png) · noted, not filed" ] }objectstack-fleet commentedon Nov 3, 2026
domain:ui#3 · zhuangjianguo · session_01QsR2jV4dWohojjbTJTQq5m
Landed · 2026-11-03T04:10Z
PR #29759 merged at 2026-11-03T04:09Z as
7ba8b11f.Fixes #29676closed this card, andpm:dispatchedis removed. The seat's ACCEPT is 6595042161.Delivered: Studio's form view canvas, in both Design and Run, now draws
layout: 'horizontal'with each label beside its control, as the console's form pages already did. It reads the value through the sameresolveFormViewChromemapping. The canvas also forwardscolumns,defaultTab,tabPosition,allowSkipandshowStepIndicator.titleanddescriptionare left out on purpose, because none of the canvas's layouts reads them. Nothing is left on this card.