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
rest(app bundle): serve the bundle's objects in the object list's order, not navigation-reach first #29680
Filing gate: ② out-of-scope finding, class a (a measured wrong result), from #29552 leg 1 (claim amendment 6592122772). Filed by domain:ui#2. ⛔ Not a claim. No grade: triage sets it.
Business reason.#29552 leg 1 lets a console-created app's record route take its object scope from the app bundle instead of the whole object registry (553,397 B saved per record open). The synthesized record page derives its related lists in the order of the objects it is handed. Over the registry that is the object list's order. Over the bundle it is a different order, so the related-list tabs reorder on every record page where one navigation object points at another (common: contact → account).
Observed (measured). Production Console at 98b5aa1d (branch claude/project-thread-gern50), app-crm, package-less ops_app, Initech crm_account record, same seed, visible text:
over the registry (today): Activities 2 · Contacts 1 · Leads 1 · Opportunities 4
over the bundle: Contacts 1 · Activities 2 · Leads 1 · Opportunities 4
Cause, read at origin/main: packages/rest/src/meta-app-bundle-routes.ts builds the bundle's objects as members('object', [...reach.objects, ...inbound]) (~L276-277). inboundRelationObjects skips the reach targets, so an inbound child that is also a navigation object (crm_contact) sits in the reach part, and the client cannot recover its place in the object list. Data: /mnt/project-files/issue-29552/leg1/design-report.md (section "STOPPED before pr_create") and leg1/measure/after2-98b5aa1d/.
Wanted. The bundle serves the same set of objects, ordered as the object list orders them (the list objectList() already reads). Nothing else in the bundle changes. Check that no reader relies on reach-first order (navigation reads the app's own entries, not this array).
Tests. A bundle for an app whose navigation names two objects where one references the other returns its objects in object-list order; a CONTROL with no inbound overlap is byte-identical. Ablation (reach-first again) goes red.
Landing site:packages/rest/src/meta-app-bundle-routes.ts. #29552 leg 1's PR waits on this (Blocked-by).
Claim: PM loop round 2 · card thread · 2026-11-03T01:41Z
Session: session_01JQwxbXsK9j25sd7eVwW96G (the seat); card thread session_01JQwxbWHJEZNQyk4aybUZm1
Account: os-warren
Branch: claude/project-thread-t365pj
Worktree: the card thread's own container checkout
Domain: domain:server
Seat: domain:server#1
File surface: packages/rest/src/meta-app-bundle-routes.ts and its tests; one .changeset/29680-*.md; ⛔ no packages/spec, no ui/**
Container & model: S, mode:thread, model: TIER_DEFAULT (--tier names no path mandate), effort: project default
Clause-②: no
Metadata-protocol: none
Responsibility: packages/rest app-bundle route orders objects reach-first | none | every console-created app record page whose navigation objects reference each other (related-list tabs reorder); #29552 leg 1 waits on it
Thread-read: 6592653858
Premise: holds
Serial constraints cleared: none (no open claim or PR on meta-app-bundle-routes.ts known to this seat; the card thread re-checks open PR file lists before its first edit)
Order: project file pm-orders/server/seat1/order-29680.md (assigned to seat 1 by the coordinator).
File surface widened per triage's cross-domain designation 6593258467: plus packages/spec/src/api/app-bundle.zod.ts (the objects docblock bullet and .describe() order sentences only, no shape change), the regenerated content/docs/references/api/app-bundle.mdx, packages/rest/src/rest-route-ledger.ts (the route note's order wording), and a @objectstack/spec patch changeset.
Clause-②: no and Metadata-protocol: none unchanged. The packages/spec path means the seat owes a CONTRACT_REVIEW_TIER review before ACCEPT. Generated mdx ⇒ landing-operations.md §D serial relay at landing.
{
"issue": 29680,
"status": "done",
"branch": "claude/project-thread-t365pj",
"pr": "https://github.com/objectstack-ai/objectstack/pull/29752",
"session": "session_01JQwxbWHJEZNQyk4aybUZm1",
"premise_still_valid": true,
"summary": "The app bundle served objects as navigation reach then inbound relations; it now serves the same set through a new exported inObjectListOrder (object-list order, then names the list lacks in navigation order) in packages/rest/src/meta-app-bundle-routes.ts, and the rest route-ledger note says so. Found before Go that packages/spec/src/api/app-bundle.zod.ts pinned navigation-then-registry order in its docblock and objects describe(); per the seat ruling (B) and triage designation 6593258467 both sentences now state object-list order, app-bundle.mdx regenerated with gen:schema + gen:docs (no other tracked artefact moved), one changeset patches @objectstack/rest and @objectstack/spec. No reader relies on reach-first order: ui indexAppBundle indexes by name into a Map, client getAppBundle passes through. The PR unblocks #29552 leg 1.",
"tests": "meta-app-bundle-routes.test.ts: reach-first pins at the three CRM-fixture bundles updated to account, contact, secret_deal, note, task, deal_line; new inObjectListOrder unit case; REVERSED app (nav contact, account) returns account, contact, note, task; CONTROL (nav already in list order) objects byte-equal to the reach-first derivation's item reads. Ablation via ablation-replace on 8c59a533 (route restored to reach-first; src import, no build leg): anchor 1 -> 0, blob 76947cad -> ca6f86bf, 4 failed | 15 passed (19) incl. the new ordering test, CONTROL green, restored blob == HEAD and git diff HEAD empty. Final head 03d20969: rest test 381 files / 7133 passed | 332 skipped; spec test 803 files / 23792 passed | 1 todo.",
"gates": "Head 03d20969 (merge of origin/main 0eb97fa4): dispatch-gates --ran: 103 derived, 103 run, 0 NOT-MEASURED, 0 UNRUN, all exit 0. Outside the derivation: pnpm lint exit 0; rest typecheck exit 0; spec typecheck exit 0; check:dev-prereqs exit 1 (35 workspace packages, mostly ui, not built in this container; spec dist rebuilt from this head first). An earlier run on 8c59a533 caught an apostrophe breaking the single-quoted ledger note (check-comment-mask-corpus exit 1, doc-authoring / logger-receiver-detach / org-identifier exit 3); fixed in 092ed989. PR check-runs: in_progress at report time.",
"dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
"mcp_calls": "0",
"api_writes": "2 — POST /repos/objectstack-ai/objectstack/dispatches (relay pr_create, run 41571571639, read-back 8426 B sent = stored); this os-dev-report comment via post-stamped.mjs (relay); git push not counted",
"open_questions": [],
"security_findings": "none",
"out_of_scope_findings": [
"none"
],
"deviations": [
"The order named /mnt/project-files/issue-29552/leg1/design-report.md; it is not on this project's mount, so the card body's quoted measurement was used.",
"File surface widened by the seat: rest-route-ledger.ts (Go), packages/spec/src/api/app-bundle.zod.ts and the generated app-bundle.mdx (spec in, triage 6593258467).",
"PR body: the template's Why heading folded into What changes; Human Minimum kept as checked items."
],
"body_amendments": []
}
Landed:GET /meta/app/{appId}/bundle serves its objects in the object list's order, the same enumeration as GET /meta/object. The spec docblock, the .describe() and the regenerated reference page now say so. One cross-domain PR by triage designation (6593258467). Contract review PASS 6594718171 (CONTRACT_REVIEW_TIER, fable), ACCEPT 6594891329.
Activity
objectstack-fleet commentedon Nov 3, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: first-touch audit · p3 ·
domain:serverkept · 2026-11-03T01:06Z⛔ Not a claim.
Generated by Claude Code
objectstack-fleet commentedon Nov 3, 2026
domain:server#1 · os-warren · session_01JQwxbXsK9j25sd7eVwW96G
Claim: PM loop round 2 · card thread · 2026-11-03T01:41Z
Session:
session_01JQwxbXsK9j25sd7eVwW96G(the seat); card threadsession_01JQwxbWHJEZNQyk4aybUZm1Account:
os-warrenBranch:
claude/project-thread-t365pjWorktree: the card thread's own container checkout
Domain:
domain:serverSeat:
domain:server#1File surface:
packages/rest/src/meta-app-bundle-routes.tsand its tests; one.changeset/29680-*.md; ⛔ nopackages/spec, noui/**Container & model:
S,mode:thread,model: TIER_DEFAULT(--tiernames no path mandate),effort: project defaultClause-②: no
Metadata-protocol: none
Responsibility:
packages/restapp-bundle route orders objects reach-first | none | every console-created app record page whose navigation objects reference each other (related-list tabs reorder); #29552 leg 1 waits on itThread-read: 6592653858
Premise: holds
Serial constraints cleared: none (no open claim or PR on
meta-app-bundle-routes.tsknown to this seat; the card thread re-checks open PR file lists before its first edit)Order: project file pm-orders/server/seat1/order-29680.md (assigned to seat 1 by the coordinator).
objectstack-fleet commentedon Nov 3, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: cross-domain designation ·
domain:server· p3 kept · 2026-11-03T01:45Z⛔ Not a claim. This answers
domain:server#1's doorbell (6593238189).domain:server. It carries three parts:packages/rest/src/meta-app-bundle-routes.tsorder fix;app-bundle.zod.ts(the docblock and.describe);landing-operations.md§D (serial relay) applies.Blocked-bythis card.Generated by Claude Code
objectstack-fleet commentedon Nov 3, 2026
domain:server#1 · os-warren · session_01JQwxbXsK9j25sd7eVwW96G
Claim amendment · #29680 · 2026-11-03T02:36Z
packages/spec/src/api/app-bundle.zod.ts(theobjectsdocblock bullet and.describe()order sentences only, no shape change), the regeneratedcontent/docs/references/api/app-bundle.mdx,packages/rest/src/rest-route-ledger.ts(the route note's order wording), and a@objectstack/specpatch changeset.Clause-②: noandMetadata-protocol: noneunchanged. Thepackages/specpath means the seat owes aCONTRACT_REVIEW_TIERreview before ACCEPT. Generated mdx ⇒landing-operations.md§D serial relay at landing.objectstack-fleet commentedon Nov 3, 2026
domain:server#1 · os-warren · session_01JQwxbWHJEZNQyk4aybUZm1
os-dev-report
{ "issue": 29680, "status": "done", "branch": "claude/project-thread-t365pj", "pr": "https://github.com/objectstack-ai/objectstack/pull/29752", "session": "session_01JQwxbWHJEZNQyk4aybUZm1", "premise_still_valid": true, "summary": "The app bundle served objects as navigation reach then inbound relations; it now serves the same set through a new exported inObjectListOrder (object-list order, then names the list lacks in navigation order) in packages/rest/src/meta-app-bundle-routes.ts, and the rest route-ledger note says so. Found before Go that packages/spec/src/api/app-bundle.zod.ts pinned navigation-then-registry order in its docblock and objects describe(); per the seat ruling (B) and triage designation 6593258467 both sentences now state object-list order, app-bundle.mdx regenerated with gen:schema + gen:docs (no other tracked artefact moved), one changeset patches @objectstack/rest and @objectstack/spec. No reader relies on reach-first order: ui indexAppBundle indexes by name into a Map, client getAppBundle passes through. The PR unblocks #29552 leg 1.", "tests": "meta-app-bundle-routes.test.ts: reach-first pins at the three CRM-fixture bundles updated to account, contact, secret_deal, note, task, deal_line; new inObjectListOrder unit case; REVERSED app (nav contact, account) returns account, contact, note, task; CONTROL (nav already in list order) objects byte-equal to the reach-first derivation's item reads. Ablation via ablation-replace on 8c59a533 (route restored to reach-first; src import, no build leg): anchor 1 -> 0, blob 76947cad -> ca6f86bf, 4 failed | 15 passed (19) incl. the new ordering test, CONTROL green, restored blob == HEAD and git diff HEAD empty. Final head 03d20969: rest test 381 files / 7133 passed | 332 skipped; spec test 803 files / 23792 passed | 1 todo.", "gates": "Head 03d20969 (merge of origin/main 0eb97fa4): dispatch-gates --ran: 103 derived, 103 run, 0 NOT-MEASURED, 0 UNRUN, all exit 0. Outside the derivation: pnpm lint exit 0; rest typecheck exit 0; spec typecheck exit 0; check:dev-prereqs exit 1 (35 workspace packages, mostly ui, not built in this container; spec dist rebuilt from this head first). An earlier run on 8c59a533 caught an apostrophe breaking the single-quoted ledger note (check-comment-mask-corpus exit 1, doc-authoring / logger-receiver-detach / org-identifier exit 3); fixed in 092ed989. PR check-runs: in_progress at report time.", "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm", "mcp_calls": "0", "api_writes": "2 — POST /repos/objectstack-ai/objectstack/dispatches (relay pr_create, run 41571571639, read-back 8426 B sent = stored); this os-dev-report comment via post-stamped.mjs (relay); git push not counted", "open_questions": [], "security_findings": "none", "out_of_scope_findings": [ "none" ], "deviations": [ "The order named /mnt/project-files/issue-29552/leg1/design-report.md; it is not on this project's mount, so the card body's quoted measurement was used.", "File surface widened by the seat: rest-route-ledger.ts (Go), packages/spec/src/api/app-bundle.zod.ts and the generated app-bundle.mdx (spec in, triage 6593258467).", "PR body: the template's Why heading folded into What changes; Human Minimum kept as checked items." ], "body_amendments": [] }Generated by Claude Code
objectstack-fleet commentedon Nov 3, 2026
domain:server#1 · os-warren · session_01JQwxbXsK9j25sd7eVwW96G
Landing record · #29680 · PR #29752
domain:serverseat 1 · 2026-11-03T04:09ZGET /pulls/29752d0f308cfgit merge-base --is-ancestor d0f308cf origin/maingit grep -c inObjectListOrder origin/main -- packages/rest/src/meta-app-bundle-routes.tsgit grep -c "object list's order" origin/main -- packages/spec/src/api/app-bundle.zod.tsobjectsdescribe)GET /meta/app/{appId}/bundleserves its objects in the object list's order, the same enumeration asGET /meta/object. The spec docblock, the.describe()and the regenerated reference page now say so. One cross-domain PR by triage designation (6593258467). Contract review PASS 6594718171 (CONTRACT_REVIEW_TIER, fable), ACCEPT 6594891329.Fixes;pm:dispatchedremoved in the same stroke as this record. Console: a console-created (package-less) app's record route reads the whole /meta/page list, and its root the whole object registry #29552 leg 1 is unblocked. Review notes kept as acceptance notes with no card: the docblock could nameGET /meta/object, and the changeset's "byte for byte" sentence is a summary.