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
metadata: an object's fields come back in alphabetical order after save/publish, so the default create form loses the declared field order #32398
The console's default create form ("新建请假申请", with no form view declared) follows that order, so it opens with 审批意见 / 审批人 / 证明附件 first and 员工姓名 / 开始日期 at the bottom: the form reads as random to an end user.
Expected
The declared order of fields is the order the default form, the default list columns and describe_object use. A JSON object's insertion order is the only ordering an author has for fields, and it should survive save and publish. Today the author has to hand-write a form view just to get a sensible field order.
Steps
Create an object whose fields keys are not in alphabetical order (MCP create_metadata or apply_blueprint).
Publish it, then describe_object → fields come back alphabetically.
Open the object's list and click 新建 → the form follows the alphabetical order.
Lane:domain:server (metadata save and publish; describe_object).
Grade: p2. Declared field order is lost after save or publish, so the default form and list columns read alphabetically. It is a usability defect with no data loss.
Claim: PM loop round 1 · #32398 · 2026-11-11T12:29Z · bug (p2)
Session: session_01Utp6CaAUev5V62cLHhQwBi (seat); dev = card thread session_01Utp6CZ3AbHTKFisziGAaK5
Account: os-bill
Branch: claude/project-thread-1hwmue (the card thread's harness-pinned branch; platform exception to claude/issue-<n>-<slug>)
Worktree: objectstack-issue-32398
Domain: domain:server
Seat: domain:server#3
File surface: the hop that reorders ObjectSchema.fields on create → publish → describe, expected in packages/metadata-core/**, packages/metadata/**, packages/metadata-protocol/** or packages/mcp/**, named by the dev's step 0 before editing; their tests; one changeset (stop on breach; explain in the report)
Container & model: M, mode:thread, model: default tier (dispatch-gates --tier: no path-derived mandate), effort: high
Clause-②: no
Metadata-protocol: none
Responsibility: platform code (objectstack) on the metadata save/publish/describe path produces the sort; no platform path covers it today (authors hand-write a form view); every author who creates an object with non-alphabetical fields reaches it
Thread-read: 6789288757
Premise: holds (read at 7d82b2da: canonicalize.ts keeps object.fields order only when the type is passed; type-blind sorts remain on the tree; the reorder hop itself is the dev's step 0 measurement)
Serial constraints cleared: none on a named file; open PR #32327 edits protocol-meta-item-face.ts / protocol-meta-layered-reads.ts — if step 0 lands the fix there, the later lander merges main
Step 0 did not reproduce the card on objectstack 7d82b2da: every hop this repository owns keeps the declared fields order. No code changed, no PR. The create_metadata / apply_blueprint tools the card names are not implemented in this repository; docs/adr/0070-package-first-authoring.md names ../cloud (service-ai-studio) as their home. Carrier: cloud.
Per-hop readings (probe: showcase dogfood boot plus MCPServerPlugin; package app.ordprobe32398; object ordprobe_leave with the card's 12 fields in the card's order):
hop
sqlite-wasm (database file)
memory driver
PUT /meta/object/NAME?mode=draft&package=PKG
200
200
POST /packages/PKG/publish-drafts
200, published 1
200, published 1
GET /meta/object/NAME
declared order
declared order
GET /meta/object (list)
declared order
declared order
objectql registry.getObject
declared order
declared order
MCP HTTP describe_object
8 injected system columns, then declared order
same
stop, cold boot on the same file, GET + registry
declared order
n/a (in-memory)
Artifact door (MetadataPluginartifactSource local-file, build-shaped showcase artifact): 6 showcase objects whose declared fields are not alphabetical; the artifact keeps their order and the served order equals the declared one.
{
"issue": 32398,
"status": "done",
"branch": "claude/project-thread-1hwmue",
"pr": null,
"session": "session_01Utp6CZ3AbHTKFisziGAaK5",
"premise_still_valid": false,
"summary": "Step 0 measured create (draft save door) -> publish-drafts -> /meta item and list reads -> registry -> MCP describe_object -> cold boot, on sqlite-wasm and the memory driver, plus the artifact door: the declared fields order survives every hop in this repository. The seat's candidate sites were read: the type-blind canonicalize callers (draft-changes, package-upgrade-plan, package-upgrade-environment), metadata-history-utils normalizeJSON, the extension owner-field canonical(), and the metadata plugin's artifact checksum only hash or compare and never feed a stored or served body; sortObjectKeys is opt-in sortKeys on the json/typescript serializers. Postgres jsonb is ruled out by the card's own reading (jsonb orders keys length-first, the card shows plain alphabetical). The card's door (create_metadata / apply_blueprint) lives in cloud service-ai-studio, which this session cannot read.",
"tests": "Scratch probes only, not committed (os-dev: no permanent file for a one-off proof): showcase boot over sqlite-wasm with databaseFile + cold reboot, and over databaseDriver memory, each printing the field order after every hop; a second probe over the MetadataPlugin artifact door. All readings above; each run's os-verify-lock VERDICT command-exit 0.",
"gates": "none run: no diff",
"dogfood_battery": "n/a — no diff",
"mcp_calls": "2 — issue_read get, issue_read get_comments (reads only)",
"api_writes": "1 — this os-dev-report comment via post-stamped",
"open_questions": [],
"security_findings": "none",
"out_of_scope_findings": ["carrier: cloud · the alphabetical order reaches describe_object on the os-test deployment through the cloud create_metadata / apply_blueprint path or the deployment's own storage; neither is in objectstack. Dedupe words: create_metadata field order alphabetical, service-ai-studio fields sort, describe_object field order"]
}
Release: claim 6795835969 (domain:server#3 · session_01Utp6CaAUev5V62cLHhQwBi) · 2026-11-11T12:44Z · reason: premise false in objectstack · next: triage, for a cloud re-route
Reading: os-dev-report 6796124697 has premise_still_valid: false and pr: null. Measured at 7d82b2da, every hop keeps the declared field order: draft PUT → publish-drafts → GET /meta/object/<name> → registry → MCP describe_object → cold boot. That holds on sqlite-wasm, on the memory driver and through the artifact door. create_metadata and apply_blueprint are not in this repo; ADR-0070 Consumers names cloud service-ai-studio as their home. So the reorder is on the cloud path, or in the os-test deployment's driver, and neither is measurable from here.
Ask to triage: route the card to cloud (carrier: cloud), or close it with a cloud card. The card returns to pm:queue with pm:retriage and no assignee. Resume-from: none (nothing pushed).
Reading:domain:server#3's step 0 (6796124697) measured every objectstack hop and found the declared fields order kept throughout. Those hops are the draft save, publish-drafts, the /meta item and list reads, the registry, MCP describe_object, a cold boot, and the artifact door, run on sqlite-wasm and the memory driver.
Producer:create_metadata and apply_blueprint, the tools the card names, live in cloud's packages/service-ai-studio (authoring-whitelist.ts), not in this repository.
Lane:domain:cloud + repo:cloud.
One hop is not measured: the hosted storage. If os-test runs on PostgreSQL through objectstack's driver-sql, the claimer first checks the order there. If that platform hop reorders the fields, it comes back as its own domain:server card.
Activity
objectstack-fleet commentedon Nov 11, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: first touch →
domain:server· p2 ·pm:queue· 2026-11-11T06:57Z⛔ Not a claim.
domain:server(metadata save and publish;describe_object).Generated by Claude Code
objectstack-fleet commentedon Nov 11, 2026
domain:server#3 · os-bill · session_01Utp6CaAUev5V62cLHhQwBi
Claim: PM loop round 1 · #32398 · 2026-11-11T12:29Z · bug (p2)
Session:
session_01Utp6CaAUev5V62cLHhQwBi(seat); dev = card threadsession_01Utp6CZ3AbHTKFisziGAaK5Account:
os-billBranch:
claude/project-thread-1hwmue(the card thread's harness-pinned branch; platform exception toclaude/issue-<n>-<slug>)Worktree:
objectstack-issue-32398Domain:
domain:serverSeat:
domain:server#3File surface: the hop that reorders
ObjectSchema.fieldson create → publish → describe, expected inpackages/metadata-core/**,packages/metadata/**,packages/metadata-protocol/**orpackages/mcp/**, named by the dev's step 0 before editing; their tests; one changeset (stop on breach; explain in the report)Container & model:
M,mode:thread,model: default tier (dispatch-gates --tier: no path-derived mandate),effort: highClause-②: no
Metadata-protocol: none
Responsibility: platform code (objectstack) on the metadata save/publish/describe path produces the sort; no platform path covers it today (authors hand-write a form view); every author who creates an object with non-alphabetical fields reaches it
Thread-read: 6789288757
Premise: holds (read at
7d82b2da:canonicalize.tskeepsobject.fieldsorder only when the type is passed; type-blind sorts remain on the tree; the reorder hop itself is the dev's step 0 measurement)Serial constraints cleared: none on a named file; open PR #32327 edits
protocol-meta-item-face.ts/protocol-meta-layered-reads.ts— if step 0 lands the fix there, the later lander mergesmainobjectstack-fleet commentedon Nov 11, 2026
domain:server#3 · os-bill · session_01Utp6CZ3AbHTKFisziGAaK5
os-dev-report
Step 0 did not reproduce the card on objectstack
7d82b2da: every hop this repository owns keeps the declaredfieldsorder. No code changed, no PR. Thecreate_metadata/apply_blueprinttools the card names are not implemented in this repository;docs/adr/0070-package-first-authoring.mdnames../cloud(service-ai-studio) as their home. Carrier: cloud.Per-hop readings (probe: showcase dogfood boot plus
MCPServerPlugin; packageapp.ordprobe32398; objectordprobe_leavewith the card's 12 fields in the card's order):PUT /meta/object/NAME?mode=draft&package=PKGPOST /packages/PKG/publish-draftsGET /meta/object/NAMEGET /meta/object(list)registry.getObjectdescribe_objectGET+ registryArtifact door (
MetadataPluginartifactSourcelocal-file, build-shaped showcase artifact): 6 showcase objects whose declared fields are not alphabetical; the artifact keeps their order and the served order equals the declared one.{ "issue": 32398, "status": "done", "branch": "claude/project-thread-1hwmue", "pr": null, "session": "session_01Utp6CZ3AbHTKFisziGAaK5", "premise_still_valid": false, "summary": "Step 0 measured create (draft save door) -> publish-drafts -> /meta item and list reads -> registry -> MCP describe_object -> cold boot, on sqlite-wasm and the memory driver, plus the artifact door: the declared fields order survives every hop in this repository. The seat's candidate sites were read: the type-blind canonicalize callers (draft-changes, package-upgrade-plan, package-upgrade-environment), metadata-history-utils normalizeJSON, the extension owner-field canonical(), and the metadata plugin's artifact checksum only hash or compare and never feed a stored or served body; sortObjectKeys is opt-in sortKeys on the json/typescript serializers. Postgres jsonb is ruled out by the card's own reading (jsonb orders keys length-first, the card shows plain alphabetical). The card's door (create_metadata / apply_blueprint) lives in cloud service-ai-studio, which this session cannot read.", "tests": "Scratch probes only, not committed (os-dev: no permanent file for a one-off proof): showcase boot over sqlite-wasm with databaseFile + cold reboot, and over databaseDriver memory, each printing the field order after every hop; a second probe over the MetadataPlugin artifact door. All readings above; each run's os-verify-lock VERDICT command-exit 0.", "gates": "none run: no diff", "dogfood_battery": "n/a — no diff", "mcp_calls": "2 — issue_read get, issue_read get_comments (reads only)", "api_writes": "1 — this os-dev-report comment via post-stamped", "open_questions": [], "security_findings": "none", "out_of_scope_findings": ["carrier: cloud · the alphabetical order reaches describe_object on the os-test deployment through the cloud create_metadata / apply_blueprint path or the deployment's own storage; neither is in objectstack. Dedupe words: create_metadata field order alphabetical, service-ai-studio fields sort, describe_object field order"] }Report taken 2026-11-11T12:42Z.
objectstack-fleet commentedon Nov 11, 2026
domain:server#3 · os-bill · session_01Utp6CaAUev5V62cLHhQwBi
Release: claim 6795835969 (
domain:server#3·session_01Utp6CaAUev5V62cLHhQwBi) · 2026-11-11T12:44Z · reason: premise false in objectstack · next: triage, for a cloud re-routepremise_still_valid: falseandpr: null. Measured at7d82b2da, every hop keeps the declared field order: draft PUT → publish-drafts →GET /meta/object/<name>→ registry → MCPdescribe_object→ cold boot. That holds on sqlite-wasm, on the memory driver and through the artifact door.create_metadataandapply_blueprintare not in this repo; ADR-0070 Consumers names cloudservice-ai-studioas their home. So the reorder is on the cloud path, or in the os-test deployment's driver, and neither is measurable from here.carrier: cloud), or close it with a cloud card. The card returns topm:queuewithpm:retriageand no assignee. Resume-from: none (nothing pushed).objectstack-fleet commentedon Nov 11, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: re-routed
domain:server→domain:cloud· p2 · 2026-11-11T12:46Z⛔ Not a claim.
domain:server#3's step 0 (6796124697) measured every objectstack hop and found the declaredfieldsorder kept throughout. Those hops are the draft save,publish-drafts, the/metaitem and list reads, the registry, MCPdescribe_object, a cold boot, and the artifact door, run on sqlite-wasm and the memory driver.create_metadataandapply_blueprint, the tools the card names, live in cloud'spackages/service-ai-studio(authoring-whitelist.ts), not in this repository.domain:cloud+repo:cloud.driver-sql, the claimer first checks the order there. If that platform hop reorders the fields, it comes back as its owndomain:servercard.Generated by Claude Code