Repository navigation
dead tracker citations in the domain:spec packages (84 sites, 21 numbers, 23 files): the ruling C+D stage for this lane (from #20556) #20597
Description
Activity
- addeddocumentationImprovements or additions to documentationImprovements or additions to documentationand removed
on Sep 29, 2026 objectstack-fleet commented
on Sep 29, 2026 ContributorAuthorMore actionsClaim: PM loop round 6
Session:session_014EJ1ED8X4MMrT18BhVx4tx
Account:os-tesla(the seat's linked user asGET /useranswers it; the card's assignee)
Branch:claude/issue-20597-lint-dead-citations
Worktree:objectstack-issue-20597
Domain:domain:spec
Seat:domain:spec#2(seat post #18549)
File surface: comment and docblock lines that cite a tracker number answering 404, re-anchored in ruling C+D's form C as #20234 applies it. The files are the 23packages/lint/src/files of the census5884031174(84 sites atf11b5f20a2):lint-flow-patterns.ts9,validate-hook-body-writes.ts9,runtime-gate.ts8,validate-searchable-fields.ts7 (thepre-#8404control).validate-expressions.ts,validate-react-page-props.tsandvalidate-sortable-fields.ts, 5 each.validate-flow-node-writes.ts,validate-page-field-bindings.tsandvalidate-translation-references.ts, 4 each.lint-liveness-properties.ts,validate-action-body-writes.tsandvalidate-security-posture.ts, 3 each;flow-template-grammar.ts2.- 1 each:
data-model-rules.ts,reference-integrity-suite.ts,validate-component-types.ts,validate-empty-combinators.ts,validate-list-view-field-refs.ts,validate-readonly-action-writes.ts,validate-readonly-flow-writes.tsandvalidate-readonly-hook-writes.ts. authoring-rules.ts(5) only if PR feat(lint): os validate refuses an api flow with no per-flow secret #20593 has landed before the push, mergingorigin/mainfirst. Otherwise it is excluded and reverted to its base blob.- Plus any generated page those docblocks project into, regenerated and never hand-edited, and one
@objectstack/lintpatchchangeset. - ⛔ No code token moves, ⛔ no test string, ⛔ no exported or message string (rule messages and hints included), ⛔ no other package, ⛔ no published release page, ⛔ no gate widening. Any file that becomes held by another PR before push is excluded.
(stop on breach; explain in the report)
Container & model:M,mode:subagent,model: opus(dispatch-gates --tier: no path-derived mandate; re-anchoring is a judgment call, as packages/spec/src: 1,277 comment lines still cite 170 deleted tracker numbers (1,295 sites) — the staged remainder of ruling C+D on #19123, measured by PR #20226 #20234's stages 1–6 ran). The at-tier contract review is owed before enqueue, as for every packages/spec/src: 1,277 comment lines still cite 170 deleted tracker numbers (1,295 sites) — the staged remainder of ruling C+D on #19123, measured by PR #20226 #20234 stage.
Clause-②: no
Thread-read: none
Serial constraints cleared: read at 2026-09-29T06:38Z againstorigin/main7a1faf1a5d. - Of the 14 non-release open PRs, only PR feat(lint): os validate refuses an api flow with no per-flow secret #20593 (this seat's After #20529, authoring surfaces still teach or pass an
apiflow with no secret:skills/objectstack-automationcalls it optional, andos validatepasses it #20553, in the merge queue) touchespackages/lint/src/, atauthoring-rules.ts,index.tsandvalidate-flow-trigger-readiness.ts(+test). Only the first is on this surface, and it is conditioned above. - No other
pm:dispatchedclaim editspackages/lint/**; [Decision] may a kind:'html' page author intrinsic HTML tags (div, a)? The console manifest says no, 3 of 3 shipped html pages say yes, and #19922's fallback cannot go live until one side changes #20112 lists it read-only (all 15 read at this stamp).
Generated by Claude Code
objectstack-fleet commented
on Sep 29, 2026 ContributorAuthorMore actionsos-dev-report
{ "issue": 20597, "status": "done", "branch": "claude/issue-20597-lint-dead-citations", "pr": "https://github.com/objectstack-ai/objectstack/pull/20612", "session": "session_014EJ1ED8X4MMrT18BhVx4tx (subagent; the parent PM session id, also the relay envelope session derived from the container)", "premise_still_valid": true, "summary": "The packages/lint stage is done as draft PR #20612 (Part of #20597, Clause-②: no, assignee os-tesla). Hypothesis 1 holds exactly: the gate's own --census --json at the tip 7a1faf1a5d reads 84 dead sites, 21 numbers, 23 files, equal per file to the claim. PR #20593 was still open at every read (last 07:39Z), so authoring-rules.ts (5 sites) stays at its base blob and the PR says Part of, not Fixes: those 5 sites remain on the card, with anchors already verified for the follow-up. In the other 22 files all 79 census sites plus one slash-joined #5775/#6629 the grammar does not read are rewritten in ruling C+D form C (81 comment lines out, 81 in), to 19 distinct commit shas, each unique, an ancestor of main, single-parent, naming the number in its own message or diff, and deciding the rule its line states. No code token, string, message, hint or rule id moves; 0 tracker numbers are net-added; no generated page projects from these docblocks, so nothing was regenerated; one @objectstack/lint patch changeset. Head census: 84 -> 5 (all in authoring-rules.ts); the pre-#8404 control at validate-searchable-fields.ts:312 is listed dead before and gone after. One dead number sits inside an author-shown string (validate-react-page-props.ts:1198, #11284) and is left byte-identical as form D.", "census": { "instrument": "The gate's own `node scripts/check-issue-citations.mjs --census --json` (board enumerated in full), filtered to packages/lint/. Cross-checked by my own raw instrument in scratch (census-raw.mjs + probe.sh): every #N (2-6 digits) in the 23 files, classed by the TypeScript 6.0.3 parser as comment/string/code with its joined qualifier, and every distinct number of 100 or more probed by REST GET issues/N without following redirects. Controls: lit #16862 #16847 #17698, dead #16714 #16715 #16697 at the start, every 100 numbers and the end.", "before": "base 7a1faf1a5d, gate census 2026-09-29T06:42:03Z-06:45:24Z (185 pages, frontier #20606): 84 dead sites (allocated-but-absent) in 23 files, 21 numbers, per file equal to the claim. Raw cross-check 06:47:36Z-06:50:11Z: 1,323 sites (1,259 comment, 64 string, 0 code); 360 numbers probed, 339 answer 200, 21 answer 404, 0 other; the same 21 numbers; its dead comment sites are the gate's 84 plus one slash-joined #6629 at validate-page-field-bindings.ts:208; one dead string site, validate-react-page-props.ts:1198 (#11284). Controls 15/15 lit=200 and 15/15 dead=404 over 5 checkpoints.", "after": "head 0c7b847f18, gate census 2026-09-29T07:28:22Z-07:31:52Z (185 pages, frontier #20611): 5 dead sites, all in the excluded authoring-rules.ts (:198 #10064, :1117 #16659, :1687 #8546, :1713 and :1733 #19370); 0 in the 22 edited files. Raw cross-check 07:32:03Z-07:34:35Z: 1,243 sites, 344 numbers, 339 answer 200 (the same 339), 5 answer 404 (#8546 #10064 #16659 #19370 in authoring-rules.ts comments, #11284 in the :1198 string); no number at head absent at base; none newly non-200; controls 15/15 and 15/15 over 5 checkpoints.", "per_number": "number sites -> anchor (evidence). #13681 x9 -> 8ed9c54b4 (lands the per-iteration containment rule pair and its measured minimal catch; its diff wrote all nine lines; #14394 kept). #8663 x13 -> 192213f66 (three write rules ask anchor provenance; body names #8663; diff wrote the [#8663] lines in all three files). #13657 x3 -> b003cf2e8 (post-hook declared-field door; diff wrote the lines). #10064 x6 -> def0d3e63 (name-keyed wire paths; body: #10064 maintainer ruling 2026-08-20 Option A). #19370 x5 -> a227afa41 (security-role-word crosses whole; its body names #19370 as the card it lands, ruling batch #203 item 3 letter B). #9798 -> c7655d472 (its body names #9798: restores the sys_comment unscoped multi-delete refusal that could not fire, the declared-but-unenforced fail-open; #9261 and ADR-0110 D3 kept). #8404 x6 -> b849e6911 (searchable-field-unprovisioned warning and its optional provenance index). #10001 x8 -> f1b5ad39a (the ViewItem RECORD rung). #6290 x5 -> e9b526597 (current_user into SCOPE_ROOTS, the field-level rule, option visibleWhen walked; #6584 is its own PR and is kept). #11284 x4 -> 5383fa670 (deprecate-first convergence; changeset names #11284, ruling 2026-08-23). #6629 x3 (2 census + slash-joined :208) -> cd584d559. #8664 x2 -> 8798cd2a6 (diff wrote both lines). #14700 x3 -> de3c52beb (diff wrote all three). #6124 -> b3c1f3cd5 (#6124's own squash commit, leg 1). #10262 x3 -> 2aca1bc4c (the test seam; diff wrote all three). #11060 x2 -> 815585513 (body: Maintainer ruling on #11060 (2026-08-23): option A). #13653 x4 -> 36d287803 (hook-body ctx.api readonly gate, shares buildReadonlyIndex). #12950 -> 225e7690f (created validate-component-types.ts; stage 5's anchor for the number). #6528 -> 3510e4a25 (#6528's own squash commit; the line read PR #6528).", "hypotheses": "1 holds: 84/21/23 at the tip, per file equal to the claim. 2 holds: only comment/docblock lines moved; the one dead string (a finding message at validate-react-page-props.ts:1198) stays byte-identical; 85 repository string/regex literals carrying the 21 numbers read no rewritten line. 3 holds and conditions the card: PR #20593 open at 06:40Z, 07:34Z and 07:39Z, so authoring-rules.ts is excluded; at 07:34Z the 9 open PRs' full file lists and the newest Claim: on all 11 pm:dispatched cards name none of the other 23 paths (PR #20593's files: authoring-rules.ts, index.ts, validate-flow-trigger-readiness.ts and its test). 4 holds: validate-searchable-fields.ts:312 pre-#8404 dead before, gone after. 5 holds with nothing to regenerate: no page under content/docs/references names any of the 19 numbers and no generator reads packages/lint/src; no release page touched." }, "tests": "At head 0c7b847f18 unless noted.\nClosure build under os-verify-lock: `timeout 570 pnpm exec turbo run build --concurrency=2 --filter=./packages/* --filter=./packages/*/*` -> Tasks: 71 successful, 71 total; VERDICT command-exit 0 (held 4m32s on a shared box). Before the merge, `turbo run build --filter=@objectstack/lint...` -> 4 successful, VERDICT 0.\n`pnpm --filter @objectstack/lint exec vitest run --maxWorkers=2` under the lock -> Test Files 115 passed (115), Tests 5363 passed (5363); then `pnpm --filter @objectstack/lint typecheck` -> exit 0, check:test-typecheck OK (2 files / 6 errors / 2 pinned signatures held); VERDICT command-exit 0. The same two runs passed with the same counts at the pre-merge head 2ce32f6b48. No consumer run is owed: no public surface byte moves beyond comments.\nMechanical guard (scratch tokcmp.mjs: TypeScript 6.0.3 leaf tokens, JSDoc kinds excluded, controls mutate the head text in memory only), merge base c96beb2707 vs HEAD over 22 files (byte-identical at 7a1faf1a5d and at the merge base), 54,508 base tokens. Real run: filesWithTokenChange=0, exit 0. Comment-insertion control (runtime-gate.ts): 0, exit 0. Code-insertion positive control (validate-hook-body-writes.ts): DIFFER at token 216, exit 1. String positive control (a parser-located StringLiteral in validate-react-page-props.ts): DIFFER at token 5, exit 1.\nLine balance: every touched .ts file +N/-N, 81/81 over 22 files; every changed line comment-shaped; line counts equal at base and head.\nTracker numbers: added-not-removed empty in every file; 80 sites and 19 numbers net-removed (79 census + the slash-joined #6629); no PR #N on an added line; the numbers kept on added lines (#5659 #5775 #8310 #8340 #9261 #9313 #12183 #13390 #14253 #14394 #19143 as issues, #6584 as a pull request) all answer 200.\nShas: 19 distinct on added lines, 0 on removed lines. Each `rev-parse --disambiguate` count is 1; each `merge-base --is-ancestor` exits 0 against origin/main and against the base; each is single-parent; the repo is not shallow; control leg e9584681a4 exits 0. The commit's own message names the number for 15 of 19, its own diff for 17 of 19, one or the other for 19 of 19.\nLint, a proven narrowing: `eslint --no-inline-config --format json` over the 22 touched .ts files -> 22 files, 0 errors, 0 warnings. isPathIgnored false for all 22, read through eslint's API. eslint.config.mjs:327-328: type-aware linting is never enabled, so a comment edit cannot move an untouched file's verdict. The repo-wide pnpm lint is CI's run.\nChangeset measurement: files[] ships dist; 12 of the 19 shas appear in the built dist (8ed9c54b4 and def0d3e63 in index.d.ts, b849e6911 in index.js and index.d.ts, and others); positive control: the unchanged sentence 'the near-miss shape: a `try_catch` that declares no `catch`' of an exported docblock is in index.d.ts. Hence patch.\nMerge probe: a no-driver merge-tree of 0c7b847f18 onto origin/main 0f6dcac5e9, from a bare shared clone in scratch (no merge.* config), exits 0; the two commits main gained after the merge touch none of the 23 files.\nNo 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 (self-test 114 cases in 8 batteries; the live diff-scoped run judged 18 citations across 22 files, 17 resolve as issues and 1 as a pull request, the kept #6584)", "pnpm check:doc-authoring :: exit 0 (sibling prose-id baseline holds: 810 pinned sites across 230 files, no growth)", "node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --ran ran.list :: exit 0 (54 derived, 54 run, 0 NOT-MEASURED, 0 UNRUN, a derived zero, at 0c7b847f18)", "bash scripts/pm/os-verify-lock.sh -c 'timeout 570 pnpm exec turbo run build --concurrency=2 --filter=./packages/* --filter=./packages/*/*' :: VERDICT command-exit 0 (71/71 tasks; run before the derived gates)", "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-empty-changeset.mjs --base origin/main :: exit 0", "node scripts/check-empty-changeset.mjs --self-test :: exit 0", "node scripts/check-issue-citations.mjs :: 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-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/spec run check:duration-unit-keys :: exit 0", "pnpm check:changeset-gate-self-tests :: exit 0", "pnpm check:cross-package-test-inputs :: exit 0", "pnpm check:doc-authoring :: exit 0", "pnpm check:docs-transcript-drift :: 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:gitlink-declared :: exit 0", "pnpm check:issue-citations :: exit 0", "pnpm check:lean-entry-closure :: exit 0", "pnpm check:logger-receiver-detach :: exit 0", "pnpm check:nul-bytes :: exit 0", "pnpm check:objectui-changeset :: exit 0", "pnpm check:org-identifier :: exit 0", "pnpm check:page-declaration-shape :: exit 0", "pnpm check:pm-changeset-deadline-census :: exit 0", "pnpm check:published-files :: 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:test-source-alias :: exit 0", "pnpm check:tier-file-adoption :: exit 0", "pnpm check:watch-hint-literal :: exit 0" ], "gates_pinned_to": "0c7b847f18", "ci": "in_progress when this report was written (2026-09-29T07:40:47Z): 31 check runs on 0c7b847f18, 11 success, 3 skipped, 17 in progress, 0 failed (one read, no polling)", "line_budget": "source: 22 .ts files, +81/-81, net 0 in every file; .changeset: +11 (1 new file); total against origin/main: 23 files, +92/-81 (173 changed lines, under 5,000)", "files_changed": [ ".changeset/lint-provenance-anchors.md", "packages/lint/src/data-model-rules.ts", "packages/lint/src/flow-template-grammar.ts", "packages/lint/src/lint-flow-patterns.ts", "packages/lint/src/lint-liveness-properties.ts", "packages/lint/src/reference-integrity-suite.ts", "packages/lint/src/runtime-gate.ts", "packages/lint/src/validate-action-body-writes.ts", "packages/lint/src/validate-component-types.ts", "packages/lint/src/validate-empty-combinators.ts", "packages/lint/src/validate-expressions.ts", "packages/lint/src/validate-flow-node-writes.ts", "packages/lint/src/validate-hook-body-writes.ts", "packages/lint/src/validate-list-view-field-refs.ts", "packages/lint/src/validate-page-field-bindings.ts", "packages/lint/src/validate-react-page-props.ts", "packages/lint/src/validate-readonly-action-writes.ts", "packages/lint/src/validate-readonly-flow-writes.ts", "packages/lint/src/validate-readonly-hook-writes.ts", "packages/lint/src/validate-searchable-fields.ts", "packages/lint/src/validate-security-posture.ts", "packages/lint/src/validate-sortable-fields.ts", "packages/lint/src/validate-translation-references.ts" ], "deviations": [ "PR first line is `Part of #20597`, not `Fixes`: PR #20593 had not landed at any read, so authoring-rules.ts (5 of the card's 84 sites) is excluded at its base blob and those sites stay on the card. Its anchors are verified for the follow-up: :198 #10064 -> def0d3e63; :1117 #16659 -> ecdfc9411 (added flow-schedule-organization-missing); :1687 '(PR #8546)' -> ba5e957ef (that PR's squash commit); :1713 and :1733 #19370 -> a227afa41.", "Two changed lines beyond the census's sites. validate-page-field-bindings.ts:208 carried '#5775/#6629', a slash-joined dead number the citation grammar does not read; it now reads 'the same #5775 residue class (commit cd584d559)', stage 5's precedent for the slash-joined #9972. runtime-gate.ts:780 is the other half of the rewritten :779 sentence and held no number.", "validate-expressions.ts:770 quotes packages/formula's SCOPE_ROOTS docblock ('the last one this list was missing (#6290)'); the quote now stops before the number, verbatim, with the commit outside the quotation. validate-expressions.ts:571 keeps #6584 (live, the anchor commit's own PR) beside e9b526597, so the gate reads it as resolves-as-pull-request.", "Merged origin/main once (0c7b847f18, merging c96beb2707): the first derivation at 2ce32f6b48 read STALE TREE because scripts/sdui-manifest.record.json changed on main. Clean merge, no driver-routed path, no lockfile change, none of the 23 files; install, closure build, tests and gates re-ran after it. origin/main then moved two more commits (ba4648dadf, 0f6dcac5e9 = stage 6's PR #20606), neither touching this diff; the no-driver merge-tree onto 0f6dcac5e9 exits 0, so no second merge.", "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 trailer check passed on every push. The PR body ends with the session-URL footer; its body read back byte-identical (17,054 bytes).", "The branch has the empty probe push, two commits (rewrite, changeset) and one merge commit; no force-push. The shared .git saw ordinary fetches of main, this worktree's add, and a bare --shared probe clone inside this issue's scratch (deleted). Scratch work lives in the scratchpad's issue-20597/ subdirectory.", "Cleanup: the worktree's node_modules and the worktree itself are removed right after this comment is read back; the remote head equals the local head 0c7b847f18." ], "mcp_calls": "0", "api_writes": "3 fleet REST writes, all through scripts/pm and the fleet-write relay, landing as objectstack-fleet[bot]; git push is not a REST write. (0) git push of branch claude/issue-20597-lint-dead-citations: the empty probe, then 3 pushes; head 0c7b847f18. (1) pr_create through scripts/pm/fleet-write/dispatch.mjs (dry-run first): POST /repos/objectstack-ai/objectstack/dispatches (session token, 204), then relay run 36537921994 executing POST /repos/objectstack-ai/objectstack/pulls with draft forced; it created #20612, whose body read back byte-identical. (2) label-write --issue 20612 --assign os-tesla: POST /repos/objectstack-ai/objectstack/dispatches, then relay run 36538005099 executing POST /repos/objectstack-ai/objectstack/issues/20612/assignees; assignee os-tesla read back; no label written (documentation, size/m and tooling are the auto-labelers'). (3) This os-dev-report comment through post-stamped.mjs: POST /repos/objectstack-ai/objectstack/dispatches, then the relay executing POST /repos/objectstack-ai/objectstack/issues/20597/comments. No other writes; the card's assignee was never written. All reads were plain REST GET with the session token.", "open_questions": [], "out_of_scope_findings": [ "carrier: #20597 itself, after PR #20593 lands. Noted in PR #20612 Acceptance notes, not filed. authoring-rules.ts keeps 5 dead sites (:198 #10064, :1117 #16659, :1687 #8546, :1713 and :1733 #19370); anchors verified above.", "carrier: none (承接者:无), needs a form-D carrier; noted in Acceptance notes, not filed. validate-react-page-props.ts:1198 is the react-prop-deprecated finding message, ending 'is removed after the deprecation window (#11284).' An author sees it, so it takes ruling D (no number); scripts/doc-authoring-prose-id.baseline.json pins it (#11284: 1 for this file). Removing it is a string change, outside this comment-only scope.", "carrier: none. Noted in Acceptance notes, not filed: surfaces the census does not sweep still cite these dead numbers. packages/lint/src/*.test.ts titles and comments (#6290, #8404, #8663, #10001, #10064, #10262, #13681, #19370 and others); hand-written docs content/docs/automation/hook-bodies.mdx (#8663, #13657), content/docs/automation/flows.mdx (#11060), content/docs/deployment/validating-metadata.mdx (#19370).", "carrier: the lane stage card that owns packages/formula (one of #20594 / #20595 / #20596; the census counts its 4 sites). Noted, not filed. packages/formula/src/cel-engine.ts cites the dead #6290 at :120, :147, :160 and :173, including the docblock validate-expressions.ts:770 quotes; e9b526597 is the verified anchor." ] }
Generated by Claude Code
objectstack-fleet commented
on Sep 29, 2026 ContributorAuthorMore actionsACCEPT — PR #20612 at head
0c7b847f18·domain:specseat 2 (session_014EJ1ED8X4MMrT18BhVx4tx) · 2026-09-29T08:02ZThe seat reviewed the dev report
5885887024against GitHub and the diff.- PR shape: draft, base
main, first linePart of #20597,Clause-②: no, assigneeos-tesla. 23 files (+92 / −81): 22 of the claim's 23packages/lint/src/files, plus a@objectstack/lintpatchchangeset. NOT governed. The driver-free merge probe againstorigin/mainexits 0. - Diff, read by the seat: 80 dead-citation comment sites are re-anchored in ruling C+D form C, citing 19 deciding commits. The seat spot-checked five anchors,
8ed9c54b4(Aloopnode aborts the entire flow run when one iteration's node fails — a single bad row kills a whole scheduled sweep, and there is no per-iteration containment to opt into #13681),192213f66(finding: twoIMPLICIT_FIELDSsets spread the blanket SYSTEM_FIELDS union with no provenance awareness — candidate sixth/seventh unprovisioned-anchor read sites #8663),def0d3e63(finding: a publish refusal'sissues[].pathcarries an array index into the gate's private snapshot (objects[417].sharingModel) that no caller can resolve #10064),b849e6911(lint:searchableFieldsis a FIFTH blanket-SYSTEM_FIELDS read site — a declared anchor on an external object becomes a$searchFieldsnarrowing over a column with no storage #8404) andcd584d559(validate-page-field-bindings的element:record_picker条目仍列着 #5775 已退役的displayField/searchFields#6629): each is an ancestor ofmain, and each commit's own diff wrote the lines it now anchors. - Evidence:
- Measured with the gate's own
--census --jsonat7a1faf1a5d: 84 dead sites before (equal per file to the claim), 5 after, all in the excludedauthoring-rules.ts. - The
pre-#8404control atvalidate-searchable-fields.ts:312is dead before and gone after. - A parser-level token comparison shows 0 code-token changes, with positive controls on a code insertion and a parser-located string.
- Lines balance at 81 out and 81 in, and 0 tracker numbers are net-added.
@objectstack/lint: 115 files / 5,363 tests. A closure build of 71 of 71 tasks.- 54 gate families derived, and all 54 ran with exit 0.
- Measured with the gate's own
- At-tier contract review:
5886146186on the PR, atCONTRACT_REVIEW_TIER, on this head — PASS.- It confirmed that the diff is comment-only: the non-comment residue is byte-identical in 22 of 22 files. No rule message, hint or rule id moved, and the
#11284finding message atvalidate-react-page-props.ts:1198is byte-identical. - It found all 19 anchors true.
- The
:770quotation is verbatim, with the commit placed outside the quote. - The
#5775/#6629slash pair is handled right: the gate's regex never read#6629there. patchwithClause-②: nois right.- The seat checked its transcript: served at tier, read-only, one write (that comment).
- It confirmed that the diff is comment-only: the non-comment residue is byte-identical in 22 of 22 files. No rule message, hint or rule id moved, and the
- Deviations, adopted:
Part of, notFixes: PR feat(lint): os validate refuses an api flow with no per-flow secret #20593 had not landed at any read, soauthoring-rules.tsstays at its base blob per the claim's condition.- The slash-joined
#6629atvalidate-page-field-bindings.ts:208is rewritten, following stage 5's precedent. - The
:770quotation now stops before the number. origin/mainwas merged once.
- Findings:
- The 5
authoring-rules.tssites (:198finding: a publish refusal'sissues[].pathcarries an array index into the gate's private snapshot (objects[417].sharingModel) that no caller can resolve #10064,:1117A schedule-triggered flow'snotifydelivers nothing on a multi-organization install: the run carries no organization, so the tenant-scoped inbox/delivery writes are refused (#8844) while the run reads healthy #16659,:1687feat(lint): permission/book cross the runtime publish gate; object measured dirty stays behind; security-role-word splits to stay behind whole (#8310) #8546,:1713and:1733[Decision]app/position声明allowRuntimeCreate: true而作者期规则零命中 —— 退役这个声明,还是把规则造出来? #19370), with anchors verified by the dev → this card's next round, after PR feat(lint): os validate refuses an api flow with no per-flow secret #20593 lands. - The
validate-react-page-props.ts:1198finding-message string (#11284, author-shown, pinned indoc-authoring-prose-id.baseline.json) → Acceptance notes. It is this card's form-D remainder, not a new card. - Unswept surfaces (lint test titles,
content/docs/automation/hook-bodies.mdx,flows.mdx,validating-metadata.mdx) → Acceptance notes. They are outside the instrument's declared surface, per [finding] dead tracker citations outsidepackages/spec/srchave no carrier: #20234 sweeps only the spec tree, and PR #20554 makes 26 more visible (pre-#N/Pre-#N) in cli, drivers, metadata, objectql, plugins, runtime and types #20556's close-out. packages/formula/src/cel-engine.tscites the dead finding: packages/formula 一包两话 —— SCOPE_ROOTS 不含 current_user 而 introspectScope 宣告它;字段级 visibleWhen 的 lint 拒绝还附错误修法「Write record.current_user」 #6290 four times → carried by dead tracker citations in thedomain:enginepackages (645 sites, 160 numbers, 104 files): the ruling C+D stage for this lane (from #20556) #20595, thedomain:enginestage card. The anchore9b526597is verified. Not filed.
- The 5
- Landing: every check on this head is green or a roster skip at this stamp, so this seat now runs the pre-landing checks, flips it ready and arms auto-merge. After it lands, this card moves to
pm:blockedwithBlocked-by: #20553for theauthoring-rules.tsround.
Generated by Claude Code
- PR shape: draft, base
objectstack-fleet commented
on Sep 29, 2026 ContributorAuthorMore actionsLanded (the
packages/lintsweep, 22 of 23 files) — PR #20612 →aa23e2c8fd; parked on #20553 · 2026-09-29T08:31Zdomain:specseat 2 (session_014EJ1ED8X4MMrT18BhVx4tx). PR #20612 merged through the merge queue at 2026-09-29T08:30Z, after the ACCEPT5886175996and the at-tier PASS5886146186. It saysPart of #20597, so this card stays open.- Verified by content on
origin/main: all 23 files are blob-identical to the reviewed head0c7b847f18. - Result: 80 dead-citation comment sites in 22
packages/lint/src/files are re-anchored in form C, citing 19 deciding commits. The census reads 84 before and 5 after. - What remains on this card:
- The 5 sites in
packages/lint/src/authoring-rules.ts, with anchors already verified by the dev (5885887024)::198finding: a publish refusal'sissues[].pathcarries an array index into the gate's private snapshot (objects[417].sharingModel) that no caller can resolve #10064 →def0d3e63,:1117A schedule-triggered flow'snotifydelivers nothing on a multi-organization install: the run carries no organization, so the tenant-scoped inbox/delivery writes are refused (#8844) while the run reads healthy #16659 →ecdfc9411,:1687(PR #8546)→ba5e957ef,:1713and:1733[Decision]app/position声明allowRuntimeCreate: true而作者期规则零命中 —— 退役这个声明,还是把规则造出来? #19370 →a227afa41. - The form-D finding-message string at
validate-react-page-props.ts:1198(#11284, pinned indoc-authoring-prose-id.baseline.json).
- The 5 sites in
Parked:
pm:dispatched→pm:blocked, with this seat's assignee removed andBlocked-by: #20553prepended to the body.authoring-rules.tsis in open PR feat(lint): os validate refuses an api flow with no per-flow secret #20593 (After #20529, authoring surfaces still teach or pass anapiflow with no secret:skills/objectstack-automationcalls it optional, andos validatepasses it #20553).- Unlock when After #20529, authoring surfaces still teach or pass an
apiflow with no secret:skills/objectstack-automationcalls it optional, andos validatepasses it #20553 closes: its PR lands, and the file is then free. - The next taker merges
mainand re-anchors those 5 lines, with the finding-message string as a separate form-D decision.
Generated by Claude Code
- Verified by content on
objectstack-fleet commented
on Sep 29, 2026 ContributorAuthorMore actionsUnlocked: #20553 closed (PR #20593 →
e651556e2d) ·domain:specseat 2 (session_014EJ1ED8X4MMrT18BhVx4tx) · 2026-09-29T09:20ZThis releases the park in
5886592368, the latest state transition on this card. No PR has merged on this card since it.- Re-derived before release: no open PR touches
packages/lint/src/authoring-rules.tsnow (all 7 open PRs' file lists read at this stamp), and nopm:dispatchedclaim names it. There is no new blocker. - Transition in this act:
pm:blocked→pm:queue, and theBlocked-by: #20553line comes off the body. - What the next taker does: merge
main, then re-anchor the 5 sites the dev verified in5885887024. PR feat(lint): os validate refuses an api flow with no per-flow secret #20593 edited this file (+37 / −2), so the lines moved; one651556e2dthey read::201finding: a publish refusal'sissues[].pathcarries an array index into the gate's private snapshot (objects[417].sharingModel) that no caller can resolve #10064 →def0d3e63:1123A schedule-triggered flow'snotifydelivers nothing on a multi-organization install: the run carries no organization, so the tenant-scoped inbox/delivery writes are refused (#8844) while the run reads healthy #16659 →ecdfc9411:1722(PR #8546)→ba5e957ef:1748and:1768[Decision]app/position声明allowRuntimeCreate: true而作者期规则零命中 —— 退役这个声明,还是把规则造出来? #19370 →a227afa41
- The form-D finding-message string at
validate-react-page-props.ts:1198(#11284, pinned indoc-authoring-prose-id.baseline.json) stays a separate decision, as the landing record says.
Generated by Claude Code
- Re-derived before release: no open PR touches
11 remaining items
objectstack-fleet commented
on Sep 29, 2026 ContributorAuthorMore actionsClaim: PM loop round 7 (stage 3, the last: the form-D finding message)
Session:session_014EJ1ED8X4MMrT18BhVx4tx
Account:os-tesla(the seat's linked user asGET /useranswers it; the card's assignee)
Branch:claude/issue-20597-react-prop-deprecated-message
Worktree:objectstack-issue-20597
Domain:domain:spec
Seat:domain:spec#2(seat post #18549)
File surface: the last item the stage-2 landing record5889811174names, nothing wider.packages/lint/src/validate-react-page-props.ts:1198: theREACT_PROP_DEPRECATEDfinding message ends with(#11284), and [Decision] Doesreact-blocks.tskeepobjectName/viewTypeas sanctioned React-tier props, or do they converge on the metadata-tier spelling? — the carrier objectui#2890's last phase has never had #11284 answers 404. It is author-shown text, so ruling C+D (5749154545) takes it in form D: the lesson in words, read from [Decision] Doesreact-blocks.tskeepobjectName/viewTypeas sanctioned React-tier props, or do they converge on the metadata-tier spelling? — the carrier objectui#2890's last phase has never had #11284's decision (the@objectstack/lintCHANGELOG entry5383fa6records it: the react tier converges on the metadata-tier spelling, deprecate-first, maintainer ruling 2026-08-23), with no number.scripts/doc-authoring-prose-id.baseline.json: its#11284pin shrinks by exactly that site (a ratchet moving down, never up).- Any test that pins the message text: flipped in the same round, asserting the new wording's substance.
- One
@objectstack/lintpatchchangeset. - ⛔ Not
packages/lint/CHANGELOG.md(release-owned). ⛔ Not the test file's comments ordescribetitles (not author-shown). ⛔ No other message, rule or file.
(stop on breach; explain in the report)
Container & model:S,mode:subagent,model: opus(no path-derived mandate). The text is author-shown, so the at-tier contract review is owed before enqueue.
Clause-②: no
Thread-read: 5889811174
Serial constraints cleared: read at 2026-09-29T12:05Z againstorigin/mainf29c83db13. - Stage 2 (PR docs(lint): re-anchor the five dead tracker citations in authoring-rules.ts to the commits that decided them #20631) landed as
f29c83db13. - No open PR touches
packages/lint/orscripts/doc-authoring-prose-id.baseline.json, and nopm:dispatchedclaim names either.
This is the last stage: the PR says
Fixes #20597.
Generated by Claude Code
objectstack-fleet commented
on Sep 29, 2026 ContributorAuthorMore actionsos-dev-report
{ "issue": 20597, "status": "done", "branch": "claude/issue-20597-react-prop-deprecated-message", "pr": "https://github.com/objectstack-ai/objectstack/pull/20641", "session": "session_014EJ1ED8X4MMrT18BhVx4tx (subagent; the parent PM session id, also the session the relay envelopes carried, derived from the container)", "premise_still_valid": true, "summary": "Stage 3, the card's last item, is draft PR #20641 (Fixes #20597, Clause-②: no, assignee os-tesla). The react-prop-deprecated finding message at validate-react-page-props.ts:1198 no longer ends with '(#11284)', a number that answers 404. It now says in words what that decision was, read from the surviving record: the lint CHANGELOG entry for 5383fa6 (maintainer ruling 2026-08-23), whose commit also wrote this line. The react tier converges on the metadata-tier vocabulary, so the deprecated spelling keeps working through the deprecation window and is removed after it. The tag, prop and dep.replacedBy interpolations, the rule id, the severity and the hint are byte-identical. scripts/doc-authoring-prose-id.baseline.json loses exactly that one pin: the gate's own --census-ledger differs from the checked-in file by that single line, and the gate now reads 809 sites across 230 files, against 810 at stages 1 and 2. One @objectstack/lint patch changeset. All three hypotheses hold. The third holds with zero pins: no test, snapshot, doc or skill asserts the message text, so nothing was flipped and nothing was added.", "hypotheses": "1 holds: :1198 read exactly '... is removed after the deprecation window (#11284).'. GET issues/11284 answers 404, with control issues/5583 at 200. The CHANGELOG entry 5383fa6 records the decision (react tier converges on the metadata-tier spelling, deprecate-first, maintainer ruling 2026-08-23), and commit 5383fa670's own diff wrote this message line. 2 holds: the baseline pinned '#11284': 1 for this file only. The regenerated ledger differs by exactly that line; the file keeps '#5583': 1, and no other (file,id) pair moves. The gate reads 809/230 (was 810/230). 3 holds with an empty result. git grep at base for 'deprecation window (#11284)', 'removed after the deprecation window' and 'deprecated spelling of the metadata-tier' hits only the source line (the grep is not blind), and at head the first two exit 1. The rule id REACT_PROP_DEPRECATED / react-prop-deprecated appears only in the source, the index.ts barrel, two release-owned CHANGELOGs and validate-react-page-props.test.ts. That test asserts the rule id (the pastDeprecation filter, toEqual([]) at :116 and :204) and never the message. The sibling objectui at b120b66 has 0 hits (git grep exit 1; control 'deprecat' hits). No pin existed to flip. A new wording pin was not added: wording is not pinned unless a consumer parses it, and none does.", "tests": "At head 6c463cec86.\nUnder bash scripts/pm/os-verify-lock.sh (slot issue-20597-s3; VERDICT command-exit 0, held 578s on a shared box, acquired after 68s on the resumed slot):\n- NODE_OPTIONS=--max-old-space-size=4096 timeout 480 pnpm exec turbo run build --concurrency=2 --filter=./packages/* --filter=./packages/*/*: Tasks 71 successful, 71 total, BUILD_EXIT=0.\n- pnpm --filter @objectstack/lint exec vitest run --maxWorkers=2: Test Files 115 passed (115), Tests 5379 passed (5379), TEST_EXIT=0.\n- pnpm --filter @objectstack/lint typecheck: TYPECHECK_EXIT=0; check:test-typecheck OK (2 files / 6 errors / 2 pinned signatures held).\nThe ratchet, both arms, as one-time controls (nothing left behind):\n- Stale arm: git restore --source=f29c83db13 of the baseline only (working tree; its blob fad4260e0b equals the base blob) over the new message. node scripts/check-doc-authoring.mjs exits 1 with 'STALE' listing exactly one pair, 'packages/lint/src/validate-react-page-props.ts #11284 (1 pinned, 0 measured)'. Restored with git checkout HEAD --; blob af8a33d216 equals HEAD and git diff HEAD is empty.\n- Growth arm: node scripts/ablation-replace.mjs put the old tail back over the new baseline (anchor x1 to x0, replacement x0 to x1). The blob became f5684f0774, which equals the base blob. The gate exits 1 with 'validate-react-page-props.ts #11284 (0 pinned, 1 measured)' at :1198. The tool proved the restore (blob 55de478256 equals HEAD, git diff HEAD empty), and a trap-armed git checkout HEAD -- re-checked it.\nTracker numbers: the only #N on a changed source line is the removed #11284; none added. Control-byte scan of the three changed files and the PR body: none.\nLint, a proven narrowing: pnpm exec eslint --no-inline-config --format json packages/lint/src/validate-react-page-props.ts reports 1 file, 0 errors, 0 warnings. Through eslint's API, isPathIgnored is false and calculateConfigForFile carries no parserOptions.project or projectService. eslint.config.mjs:327 says type-aware linting is never enabled, so a string edit cannot move an untouched file's verdict. The repo-wide pnpm lint is CI's.\nChangeset measurement: files[] = dist, README.md, CHANGELOG.md. The new sentence is in dist/index.js, index.cjs, runtime.js and runtime.cjs, one each; 'deprecation window (#11284)' is in none. The positive control 'Likely a typo of a contract prop. Fix it or remove it.' is in all four. Hence patch.\nMerge probe: a driver-free merge-tree of 6c463cec86 onto origin/main f1e921ab8e, from a bare --shared clone in scratch with no merge.* config (deleted after), exits 0. The 4 commits main gained since the base touch none of the 3 paths.\nNo behavioural ablation is owed, since no behaviour changes. No consumer sweep is owed: no export, type or rule id moves, and no consumer parses the text.", "gates": [ "node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands :: exit 0 (62 commands, change set 3 paths vs merge base f29c83db1)", "node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --ran ran.list :: exit 0 (62 derived, 62 run, 0 NOT-MEASURED, 0 UNRUN, a derived zero, at 6c463cec86)", "all 62 derived commands :: exit 0 each, the 56 build-free ones before the build and the 6 build-reading ones after it (check:docs-transcript-drift, check:dts-closure, check:dual-build-cjs-loads, check:lean-entry-closure, check:published-files, check:sourcemap-no-sources-content)", "pnpm check:doc-authoring :: exit 0 (sibling prose-id baseline holds: 809 pinned sites across 230 files, no growth, no burn-down unrecorded; was 810/230)", "pnpm check:issue-citations :: exit 0 (self-test 114 cases in 8 batteries); node scripts/check-issue-citations.mjs :: exit 0 ('no issue citations added against f29c83db1')", "pnpm check:nul-bytes :: exit 0", "rosters under a touched directory, run as well: node scripts/check-changeset-fixed.mjs, node scripts/check-published-list-mirrors.mjs (and --self-test), node scripts/check-dts-references.mjs --self-test, pnpm check:authz-resolver, check:console-injection, check:engine-double-contract, check:error-code-casing, check:filter-alias-parity, check:i18n-stale-fill :: exit 0 each; pnpm check:published-readme-exports :: exit 3 (prerequisite, before the build), then exit 0 after the build", "NOT MEASURED, as the derivation itself declares (a value from the workflow): check-issue-citations --census, check-shard-attestation --emit, check-test-completeness; CI's own path-scheduled jobs and type-check lanes are CI's" ], "gates_pinned_to": "6c463cec86", "ci": "in_progress at the one read (2026-09-29T12:40:31Z): 31 check runs on 6c463cec86, 9 success, 3 skipped, 19 in progress, 0 failed. No polling.", "line_budget": "3 files, +15/-2 (17 changed lines, under 5,000): validate-react-page-props.ts +1/-1, doc-authoring-prose-id.baseline.json +0/-1, .changeset +14 (1 new file)", "files_changed": [ ".changeset/20597-react-prop-deprecated-message-words.md", "packages/lint/src/validate-react-page-props.ts", "scripts/doc-authoring-prose-id.baseline.json" ], "deviations": [ "Commit trailers follow AGENTS.md's model-free pair (Claude-Session plus Co-authored-by: Claude), not the model-named Co-Authored-By the harness reminder asked for; the pre-push check:commit-card-trailers passed. The PR body ends with AGENTS.md's session-URL footer rather than the harness's emoji footer. The body read back byte-identical (8,627 bytes).", "The first locked run returned VERDICT queue-timeout (exit 99, never acquired): it waited its 540 s budget at the head of the queue while pid 6314 (issue-20233-s10's tests-inner.sh) held the lock for 20+ min. That run is NOT MEASURED, not a failure. The kept slot resumed at once and acquired after 68 s. The build-free gates ran during the wait.", "Two void first attempts, re-run correctly. (1) The first dist positive control ('is retired — the contract') read 0 because the bundle escapes the em dash as \\u2014; it was replaced by an ASCII control, which hits in all four files. (2) The first merge-tree probe failed to fetch abbreviated shas into the bare probe (no reading); it was re-run with full shas and exits 0.", "No merge of origin/main: it moved f29c83db13 to f1e921ab8e (4 commits), none touching the 3 paths or the baseline, and the driver-free merge-tree exits 0.", "The roster runs are recorded in a separate list, outside ran.list, so --ran reconciles exactly the 62 derived families.", "Scratch work lives in the scratchpad's issue-20597-s3/ subdirectory. The shared .git saw ordinary fetches of main, this worktree's add, and a bare --shared probe clone inside scratch (deleted). No force-push: the branch holds the empty probe push and one commit (6c463cec86). Cleanup: the worktree's node_modules and the worktree itself are removed right after this comment is read back; the remote head equals the local head." ], "mcp_calls": "0", "api_writes": "3 fleet REST writes, all through scripts/pm and the fleet-write relay, landing as objectstack-fleet[bot]; git push is not a REST write. (0) git push of claude/issue-20597-react-prop-deprecated-message: the empty probe, then one push of 6c463cec86. (1) pr_create through scripts/pm/fleet-write/dispatch.mjs (dry-run first): POST /repos/objectstack-ai/objectstack/dispatches (204), then relay run 36569517147 executing POST /repos/objectstack-ai/objectstack/pulls with draft forced. It created #20641, whose body read back byte-identical. (2) label-write --issue 20641 --assign os-tesla: POST .../dispatches, then relay run 36569619930 executing POST /repos/objectstack-ai/objectstack/issues/20641/assignees. Read back: os-tesla. No label was written (size/s, documentation and tooling come from the auto-labelers, and the dispatch named none). (3) This os-dev-report comment through post-stamped.mjs: POST .../dispatches, then the relay executing POST /repos/objectstack-ai/objectstack/issues/20597/comments. No other writes; the card's assignee was never written. All reads were plain REST GET.", "open_questions": [], "out_of_scope_findings": [ "carrier: none (承接者:无). Noted in PR #20641 Acceptance notes, not filed (dormant, no class). react-prop-deprecated cannot fire today. The built REACT_BLOCKS carries 0 props with deprecated (4 blocks, 37 interactions), and the only deprecated spellings there ever were, ListView objectName / viewType, now sit in REACT_RETIRED_OVERLAY_PROPS and report react-prop-retired. The mechanism stays for a future deprecation. Dedupe words: react-prop-deprecated dormant, REACT_BLOCKS deprecated empty, deprecate-first mechanism.", "carrier: none (承接者:无). Noted in Acceptance notes, not filed (a stale test comment, outside the claim's surface). The header comment of validate-react-page-props.test.ts (:32 to :36) says every objectName ListView fixture 'carries exactly one deprecation warning' and that the warning 'is pinned in the vocabulary describe block below'. The assertions at :116 and :204 expect zero, and the describe block below pins react-prop-retired, not a deprecation warning. The same file still cites the dead #11284 in the comment at :77 and in the describe title at :83; that is the test-title family stage 1 already noted. Dedupe words: pastDeprecation stale comment, react-page-props test header.", "carrier: none (承接者:无). Noted in Acceptance notes, not filed. The same file's other author-shown id: the REACT_CHART_AGGREGATE_INVALID hint at :458 contains 'objectstack#5583 ruled that …'. #5583 answers 200, so it is not a dead citation and not on this card. Ruling D would still take it, and it stays in the prose-id baseline among the 809 adjudicated sites. Dedupe words: objectstack#5583 hint, chart aggregate groupBy hint tracker id, prose-id baseline burn-down." ] }
Generated by Claude Code
objectstack-fleet commented
on Sep 29, 2026 ContributorAuthorMore actionsACCEPT (stage 3, the last) — PR #20641 at head
6c463cec86·domain:specseat 2 (session_014EJ1ED8X4MMrT18BhVx4tx) · 2026-09-29T12:54ZThe seat reviewed the stage-3 dev report
5890531733against GitHub and the diff.- PR shape: draft, base
main, first lineFixes #20597,Clause-②: no, assigneeos-tesla. 3 files (+15 / −2):packages/lint/src/validate-react-page-props.ts(+1 / −1);scripts/doc-authoring-prose-id.baseline.json(−1);- a
@objectstack/lintpatchchangeset. - NOT governed. The driver-free merge probe against
origin/mainexits 0.
- Result: the
REACT_PROP_DEPRECATEDfinding message no longer ends with(#11284), a number that answers 404. It says in words what that decision was: the react tier converges on the metadata-tier vocabulary, deprecate-first, so the deprecated spelling keeps working through the window and is removed after it. The prose-id baseline loses exactly that one pin. - Evidence (dev):
- The ratchet was checked in both directions. The old baseline over the new text reads STALE, naming exactly this pair. The old text over the new baseline reads growth, at
:1198. - No test, snapshot, doc or skill asserts the message text, so nothing needed flipping.
- The build ran 71 of 71 tasks;
@objectstack/lintpassed 115 files / 5,379 tests and its typecheck. - 62 derived gate families, all run with exit 0.
- The ratchet was checked in both directions. The old baseline over the new text reads STALE, naming exactly this pair. The old text over the new baseline reads growth, at
- At-tier contract review:
5890702936on the PR, atCONTRACT_REVIEW_TIER, on this head — PASS.- The message's prefix, interpolations, rule id, severity and hint are byte-identical. The new tail restates the decision as its surviving record states it (the CHANGELOG entry
5383fa6and commit5383fa670, which wrote this line). - Shrinking the baseline is the landing author's remedy under the gate's own header.
- No consumer parses the message; objectui reads this rule only by id.
- The card's population reads 0 after this, and nothing else is owed by the card.
patchwithClause-②: nois right.- The seat checked its transcript: served at tier, read-only, one write (that comment).
- The message's prefix, interpolations, rule id, severity and hint are byte-identical. The new tail restates the decision as its surviving record states it (the CHANGELOG entry
- Findings:
react-prop-deprecatedis dormant today: no block declares a deprecated prop. The mechanism stays for a future deprecation → Acceptance notes.- The header comment of
validate-react-page-props.test.ts(:32–:36) describes a deprecation warning that the assertions no longer expect → Acceptance notes. #11284still stands in the test's comment anddescribetitle (:77,:83),packages/spec/src/ui/react-blocks.test.ts:147,packages/spec/scripts/build-react-blocks-contract.ts(:69,:116), and release-owned CHANGELOGs. Test titles and comments belong to the form-D test stage;packages/spec/scripts/**is outside [finding] dead tracker citations outsidepackages/spec/srchave no carrier: #20234 sweeps only the spec tree, and PR #20554 makes 26 more visible (pre-#N/Pre-#N) in cli, drivers, metadata, objectql, plugins, runtime and types #20556's family → Acceptance notes.- The
REACT_CHART_AGGREGATE_INVALIDhint at:458citesobjectstack#5583, which answers 200. It is not a dead citation, and it stays among the baseline's adjudicated sites → Acceptance notes.
- Landing: when every check on this head is green or a roster skip (4 were still running at this stamp), this seat runs the pre-landing checks, flips it ready and arms auto-merge.
Fixes #20597closes the card with the merge.
Generated by Claude Code
- PR shape: draft, base
objectstack-fleet commented
on Sep 29, 2026 ContributorAuthorMore actionsLanded (stage 3, the last) — PR #20641 →
c6b37cd08d; card closed ·domain:specseat 2 (session_014EJ1ED8X4MMrT18BhVx4tx) · 2026-09-29T13:43Z- Merged through the merge queue at 2026-09-29T13:42Z, after the ACCEPT
5890729029and the at-tier PASS5890702936. - Verified by content on
origin/mainc6b37cd08d: all 3 files are blob-identical to the reviewed head6c463cec86. - Closing-keyword audit: the body says
Fixes #20597, and this card closedcompletedwith the merge.pm:dispatchedcomes off in this act. - What the card delivered, over three stages: the gate's census of the
domain:speclane (84 dead tracker citations inpackages/lint) reads 0. The comment sites were re-anchored in form C onto the commits that decided them: 80 lines in PR docs(lint): re-anchor the dead tracker citations in packages/lint/src to the commits that decided them #20612 and 5 in PR docs(lint): re-anchor the five dead tracker citations in authoring-rules.ts to the commits that decided them #20631. The one author-shown string, theREACT_PROP_DEPRECATEDmessage, now states its decision in words (form D, this PR). The prose-id baseline shrank by that site. - Left, each with its carrier:
#11284invalidate-react-page-props.test.ts's comment anddescribetitle, and inpackages/spec'sreact-blocks.test.ts→ the form-D test-string stage of packages/spec/src: 1,277 comment lines still cite 170 deleted tracker numbers (1,295 sites) — the staged remainder of ruling C+D on #19123, measured by PR #20226 #20234.packages/spec/scripts/build-react-blocks-contract.ts→ outside [finding] dead tracker citations outsidepackages/spec/srchave no carrier: #20234 sweeps only the spec tree, and PR #20554 makes 26 more visible (pre-#N/Pre-#N) in cli, drivers, metadata, objectql, plugins, runtime and types #20556's family. Released CHANGELOGs → records, not edited.
Generated by Claude Code
- Merged through the merge queue at 2026-09-29T13:42Z, after the ACCEPT
objectstack-fleet commented
on Oct 1, 2026 ContributorAuthorMore actionsPost-landing census for #20636, step 4 of triage's
5889747311·domain:specseat 2 (session_017VaLJnYwhPsanVCe9dMCJU) · 2026-10-01T01:49ZInstrument:
node scripts/check-issue-citations.mjs --census --json(the gate's own, read-only), run twice on the same tree,origin/mainf8178ffece. One run used the extractor PR #20989 landed (mergea5bce40888); the other used the extractor of its first parent,315888d66. Both enumerated the same board: 189 pages, frontier #21014. Repo-wide, dead (allocated-but-absent) goes from 740 to 754: 14 newly visible, 0 lost. The seat re-probed six of the cited numbers over REST, all 404, with lit controls #5286 and #12624 at 200.This lane (
packages/lint(domain:spec)): 0 newly visible. The lane's dead total on this tree is 0 with the old extractor and 0 with the new one.Nothing newly visible in this lane, and the lane's dead total is 0 with either extractor. No follow-up stage is owed.
Generated by Claude Code
- added a commit that references this issue
on Oct 7, 2026
Filing gate: ① a family with a named population. Class (a): shipped source cites a tracker number that answers 404, the rot that ruling C+D on #19123 (
5749154545, maintainer 「同意」) set out to remove.reach:source comments in published packages. The census was measured, not estimated.Filed by the triage seat (objectstack-wide, seat post #6015,
session_01AavokzJ5DndAwitDXvKy4U) as step 2 of #20556. That card is the carrier for dead citations outsidepackages/spec/src, and its first deliverable, the split by lane, is5884031174(domain:specseat 2).The population (census
5884031174,origin/mainf11b5f20a2)allocated-but-absent), 21 distinct numbers, in 23 files.packages/lintonly (the lane table anchorspackages/linttodomain:spec).node scripts/check-issue-citations.mjs --census --json, the gate's own, read-only. Its declared surface is comment prose inpackages/**/src/**/*.{ts,tsx}, with string literals blanked. A site outside it is not swept, and that is not the same as clean.Control set (the
pre-#Nsites PR #20554 made visible, all 404)validate-searchable-fields.ts(about :312) lint:searchableFieldsis a FIFTH blanket-SYSTEM_FIELDS read site — a declared anchor on an external object becomes a$searchFieldsnarrowing over a column with no storage #8404The line numbers are from #20556's filing. The census found some one or two lines off after tree drift.
Direction (triage's grade, on the first comment)
packages/spec/srchave no carrier: #20234 sweeps only the spec tree, and PR #20554 makes 26 more visible (pre-#N/Pre-#N) in cli, drivers, metadata, objectql, plugins, runtime and types #20556's answer). ⛔ No gate widening.Dedupe: #20556 (the carrier), #20234 (the
packages/spec/srcstages) and #19123 (the ruling). No other card carries this lane's sites.