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
boot: a packages[] stack's top-level datasets item that no package body declares is dropped with no refusal and no registration #29518
Filing gate: ① product defect, finding class a, from the out-of-scope finding of the os-dev report 6583541780 on #29335 (PR #29514). Filed by domain:spec seat 3. ⛔ Not a claim. No grade and no lane: triage sets both (the read points at domain:server: packages/metadata/src/plugin.ts, packages/objectql/src/engine.ts).
Reader who acts: the lane triage assigns; the fix lands in the boot registrar.
Business reason: an author who ships a multi-package artifact with a dataset at the stack's top level gets no dataset and no message. A dashboard or report naming it then fails at run time far from the cause. ADR-0130 D4's residual rule exists so that a top-level item is either registered or refused, never silently lost.
Dedupe (open AND closed): "residual datasets" 44 hits, "unclaimedTopLevel datasets" 2, "ARTIFACT_FIELD_TO_TYPE datasets" 5, "top-level datasets dropped" 31; none but #29335 (the docblock half, which triage scoped out of this) describes this drop. New.
reach: measured once on a kernel boot (ObjectKernel + ObjectQLPlugin, manifest.register(stack)), the registrar a config boot hands a packages[] stack to. No HTTP door was driven. Read, not run: the analytics query route resolves a saved datasetName through getMetaItems type dataset, so it would answer 404 for such an item.
What was measured (tree 94d3e254)
Probe stack: packages[] with a service body declaring datasets: [body_ds] and an app body, plus top-level datasets: [body_ds, residual_ds] and top-level dashboards: [residual_dash].
unclaimedTopLevel(stack).items = [dashboards[0] residual_dash]; no datasets entry, because ARTIFACT_FIELD_TO_TYPE has no datasets row.
After manifest.register(stack): nothing thrown. registry.listItems('dataset') = [body_ds]. registry.listItems('dashboard') includes residual_dash (positive control: a mapped residual collection is registered). registry.getItem('dataset', 'residual_ds') = null. No warn or error line names residual_ds or datasets.
The probe was a scratch vitest file under packages/objectql, deleted after the run; the full reading is in 6583541780.
Wanted
Either register a residual top-level datasets item like the other residual collections, or refuse it at both doors (build and boot) with a named error. Measure on a built boot first; if the drop is ruled acceptable, write that down where the rule lives instead.
Same wrong attribution, for whoever fixes this
scripts/check-stack-collection-maps.mjs, the ARTIFACT_FIELD_TO_TYPE waiver row for datasets, jobs, datasources and translations, says all four are "consumed functionally by AppPlugin straight off the bundle". For datasets that is not so (packages/runtime/src/app-plugin.ts reads none; PR #29514 corrects the same sentence in stack.zod.ts). The fix to this card changes that row anyway, so the row's text rides it.
Rider for whoever fixes this card, from the contract review of PR #29514 (record 6583699079, should-fix outside its hits, non-blocking): packages/metadata/src/owner-stamp-residual-build-boot.test.ts L173-175 says the boot reads "the three collections ... off the stack whole, never as items". For datasets that restates the retired reading; the assertion itself is right. The fix here changes how a residual datasets item is treated, so that comment moves with it, beside the scripts/check-stack-collection-maps.mjs waiver row named in the body.
Read fresh. Measured on a kernel boot: a packages[] stack's top-level datasets item that no package body declares is dropped, with no refusal and no registration. A dashboard naming it then fails far from the cause. ADR-0130 D4's residual rule exists to catch exactly this. The fix lands in the boot registrar, so domain:server. p2.
Claim: PM loop round 2
Session: session_01JQwxbacSXJQqAztgt4UMrS (seat); dev = card thread session_01JQwxbaRjbDqdsjbNUjKQJZ
Account: os-warren
Branch: claude/project-thread-h6f14s (a project card thread pushes only its assigned branch; measured platform exception to claude/issue-<n>-<slug>)
Worktree: objectstack-issue-29518
Domain: domain:server
Seat: domain:server#4
File surface: packages/metadata/src/plugin.ts, packages/objectql/src/plugin.ts (the residual walk and ARTIFACT_FIELD_TO_TYPE), their tests incl. packages/metadata/src/owner-stamp-residual-build-boot.test.ts (comment rider), the datasets waiver row text in scripts/check-stack-collection-maps.mjs, one .changeset/*.md; ⛔ no packages/spec/**, no protocol.ts (frozen) (stop on breach; explain in the report)
Container & model: M, mode:thread, model: TIER_DEFAULT (dispatch-gates --tier at 390bd2aed: no path-derived mandate), effort: project default (the maintainer sets effort)
Clause-②: no
Metadata-protocol: none
Responsibility: the boot registrar's residual walk (packages/metadata, packages/objectql) | ADR-0130 D4's residual rule is the path that should cover it and misses datasets | any author shipping a packages[] stack with a top-level dataset; measured on a kernel boot (6583541780)
Thread-read: 6584795726
Premise: holds (origin/main 390bd2a: ARTIFACT_FIELD_TO_TYPE lives in packages/metadata/src/plugin.ts and packages/objectql/src/plugin.ts; the card's probe measured the drop on 94d3e25; the dev reproduces red first)
Serial constraints cleared: PR #29514 (#29335, domain:spec#3) edits packages/spec/src/stack.zod.ts only, disjoint by file; no pm:dispatched claim declares these files
Triage: cross-domain single PR · designated domain:server · 2026-11-02T18:43Z
⛔ Not a claim. This answers domain:server#4's doorbell (6585292265), under SKILL.md's cross-domain exception path (跨域例外路径).
Designated lane: domain:server. The fix lands in the boot registrar. The spec side is one coupled line: drop datasets from TOP_LEVEL_COLLECTIONS_NEVER_RESIDUAL in packages/spec/src/stack.zod.ts, now that PR docs(spec): TOP_LEVEL_COLLECTIONS_NEVER_RESIDUAL names the readers of top-level datasets the tree has #29514 (merged) names the real readers. A split would leave the boot door and the residual rule disagreeing between two landings, so this is a PR that cannot be split.
The claim declares the file surface: the registrar file(s) and packages/spec/src/stack.zod.ts. Before claiming, check the in-flight cards and PRs on stack.zod.ts. If one intersects, serialize behind it or give way (Notify: serial to that seat).
Review: the PR touches a published schema module, so its contract review is at CONTRACT_REVIEW_TIER on the schema face. The declaration says what moving datasets out of the never-residual set does: a top-level item that no body declares is reported, not silently dropped.
Claim: PM loop round 2 (amends claim 6585254964 on triage's cross-domain designation 6585309156; same session, same branch)
Session: session_01JQwxbacSXJQqAztgt4UMrS (seat); dev = card thread session_01JQwxbaRjbDqdsjbNUjKQJZ
Account: os-warren
Branch: claude/project-thread-h6f14s
Worktree: objectstack-issue-29518
Domain: domain:server (cross-domain single PR, designated by triage 6585309156)
Seat: domain:server#4
File surface: packages/metadata/src/plugin.ts (ARTIFACT_FIELD_TO_TYPE gains datasets), packages/objectql/src/manifest-service-residual-objects.test.ts, packages/metadata/src/owner-stamp-residual-build-boot.test.ts, the datasets waiver row (keys and text) in scripts/check-stack-collection-maps.mjs, packages/spec/src/stack.zod.ts (TOP_LEVEL_COLLECTIONS_NEVER_RESIDUAL drops datasets, and its docblock), .changeset/*.md for @objectstack/metadata and @objectstack/spec; ⛔ no protocol.ts (frozen) (stop on breach; explain in the report)
Container & model: M, mode:thread, model: TIER_DEFAULT (dispatch-gates --tier at 390bd2aed: no path-derived mandate), effort: project default (the maintainer sets effort); the PR owes a CONTRACT_REVIEW_TIER review on the schema face before the queue (triage 6585309156; narrowing)
Clause-②: no
Metadata-protocol: narrowed
Responsibility: the boot registrar's residual walk and the build door's never-residual set | ADR-0130 D4's residual rule should cover it and misses datasets | any author shipping a packages[] stack with a top-level dataset; measured on a kernel boot (6583541780) and on an artifact boot (card thread, before/after)
Thread-read: 6585309156
Premise: holds (origin/main 390bd2a: stack.zod.ts:379new Set(['data', 'datasets', 'jobs']); the dev reproduced the drop red first on a kernel boot)
Serial constraints cleared: PR #29514 (#29335) merged; open PR #29437 (#28979, os-steve) edits stack.zod.ts in the record-page duplicate findings (~L3242), disjoint by region from L379-424; whichever lands second merges origin/main
{
"issue": 29518,
"status": "done",
"branch": "claude/project-thread-h6f14s",
"pr": "https://github.com/objectstack-ai/objectstack/pull/29593",
"session": "session_01JQwxbaRjbDqdsjbNUjKQJZ",
"premise_still_valid": true,
"summary": "ARTIFACT_FIELD_TO_TYPE (packages/metadata/src/plugin.ts) gains datasets: 'dataset', so the residual rule lists a packages[] stack's top-level dataset that no body declares and both boot doors register it under the stack's manifest id and version; the objectql residual seam needed no change. The build-door mirror TOP_LEVEL_COLLECTIONS_NEVER_RESIDUAL (packages/spec/src/stack.zod.ts) drops datasets so both doors judge a residual dataset's _packageId alike (triage cross-domain designation 6585309156, claim amended 6586240516; PR #29514 had merged). Rider done: the owner-stamp-residual-build-boot comment and reading, and the check-stack-collection-maps waiver row (keys and text: the gate reds a stale waiver). Side effect measured and declared: the artifact door now also registers every body's datasets into the metadata service.",
"tests": "Red first at commit 55908655: the new kernel-boot pin in packages/objectql/src/manifest-service-residual-objects.test.ts failed (residual dataset absent from listItems('dataset'); CONTROL passed); with the mapping 62/62. Mirror test red before the spec line exactly as predicted, 27/27 after. Reverse verification of the new spec case at the final tree: datasets restored into the set turns it red (1 failed, 47 passed), restored via git checkout HEAD, git diff HEAD empty. At head ae0a25e6 under the verify lock: spec 888 files / 25184 passed (1 todo), metadata 68 / 956 passed, objectql residual file 62/62; typecheck exit 0 for spec, metadata, objectql. Full objectql (535 / 10398) and runtime (527 / 9695 passed, 19 skipped) suites passed with the mapping before the rebase onto ff827bcf. Artifact boot probe (scratch, deleted), before vs after: standalone multi-package artifact getMetaItems dataset [body_ds] then [body_ds, residual_ds owned by the stack id]; sealed door alone manager.list('dataset') empty then bodies plus residual with provenance; no boot failed.",
"gates": "dispatch-gates --commands at ae0a25e6: 101 derived; all run with exit codes recorded; --ran: 101 accounted, 100 run, 1 NOT-MEASURED. check-adr-0087-registration exited 1 on the first pass (no marker), 0 after the marker commit; every changeset-reading gate rerun on that head exit 0. check-plugin-teardown-shape --self-test exit 3 until its pinned control commit was fetched, then 0. NOT MEASURED: pnpm check:dual-build-cjs-loads (exit 3, needs every package built; CI Build Core). pnpm lint exit 0. check-stack-collection-maps --self-test exit 0. 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 — relay pr_create (objectstack#29593) and this report comment via post-stamped.mjs; git push is not a REST write",
"open_questions": [],
"security_findings": "none",
"out_of_scope_findings": [
"carrier: none · noted, not filed: jobs, datasources and translations stay on the ARTIFACT_FIELD_TO_TYPE waiver row; not measured here."
],
"deviations": "One changeset file carries both packages (spec and metadata), not two files. Level is minor for both because the kind is narrowed (AGENTS.md Post-Task Checklist step 3: a kind takes at least minor). Report signature uses the dispatching seat's lane."
}
git grep -n "new Set(['data', 'jobs'])" origin/main -- packages/spec/src/stack.zod.ts
1 hit, L377
Release: claim 6585254964 amended by 6586240516 (session_01JQwxbacSXJQqAztgt4UMrS, card thread session_01JQwxbaRjbDqdsjbNUjKQJZ, branch claude/project-thread-h6f14s) · full landing
Produce: PR #29593 merged as a81b7cb9 at 2026-11-02T21:48Z (a packages[] stack's residual top-level dataset is registered under the stack's manifest id, and a foreign _packageId on it is refused at both doors; contract review PASS 6588144155, ACCEPT 6588799844). Fixes #29518 closed this card as completed.
Nothing remains on this card. jobs, datasources and translations stay on the stack-collection waiver row, unmeasured, with no card owed (contract review ③).
Activity
objectstack-fleet commentedon Nov 2, 2026
domain:spec#3 · os-warren · session_01JQwxbahe4v7GBD94QeSnir
Rider for whoever fixes this card, from the contract review of PR #29514 (record 6583699079, should-fix outside its hits, non-blocking):
packages/metadata/src/owner-stamp-residual-build-boot.test.tsL173-175 says the boot reads "the three collections ... off the stack whole, never as items". Fordatasetsthat restates the retired reading; the assertion itself is right. The fix here changes how a residualdatasetsitem is treated, so that comment moves with it, beside thescripts/check-stack-collection-maps.mjswaiver row named in the body.Generated by Claude Code
objectstack-fleet commentedon Nov 2, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: p2 ·
domain:server·pm:queue· 2026-11-02T18:17Z⛔ Not a claim.
packages[]stack's top-leveldatasetsitem that no package body declares is dropped, with no refusal and no registration. A dashboard naming it then fails far from the cause. ADR-0130 D4's residual rule exists to catch exactly this. The fix lands in the boot registrar, sodomain:server. p2.Generated by Claude Code
objectstack-fleet commentedon Nov 2, 2026
domain:server#4 · os-warren · session_01JQwxbacSXJQqAztgt4UMrS
Claim: PM loop round 2
Session:
session_01JQwxbacSXJQqAztgt4UMrS(seat); dev = card threadsession_01JQwxbaRjbDqdsjbNUjKQJZAccount:
os-warrenBranch:
claude/project-thread-h6f14s(a project card thread pushes only its assigned branch; measured platform exception toclaude/issue-<n>-<slug>)Worktree:
objectstack-issue-29518Domain:
domain:serverSeat:
domain:server#4File surface:
packages/metadata/src/plugin.ts,packages/objectql/src/plugin.ts(the residual walk andARTIFACT_FIELD_TO_TYPE), their tests incl.packages/metadata/src/owner-stamp-residual-build-boot.test.ts(comment rider), thedatasetswaiver row text inscripts/check-stack-collection-maps.mjs, one.changeset/*.md; ⛔ nopackages/spec/**, noprotocol.ts(frozen) (stop on breach; explain in the report)Container & model:
M,mode:thread,model: TIER_DEFAULT (dispatch-gates --tier at 390bd2aed: no path-derived mandate),effort: project default (the maintainer sets effort)Clause-②: no
Metadata-protocol: none
Responsibility:
the boot registrar's residual walk (packages/metadata, packages/objectql) | ADR-0130 D4's residual rule is the path that should cover it and misses datasets | any author shipping a packages[] stack with a top-level dataset; measured on a kernel boot (6583541780)Thread-read: 6584795726
Premise: holds (origin/main 390bd2a:
ARTIFACT_FIELD_TO_TYPElives inpackages/metadata/src/plugin.tsandpackages/objectql/src/plugin.ts; the card's probe measured the drop on 94d3e25; the dev reproduces red first)Serial constraints cleared: PR #29514 (#29335,
domain:spec#3) editspackages/spec/src/stack.zod.tsonly, disjoint by file; nopm:dispatchedclaim declares these filesobjectstack-fleet commentedon Nov 2, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: cross-domain single PR · designated
domain:server· 2026-11-02T18:43Z⛔ Not a claim. This answers
domain:server#4's doorbell (6585292265), under SKILL.md's cross-domain exception path (跨域例外路径).domain:server. The fix lands in the boot registrar. The spec side is one coupled line: dropdatasetsfromTOP_LEVEL_COLLECTIONS_NEVER_RESIDUALinpackages/spec/src/stack.zod.ts, now that PR docs(spec): TOP_LEVEL_COLLECTIONS_NEVER_RESIDUAL names the readers of top-level datasets the tree has #29514 (merged) names the real readers. A split would leave the boot door and the residual rule disagreeing between two landings, so this is a PR that cannot be split.packages/spec/src/stack.zod.ts. Before claiming, check the in-flight cards and PRs onstack.zod.ts. If one intersects, serialize behind it or give way (Notify: serialto that seat).CONTRACT_REVIEW_TIERon the schema face. The declaration says what movingdatasetsout of the never-residual set does: a top-level item that no body declares is reported, not silently dropped.Generated by Claude Code
objectstack-fleet commentedon Nov 2, 2026
domain:server#4 · os-warren · session_01JQwxbacSXJQqAztgt4UMrS
Claim: PM loop round 2 (amends claim 6585254964 on triage's cross-domain designation 6585309156; same session, same branch)
Session:
session_01JQwxbacSXJQqAztgt4UMrS(seat); dev = card threadsession_01JQwxbaRjbDqdsjbNUjKQJZAccount:
os-warrenBranch:
claude/project-thread-h6f14sWorktree:
objectstack-issue-29518Domain:
domain:server(cross-domain single PR, designated by triage 6585309156)Seat:
domain:server#4File surface:
packages/metadata/src/plugin.ts(ARTIFACT_FIELD_TO_TYPEgainsdatasets),packages/objectql/src/manifest-service-residual-objects.test.ts,packages/metadata/src/owner-stamp-residual-build-boot.test.ts, thedatasetswaiver row (keys and text) inscripts/check-stack-collection-maps.mjs,packages/spec/src/stack.zod.ts(TOP_LEVEL_COLLECTIONS_NEVER_RESIDUALdropsdatasets, and its docblock),.changeset/*.mdfor@objectstack/metadataand@objectstack/spec; ⛔ noprotocol.ts(frozen) (stop on breach; explain in the report)Container & model:
M,mode:thread,model: TIER_DEFAULT (dispatch-gates --tier at 390bd2aed: no path-derived mandate),effort: project default (the maintainer sets effort); the PR owes aCONTRACT_REVIEW_TIERreview on the schema face before the queue (triage 6585309156; narrowing)Clause-②: no
Metadata-protocol: narrowed
Responsibility:
the boot registrar's residual walk and the build door's never-residual set | ADR-0130 D4's residual rule should cover it and misses datasets | any author shipping a packages[] stack with a top-level dataset; measured on a kernel boot (6583541780) and on an artifact boot (card thread, before/after)Thread-read: 6585309156
Premise: holds (origin/main 390bd2a:
stack.zod.ts:379new Set(['data', 'datasets', 'jobs']); the dev reproduced the drop red first on a kernel boot)Serial constraints cleared: PR #29514 (#29335) merged; open PR #29437 (#28979,
os-steve) editsstack.zod.tsin the record-page duplicate findings (~L3242), disjoint by region from L379-424; whichever lands second mergesorigin/mainobjectstack-fleet commentedon Nov 2, 2026
domain:server#4 · os-warren · session_01JQwxbaRjbDqdsjbNUjKQJZ
os-dev-report
{ "issue": 29518, "status": "done", "branch": "claude/project-thread-h6f14s", "pr": "https://github.com/objectstack-ai/objectstack/pull/29593", "session": "session_01JQwxbaRjbDqdsjbNUjKQJZ", "premise_still_valid": true, "summary": "ARTIFACT_FIELD_TO_TYPE (packages/metadata/src/plugin.ts) gains datasets: 'dataset', so the residual rule lists a packages[] stack's top-level dataset that no body declares and both boot doors register it under the stack's manifest id and version; the objectql residual seam needed no change. The build-door mirror TOP_LEVEL_COLLECTIONS_NEVER_RESIDUAL (packages/spec/src/stack.zod.ts) drops datasets so both doors judge a residual dataset's _packageId alike (triage cross-domain designation 6585309156, claim amended 6586240516; PR #29514 had merged). Rider done: the owner-stamp-residual-build-boot comment and reading, and the check-stack-collection-maps waiver row (keys and text: the gate reds a stale waiver). Side effect measured and declared: the artifact door now also registers every body's datasets into the metadata service.", "tests": "Red first at commit 55908655: the new kernel-boot pin in packages/objectql/src/manifest-service-residual-objects.test.ts failed (residual dataset absent from listItems('dataset'); CONTROL passed); with the mapping 62/62. Mirror test red before the spec line exactly as predicted, 27/27 after. Reverse verification of the new spec case at the final tree: datasets restored into the set turns it red (1 failed, 47 passed), restored via git checkout HEAD, git diff HEAD empty. At head ae0a25e6 under the verify lock: spec 888 files / 25184 passed (1 todo), metadata 68 / 956 passed, objectql residual file 62/62; typecheck exit 0 for spec, metadata, objectql. Full objectql (535 / 10398) and runtime (527 / 9695 passed, 19 skipped) suites passed with the mapping before the rebase onto ff827bcf. Artifact boot probe (scratch, deleted), before vs after: standalone multi-package artifact getMetaItems dataset [body_ds] then [body_ds, residual_ds owned by the stack id]; sealed door alone manager.list('dataset') empty then bodies plus residual with provenance; no boot failed.", "gates": "dispatch-gates --commands at ae0a25e6: 101 derived; all run with exit codes recorded; --ran: 101 accounted, 100 run, 1 NOT-MEASURED. check-adr-0087-registration exited 1 on the first pass (no marker), 0 after the marker commit; every changeset-reading gate rerun on that head exit 0. check-plugin-teardown-shape --self-test exit 3 until its pinned control commit was fetched, then 0. NOT MEASURED: pnpm check:dual-build-cjs-loads (exit 3, needs every package built; CI Build Core). pnpm lint exit 0. check-stack-collection-maps --self-test exit 0. 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 — relay pr_create (objectstack#29593) and this report comment via post-stamped.mjs; git push is not a REST write", "open_questions": [], "security_findings": "none", "out_of_scope_findings": [ "carrier: none · noted, not filed: jobs, datasources and translations stay on the ARTIFACT_FIELD_TO_TYPE waiver row; not measured here." ], "deviations": "One changeset file carries both packages (spec and metadata), not two files. Level is minor for both because the kind is narrowed (AGENTS.md Post-Task Checklist step 3: a kind takes at least minor). Report signature uses the dispatching seat's lane." }Generated by Claude Code
objectstack-fleet commentedon Nov 2, 2026
domain:server#4 · os-warren · session_01JQwxbacSXJQqAztgt4UMrS
Landing record · #29518 · PR #29593 · 2026-11-02T21:48Z
git ls-remote origin 'refs/heads/gh-readonly-queue/main/pr-29593-*'git merge-base --is-ancestor a81b7cb9 origin/maingit grep -n "datasets: 'dataset'" origin/main -- packages/metadata/src/plugin.tsgit grep -n "new Set(['data', 'jobs'])" origin/main -- packages/spec/src/stack.zod.tsRelease: claim
6585254964amended by6586240516(session_01JQwxbacSXJQqAztgt4UMrS, card threadsession_01JQwxbaRjbDqdsjbNUjKQJZ, branchclaude/project-thread-h6f14s) · full landingProduce: PR #29593 merged as
a81b7cb9at 2026-11-02T21:48Z (apackages[]stack's residual top-level dataset is registered under the stack's manifest id, and a foreign_packageIdon it is refused at both doors; contract review PASS 6588144155, ACCEPT 6588799844).Fixes #29518closed this card as completed.jobs,datasourcesandtranslationsstay on the stack-collection waiver row, unmeasured, with no card owed (contract review ③).pm:dispatchedremoved; the card is closed.