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 }}
This repository was archived by the owner on Oct 26, 2026. It is now read-only.
Repository navigation
This repository was archived by the owner on Oct 26, 2026. It is now read-only.
Data pillar Form tab: a compact Layout / Preview control with Add section and Add field at the right, field cards with a type tag and a selection ring, and a dashed "Add a section" footer #12451
Epic #12446, decisions 1 and 3. Measured on objectui main a2225f91, Data pillar, Form tab for crm_account: a second sub-tab row (Layout / Preview) with a trailing badge sentence, then an info strip, then a bordered card per section ("Basic Information") whose fields are bordered boxes with the label, a type word and a disabled input — five nesting levels under the object header. Section settings is an icon at the card's right; there is no "add" affordance in the toolbar.
Target
Under the object header and tab row of the Data pillar card:
Form toolbar, 12 px vertical padding, white, bottom border: a compact segmented control (24 px items) Layout / Preview; a 12 px muted hint "Drag fields to arrange · click a field to edit its properties"; at the right "Add section" (outline chip) and "Add field" (primary-soft chip), both 28 px. The badge sentences of today's Layout / Preview row move into the control's titles; the read-only card owns the read-only strip.
Canvas, sidebar-tinted, 24 px padding, 16 px between sections.
Section card: white, 1 px border, 8 px radius; a 44 px header with a 14 px / 600 title, "N fields" at 12 px muted, a drag grip at the left and the section settings icon button at the right; a 3-column grid body (repeat(3, minmax(0, 1fr)), 8 px gap, 12 px padding). A field that spans (textarea, rich text) takes two columns.
Field card: 10 px by 12 px padding, 6 px radius, transparent border that turns muted on hover; a 13 px / 500 label (red asterisk when required), a 10 px uppercase type tag beside it, then a 32 px skeleton input (56 px for textarea; a select skeleton with a chevron for picklists). Selected: 1 px primary border plus a 3 px primary-soft ring; the type tag turns primary.
Footer: a dashed 44 px "Add a section" button under the last section.
Drag-and-drop, keyboard reordering and their announcements (objectui#11802, #11871, #11898) are untouched; only presentation moves.
File surface
packages/app-shell/src/views/studio-design/ObjectFormDesigner.tsx, ObjectGroupInspector.tsx (trigger only), StudioDesignSurface.tsx (the Form tab's sub-tab row and strips), packages/app-shell/src/views/metadata-admin/i18n.ts (the new toolbar hint; existing engine.studio.data.form.* keys stay).
Acceptance
The Form tab shows exactly one toolbar row between the object tab row and the first section card.
Selected field shows the ring; the selection opens the field inspector exactly as today (DataPillar.inspectorBelongsToView-11781 stays green).
ObjectFormDesigner.test.tsx, dndAnnouncements-11802, keyboardDrop-11871, keyboardGrid-11898, roleDescription-11872, readOnlyDescription-11924, ObjectGroupInspector.test.tsx, DataPillar.layoutBadge.test.tsx stay green or are updated in the same PR for the moved badge, each ablated once.
Before/after screenshots, light and dark.
Constraints
Tailwind utilities and theme tokens only; no inline style.
Lands after the shared inspector card and the Data pillar card (the Blocked-by lines below).
Reference artboard
docs/design/studio-redesign/data-form.html on objectui main (landed in #12458); data-form.png is its 1280 px render. The folder's README carries the shared numbers and what a pull request against this card must show: two screenshots per artboard it touches (light and dark, 1280 px, cropped to the artboard's region), a deviation list with a reason per line, and the card's named tests green or updated. Where this card and the artboard disagree, this card's numbers win and the disagreement is reported here.
Body refreshed 2026-10-15T09:52Z by the epic PM session: a Reference artboard section added now that #12458 is on main. Earlier refresh 2026-10-15T08:17Z: the Blocked-by line now names the layout skeleton card #12459, which supersedes #12447, #12448 and #12449.
Unlock read 2026-10-15T09:52Z: #12459 landed in #12460 (main cf430cd10e), so the Blocked-by line that names it is satisfied. The reference artboards are on main under docs/design/studio-redesign/ (#12458) and the body now carries a Reference artboard section naming this card's.
This card stays blocked: its second Blocked-by line names #12450, in flight with seat domain:ui#4 since 09:35Z; it unlocks when that card lands.
Claim: PM loop round 1 (epic #12446 subtree)
Session: session_01SJn1GEkrbbBQkhGC26wEDw
Account: os-sales (the seat's linked user as GET /user answers it; the card's assignee)
Branch: claude/issue-12451-data-form-tab
Worktree: objectui-issue-12451 (in the cloud session's own container)
Domain: domain:ui
Seat: domain:ui#4
File surface: packages/app-shell/src/views/studio-design/ObjectFormDesigner.tsx, ObjectGroupInspector.tsx (trigger only), StudioDesignSurface.tsx (region: the Form tab's sub-tab row and strips inside DataPillar only), packages/app-shell/src/views/metadata-admin/i18n.ts (the new toolbar hint; engine.studio.data.form.* keys stay), new tests beside them, the screenshots under docs/design/studio-redesign/after/ named 12451-*.png, one .changeset/12451-*.md (stop on breach; explain in the report)
Container & model: M, mode:cloud, model: opus (cloud on the maintainer's stance 「可以的话,ui 后续开发尽量用云 session,并且要求截图给我看」; batch 5 on 「上限提到 5,提速」, this session's chat, 2026-10-15)
Clause-②: no
Responsibility: n/a — not a defect card
Thread-read: 6189328542
Serial constraints cleared: objectui#12450 merged as PR objectui#12477 (7a5f4c1), the Data pillar card this one waits on, so its DataPillar region is free. In flight on the same file at claim time, all this seat and all outside DataPillar: objectui#12455 (InterfacesPillar), objectui#12456 (AccessPillar), objectui#12454's PR objectui#12481 (AutomationsPillar). objectui#12453 (read-only posture) follows this card on ObjectFormDesigner.tsx's read-only strip.
os-dev-report
{
"issue": 12451,
"status": "done",
"branch": "claude/issue-12451-data-form-tab",
"pr": "#12501",
"session": "session_01Ny1sjmm6FfprVoKfh8RYYJ (dispatched by seat domain:ui#4, session_01SJn1GEkrbbBQkhGC26wEDw)",
"premise_still_valid": true,
"summary": "The Form tab now draws one toolbar row under the tab row in Layout and Preview (compact Layout / Preview control whose items carry the old caption as their title, the new toolbarHint, and in Layout an outline add-section chip plus a primary-soft Add field chip), a flush sidebar-tinted canvas, section cards with a 44 px header, field count and the settings trigger at the right, field cards with a 10 px type tag and a primary border plus primary/10 ring when selected, and a dashed add-section footer. PM assumptions measured: (1) holds - inferColumns plus containerGridColsFor are kept and ObjectFormDesigner.test.tsx is unmodified and green, fixed 3 columns is deviation 1; (2) holds - the second sub-tab row and badge sentence were on main, layoutBadge test updated to read by title; (3) partly falsified - the designer already had its own Add field button on main (outline), now restyled as the primary-soft chip; it calls onAddField, which DataPillar wires to the same addField the More menu runs (one implementation, pinned by DataPillar.formToolbar-12451); (4) read-only behaviour left as is. ObjectGroupInspector.tsx needed no change: the trigger lives in ObjectFormDesigner.tsx. Setup note: the shared checkout held a local branch of the claimed name at origin/main with no commits of its own; I detached the shared checkout and deleted that local copy so the worktree could own the name (remote branch untouched).",
"tests": "All from the worktree root through os-verify-lock. Card-named suites plus StudioDesignSurface.readOnlyWording-11781 (11 files) at d393034: Test Files 11 passed (11), Tests 85 passed (85). New DataPillar.formToolbar-12451 + ObjectFormDesigner.cards-12451: Tests 9 passed (9). packages/app-shell/src/views/studio-design at e03a482: non-StudioDesignSurface 100 files, Tests 782 passed (782); StudioDesignSurface.* 76 files, 1 failed (draftVersionConflict-11773: unscoped N fields read now also matched the section count), fixed test-only in 725f0ef: Tests 7 passed (7); source unchanged since d393034. Census + ratchet (machineLocaleCensus-9909, ariaLabelLiteralCensus-12145, product-neutral-renderer.ratchet) at 725f0ef: Tests 44 passed (44). Ablations (anchor count checked, mutation run, restored to HEAD blob, git diff HEAD empty, hash-object equal to HEAD blob; the script's own inline restore check misprinted RESTORE FAILED, the independent hash check after the run is the proof): Layout title forced clean -> layoutBadge + readOnlyWording 2 failed | 6 passed; second toolbar in Preview -> formToolbar-12451 1 failed | 3 passed; no selection ring -> cards-12451 1 failed | 4 passed; hint back on old key -> 2 failed | 6 passed. Unmodified named suites (dnd 11802, keyboard 11871/11898, roleDescription 11872, readOnlyDescription 11924, ObjectGroupInspector, inspectorBelongsToView-11781, flatTabs-12450, ObjectFormDesigner.test) not ablated: their behaviour did not change.",
"gates": "Local, exit captured before any pipe: pnpm --filter @object-ui/app-shell type-check exit 0 (after building the app-shell^... closure, 28 tasks); pnpm --filter @object-ui/app-shell build exit 0 (dist completeness 1098 files); eslint --no-inline-config on the 7 touched source/test files exit 0, 0 errors, warnings on untouched lines; pnpm check:i18n-keys 0; pnpm check:i18n-drift 0 (1 key added, 0 en values changed); pnpm check:i18n-designer-parity 0; node scripts/check-changeset-presence.mjs 0; node scripts/check-changeset-no-major.mjs 0; pnpm check:new-line-citations 0 (0 new); check-governed-queue-guard --test NOT GOVERNED; control-byte self-scan of changed files: no hits (scripts/check-nul-bytes.mjs does not exist in objectui, MODULE_NOT_FOUND, not a gate reading). dispatch-gates.mjs --ran not run: objectui has no scripts/pm/dispatch-gates.mjs; the list was hand-derived from objectui package.json per the dispatch. PR check-runs at 725f0ef when read: label success, Changeset Fixed Group Check success, Test (coverage) and dependabot skipped; Type Check, Lint, Repo Gates, Build and E2E, Build Docs, Test (dist pins), Test shards 1-16, Spec Main Shape Gate, Line Citation Gate, Live E2E in_progress.",
"mcp_calls": "6 GitHub MCP reads (issue_read get 12451, issue_read get_comments 12451, issue_read get_comments 12446, pull_request_read get 12477, pull_request_read get 12501, pull_request_read get_check_runs 12501), plus 3 claude-code-remote add_repo calls (objectstack read, hotcrm read, objectstack push - see deviations). No MCP write tool.",
"api_writes": "2 relay strokes accepted - pr_create (POST /repos/objectstack-ai/objectui/pulls draft + POST issues/12501/assignees os-sales, read back 10333 bytes identical) and this os-dev-report comment (POST issues/12451/comments). One earlier pr_create dispatch was refused by the egress proxy before anything ran (POST /repos/objectstack-ai/objectstack/dispatches -> 403, repository_dispatch is not permitted for this session type). git push x4 (empty branch, then 3 commits). Zero label writes.",
"deviations": [
"Relay route: the first fleet-write dispatch got 403 from the proxy; I attached objectstack-ai/objectstack with add_repo access push, after which the same dispatch was accepted (HTTP 204, run 38747358528 success). No direct-transport write was made.",
"Artboard deviations, as listed on the PR: 1 fixed 3 columns kept as the runtime rule; 2 wide fields span the full row (isWideFieldType); 3 copy reads Add group (existing key) not Add section / Add a section; 4 no section drag grip (sections have no drag, move buttons kept); 5 section count says 1 fields (shared fieldCount key, no singular); 6 screenshots on a writable local base Acme CRM because HotCRM is read-only under objectstack dev.",
"File surface: two existing test files outside the claim's list were edited test-only - StudioDesignSurface.readOnlyWording-11781 (pins the same moved caption) and StudioDesignSurface.draftVersionConflict-11773 (scoped its header field-count read). In StudioDesignSurface.tsx the edits stay in DataPillar: formFlush and bodyFlush beside recordsFlush, the two strip insets, the formModeControl element, and the Form branch of the body. ObjectGroupInspector.tsx unchanged.",
"Screenshots: besides the two required after shots, 12451-data-form-before-light.png and -dark.png (same data, d4bc81e) for card acceptance 4.",
"Commit trailers follow objectui AGENTS.md (model-free Co-authored-by: Claude), over the harness attribution reminder, as that file's precedence rule says."
],
"files_changed": [
"packages/app-shell/src/views/studio-design/ObjectFormDesigner.tsx",
"packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx",
"packages/app-shell/src/views/metadata-admin/i18n.ts",
"packages/app-shell/src/views/studio-design/DataPillar.formToolbar-12451.test.tsx (new)",
"packages/app-shell/src/views/studio-design/ObjectFormDesigner.cards-12451.test.tsx (new)",
"packages/app-shell/src/views/studio-design/DataPillar.layoutBadge.test.tsx",
"packages/app-shell/src/views/studio-design/StudioDesignSurface.readOnlyWording-11781.test.tsx",
"packages/app-shell/src/views/studio-design/StudioDesignSurface.draftVersionConflict-11773.test.tsx",
"docs/design/studio-redesign/after/12451-data-form-light.png, -dark.png, -before-light.png, -before-dark.png",
".changeset/12451-data-form-tab.md"
],
"line_budget": "n/a",
"open_questions": [
{
"question": "Should the Form canvas say section instead of group (Add section, Add a section, Section settings, Ungrouped) as the artboard does?",
"options": [
"A keep group, as shipped: one word on the canvas, no key churn",
"B rename the English values of the designer group keys to section in one copy card, keys kept"
],
"recommendation": "A for this card. Business need: no pull beyond the artboard's copy; long-term: one vocabulary per canvas, which A keeps and B could also reach in one stroke; AI-error: neither adds a metadata key (fieldGroups stays the spec name, which A matches); startup focus: A adds nothing. If the epic wants section, B is a small separate card."
},
{
"question": "engine.studio.designer.hint is now read by no call site. Retire it?",
"options": [
"A retire it in a follow-up (startup axis: retire immediately)",
"B keep it (the dispatch ruling: existing keys stay)"
],
"recommendation": "B in this PR because the ruling binds it; A as a one-line follow-up if the maintainer wants it - zero readers is the startup-axis case for immediate retirement."
}
],
"out_of_scope_findings": [
"polish, not filed: engine.studio.data.fieldCount renders 1 fields for one field, in the object header and now in the section header. Carrier: none, noted in the PR Acceptance notes.",
"observation, not filed: ObjectFormDesigner.keyboardGrid-11898 geometry constants describe the pre-12451 card metrics; the suite is self-consistent and green and does not measure layout. Carrier: none."
]
}
Activity
objectstack-fleet commentedon Oct 15, 2026
Unlock read 2026-10-15T09:52Z: #12459 landed in #12460 (main
cf430cd10e), so the Blocked-by line that names it is satisfied. The reference artboards are on main underdocs/design/studio-redesign/(#12458) and the body now carries a Reference artboard section naming this card's.This card stays blocked: its second Blocked-by line names #12450, in flight with seat
domain:ui#4since 09:35Z; it unlocks when that card lands.Epic PM session
session_cdb7a717-def7-4e71-9988-f089fbaa18ff.objectstack-fleet commentedon Oct 15, 2026
Claim: PM loop round 1 (epic #12446 subtree)
Session:
session_01SJn1GEkrbbBQkhGC26wEDwAccount:
os-sales(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-12451-data-form-tabWorktree:
objectui-issue-12451(in the cloud session's own container)Domain:
domain:uiSeat:
domain:ui#4File surface:
packages/app-shell/src/views/studio-design/ObjectFormDesigner.tsx,ObjectGroupInspector.tsx(trigger only),StudioDesignSurface.tsx(region: the Form tab's sub-tab row and strips insideDataPillaronly),packages/app-shell/src/views/metadata-admin/i18n.ts(the new toolbar hint;engine.studio.data.form.*keys stay), new tests beside them, the screenshots underdocs/design/studio-redesign/after/named12451-*.png, one.changeset/12451-*.md(stop on breach; explain in the report)Container & model:
M,mode:cloud,model: opus(cloud on the maintainer's stance 「可以的话,ui 后续开发尽量用云 session,并且要求截图给我看」; batch 5 on 「上限提到 5,提速」, this session's chat, 2026-10-15)Clause-②: no
Responsibility:
n/a — not a defect cardThread-read: 6189328542
Serial constraints cleared: objectui#12450 merged as PR objectui#12477 (
7a5f4c1), the Data pillar card this one waits on, so itsDataPillarregion is free. In flight on the same file at claim time, all this seat and all outsideDataPillar: objectui#12455 (InterfacesPillar), objectui#12456 (AccessPillar), objectui#12454's PR objectui#12481 (AutomationsPillar). objectui#12453 (read-only posture) follows this card onObjectFormDesigner.tsx's read-only strip.objectstack-fleet commentedon Oct 15, 2026
os-dev-report
{
"issue": 12451,
"status": "done",
"branch": "claude/issue-12451-data-form-tab",
"pr": "#12501",
"session": "session_01Ny1sjmm6FfprVoKfh8RYYJ (dispatched by seat domain:ui#4, session_01SJn1GEkrbbBQkhGC26wEDw)",
"premise_still_valid": true,
"summary": "The Form tab now draws one toolbar row under the tab row in Layout and Preview (compact Layout / Preview control whose items carry the old caption as their title, the new toolbarHint, and in Layout an outline add-section chip plus a primary-soft Add field chip), a flush sidebar-tinted canvas, section cards with a 44 px header, field count and the settings trigger at the right, field cards with a 10 px type tag and a primary border plus primary/10 ring when selected, and a dashed add-section footer. PM assumptions measured: (1) holds - inferColumns plus containerGridColsFor are kept and ObjectFormDesigner.test.tsx is unmodified and green, fixed 3 columns is deviation 1; (2) holds - the second sub-tab row and badge sentence were on main, layoutBadge test updated to read by title; (3) partly falsified - the designer already had its own Add field button on main (outline), now restyled as the primary-soft chip; it calls onAddField, which DataPillar wires to the same addField the More menu runs (one implementation, pinned by DataPillar.formToolbar-12451); (4) read-only behaviour left as is. ObjectGroupInspector.tsx needed no change: the trigger lives in ObjectFormDesigner.tsx. Setup note: the shared checkout held a local branch of the claimed name at origin/main with no commits of its own; I detached the shared checkout and deleted that local copy so the worktree could own the name (remote branch untouched).",
"tests": "All from the worktree root through os-verify-lock. Card-named suites plus StudioDesignSurface.readOnlyWording-11781 (11 files) at d393034: Test Files 11 passed (11), Tests 85 passed (85). New DataPillar.formToolbar-12451 + ObjectFormDesigner.cards-12451: Tests 9 passed (9). packages/app-shell/src/views/studio-design at e03a482: non-StudioDesignSurface 100 files, Tests 782 passed (782); StudioDesignSurface.* 76 files, 1 failed (draftVersionConflict-11773: unscoped N fields read now also matched the section count), fixed test-only in 725f0ef: Tests 7 passed (7); source unchanged since d393034. Census + ratchet (machineLocaleCensus-9909, ariaLabelLiteralCensus-12145, product-neutral-renderer.ratchet) at 725f0ef: Tests 44 passed (44). Ablations (anchor count checked, mutation run, restored to HEAD blob, git diff HEAD empty, hash-object equal to HEAD blob; the script's own inline restore check misprinted RESTORE FAILED, the independent hash check after the run is the proof): Layout title forced clean -> layoutBadge + readOnlyWording 2 failed | 6 passed; second toolbar in Preview -> formToolbar-12451 1 failed | 3 passed; no selection ring -> cards-12451 1 failed | 4 passed; hint back on old key -> 2 failed | 6 passed. Unmodified named suites (dnd 11802, keyboard 11871/11898, roleDescription 11872, readOnlyDescription 11924, ObjectGroupInspector, inspectorBelongsToView-11781, flatTabs-12450, ObjectFormDesigner.test) not ablated: their behaviour did not change.",
"gates": "Local, exit captured before any pipe: pnpm --filter @object-ui/app-shell type-check exit 0 (after building the app-shell^... closure, 28 tasks); pnpm --filter @object-ui/app-shell build exit 0 (dist completeness 1098 files); eslint --no-inline-config on the 7 touched source/test files exit 0, 0 errors, warnings on untouched lines; pnpm check:i18n-keys 0; pnpm check:i18n-drift 0 (1 key added, 0 en values changed); pnpm check:i18n-designer-parity 0; node scripts/check-changeset-presence.mjs 0; node scripts/check-changeset-no-major.mjs 0; pnpm check:new-line-citations 0 (0 new); check-governed-queue-guard --test NOT GOVERNED; control-byte self-scan of changed files: no hits (scripts/check-nul-bytes.mjs does not exist in objectui, MODULE_NOT_FOUND, not a gate reading). dispatch-gates.mjs --ran not run: objectui has no scripts/pm/dispatch-gates.mjs; the list was hand-derived from objectui package.json per the dispatch. PR check-runs at 725f0ef when read: label success, Changeset Fixed Group Check success, Test (coverage) and dependabot skipped; Type Check, Lint, Repo Gates, Build and E2E, Build Docs, Test (dist pins), Test shards 1-16, Spec Main Shape Gate, Line Citation Gate, Live E2E in_progress.",
"mcp_calls": "6 GitHub MCP reads (issue_read get 12451, issue_read get_comments 12451, issue_read get_comments 12446, pull_request_read get 12477, pull_request_read get 12501, pull_request_read get_check_runs 12501), plus 3 claude-code-remote add_repo calls (objectstack read, hotcrm read, objectstack push - see deviations). No MCP write tool.",
"api_writes": "2 relay strokes accepted - pr_create (POST /repos/objectstack-ai/objectui/pulls draft + POST issues/12501/assignees os-sales, read back 10333 bytes identical) and this os-dev-report comment (POST issues/12451/comments). One earlier pr_create dispatch was refused by the egress proxy before anything ran (POST /repos/objectstack-ai/objectstack/dispatches -> 403, repository_dispatch is not permitted for this session type). git push x4 (empty branch, then 3 commits). Zero label writes.",
"deviations": [
"Relay route: the first fleet-write dispatch got 403 from the proxy; I attached objectstack-ai/objectstack with add_repo access push, after which the same dispatch was accepted (HTTP 204, run 38747358528 success). No direct-transport write was made.",
"Artboard deviations, as listed on the PR: 1 fixed 3 columns kept as the runtime rule; 2 wide fields span the full row (isWideFieldType); 3 copy reads Add group (existing key) not Add section / Add a section; 4 no section drag grip (sections have no drag, move buttons kept); 5 section count says 1 fields (shared fieldCount key, no singular); 6 screenshots on a writable local base Acme CRM because HotCRM is read-only under objectstack dev.",
"File surface: two existing test files outside the claim's list were edited test-only - StudioDesignSurface.readOnlyWording-11781 (pins the same moved caption) and StudioDesignSurface.draftVersionConflict-11773 (scoped its header field-count read). In StudioDesignSurface.tsx the edits stay in DataPillar: formFlush and bodyFlush beside recordsFlush, the two strip insets, the formModeControl element, and the Form branch of the body. ObjectGroupInspector.tsx unchanged.",
"Screenshots: besides the two required after shots, 12451-data-form-before-light.png and -dark.png (same data, d4bc81e) for card acceptance 4.",
"Commit trailers follow objectui AGENTS.md (model-free Co-authored-by: Claude), over the harness attribution reminder, as that file's precedence rule says."
],
"files_changed": [
"packages/app-shell/src/views/studio-design/ObjectFormDesigner.tsx",
"packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx",
"packages/app-shell/src/views/metadata-admin/i18n.ts",
"packages/app-shell/src/views/studio-design/DataPillar.formToolbar-12451.test.tsx (new)",
"packages/app-shell/src/views/studio-design/ObjectFormDesigner.cards-12451.test.tsx (new)",
"packages/app-shell/src/views/studio-design/DataPillar.layoutBadge.test.tsx",
"packages/app-shell/src/views/studio-design/StudioDesignSurface.readOnlyWording-11781.test.tsx",
"packages/app-shell/src/views/studio-design/StudioDesignSurface.draftVersionConflict-11773.test.tsx",
"docs/design/studio-redesign/after/12451-data-form-light.png, -dark.png, -before-light.png, -before-dark.png",
".changeset/12451-data-form-tab.md"
],
"line_budget": "n/a",
"open_questions": [
{
"question": "Should the Form canvas say section instead of group (Add section, Add a section, Section settings, Ungrouped) as the artboard does?",
"options": [
"A keep group, as shipped: one word on the canvas, no key churn",
"B rename the English values of the designer group keys to section in one copy card, keys kept"
],
"recommendation": "A for this card. Business need: no pull beyond the artboard's copy; long-term: one vocabulary per canvas, which A keeps and B could also reach in one stroke; AI-error: neither adds a metadata key (fieldGroups stays the spec name, which A matches); startup focus: A adds nothing. If the epic wants section, B is a small separate card."
},
{
"question": "engine.studio.designer.hint is now read by no call site. Retire it?",
"options": [
"A retire it in a follow-up (startup axis: retire immediately)",
"B keep it (the dispatch ruling: existing keys stay)"
],
"recommendation": "B in this PR because the ruling binds it; A as a one-line follow-up if the maintainer wants it - zero readers is the startup-axis case for immediate retirement."
}
],
"out_of_scope_findings": [
"polish, not filed: engine.studio.data.fieldCount renders 1 fields for one field, in the object header and now in the section header. Carrier: none, noted in the PR Acceptance notes.",
"observation, not filed: ObjectFormDesigner.keyboardGrid-11898 geometry constants describe the pre-12451 card metrics; the suite is self-consistent and green and does not measure layout. Carrier: none."
]
}
Generated by Claude Code
feat(app-shell): Data pillar Form tab — one toolbar row, section and …