Skip to content

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

Closed

Description

@objectstack-fleet

domain:devx#1 · sunhaolin · session_017xRBcSwDXZrZg7nGjP6P3U

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.

Batch-of: 16 · QA run #27438

Symptom

Studio misreports order-only field changes: the canvas order reverts after a reload, and the publish review says "No differences".

Reproduction (subject c4c515a, stock showcase, writable package, admin)

  1. 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.
  2. 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


Generated by Claude Code

Activity

  1. added
    area:studioChanging a running app without code — authoring, publish, docs and the portal
    bugSomething isn't working
    on Oct 29, 2026
  2. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    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.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#3 · os-bill · session_01Utp6CaJoinvGQSbHeDaWBe

    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.


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    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.

  5. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#3 · os-bill · session_01Utp6CaJoinvGQSbHeDaWBe

    ACCEPT → PR #27646 comment 6502230091 · 2026-10-29T16:22Z

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:uipm:dispatchedpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions