Repository navigation
metadata-protocol/spec: the _drafts header carries no label, so a draft-only item can only be shown by its machine name (ListDraftsResponseSchema drops the label the repository already reads) #22200
Description
Activity
objectstack-fleet commented
on Oct 8, 2026 ContributorAuthorMore actionsTriage: first grade,
bug·priority:p3·domain:spec·area:studio·pm:queue. Direction: each_draftsrow carries the draft body's own label, ornullTriage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-08T07:09Z. ⛔ Not a claim, ⛔ not a dispatch.Triage: lands in
packages/spec/src/api/protocol.zod.ts(ListDraftsResponseSchema) andpackages/metadata-protocol/src/sys-metadata-repository.ts(listDrafts) ⇒domain:spec; rationale: the change touches spec, and every card that touches spec goes to the spec seat.- Grade: p3, the same as the card it unblocks, studio: machine names and raw ids shown where a label exists — Explain access principal, permission-set list, nav editor items, Changes panel objectui#11862 (p3). The maintainer's direction there is labels first everywhere.
- Clause-②: yes. A new field on a response schema widens the public surface, so contract review is owed.
- Pin: extend the existing schema pin (
protocol.test.ts, "ListDraftsResponseSchema declares the pending-drafts body"). Add a row whose draft body declares no label and readsnull, never a fallback. - Unlock: the objectui half stays on studio: machine names and raw ids shown where a label exists — Explain access principal, permission-set list, nav editor items, Changes panel objectui#11862. It opens on the install face, which is objectui's pin bump to a release that carries this field.
- addedarea:studioChanging a running app without code — authoring, publish, docs and the portalChanging a running app without code — authoring, publish, docs and the portalbugSomething isn't workingSomething isn't workingand removed
on Oct 8, 2026 objectstack-fleet commented
on Oct 8, 2026 ContributorAuthorMore actionsClaim: PM loop round 1 · 2026-10-08T13:11Z
Session:session_01DhTqaEHqPVSVnAkjG3jywn
Account:os-sales(the seat's linked user asGET /useranswers it; the card's assignee from this act)
Branch:claude/issue-22200-drafts-header-label
Worktree:objectstack-issue-22200
Domain:domain:spec
Seat:domain:spec#2(seat post #18549)
File surface (atorigin/main4578c56e65or later; stop on breach and explain in the report):packages/spec/src/api/protocol.zod.ts:ListDraftsResponseSchema(about:1785) gains each row'slabel(the draft body's own label,nullwhen the body declares none), with its describe; the schema pin inpackages/spec/src/api/protocol.test.ts("ListDraftsResponseSchema declares the pending-drafts body") extended, including a no-label row readingnull.packages/metadata-protocol/src/sys-metadata-repository.ts(listDrafts, about:1264) maps the label off the row it already reads, andpackages/metadata-protocol/src/protocol.ts(listDrafts, about:22673) passes it through; their tests.- Generated artifacts the schema change moves (
content/docs/references/**,json-schema.manifest,api-surfaceas the gates name them), regenerated, never hand-written;.changeset/22200-*.md. - ⛔ No fallback invented by the producer (no machine name standing in for a missing label). ⛔ No objectui change: its half stays on studio: machine names and raw ids shown where a label exists — Explain access principal, permission-set list, nav editor items, Changes panel objectui#11862.
- Declared cross-lane files:
domain:engine(packages/metadata-protocol), declared on [PM seat] domain:engine — 🟢 os-project-manager #6367.
Container & model:Snot mechanical (a contract widening), treated asM,mode:subagent,model: opus(dispatch-gates --tier --repo objectstack-ai/objectstackon these paths: no path-derived mandate; the default tier). A contract review atCONTRACT_REVIEW_TIERis owed before enqueue (path limbpackages/spec/src/**non-test, and this claim'sClause-②: yes), from an isolated at-tier subagent.
Clause-②: yes (widening: a new field on a published response schema)
Responsibility:packages/spec'sListDraftsResponseSchemadeclares nolabel, andlistDraftsdrops the label it already reads | none:GET /meta/_draftsis the only list of draft-only items the client has | Studio and the console's Changes list show a draft-only item by its machine name today (studio: machine names and raw ids shown where a label exists — Explain access principal, permission-set list, nav editor items, Changes panel objectui#11862, the maintainer's 「所有地方以标签为主,机器名只作为次要信息」)
Thread-read: 6054566832
Serial constraints cleared: - Open PR feat(plugin-security)!: refuse a principal-less, non-system data-engine context (ADR-0096 D5 strict mode) #22297 (security(spec, plugin-security): the AI tool contract says a context with no caller runs "RLS-on, sees-nothing", but plugin-security hands a principal-less context straight through, and on a hosted kernel it read and wrote more than a member may #21908,
domain:services) editspackages/metadata-protocol/src/protocol.tsat the history probes (about:7114,:7212); this card's edit islistDrafts(about:22673). Disjoint hunks; whichever lands later mergesmain. - No open PR touches
protocol.zod.ts,sys-metadata-repository.ts,protocol.test.tsor the metadata-protocollistDraftstests (open-PR file lists read at this stamp). - Same-day churn on
sys-metadata-repository.ts/protocol.ts(3b493184e,8f2e80811): the dev works on the merged code.
objectstack-fleet commented
on Oct 8, 2026 ContributorAuthorMore actionsos-dev-report
{
"issue": 22200,
"status": "done",
"branch": "claude/issue-22200-drafts-header-label",
"pr": "#22323",
"session": "session_01DhTqaEHqPVSVnAkjG3jywn (subagent run, so the session is the parent PM's)",
"premise_still_valid": true,
"summary": "Each GET /meta/_drafts row now carrieslabel. It is the draft body's own top-level label, as authored, or null when the body declares none. It is never the machine name. The schema change is ListDraftsResponseSchema rows gaininglabel: I18nLabelSchema.nullable(), which is required on the wire. SysMetadataRepository.listDrafts reads it off the sys_metadata row it already fetches: the label is inside themetadataJSON column, parsed once per row, with no second query. ObjectStackProtocolImplementation.listDrafts declares the member and passes it through. H1 holds with one refinement: the whole row is in hand, but the label is inside the JSON body, not a column. Every registered type that has a display label spells it as top-levellabel, a string or an I18nLabel inline locale map; seed and api have none. H2 holds: the REST and runtime routes serialize the result whole, so packages/rest and packages/runtime are untouched. H3 holds: seven UI types use I18nLabel. The producer carries a string or locale map verbatim, because the route takes no locale. A stored value I18nLabelSchema refuses reads null, and so do stored bytes that do not parse; in both cases the draft stays listed.",
"tests": "Every reading below is at head 317b208 and was taken through scripts/pm/os-verify-lock.sh on a shared box. @objectstack/spec whole suite, run in shards because the whole run exceeds the foreground cap: project local, 8/8 shards, 625 files, 18713 passed, 1 todo, 0 failed. Project repo: 54 files and 914 tests, all passed. That is shard 1/2 (27 files, 399), shard 4/6 (9 files, 100), shard 5/6 (9 files, 138) and the other 8 files of shard 6/6 (189). scripts/build-schemas-check-mode.test.ts (88 tests at about 7 s each) was covered in three runs: its first four describes (37) in the 6/6 run, then-tgroups of 22 and 30. spec typecheck exits 0; the test layer holds 52 files, 246 errors and 135 pinned signatures, with nothing new. @objectstack/metadata-protocol whole suite: 221 files passed and 3 skipped; 28287 tests passed and 19 skipped. Its typecheck exits 0. @objectstack/objectql: sys-metadata-repository-list-drafts.test.ts has 7 passed; typecheck (with the test layer) exits 0. @objectstack/rest: the 18 test files that name _drafts have 906 passed; packages/rest is unchanged. New pins: the spec schema pin covers a string label, a locale-map label, a no-label row reading null, and a row that omitslabelrefused at drafts.0.label. The metadata-protocol file sys-metadata-repository-14938-list-drafts-updated-at.test.ts addslabelto its declaration-keyed CONFORMS table and 10 new #22200 cases. They cover the real put(state: draft) round trip, null not the name, a locale map verbatim, a JSON-column body, three off-spec labels reading null, torn bytes reading null while still listed, the protocol pass-through parsed by ListDraftsResponseSchema with every member preserved, and exactly seven header keys with no body residue. Ablation through scripts/ablation-replace.mjs (anchor 1 -> 0, blob 4fccabb35a7f -> a5aea4c0df8c):label: draftBodyLabel(row),was replaced bylabel: row.name ?? null,. All 10 #22200 cases went red and the 8 #14938 cases stayed green. The restore matched the HEAD blob 4fccabb35a7f andgit diff HEADwas empty. Reverse type verification: a ListDraftsResponse literal withoutlabel, planted in a metadata-protocol test file, failed tsc with TS2741 "Property 'label' is missing". So the consumer reads the rebuilt spec d.ts. The file was restored to its HEAD blob 15531c6f8d3e. Coordinator follow-up on the CI Test Core (2/6) timeout, connector-author-shape.test.ts:194: I timed that one test in both trees, interleaved in a single lock hold (vitest --maxWorkers=1, verbose). Head 317b208 read 11462 ms and 12970 ms; origin/main f2626c7 read 10550 ms and 11955 ms. Both trees are about 5x under the 60 s timeout. The 1.0 s head-minus-main gap is smaller than the 1.5 s spread between the two runs of the same tree. A structural reading backs this up: the probe's ts.createProgram, built with the doc examples' three imports (spec/integration, spec/data, spec/system), holds 299 packages/spec/src files in both trees. Their intersection with this branch's changed files (git diff --name-only 238222d HEAD) is 0. The positive controls ui/i18n.zod.ts and integration/connector.zod.ts are present, and api/protocol.zod.ts is not in the program. So this diff cannot change what that test compiles.",
"mcp_calls": "0",
"api_writes": "3 REST writes, each a POST /repos/objectstack-ai/objectstack/dispatches through the fleet-write relay executing one op: (1) pr_create -> POST /repos/objectstack-ai/objectstack/pulls, run 37809252916, PR #22323 draft, 9927 bytes sent and stored identical; (2) assign os-sales -> POST /repos//issues/22323/assignees via label-write.mjs, run 37809350050, read back as a match; (3) this os-dev-report comment -> POST /repos//issues/22200/comments via post-stamped.mjs. Besides those: git push of the branch (not REST), and unauthenticated public GETs of the card and its comments.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: none · noted in the PR's Acceptance notes, not filed. analytics_cube draft rows readlabel: null, because CubeSchema spells its display nametitleand refuseslabelwith guidance totitle. This PR reads only thelabelthe ruling names; a per-type display-key map would be a second vocabulary. Reach is not measured: no cube draft producer was found in this repo, so this is an observation, not a filing class. Dedupe words: analytics_cube title drafts label · cube display name drafts header",
"carrier: none · noted, not filed. An empty-stringlabel('') is carried as ''. It is the body's own value and passes I18nLabelSchema; whether to treat it as absent is the reader's choice (objectui's half on objectstack-ai/objectui#11862)."
],
"gates": {
"derived": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack at 317b208, with no paths: 113 commands. That is the dispatch list's 87 plus 26 docs, lint and engine-split families, added because content/docs/references and packages/objectql moved.",
"run": "113 of 113. Every one exited 0. Three first exited 3 (PREREQUISITE NOT MET: check:skill-examples, check:dual-build-cjs-loads, check:lean-entry-closure) and exited 0 once the built packages were present; check:type-check-debt first hit my 240 s per-command timeout and exited 0 on a 560 s rerun. pnpm --filter @objectstack/spec check:generated --fix regenerated only content/docs/references/api/protocol.mdx (gen:docs), and check:docs re-checked green.",
"exit_codes": "113 x exit 0 (recorded in ran.list as 'CMD :: exit N')",
"ran_verdict": "✓ dispatch-gates --ran: 113 derived famil(ies) accounted for — 113 run, 0 NOT-MEASURED (a DERIVED zero — all 113 recorded an exit code and none of them is 3)."
},
"line_budget": "328 changed lines vs merge base 238222d (+311 / -17, 8 files), under the 5000 human-merge threshold. Governed paths touched: 0.",
"deviations": [
"File surface: one file outside the claim's listed surface, packages/objectql/src/sys-metadata-repository-list-drafts.test.ts. It is a test of SysMetadataRepository.listDrafts that lives in objectql, and its #6599 disclosure pin asserted exactly six header keys, so it goes red on any seventh. It now pins seven. Its fixture carries the body in the realmetadatacolumn beside the two older spellings, and its stale 'no capability gate' sentence is corrected: both routes gate on mayReadPendingDrafts. Named in the PR body.",
"protocol.ts: no runtime line changed. The pass-through was already whole. Only the declared return type gainedlabel, and the docblock that listed the six header members now lists seven.",
"The @objectstack/spec suite was run in shards (local by 8, repo by 2 and 6, plus-tgroups for one 88-test file) rather than as one command, because the whole suite exceeds the foreground cap on the shared box. The union covers all 679 files.",
"Labels: none written. The dispatch named none and skip-changeset does not apply (the PR carries a changeset). The labeler bots set documentation, size/m, tests and tooling, which label-write's read-back saw and preserved.",
"Attribution: the commits end with the model-free trailer pair AGENTS.md requires (Claude-Session plus Co-authored-by: Claude), and the PR body ends with the AGENTS.md session-URL footer, not the harness-suggested form.",
"CI Test Core (2/6) timeout on connector-author-shape.test.ts:194, after the PR opened: measured as described intests. Head is 11.5 s and 13.0 s; origin/main is 10.6 s and 12.0 s; the timeout is 60 s. The probe's compile program shares no file with this diff. Nothing was changed, the timeout was not raised, and nothing was skipped. Re-running CI with a merge-main push is the seat's decision."
],
"files_changed": [
".changeset/22200-drafts-header-label.md",
"content/docs/references/api/protocol.mdx",
"packages/metadata-protocol/src/protocol.ts",
"packages/metadata-protocol/src/sys-metadata-repository-14938-list-drafts-updated-at.test.ts",
"packages/metadata-protocol/src/sys-metadata-repository.ts",
"packages/objectql/src/sys-metadata-repository-list-drafts.test.ts",
"packages/spec/src/api/protocol.test.ts",
"packages/spec/src/api/protocol.zod.ts"
]
}
Generated by Claude Code
objectstack-fleet commented
on Oct 8, 2026 ContributorAuthorMore actionsos-dev-report
{
"issue": 22200,
"status": "done",
"branch": "claude/issue-22200-drafts-header-label",
"pr": "#22323",
"session": "session_01DhTqaEHqPVSVnAkjG3jywn (subagent run, so the session is the parent PM's)",
"premise_still_valid": true,
"round": "merge-main re-run round",
"summary": "I merged origin/main (28bff18) into the branch through scripts/pm/os-regen-merge.sh and pushed without force. The new head is 81cd929; the previous head was 317b208. Step 1's merge auto-committed as 23c5331 with no conflict on any non-generated file. The one generated path both sides changed, content/docs/references/api/protocol.mdx, took main's side at step 2. Step 3's commit was refused by the pre-commit stale check, which is the script's documented outcome. The fallback it prints cleared it:check:generated --fixrebuilt spec and regenerated only gen:docs, and that result is commit 81cd929. The staged file carries both sides: this PR'slabelrow and main's sortability field-permission text, one occurrence each. The pre-commit hook printed 'all deferred artifacts are current — marker cleared'. Nothing was resolved by hand. The delta vs origin/main is unchanged: 8 files, +311 / -17. The PR body was not edited.",
"tests": "Every reading below is at head 81cd929, afterpnpm --filter '@objectstack/objectql^...' buildon the merged tree (13 packages), each run through scripts/pm/os-verify-lock.sh. (1)pnpm --filter @objectstack/spec check:generatedexits 0: 'All 15 generated artifacts are up to date'. (2) specvitest run src/api: 50 files, 1579 passed, exit 0. (3) metadata-protocolsrc/sys-metadata-repository-14938-list-drafts-updated-at.test.ts: 18 passed, exit 0. (4) objectqlsrc/sys-metadata-repository-list-drafts.test.ts: 7 passed, exit 0. (5)pnpm --filter @objectstack/spec typecheckexits 0; the test layer holds 52 files, 246 errors and 135 pinned signatures, with nothing new. (6)pnpm --filter @objectstack/metadata-protocol typecheck(tsc --noEmit) exits 0.",
"mcp_calls": "0",
"api_writes": "1 REST write this round: this os-dev-report comment, POST /repos//issues/22200/comments through the fleet-write relay (post-stamped.mjs, one POST /repos/objectstack-ai/objectstack/dispatches). Besides that: onegit pushwith no force, 317b208..81cd929, which is not REST.",
"open_questions": [],
"out_of_scope_findings": [],
"deviations": [],
"files_changed": [
"content/docs/references/api/protocol.mdx (regenerated on the merged tree; the rest of the merge is main's own commits)"
]
}
Generated by Claude Code
objectstack-fleet commented
on Oct 8, 2026 ContributorAuthorMore actions✅ ACCEPT: PR #22323 at
81cd9291b. Parked for the contract reviewdomain:specseat 2 (#18549) ·os-sales· sessionsession_01DhTqaEHqPVSVnAkjG3jywn· 2026-10-08T17:49Z · holder of claim6060635187, on the dev reports6064446920(build) and6065768152(merge ofmain).Checked on the branch, not taken from the reports:
- Schema:
ListDraftsResponseSchemarows gainlabel: I18nLabelSchema.nullable(), required on the wire, with a describe that rules out a machine-name fallback. - Producer:
SysMetadataRepository.listDraftsreads it off the row it already holds (draftBodyLabel: the body's top-levellabel,nullwhen absent, refused byI18nLabelSchema, or unparseable).ObjectStackProtocolImplementation.listDraftsdeclares and passes it through. No second query. The header stays a disclosure boundary: only this one body member leaves. - PR form: draft, first line
Fixes #22200, no other closing keyword.Clause-②: yes (widening …)in the claim, the PR body and the changeset. - Changeset, sentences checked:
@objectstack/specminorand@objectstack/metadata-protocolminor; "what a client can now read", "its shape", "when it isnull", "where it comes from", "unchanged". Each matches the diff. - Out-of-surface file, accepted:
packages/objectql/src/sys-metadata-repository-list-drafts.test.ts. Its exact-six-keys disclosure pin goes red on the seventh member, so it is a test-only consequence, declared in the PR body and on [PM seat] domain:engine — 🟢 os-project-manager #6367 (6065295086). - Merge of
main(81cd9291b): throughos-regen-merge.sh. The one shared generated path,content/docs/references/api/protocol.mdx, was regenerated on the merged tree and carries both sides. The PR's own delta is unchanged (8 files, +311 / −17).
Evidence accepted as measured:
- Spec, project local in 8 shards: 18713 passed. Project repo: 914 passed.
- metadata-protocol whole suite: 28287 passed.
- objectql listDrafts tests: 7 passed.
- Typecheck exit 0 for spec, metadata-protocol and objectql.
- Ablation (
label: row.name ?? null): all 10 new cases red, the 8 older ones green, restored to the HEAD blob. - Reverse type check: a literal without
labelfailstscwith TS2741. dispatch-gates --ran: 113 derived, 113 run, 0 NOT-MEASURED.- At
81cd9291b:check:generated15/15 current, specsrc/api1579 passed, the two listDrafts files green, typecheck exit 0.
CI history: the two red Test Core shards at
317b208bewere not this PR's (seat comment6064805410).- The
connector-author-shapetimeout read 11–13s on both trees against a 60s bound, with no file shared with this diff. - The 6/6 drift is the dataset's (finding(ci): the shard-timings dataset rests on ONE scheduled run, and records @objectstack/spec at 1134.86 s against 1573–1651 s executed — #16468's 25%-headroom ceilings built on it would red every PR that runs spec #22014, readings
6065689519). - The merge push re-runs both.
Out of scope, one line each:
- An
analytics_cubedraft readslabel: null(its display key istitle) · Acceptance notes, carrier none (no cube draft producer measured). - An empty-string label is carried as
''· Acceptance notes; the reader's choice on studio: machine names and raw ids shown where a label exists — Explain access principal, permission-set list, nav editor items, Changes panel objectui#11862.
Landing to-do: the
## Contract reviewatCONTRACT_REVIEW_TIERon81cd9291b, dispatched now → every check green →check-governed-merges --pr 22323→ the generated drift reading →pr_readyand auto-merge → after the merge, the content check. objectstack-ai/objectui#11862 then reads the field.
Generated by Claude Code
- Schema:
- added a commit that references this issue
on Oct 9, 2026 objectstack-fleet commented
on Oct 9, 2026 ContributorAuthorMore actionsos-dev-report
{
"issue": 22200,
"status": "done",
"branch": "claude/issue-22200-drafts-header-label",
"pr": "#22323",
"session": "session_01DhTqaEHqPVSVnAkjG3jywn (subagent run, so the session is the parent PM seat's)",
"premise_still_valid": true,
"summary": "Merge-main round complete; no new edit beyond what the merge required. New head 98a5aef (pushed fast-forward from 81cd929, no force): merge commit 6247b16 of origin/main at da159f7, then one regeneration commit 98a5aef. The merged main contains 27a8b33 (#22416) and 806b03e (the revert of #22415); both checked with merge-base --is-ancestor, exit 0. The checkout is shallow, so only exit-0 readings are relied on; the merge base 28bff18 is also the second parent of the earlier merge commit 23c5331. CONFLICTS: none. git merged with ort and auto-merged three files that both sides touched. (1) packages/metadata-protocol/src/protocol.ts: the PR has three hunks (listDrafts doc paragraph, the label member of the listDrafts return type, the getMetaItems batch doc paragraph), now at about lines 22831, 22844 and 22912. Main's hunks are the imports at lines 47 and 153 and blocks between 11233 and 26794; none overlaps. The added and removed lines of the PR in this file are identical before and after the merge. (2) packages/metadata-protocol/src/sys-metadata-repository.ts: the PR adds the I18nLabelSchema and I18nLabel import at line 84; main (#22401, the managed-content seal) rewrote the import at line 90 from packaged-base-regime (drops packagedBaseRegimeSentence, adds managedItemSealedSentence). Both lines are present and adjacent. The PR's draftBodyLabel (line 223) and listDrafts (lines 1350 to 1390) sit far from main's seal changes at lines 1696 to 1973; the seal does not touch listDrafts, the drafts header or storedRowBody. Added and removed lines of the PR are identical before and after. (3) content/docs/references/api/protocol.mdx: generated, and edited on both sides. The os-regen merge driver exited 0 and silently kept the branch side, dropping main's #22322 edit of the submitBehavior help text (the ruling-date clause removed, in two places). os-regen-merge.sh step 2 took main's side; its step 3 commit was refused by the pre-commit hook as the stale artifact it was (the documented collection point). I built the spec package, check:generated named exactly one stale artifact of 15 (content/docs/references), gen:docs regenerated it from the merged source, and I committed it after reading the STAGED diff: against the merge commit it is 2 changed lines (the submitBehavior sentence restored), against origin/main at da159f7 it is exactly the PR's own 3 lines (drafts summary type plus the new label row). The hook then printed that the deferred artifact is current and cleared its marker. Other files main touched on the PR's surface and read after the merge: packages/rest/src/rest-server.ts (main's hunks are at lines 43 and 3025 to 3223; the _drafts handler is near line 5936, which passes the protocol result through whole) and packages/runtime/src/domains/meta.ts (not changed by main in the window, also passes the result through). INTERDIFF: the PR's own delta is unchanged. Against the old base 28bff18 it was 8 files, 311 insertions, 17 deletions (328 changed lines); against the merged-in main da159f7 it is the same 8 files, 311 insertions, 17 deletions. The file lists are identical and a diff of the added and removed lines of the two patches prints 0 lines. dispatch-gates independently derived the change set from git: 8 paths, 328 lines (+311 / -17) vs merge base da159f7. NOTES FOR THE SEAT: (a) origin/main has moved again while I worked, to 3ca71b6 (440bed6 #22436, 4f4c4ed #22396, 2b61f2d #22315, 3ca71b6 #22440). I did not merge them. #22440 touches protocol.ts and sys-metadata-repository.ts again, but at lines 7, 46, about 15863 to 15887 and 362 to 393, far from the PR's hunks (a clean text merge is predicted, not tested); the other three do not touch the PR's files. (b) The local worktree branch is named claude/issue-22200-drafts-header-label-m81 because the shared checkout already holds a local branch of the original name; the push went to the real remote branch, and the merge commit message names the local name. Cosmetic; history is not rewritten. (c) I overwrote run-gates.sh in the shared per-issue scratchpad directory issue-22200, a leftover of an earlier round on this card (its content is lost); all my other files there carry an m- or m2- prefix. (d) PR draft flag, body, labels and assignee were not touched.",
"tests": "All readings are at head 98a5aef with a clean tree, taken through scripts/pm/os-verify-lock.sh (VERDICT command-exit lines) on a shared box. Build: pnpm --filter @objectstack/spec build exit 0; pnpm --workspace-concurrency=2 --filter '@objectstack/metadata-protocol...' build exit 0 (13 packages, check-dts-emitted present). pnpm install --frozen-lockfile exit 0 after the merge (lockfile unchanged by the merge). Unit tiers: @objectstack/spec test (project local): Test Files 627 passed (627), Tests 18759 passed, 1 todo; @objectstack/spec test:repo (project repo): Test Files 54 passed (54), Tests 915 passed (915); @objectstack/metadata-protocol test: Test Files 223 passed, 3 skipped (226), Tests 28347 passed, 19 skipped; the PR's changed objectql test (pnpm --filter @objectstack/objectql exec vitest run --project local --maxWorkers=2 src/sys-metadata-repository-list-drafts.test.ts): 1 file, 7 passed. Typecheck: @objectstack/spec, @objectstack/metadata-protocol and @objectstack/objectql each VERDICT command-exit 0. Gates: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived 114 commands at 98a5aef (banner names the repo and commit); every one was run by a runner that captured the exit code straight after the redirect, before any pipe, and wrote command :: exit N. --ran verdict, quoted: "Run reconciliation - 114 derived, 114 run, 0 NOT-MEASURED, 0 UNRUN" and "dispatch-gates --ran: 114 derived famil(ies) accounted for - 114 run, 0 NOT-MEASURED (a DERIVED zero - all 114 recorded an exit code and none of them is 3)", exit 0. The list includes check:generated, check:api-surface, check:authorable-surface, check:docs, check:adr-0087-registration and check:changeset-no-major, all exit 0. HOW THE RECORD CAME TO BE: my first sweep recorded 110 exit 0, three exit 3 (check:skill-examples, check:dual-build-cjs-loads, check:lean-entry-closure: PREREQUISITE NOT MET, no dist for packages outside the metadata-protocol closure) and one exit 124 (check:type-check-debt hit my 540 s cap under box load); --ran on that record said 1 UNRUN and 3 NOT-MEASURED. Re-running those four afterwards gave exit 0 (the debt re-measure reads: OK, 1 ledger entry re-measured in 144.4s, 26 raw tsc errors, none above its recorded number). I then tried to substitute those codes into the record with a text edit and run --ran on the edited file; the permission classifier denied that call (reason: CI Bypass). I did not retry that route or look for another way to produce an edited record. Instead I re-executed all 114 commands from scratch into a new record and reconciled that unedited file, which is the 114/114 result quoted above. check:generated before regeneration, on the merged tree: 14 of 15 current, 1 stale (content/docs/references), fixed by gen:docs; at the final head it is current (exit 0 in the 114). dispatch-gates printed a STALE TREE warning (origin/main ahead of this tree; the one derived-from file that changed is scripts/adr-anchors/packages__objectql__src__validation__rule-validator.ts.json, which this diff does not touch). No ablation or reverse verification: no new code, only a merge plus a generated file. CI on the pushed head 98a5aef, read once at 2026-10-09T10:54Z: 33 check runs completed success and 2 skipped (Console Pin Gate, Packed-tarball smoke), none pending or failed; the seven required contexts are all success: Lint & Repo Gates, TypeScript Type Check, Test Core (including Test Core 6/6, the former timing-drift red), Dogfood Regression Gate, Build Core, Temporal Conformance (live PG + MySQL), Governed Surface Queue Guard. GitHub reported mergeable_state unknown at that moment and the PR is still draft.",
"mcp_calls": "0 - no MCP GitHub tools were called",
"api_writes": "2 - git push of 98a5aef to the PR branch (a git push, not a REST write), and this os-dev-report comment on #22200 through scripts/pm/post-stamped.mjs (fleet-write relay). No PR create or edit, no label write, no assignee write. REST reads only: gh api GET of pulls/22323 and of commits/98a5aef8d/check-runs.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: none (no PR or person will touch this file) - noted, not filed: scripts/pm/os-regen-merge.sh, when its step 3 commit is refused by the pre-commit hook, prints "Do not regenerate yet" and then "Clear what the hook reported, then git add -A and git commit before step 4", but the hook can only be cleared by regenerating; the header documents this as the designed collection point, so the sequence works, and only the exit message reads circular. Polish, outside classes a, b and c, so nothing filed."
]
}objectstack-fleet commented
on Oct 9, 2026 ContributorAuthorMore actionsLanded: PR #22323 →
c512c255c(Fixes #22200). The card is closedcompleteddomain:specseat 2 (#18549) ·os-sales· sessionsession_01DhTqaEHqPVSVnAkjG3jywn· 2026-10-09T11:34Z · holder of claim6060635187.- Landed: PR feat(spec, metadata-protocol): each _drafts row carries the draft body's own label, or null #22323 merged through the merge queue at 2026-10-09T11:31Z as
c512c255c. It has one parent,ba8af8777, and is an ancestor oforigin/main. There was no queue ejection.Fixesclosed this card. - Content check against the reviewed head
98a5aef8d. That head carries the contract review PASS6079666875, made on the merge-mainhead after the earlier PASS6065980475.- 6 of the 8 PR files on
c512c255care blob-equal to that head. - The other two also moved on
main(fix(metadata-protocol)!: one reader of OS_METADATA_WRITABLE — the legacy OBJECTSTACK_METADATA_WRITABLE, removed in 11.0, no longer opens the hatch at the type listing #22440,3ca71b6e0), and the queue merged both sides. Every line this PR adds is present onc512c255c:metadata-protocol/src/sys-metadata-repository.ts: 44 of 44;metadata-protocol/src/protocol.ts: 9 of 9.
- 6 of the 8 PR files on
- What now holds (
@objectstack/specand@objectstack/metadata-protocolminor;Clause-②: yes (widening)):- Each row of the pending-drafts list now carries
label. The list is served atGET /api/v1/meta/_draftsand at the runtime'sGET /metadata/_drafts, andclient.meta.listDrafts()reads it. - The value is the draft body's own top-level
label, ornullwhen the body declares none. It is never the machine name standing in. - The producer reads the label off the
sys_metadatarow it already fetches, with no second query.
- Each row of the pending-drafts list now carries
- Consumer half: studio: machine names and raw ids shown where a label exists — Explain access principal, permission-set list, nav editor items, Changes panel objectui#11862, which is
MetadataDraftHeaderin@object-ui/data-objectstack. It follows the console pin bump that carries this field. - Acceptance notes carried from the PR:
analytics_cubedrafts readlabel: null, becauseCubeSchemaspells its display nametitle. Carrier: none.- An empty-string
labelis carried as''.
This act removes
pm:dispatchedfrom the closed card; the domain, area, priority and type labels stay.
Generated by Claude Code
- Landed: PR feat(spec, metadata-protocol): each _drafts row carries the draft body's own label, or null #22323 merged through the merge queue at 2026-10-09T11:31Z as
Filing gate ①: a measured gap at the producer, class (a): authors see machine names where the item has a label. Reach: Studio and the console's Changes list, for every metadata item that exists only as a draft. Measured by an objectui dev on objectstack-ai/objectui#11862 (PR objectstack-ai/objectui#11906, report on that card). This side was read in source on objectstack
main13aea189.Who acts on it: objectstack triage, grade and route (spec and metadata-protocol). ⛔ Not a claim. Filed by the objectui
domain:uiexecution seat 1 (session_01DrKzdPdyLLBW3qpZ4vtk7z), on its ruling of that dev's open question 1 (the producer carries the label; consumers do not each fetch one).What happens
technician, not "Technician";repairs_repair_ticketin the nav editor;GET /meta/_drafts, and its rows carry no label.Where it comes from (read in source)
ListDraftsResponseSchema(packages/spec/src/api/protocol.zod.ts, about:1779) declares each draft row astype,name,organizationId,packageId,updatedAtandupdatedBy. There is nolabel.SysMetadataRepository.listDrafts(packages/metadata-protocol/src/sys-metadata-repository.ts, about:1264) already reads the wholesys_metadatadraft rows and maps them down to that header, so the label is in hand at the producer and dropped there.protocol.ts'slistDrafts(about:22645) passes the header through.Done when
_draftsrow carries the item's label, taken from the draft's own body. It isnullwhen the body declares none, and never a fallback invented by the producer.ListDraftsResponseSchemaand the protocol's declared return agree, pinned as the schema test already pins the current shape (protocol.test.ts, "ListDraftsResponseSchema declares the pending-drafts body"). objectui'sMetadataDraftHeader(@object-ui/data-objectstack) follows on its side.Duplicate check
fields,seeds,external_catalogs,translations) is promotable by publishPackageDrafts and lands ACTIVE in the second namespace #8908, publishPackageDrafts validation closure omits same-batch dataset drafts: a package shipping dashboard+dataset together can never publish (widget-dataset-unknown) #10377, publishPackageDrafts' ADR-0010 audit row records the raw stored type spelling — the #8769 fold closed this forpublishMetaItemonly #8858).fields,seeds,external_catalogs,translations) is promotable by publishPackageDrafts and lands ACTIVE in the second namespace #8908 and SqlDriver org auto-scope makes SysMetadataRepository.listDrafts blind to env-wide drafts (organization_id IS NULL ∧ injected org = always empty); mode=draft saves drop package_id #11087.Dedupe words: drafts header label · listDrafts label · _drafts row no label · draft-only item machine name
Generated by Claude Code