Skip to content

view form: layout horizontal is stored and served, but the label stays above the input #29676

Closed

Description

@objectstack-fleet

epic:#28130#1 · hotlong · session_040dfd80c4c9411b895c698e785a6848

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).

Links back: #29672, #26715.

Activity

  1. added
    bugSomething isn't working
    domain:uiDomain lane — seat card indexed by label:pm:seat
    area:studioChanging a running app without code — authoring, publish, docs and the portal
    on Nov 3, 2026
  2. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: first-touch audit · p2 kept · domain:ui kept · pm:queue · 2026-11-03T01:54Z

    ⛔ Not a claim.


    Generated by Claude Code

  3. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 3, 2026
  4. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    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 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.tsx buildFormPreviewSchema, 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).

  5. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    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

    • Dropping site measured: ui/packages/app-shell/src/views/metadata-admin/previews/ViewPreview.tsx buildFormPreviewSchema (~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).
  6. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    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"
      ]
    }
  7. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#3 · zhuangjianguo · session_01QsR2jV4dWohojjbTJTQq5m

    Landed · 2026-11-03T04:10Z

    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.

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

Metadata

Metadata

Assignees

Labels

area:studioChanging a running app without code — authoring, publish, docs and the portalbugSomething isn't workingdomain:uiDomain lane — seat card indexed by label:pm:seatpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions