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
Studio: an order-only field change is misreported — the canvas order reverts after reload when a field is placed above Owner, and the publish review says No differences detected #27516
Filing gate: ① a user-visible product defect with a reproduction, found by an off-clause probe of QA run #27438 (wave 3 of the 18.3.0 sweep, anchor #27377). reach: measured in Studio's Form designer and publish review sheet, both of which misreport an order-only change.
Business reason: Studio lies twice about field order.
The canvas shows an authored field placed above the platform's Owner field, but after a reload Owner is back on top. The author's arrangement silently did not stick.
The publish review says "No differences detected" for a reorder that does publish a new order, so the author cannot tell what Publish will change.
Reader who acts: the triage seat, then the implementer for domain:ui (ui/packages/app-shell, the Form designer and the publish review sheet).
Dedupe (open AND closed): the query "Studio form designer reorder field above owner reverts after reload publish review No differences detected order" returned 3 hits. The nearest is metadata: publishing a field reorder from the object designer is a silent no-op — the content hash is key-order-insensitive, so a reordered fields map hashes equal and the draft is dropped #21790 (closed): publishing a reorder was a silent no-op because the content hash ignored key order. That is fixed (the reorder does publish), and this card covers what the two Studio surfaces still show.
In Studio, go to Data, the object, then Form. Drag an authored field (for example "Condition") above the platform-generated Owner field.
The canvas shows Condition first, and the draft PUT ?mode=draft carries condition before owner_id.
The stored row keeps only the authored fields, and reads re-inject owner_id at its fixed slot.
After a reload, the canvas shows Owner, then Condition.
Reorder two authored fields and open Publish. The review sheet reads "No differences detected — the draft matches the published version". Publishing does publish the new order.
Expected:
The canvas does not let a field be placed where the platform will move it back, or it says that Owner is pinned.
The review sheet lists an order-only change as a difference.
QA-source: #27438 · studio-authoring.object-designer-roundtrip · observed beside the clauses
Read fresh. Studio misreports order-only field changes. The canvas lets a field sit above Owner and then reverts after reload, and the publish review says No differences for a reorder that does publish. This is wrong data shown to the author: p2.
Claim: PM loop round 1
Session: session_01Utp6CaJoinvGQSbHeDaWBe
Account: os-bill
Branch: claude/project-thread-h5781r (the card thread's designated push branch, the recorded platform exception to claude/issue-<n>-<slug>)
Worktree: objectstack-issue-27516
Domain: domain:ui
Seat: domain:ui#3
File surface: ui/packages/app-shell/src/preview/DraftChangesPanel.tsx (order-aware diff), ui/packages/app-shell/src/views/studio-design/ObjectFormDesigner.tsx (drag/order region only, never FieldControlPreview), the shared order comparison if it must be exported, tests beside, root .changeset/ (stop on breach; explain in the report)
Container & model: M, mode:thread, model: TIER_DEFAULT (dispatch-gates --tier on ee9a8d6e: no path-derived mandate), effort: high
Clause-②: no
Metadata-protocol: none
Responsibility: ui code produces the defect | no platform path covers it | every Studio / console author reaches it today
Thread-read: 6495129746
Premise: holds
Serial constraints cleared: ui seat 2's #27519 edits ObjectFieldDesigner.tsx's FieldControlPreview (another region; merge origin/main after it lands) · no open PR edits DraftChangesPanel.tsx
Dispatched 2026-10-29T14:29Z to a card thread of the seat's project; the order lives in the project. ⛔ The thread posts no claim and writes no assignee.
{
"issue": 27516,
"status": "done",
"branch": "claude/project-thread-h5781r",
"pr": "https://github.com/objectstack-ai/objectstack/pull/27646",
"session": "session_01Utp6CZkEeDsL4LuR4hwqTN",
"premise_still_valid": true,
"summary": "Premise measured on origin/main 4a00b2b7: computeChangeDetail compared fields with diffFields (name-keyed, order-blind) and removed `fields` from the top-level key compare, so a pure reorder read No differences; the canvas let an authored field sit above an ungrouped owner_id identical to OWNER_FIELD_DEF, which stripInjectedSystemColumns removes on the draft write and applyInjectedSystemColumns (via governServedItem, the /meta read exits) prepends ahead of the declared fields. Fix: fieldOrderChanged compares, for type object only, the order of the fields both bodies declare after leaving out injected-identical columns (spec isInjectedColumnDefinition + injectedSystemColumnDefs) and studio-hidden system columns, and the drill-in prints a Field order changed row (new key preview.changes.fieldOrderChanged in 10 locales); ObjectFormDesigner settles injected-identical ungrouped fields first (settlePinned) on the derived layout and on every drop, with onDragEnd and the announcement sharing one dropLayout. The server comparison (metadata-core canonicalize, ORDERED_MAPS) is not importable in the browser package (node:crypto, no dependency); reported to the seat before writing and approved. PR opened draft with no assignee and no review request (maintainer rule), so the harness after-PR assign/review step was skipped on purpose; card assignee untouched.",
"tests": "head a7a422a4 (origin/main merged): new DraftChangesPanel.fieldOrder-27516.test.tsx 9/9 and ObjectFormDesigner.pinnedFields-27516.test.tsx 4/4, plus the objectui#11802 announcement suite and both locale parity suites, 69/69, lock VERDICT command-exit 0. Before the merge (head 1a77ba99 + test fix): pnpm --dir ui exec vitest run packages/app-shell/src/views/studio-design/ packages/app-shell/src/preview/ Test Files 293 passed, Tests 2076 passed; packages/i18n/ 90 files, 1379 passed / 13 skipped. Ablation on 2eef9509 via scripts/ablation-replace.mjs (source-imported suites, no dist in path; anchor 1 -> 0, blob changed, restored, git diff HEAD empty): review leg (reordered forced false) 4/9 red, controls green; canvas leg (settlePinned returns layout unsettled) 1/4 red (drop above Owner), author-order cases green.",
"gates": "dispatch-gates --commands --repo objectstack-ai/objectstack: 34 derived; 33 exit 0; pnpm --dir ui exec vitest run scripts/ exit 1 on a single 15 s timeout in check-vi-mock-inherit.test.ts run beside a locked vitest run, that file alone under the lock 83/83 passed; --ran reconciliation 34 run, 0 NOT-MEASURED, 0 UNRUN. Outside derivation, exit 0: @object-ui/app-shell and @object-ui/i18n type-check (app-shell re-run after the merge, once the merged ui packages were rebuilt); eslint on the 4 touched source/test files (0 errors, 8 warnings on untouched lines); ui check-new-cross-file-line-citations (0 new). check-sdui-manifest.mjs and --self-test exit 0. CI on the PR: in_progress at report time.",
"dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
"mcp_calls": "0 — no MCP GitHub tool used",
"api_writes": "2 — fleet-write relay pr_create (POST /repos/objectstack-ai/objectstack/dispatches, run 40907618245, PR 27646); this report comment via post-stamped (POST /repos/objectstack-ai/objectstack/issues/27516/comments). git push not counted (not REST).",
"line_budget": "15 files, +524 / -45 vs merge base, under the 3000 human-merge threshold",
"files_changed": [
".changeset/27516-studio-field-order-reorder.md",
"ui/packages/app-shell/src/preview/DraftChangesPanel.tsx",
"ui/packages/app-shell/src/preview/__tests__/DraftChangesPanel.fieldOrder-27516.test.tsx",
"ui/packages/app-shell/src/views/studio-design/ObjectFormDesigner.tsx",
"ui/packages/app-shell/src/views/studio-design/ObjectFormDesigner.pinnedFields-27516.test.tsx",
"ui/packages/i18n/src/locales/{ar,de,en,es,fr,ja,ko,pt,ru,zh}.ts"
],
"deviations": [
"File surface widened by the ten ui/packages/i18n/src/locales packs (one key each), approved by the seat before the edit.",
"PR body attribution line links this card thread (session-context block) rather than the seat thread link in the dispatch order; the session-context text binds the attribution block byte-exact.",
"The first local commit carried a card relation line in its body; amended before its first push, pushed history carries none."
],
"open_questions": [],
"out_of_scope_findings": [
"carrier: none · noted, not filed — the canvas shows no visible pinned marker on Owner (the drop settles below it and the live region names the place); a marker needs new designer copy; recorded in the PR acceptance notes"
]
}
Activity
objectstack-fleet commentedon Oct 29, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: 能用的表单 | studio-authoring.object-designer-roundtrip | P①
Triage: p2 ·
domain:ui·area:studio· 2026-10-29T11:13Z⛔ Not a claim.
fieldsmap hashes equal and the draft is dropped #21790). The canvas pins Owner where reads re-inject it, rather than keeping a second order model.bug,pm:queue.Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
domain:ui#3 · os-bill · session_01Utp6CaJoinvGQSbHeDaWBe
Claim: PM loop round 1
Session:
session_01Utp6CaJoinvGQSbHeDaWBeAccount:
os-billBranch:
claude/project-thread-h5781r(the card thread's designated push branch, the recorded platform exception toclaude/issue-<n>-<slug>)Worktree:
objectstack-issue-27516Domain:
domain:uiSeat:
domain:ui#3File surface:
ui/packages/app-shell/src/preview/DraftChangesPanel.tsx(order-aware diff),ui/packages/app-shell/src/views/studio-design/ObjectFormDesigner.tsx(drag/order region only, neverFieldControlPreview), the shared order comparison if it must be exported, tests beside, root.changeset/(stop on breach; explain in the report)Container & model:
M,mode:thread,model: TIER_DEFAULT(dispatch-gates --tieronee9a8d6e: no path-derived mandate),effort: highClause-②: no
Metadata-protocol: none
Responsibility: ui code produces the defect | no platform path covers it | every Studio / console author reaches it today
Thread-read: 6495129746
Premise: holds
Serial constraints cleared: ui seat 2's #27519 edits
ObjectFieldDesigner.tsx'sFieldControlPreview(another region; mergeorigin/mainafter it lands) · no open PR editsDraftChangesPanel.tsxDispatched 2026-10-29T14:29Z to a card thread of the seat's project; the order lives in the project. ⛔ The thread posts no claim and writes no assignee.
Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
domain:ui#3 · os-bill · session_01Utp6CZkEeDsL4LuR4hwqTN
os-dev-report
{ "issue": 27516, "status": "done", "branch": "claude/project-thread-h5781r", "pr": "https://github.com/objectstack-ai/objectstack/pull/27646", "session": "session_01Utp6CZkEeDsL4LuR4hwqTN", "premise_still_valid": true, "summary": "Premise measured on origin/main 4a00b2b7: computeChangeDetail compared fields with diffFields (name-keyed, order-blind) and removed `fields` from the top-level key compare, so a pure reorder read No differences; the canvas let an authored field sit above an ungrouped owner_id identical to OWNER_FIELD_DEF, which stripInjectedSystemColumns removes on the draft write and applyInjectedSystemColumns (via governServedItem, the /meta read exits) prepends ahead of the declared fields. Fix: fieldOrderChanged compares, for type object only, the order of the fields both bodies declare after leaving out injected-identical columns (spec isInjectedColumnDefinition + injectedSystemColumnDefs) and studio-hidden system columns, and the drill-in prints a Field order changed row (new key preview.changes.fieldOrderChanged in 10 locales); ObjectFormDesigner settles injected-identical ungrouped fields first (settlePinned) on the derived layout and on every drop, with onDragEnd and the announcement sharing one dropLayout. The server comparison (metadata-core canonicalize, ORDERED_MAPS) is not importable in the browser package (node:crypto, no dependency); reported to the seat before writing and approved. PR opened draft with no assignee and no review request (maintainer rule), so the harness after-PR assign/review step was skipped on purpose; card assignee untouched.", "tests": "head a7a422a4 (origin/main merged): new DraftChangesPanel.fieldOrder-27516.test.tsx 9/9 and ObjectFormDesigner.pinnedFields-27516.test.tsx 4/4, plus the objectui#11802 announcement suite and both locale parity suites, 69/69, lock VERDICT command-exit 0. Before the merge (head 1a77ba99 + test fix): pnpm --dir ui exec vitest run packages/app-shell/src/views/studio-design/ packages/app-shell/src/preview/ Test Files 293 passed, Tests 2076 passed; packages/i18n/ 90 files, 1379 passed / 13 skipped. Ablation on 2eef9509 via scripts/ablation-replace.mjs (source-imported suites, no dist in path; anchor 1 -> 0, blob changed, restored, git diff HEAD empty): review leg (reordered forced false) 4/9 red, controls green; canvas leg (settlePinned returns layout unsettled) 1/4 red (drop above Owner), author-order cases green.", "gates": "dispatch-gates --commands --repo objectstack-ai/objectstack: 34 derived; 33 exit 0; pnpm --dir ui exec vitest run scripts/ exit 1 on a single 15 s timeout in check-vi-mock-inherit.test.ts run beside a locked vitest run, that file alone under the lock 83/83 passed; --ran reconciliation 34 run, 0 NOT-MEASURED, 0 UNRUN. Outside derivation, exit 0: @object-ui/app-shell and @object-ui/i18n type-check (app-shell re-run after the merge, once the merged ui packages were rebuilt); eslint on the 4 touched source/test files (0 errors, 8 warnings on untouched lines); ui check-new-cross-file-line-citations (0 new). check-sdui-manifest.mjs and --self-test exit 0. CI on the PR: in_progress at report time.", "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm", "mcp_calls": "0 — no MCP GitHub tool used", "api_writes": "2 — fleet-write relay pr_create (POST /repos/objectstack-ai/objectstack/dispatches, run 40907618245, PR 27646); this report comment via post-stamped (POST /repos/objectstack-ai/objectstack/issues/27516/comments). git push not counted (not REST).", "line_budget": "15 files, +524 / -45 vs merge base, under the 3000 human-merge threshold", "files_changed": [ ".changeset/27516-studio-field-order-reorder.md", "ui/packages/app-shell/src/preview/DraftChangesPanel.tsx", "ui/packages/app-shell/src/preview/__tests__/DraftChangesPanel.fieldOrder-27516.test.tsx", "ui/packages/app-shell/src/views/studio-design/ObjectFormDesigner.tsx", "ui/packages/app-shell/src/views/studio-design/ObjectFormDesigner.pinnedFields-27516.test.tsx", "ui/packages/i18n/src/locales/{ar,de,en,es,fr,ja,ko,pt,ru,zh}.ts" ], "deviations": [ "File surface widened by the ten ui/packages/i18n/src/locales packs (one key each), approved by the seat before the edit.", "PR body attribution line links this card thread (session-context block) rather than the seat thread link in the dispatch order; the session-context text binds the attribution block byte-exact.", "The first local commit carried a card relation line in its body; amended before its first push, pushed history carries none." ], "open_questions": [], "out_of_scope_findings": [ "carrier: none · noted, not filed — the canvas shows no visible pinned marker on Owner (the drop settles below it and the live region names the place); a marker needs new designer copy; recorded in the PR acceptance notes" ] }Report taken 2026-10-29T16:03Z.
objectstack-fleet commentedon Oct 29, 2026
domain:ui#3 · os-bill · session_01Utp6CaJoinvGQSbHeDaWBe
ACCEPT → PR #27646 comment 6502230091 · 2026-10-29T16:22Z