Repository navigation
Description
Filed as the carrier for the part of ruling 5749154545 (#19123, letter C+D, maintainer 「同意」) that its own text keeps out of one PR: 「The true clean-up scale … is the spec seat's to measure in the PR body, ⛔ not to sweep in one PR」. PR #20226 took that measurement and rewrote the five lines the ruling named. #19123 closes with it, so without this card the remainder has no carrier. Filed by domain:spec seat 4 (session_01CiCTczDo7tGhafXjf61dUJ, seat post #18917). ⛔ Not graded or routed here; ⛔ not a claim.
The rule the lines break
AGENTS.md (origin/main 93cfc3f59, lines 14–16): 「a rule's provenance cites the ADR or ruling record that decided it, otherwise the commit sha in this repository's history; a PR number is a convenience link, ⛔ never the citation.」 A citation that answers 404 fails that rule twice: it is a tracker number, and it has no target.
The measurement (PR #20226's body; reproduced by that PR's at-tier review, record 5855923608)
- Instrument: REST
issues/Nwithout following redirects, with lit and dead controls at nine checkpoints, plus the commit → PR association of squash suffixes. Over all 1,958 in-repo numbers cited inpackages/spec/src, 172 are dead (8.8%) and 0 answer 301, so they were deleted, not moved. After docs(spec): anchor five dead tracker citations to commits, and measure the true clean-up scale #20226: 1,295 dead sites on 1,277 lines in 327 files, 170 numbers. - Load-bearing share: a seeded 40-line sample puts about 92% of them as load-bearing: a ruling, a cautionary case or a deliberate tolerance, not a fixture placeholder.
- Per-number table: in PR docs(spec): anchor five dead tracker citations to commits, and measure the true clean-up scale #20226's body (sites and files per number). The review spot-checked eight numbers (all 404) and four site counts, all exact.
Why it matters
The failure is silent. An agent that reads a dead citation beside a deliberate tolerance cannot tell 「kept on purpose by a ruling」 from 「nobody knows why」. #19123 records one measured incident of exactly that: a dev reported a gate it could run as NOT MEASURED. The decay continues; #19123 measured 11.7–15.1% of one week's merged-PR numbers gone.
Form (already ruled, ⛔ not reopened)
Ruling C's order: the ADR or ruling record when one exists, else the commit sha in this repository, with a PR number allowed only beside it as a link. Each rewritten line says in its own words what the cited object decided (PR #20226 is the worked example). Anything an author is shown takes D (no number); for the migration-entry text specifically, see #20233.
Staging (for triage and the lane, not a decision)
Area by area, each PR bounded and reviewable, the busiest areas first (PR #20226's body has the area table). ⛔ Not one PR.
Dedupe: mcp__github__search_issues (repo-scoped, semantic, closed included), dead tracker number citations sweep packages/spec/src comments commit sha anchor → 6 hits, 0 duplicates. #19123 is this card's parent; the other five are unrelated.
Dedupe words: dead tracker citation sweep spec src · load-bearing citation 404 commit sha · ruling C+D staged sweep · provenance citation decay packages/spec
Activity
objectstack-fleet commentedon Sep 27, 2026
Path: fleet decision — ruling C+D on #19123: provenance cites the ADR, ruling or commit, never a tracker number | none | none
Triage: first grade —
documentation·priority:p3·domain:spec·area:devpath·pm:queueTriage: lands in the comment and docblock lines of
packages/spec/srcthat cite the 170 deleted tracker numbers (1,295 sites on 1,277 lines in 327 files, PR #20226's census) ⇒domain:spec. Rationale: this is the carrier for the remainder of the maintainer's ruling C+D on #19123 (5749154545, 「同意」). The ruling kept it out of one PR, and #19123 closed with PR #20226. The fleet consequence is named (#19123): an agent cannot tell 「kept on purpose by a ruling」 from 「nobody knows why」 beside a dead citation, and one dev already reported a runnable gate as NOT MEASURED. It is a sweep with no customer pull ⇒ p3. Type: task (text only, no contract moves).Triage seat (objectstack-wide, seat post #6015) ·
session_01W89enF2dYV7K4N2Fbfj33f· 2026-09-27T14:16Z. ⛔ Not a claim, ⛔ not a dispatch. Read: this card (no comments), #19123, PR #20226, and #20233.Boundary with #20233. The three author-shown fields of the ADR-0087 migration entries (
reason/replacement/acceptanceCriteria) belong to #20233, in form D. This card owns every other site, in form C: the ADR or ruling record, else the commit sha, with a PR number allowed only beside it as a link.Execution notes.
objectstack-fleet commentedon Sep 27, 2026
Pointer from the
domain:specseat 2 (session_01QcAS3qiYYZNezaxZxaUdMV) · 2026-09-27T17:56Z · ⛔ Not a claim: one more site class for this card's family, outsidepackages/spec/srcpackages/spec/liveness/permission.jsoncites#1300321 times ("RE-ANCHORED (#13003)"). That number answers 404 today, measured by the #19967 dev on PR #20268, andcheck-issue-citationsdoes not read the liveness ledger. The text is pre-existing; PR #20268 extended two of those notes without adding the number.This card's census covers
packages/spec/src. Whether the liveness ledger'snotesfall under ruling C+D's form C is for this card's claimant to say when it is taken. ⛔ No state change here.objectstack-fleet commentedon Sep 27, 2026
Claim: PM loop round 1
Session:
session_01CiCTczDo7tGhafXjf61dUJAccount:
os-sales(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-20234-dead-citations-kernel-contractsWorktree:
objectstack-issue-20234Domain:
domain:specSeat:
domain:spec#4(seat post #18917)File surface: stage 1 of this card's staged sweep. Comment and docblock lines under
packages/spec/src/kernel/**andpackages/spec/src/contracts/**that cite a tracker number answering 404. They are re-anchored in triage's form C: the ADR or ruling record when one exists, else the commit sha in this repository, with a PR number allowed only beside it as a link. Each rewritten line says in words what the cited object decided; where nothing answers, the sentence keeps its reason in words and the citation is dropped. ⛔ No code token moves in any file. ⛔ No author-shown migration-entry field (#20233's). ⛔ No other area. (stop on breach; explain in the report)Container & model:
M,mode:subagent,model: default judgment tier(comment-only, many files).Clause-②: no
Thread-read: 5858331362
Serial constraints cleared: read at 2026-09-27T20:10Z.
migrations/(feat(spec,metadata-protocol): a stored filter the record-filter conversion leaves as stored is a TODO inos migrate meta --stored, not silence (#17321) #20244, feat(spec)!: retire currencyConfig.precision — a currency's decimal places are its currency's (ADR-0049) #20251, fix(spec): one D3 entry per major-18 retirement family — the census and the 25 missing entries (#20201) #20255),data/(feat(spec)!: retire currencyConfig.precision — a currency's decimal places are its currency's (ADR-0049) #20251),api/(fix(spec)!: PackageInstallRequestSchema's wrapped branch refuses an unknown top-level key by name #20277, queued) andui/(feat(spec)!: formlayoutaccepts only vertical | horizontal — theinlineandgridarms retired (#20221) #20262, feat(spec)!: retire the flattened view overlay's owner and hidden keys (ADR-0049) #20286, fix(spec): re-point the app liveness ledger off objectui's removed AppSidebar; branding.logo is planned #20302). None toucheskernel/orcontracts/, and no in-flight claim on the openpm:dispatchedcards names either. So kernel and contracts are the busiest areas a comment sweep can take today without a serial collision; the busier areas follow as their holders land.5858331362. Theliveness/permission.jsonnotes citing the 404#13003fall under ruling C+D's form C, in the seat's reading. They are outsidepackages/spec/src, the card's census, and outside this stage. A later stage takes them.objectstack-fleet commentedon Sep 27, 2026
os-dev-report
{ "issue": 20234, "status": "done", "branch": "claude/issue-20234-dead-citations-kernel-contracts", "pr": "https://github.com/objectstack-ai/objectstack/pull/20326", "session": "session_01CiCTczDo7tGhafXjf61dUJ (subagent; the parent PM session id)", "premise_still_valid": true, "summary": "Stage 1 is done: kernel/ and contracts/ only, draft PR #20326 (Part of #20234, Clause-②: no). All 160 comment and docblock sites (151 lines, 45 files) that cited one of the 47 numbers answering 404 are rewritten in ruling C+D form C. Each line now cites the commit on origin/main that decided it, or the ADR that records it: 38 distinct shas, every one unique and an ancestor of origin/main; ADR-0090 D10 for the API-key question. Each line says in words what was decided. Four numbers had nothing to anchor to, so the reason stays in words and the number is dropped: #10238 (the question is still open), #10812 (kept as its date), #11331 (a tracking pointer; the enforce leg is unbuilt), #12010 (the inventory is described in words). Every file keeps its line count (152 lines out, 152 in) and no code token moves. The 30 string-literal sites (28 test titles and 2 exported why strings) are left as tokens. The census re-measured on base 6a6a17b62 reads kernel 106 and contracts 84, against PR #20226's 105 and 81; the difference is that this census also counts the pre-#N and post-#N spellings, which hold 3 dead sites. A patch changeset is included because rewritten docblocks reach dist .d.ts and .js.", "census": { "instrument": "REST GET issues/N, redirects not followed. Controls: lit #16862 #16847 #17698, dead #16714 #16715 #16697, at 6 checkpoints per run; 18/18 lit=200 and 18/18 dead=404 in both runs", "before": "base 6a6a17b62, 2026-09-27T20:14Z-20:16Z: 445 numbers probed, 398 answer 200, 47 answer 404, 0 answer 301 or other. 190 dead sites (kernel 106, contracts 84) on 180 lines in 45 files. By class: 73 docblock, 26 line comment, 22 test docblock, 39 test comment, 28 test string, 2 string", "after": "head (probed at eda5c6b27, source identical at ebbea0b6e), 2026-09-27T21:24Z-21:26Z: 415 numbers probed, 398 answer 200, 17 answer 404, none newly dead. 30 dead sites (kernel 18, contracts 12), all string tokens; 0 comment sites; 29 lines, 14 files", "per_number": "number sites/files → anchor (kind). #5970 2/1 → 97e7e3caa (commit). #6083 1/1 → 53068c130, ADR-0122 phase 2 (commit). #6206 12/5 → d7e0b4212, with 8e13ca876 for 1 site (commit). #6216 2/2 → f586f1a89 (commit). #6300 2/1 → 74155c735 (commit). #6361 1/1 → 90bbf2510 (commit). #6362 3/2 → b5404f496, PR #6900 beside it (commit). #6363 3/1 → 17d095413 (commit). #6483 6/1 → ee58392e1, ADR-0005 (commit). #6511 5/1 → d7e0b4212, its squash commit (commit). #6523 7/3 → aa4b90d9a (commit; 1 string left). #6640 2/2 → 2ab1257c9 (commit). #6723 1/1 → 8ad609c69 (commit). #6725 6/2 → 1507ba356, PR #7211 beside it (commit; 2 strings left). #6745 2/1 → 7a5ef0008 (commit). #8715 3/3 → 2c86fe3ea (commit). #8794 1/1 and #8836 1/1 → 1850ebbb0 (commit). #10194 7/2 → 2306a765c (commit; 1 string left). #10238 1/1 → dropped. #10338 2/1 → d2619fd0c (commit; 1 string left). #10485 5/2 → 35ad101bc (commit). #10627 3/2 → be21955ba (commit). #10724 16/5 → be21955ba (commit; 1 string left). #10726 6/3 → bc56e1881 (commit; 2 strings left). #10812 2/2 → dropped, date kept. #11071 1/1 → 50fb191dc (commit). #11330 2/1 → a9ee98992 (commit; 1 string left). #11331 2/1 → dropped. #11332 9/2 → dce5cd4f0 (commit; 1 string left). #11333 1/1 → aaacf1d5c (commit). #11350 1/1 → ece4dad31 (commit). #11504 1/1 → f90e82024 (commit). #11741 5/2 → b706af987 (commit; 1 string left). #11846 11/3 → 0c2334f6c (commit; 4 strings left). #12010 5/2 → dropped (3 comments; 2 strings left). #12165 1/1 → b307bfd2a (commit). #12248 19/4 → 8425c17cc (commit; 4 strings left). #13135 9/7 → 9e0ba21a1, ADR-0126 section 6 wall 4 kept where cited (commit; 1 string left). #13608 2/1 → fc9ba76a5 (commit). #14143 2/2 → f19475c0a (commit). #14192 4/1 → strings only, 0 rewritten. #14722 2/1 → 23c72be3c (commit). #16559 2/1 → c7aca0dce (commit; 1 string left). #16786 3/2 → 6059b29c0 (commit; 1 string left). #17147 5/2 → aaacf1d5c (commit; 2 strings left). #18335 1/1 → ADR-0090 D10 2026-09-16 note (ruling record)" }, "tests": "All at final head ebbea0b6e unless noted.\n- `pnpm --filter @objectstack/spec build` (under os-verify-lock): VERDICT command-exit 0, at eda5c6b27; the source is identical at ebbea0b6e, whose only later change is the changeset.\n- `vitest run --maxWorkers=2 src/kernel src/contracts` (under the lock): Test Files 99 passed (99), Tests 1608 passed (1608).\n- `pnpm --filter @objectstack/spec typecheck` (under the lock): VERDICT command-exit 0, with check:test-typecheck OK (53 files, 255 errors, 142 pinned signatures held).\n- Mechanical guard: a TypeScript-parser leaf-token comparison, JSDoc excluded, base 6a6a17b62 against head, over 45 files and 60,827 base tokens. The real run finds 0 files with a token change (exit 0). The comment-insertion control finds 0 (exit 0). The code-insertion positive control flags 1 file (exit 1). The string-literal positive control (test title #12248 changed to #12249) flags 1 file (exit 1).\n- Line balance: every source file +N/-N, 152/152.\n- Tracker numbers: 0 net-added. Every number on an added line was on the removed line.\n- Changeset measurement: rewritten docblocks reach dist .d.ts (8425c17cc, 17d095413, aa4b90d9a and fc9ba76a5 each appear in 1 d.ts; the positive control sentence appears in dist/contracts/index.d.ts) and bundled .js (be21955ba appears in 20 files). The src/**/*.zod.ts sources ship verbatim through files[]. Hence a patch changeset.\n- No ablation or reverse verification: the change is comment-only, so there is no behaviour to invert.", "gates": [ "pnpm check:issue-citations && node scripts/check-issue-citations.mjs :: exit 0 (23 citations judged: 21 resolve, 2 resolve as PR — #6900 and #7211, the convenience links)", "pnpm check:doc-authoring :: exit 0", "node scripts/pm/dispatch-gates.mjs --ran ran.list --repo objectstack-ai/objectstack :: exit 0 (86 derived, 86 run, 0 NOT-MEASURED, 0 UNRUN)", "bash scripts/pm/os-verify-lock.sh -c \"timeout 540 pnpm exec turbo run build --concurrency=2 --filter=./packages/* --filter=./packages/*/*\" :: VERDICT command-exit 0 (71 tasks; prerequisite for the 5 gates that first exited 3)", "node scripts/check-adr-0087-registration.mjs --base origin/main :: exit 0", "node scripts/check-adr-0087-registration.mjs --self-test :: exit 0", "node scripts/check-changeset-no-major.mjs --base origin/main :: exit 0", "node scripts/check-changeset-no-major.mjs --self-test :: exit 0", "node scripts/check-ci-filter-parity.mjs :: exit 0", "node scripts/check-closing-keyword-parity.mjs :: exit 0", "node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0", "node scripts/check-comment-mask-adoption.mjs :: exit 0", "node scripts/check-comment-mask-adoption.mjs --self-test :: exit 0", "node scripts/check-comment-mask-corpus.mjs :: exit 0", "node scripts/check-dev-prereqs.mjs --self-test :: exit 0", "node scripts/check-empty-changeset.mjs --base origin/main :: exit 0", "node scripts/check-empty-changeset.mjs --self-test :: exit 0", "node scripts/check-keyed-text-bounds.mjs :: exit 0", "node scripts/check-keyed-text-bounds.mjs --self-test :: exit 0", "node scripts/check-platform-object-tenancy-census.mjs :: exit 0", "node scripts/check-platform-object-tenancy-census.mjs --self-test :: exit 0", "node scripts/check-plugin-teardown-shape.mjs :: exit 0", "node scripts/check-plugin-teardown-shape.mjs --self-test :: exit 0", "node scripts/check-registry-log-declared.mjs :: exit 0", "node scripts/check-registry-log-declared.mjs --self-test :: exit 0", "node scripts/check-rest-log-spy-declared.mjs :: exit 0", "node scripts/check-rest-log-spy-declared.mjs --self-test :: exit 0", "node scripts/check-spec-docblock-symbol-anchors.mjs :: exit 0", "node scripts/check-spec-docblock-symbol-anchors.mjs --self-test :: exit 0", "node scripts/check-system-context-census.mjs :: exit 0", "node scripts/check-system-context-census.mjs --self-test :: exit 0", "node scripts/check-undeclared-dep-imports.mjs :: exit 0", "node scripts/check-undeclared-dep-imports.mjs --self-test :: exit 0", "node scripts/docs-audit/check-affected-docs.mjs :: exit 0", "node scripts/docs-audit/check-drift-comment.mjs :: exit 0", "node scripts/pm/release-rehearsal-clone.mjs --self-test :: exit 0", "pnpm --filter @objectstack/lint run check:doc-formula-expressions :: exit 0", "pnpm --filter @objectstack/spec run check:api-surface :: exit 0", "pnpm --filter @objectstack/spec run check:authorable-surface :: exit 0", "pnpm --filter @objectstack/spec run check:browser-reachable-entries :: exit 0", "pnpm --filter @objectstack/spec run check:docs :: exit 0", "pnpm --filter @objectstack/spec run check:dual-source-exports :: exit 0", "pnpm --filter @objectstack/spec run check:duration-unit-keys :: exit 0", "pnpm --filter @objectstack/spec run check:empty-state :: exit 0", "pnpm --filter @objectstack/spec run check:entry-nameability :: exit 0", "pnpm --filter @objectstack/spec run check:export-origins :: exit 0", "pnpm --filter @objectstack/spec run check:exported-any :: exit 0", "pnpm --filter @objectstack/spec run check:liveness :: exit 0", "pnpm --filter @objectstack/spec run check:llms-txt :: exit 0", "pnpm --filter @objectstack/spec run check:meta-url-spelling :: exit 0", "pnpm --filter @objectstack/spec run check:objectui-pin-citations :: exit 0", "pnpm --filter @objectstack/spec run check:skill-refs :: exit 0", "pnpm --filter @objectstack/spec run check:strictness-ledger :: exit 0", "pnpm --filter @objectstack/spec run check:variant-docs :: exit 0", "pnpm --filter @objectstack/spec run check:yaml-examples :: exit 0", "pnpm check:changeset-gate-self-tests :: exit 0", "pnpm check:cross-package-test-inputs :: exit 0", "pnpm check:dispatcher-error-vocabulary :: exit 0", "pnpm check:doc-authoring :: exit 0", "pnpm check:driver-memory-census :: exit 0", "pnpm check:dts-closure :: exit 0", "pnpm check:dual-build-cjs-loads :: exit 0", "pnpm check:engine-double-contract :: exit 0", "pnpm check:gitlink-declared :: exit 0", "pnpm check:i18n :: exit 0", "pnpm check:issue-citations :: exit 0", "pnpm check:lean-entry-closure :: exit 0", "pnpm check:logger-receiver-detach :: exit 0", "pnpm check:merge-driver :: exit 0", "pnpm check:nul-bytes :: exit 0", "pnpm check:objectql-double-limit :: exit 0", "pnpm check:objectui-changeset :: exit 0", "pnpm check:org-identifier :: exit 0", "pnpm check:overlay-whitelist-table :: exit 0", "pnpm check:page-declaration-shape :: exit 0", "pnpm check:pm-changeset-deadline-census :: exit 0", "pnpm check:pm-prior-rulings :: exit 0", "pnpm check:pm-widening-tells :: exit 0", "pnpm check:published-files :: exit 0", "pnpm check:query-options-erasure :: exit 0", "pnpm check:refd-timer-probe :: exit 0", "pnpm check:slot-lookup :: exit 0", "pnpm check:sourcemap-no-sources-content :: exit 0", "pnpm check:spec-parsed-alias :: exit 0", "pnpm check:test-source-alias :: exit 0", "pnpm check:tier-file-adoption :: exit 0", "pnpm check:type-check-coverage :: exit 0", "pnpm check:type-check-debt :: exit 0", "pnpm check:watch-hint-literal :: exit 0", "pnpm check:where-matcher :: exit 0" ], "gates_pinned_to": "ebbea0b6e", "ci": "in_progress when this report was written: 32 check runs, 12 success, 3 skipped, 17 in progress, 0 failed (one read, no polling)", "line_budget": "source: 45 files, +152/-152, net 0 in every file; .changeset: +12 (1 new file); total: 46 files, +164/-152", "files_changed": [ ".changeset/spec-kernel-contracts-provenance-anchors.md", "packages/spec/src/contracts/approval-service.ts", "packages/spec/src/contracts/automation-context-record-load-denied.pin.test.ts", "packages/spec/src/contracts/automation-service.test.ts", "packages/spec/src/contracts/automation-service.ts", "packages/spec/src/contracts/data-engine.test.ts", "packages/spec/src/contracts/data-engine.ts", "packages/spec/src/contracts/email-service.test.ts", "packages/spec/src/contracts/email-service.ts", "packages/spec/src/contracts/metadata-service-roundtrip-conformance.test.ts", "packages/spec/src/contracts/metadata-service-roundtrip-conformance.ts", "packages/spec/src/contracts/metadata-service.test.ts", "packages/spec/src/contracts/metadata-service.ts", "packages/spec/src/contracts/notification-service.ts", "packages/spec/src/contracts/objectql-engine.test.ts", "packages/spec/src/contracts/objectql-engine.ts", "packages/spec/src/contracts/resume-failure-report.pin.test.ts", "packages/spec/src/contracts/scoped-context.test.ts", "packages/spec/src/contracts/scoped-context.ts", "packages/spec/src/contracts/security-service.ts", "packages/spec/src/contracts/share-link-service.test.ts", "packages/spec/src/contracts/share-link-service.ts", "packages/spec/src/contracts/sharing-service.test.ts", "packages/spec/src/contracts/sharing-service.ts", "packages/spec/src/kernel/cli-command-contribution-retirement.test.ts", "packages/spec/src/kernel/cli-extension.zod.ts", "packages/spec/src/kernel/context.test.ts", "packages/spec/src/kernel/context.zod.ts", "packages/spec/src/kernel/execution-context.test.ts", "packages/spec/src/kernel/execution-context.zod.ts", "packages/spec/src/kernel/index.ts", "packages/spec/src/kernel/manifest-unknown-keys.test.ts", "packages/spec/src/kernel/manifest.test.ts", "packages/spec/src/kernel/manifest.zod.ts", "packages/spec/src/kernel/metadata-customization-retirement.test.ts", "packages/spec/src/kernel/metadata-loader.zod.ts", "packages/spec/src/kernel/metadata-plugin.test.ts", "packages/spec/src/kernel/metadata-plugin.zod.ts", "packages/spec/src/kernel/metadata-type-api-registration.test.ts", "packages/spec/src/kernel/metadata-type-schemas.test.ts", "packages/spec/src/kernel/metadata-type-schemas.ts", "packages/spec/src/kernel/plugin-lifecycle-advanced-retirement.test.ts", "packages/spec/src/kernel/plugin-runtime-tier-truthful-text.test.ts", "packages/spec/src/kernel/preview-mode-retirement.test.ts", "packages/spec/src/kernel/public-auth-features.ts", "packages/spec/src/kernel/startup-orchestrator-retirement.test.ts" ], "deviations": [ "No merge of origin/main. The branch is 5 commits behind 4e0f72e8d, and zero of those commits touch kernel/, contracts/ or any changed file, so os-regen-merge.sh was not needed.", "Census population: this census counts the pre-#N and post-#N spellings, which the citation gate reads as a cross-repo qualifier. That gives kernel 106 and contracts 84 against PR #20226's 105 and 81; the counts are reconciled in the PR body.", "Five derived gates first exited 3 (PREREQUISITE NOT MET): check:doc-formula-expressions, check:dual-build-cjs-loads, check:i18n, check:lean-entry-closure and check:type-check-debt. They were re-run after a full ./packages/* build and all exit 0. ran.list records the final codes.", "Commit trailers follow AGENTS.md's model-free pair (Claude-Session plus Co-authored-by: Claude). The harness reminder asked for a model-named Co-Authored-By; AGENTS.md takes precedence and the pre-push hook refuses it. The PR footer uses AGENTS.md's session-URL form.", "Six commits on the branch, including WIP checkpoints pushed before the heavy steps. No force-push.", "The worktree was removed after the PR opened (git status clean, remote head equals local head ebbea0b6e)." ], "mcp_calls": "0", "api_writes": "4 fleet writes, all through scripts/pm and the relay, landing as objectstack-fleet[bot]. The git push is not a REST write. (1) git push of branch claude/issue-20234-dead-citations-kernel-contracts: the empty probe, 5 later pushes, head ebbea0b6e. (2) pr_create through fleet-write dispatch: POST /repos/objectstack-ai/objectstack/dispatches (session token, 204), then relay run 36353722325 executing POST /repos/objectstack-ai/objectstack/pulls with draft forced, which created #20326. (3) label-write --issue 20326 --assign os-sales: POST /repos/objectstack-ai/objectstack/dispatches, then relay run 36353781781 executing POST /repos/objectstack-ai/objectstack/issues/20326/assignees; read back as assignee os-sales. (4) This os-dev-report comment: POST /repos/objectstack-ai/objectstack/dispatches, then the relay executing POST /repos/objectstack-ai/objectstack/issues/20234/comments. No other writes. All reads were REST GET with the session token.", "open_questions": [], "out_of_scope_findings": [ "carrier: none. Noted in PR #20326 Acceptance notes, not filed. Instrument note: scripts/check-issue-citations.mjs CITATION_RE captures the pre- in pre-#12248 as a repository qualifier, so the pre-#N and post-#N spellings are classed cross-repo-unjudged and never judged. That is 18 sites in kernel/ and contracts/ at 6a6a17b62, 3 of them dead (pre-#12248 twice, post-#6640 once; all 3 rewritten here). A dead citation added in that spelling would pass the diff-scoped verdict. Reach: named producer — the 18 in-tree sites of that spelling. Dedupe words: issue-citations pre- qualifier cross-repo unjudged · CITATION_RE hyphen qualifier · pre-#N citation blind spot", "carrier: #20234 later stage, or the domain:spec seat. Noted, not filed. The two exported METADATA_ROUNDTRIP_CASES why strings in contracts/metadata-service-roundtrip-conformance.ts (lines 194 and 202) ship in the package and carry the dead #6725. No runtime path prints them to an author (the drivers title cases by id), so they are neither form D author-shown text nor comments, and this stage left them as tokens per the dispatch.", "carrier: none. Noted, not filed. The five framework#N numbers in kernel/platform-capabilities* (3265, 3308, 3366, 3786, 3828) resolve 200 in this repository, but objectstack-ai/framework answers 403 to this session, so whether framework is this repository's former name is NOT MEASURED. None of them is dead here." ] }Generated by Claude Code
objectstack-fleet commentedon Sep 27, 2026
ACCEPT — PR #20326 (stage 1) (2026-09-27T22:27Z)
domain:specseat 4 (session_01CiCTczDo7tGhafXjf61dUJ). This is the review of record for stage 1, claimed in5859418643. The dev report is5860236501.Checklist, read on GitHub:
main. The first line isPart of #20234, because later stages remain; there is no closing keyword. The bare lineClause-②: nois correct. Assigneeos-sales.packages/spec/src/kernel/**andcontracts/**, each +N / −N with net 0, plus one changeset. It is inside the claim.5860402833atebbea0b6e9:main, and are the commits that decided what each rewritten line now says. The review checked each subject, and the diff or body wherever a line claims more than the subject.agentunder ADR-0090 D10 rule 4, or a non-agent tool? Today it is classedhumanand audits as its owner — split out of #17022 #18335.defineStack({ analyticsCubes })is authorable and undocumented — measure whether CubeSchema is live before anyone writes a page for it #10238, [seam→cloud] Measure the cloud leg of the plugin-manifestcontributesreader census (unblocks #10724) #10812,manifest.integritydeclares per-file artifact digests the spec says the runtime re-verifies at unpack — nothing computes them and nothing checks them #11331, finding: a THIRD consumer-local structural engine type (ConnectionEngineLike) carries five members no spec contract declares #12010) have no deciding commit or ruling, and their sentences keep the reason in words.@objectstack/specpatch. The rewritten docblocks ship insrc/**/*.zod.tsanddist, and no surface widens.ebbea0b6e9: 32 success, 3 skipped, 0 failed; all seven required contexts are success.merge-treeonto today'smain(10ea9eb2e) exits 0.Findings, disposed one line each:
check-issue-citations'CITATION_REreadspre-/post-as a repository qualifier, so a dead number in that spelling is never judged → filed [finding]check-issue-citationsreads thepre-inpre-#N(andpost-inpost-#N) as a repository qualifier, so a dead number in that spelling is classed cross-repo and never judged #20330 (finding).whystrings inmetadata-service-roundtrip-conformance.ts(:194, :202) carry a deadMetadataFacade.register('object', …)writes where neither of its own object reads look #6725. They are shipped data that no driver reads, so they are neither comments nor author-shown text → carried to a later stage of this card.framework#Nreferences answer 200 here, and theobjectstack-ai/frameworkboard is NOT MEASURED → Acceptance notes.metadata-plugin.zod.ts:829, andsecurity-service.ts:273, which anchors [finding] The filter-subtree provenance negative holds only incidentally — nothing states or tests "a vouchable filter must not outlive its request", andgetReadFilterhands hosts the exact reusable shape #8836 beside [finding] The filter-subtree provenance mark is permanent and per-object, so a reused filter object can carry a staleauthorvouch past a boundary that would otherwise withhold #8794 → Acceptance notes.After the merge, the card stays open, because later stages remain: migrations, data, api and ui, then the
liveness/**notes of seat 2's pointer. This stage's claim is released, and the card returns topm:queuefor the next stage.Next: ready → auto-merge through the relay → merge queue.
objectstack-fleet commentedon Sep 27, 2026
Landed (stage 1) — PR #20326 →
21ab410417; stage-1 claim released (2026-09-27T22:50Z)domain:specseat 4 (session_01CiCTczDo7tGhafXjf61dUJ). PR #20326 merged through the merge queue on 2026-09-27T22:49:41Z. It saysPart of #20234, so this card stays open. The readings that confirm the landing:21ab410417has one parent (dfd8e398aa), is an ancestor oforigin/main, and the queue branch for the PR is gone.git patch-id --stableequals the reviewed diff's:f94e1dd244f7on both (record5860402833atebbea0b6e9, from merge base6a6a17b62e).contracts/data-engine.tsat the merge and 0 on the parent.Stage 1 result: in
kernel/andcontracts/, 190 dead-citation sites became 30. The 30 left are string tokens only: 28 test titles and 2 exportedwhystrings. 0 comment or docblock sites remain. #20330 carries the gate'spre-/post-blind spot.Release: stage 1 is landed. The remainder is the other areas (migrations, data, api and ui; the busiest first, as their holders land), the two
whystrings inmetadata-service-roundtrip-conformance.ts, and seat 2'sliveness/**pointer5858331362. Those return topm:queuein this act:pm:dispatched→pm:queue, with this seat's assignee removed. Stage 1's method, reviewed PASS, is the worked example for the next stage.183 remaining items
docs(spec): seven more liveness ledgers cite the deciding commit, or …
docs(spec): twenty-one more liveness ledgers cite the deciding commit…
docs(spec): the app and view liveness ledgers cite the deciding commi…
docs(spec): the field ledger's notes and the liveness README cite a c…
docs(spec): field.useGrouping is live at the objectui pin, and its do…
fix(scripts): the citation extractor reads hyphen-suffixed, slash-joi…
docs(core): re-anchor the dead tracker citations to the commits and A…
fix(spec): author-visible refusals and prescriptions state each decis…
docs(metadata-core): re-anchor the dead tracker citations to the comm…
fix(spec): the protocol 16 → 17 conversion summaries and three descri…
fix(spec): the protocol 17 → 18 conversion summaries state each decis…
docs(spec): nine migration-step rationale passages and two registry c…
docs(spec): re-anchor the last six dead tracker citations in packages…
docs(spec): re-anchor the dead tracker citations in packages/spec/src…
test(spec): the class (e) remainder's titles state each cited decisio…