Repository navigation
docs(service-job): re-anchor the dead tracker citation to the commit that decided it - #20866
Merged
objectstack-fleet[bot] merged 1 commit intoSep 30, 2026
Merged
Conversation
…that decided it The inert cron fixture's docblock and the timeout suite's pointer to it cited a tracker number that no longer resolves. Both now cite commit 226cb71, which moved every exact-count case onto the shared NEVER_FIRES fixture and whose message records the Date-only measurement the fixture's docblock describes. Comments only; line counts kept. Claude-Session: https://claude.ai/code/session_01XY5uCwTjZj7884yYtyur4H Co-authored-by: Claude <noreply@anthropic.com>
Contributor
📓 Docs Drift Check
What this run could not see
Coarse fallback — 3 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
objectstack-fleet
Bot
deleted the
claude/issue-20596-service-job-citations
branch
September 30, 2026 14:16
akarma-synetal
pushed a commit
to akarma-synetal/framework
that referenced
this pull request
Oct 7, 2026
…mmit that decided it (objectstack-ai#20881) Part of objectstack-ai#20596 Clause-②: no ## What changed This is the eighteenth stage of the `domain:services` lane of the dead-citation sweep, and the lane's last package. It covers `packages/services/service-realtime/src/**` and nothing else. By the seat's claim (`5913177103`), it is the last of the single-site packages, taken one package per stage. The card's own close is the seat's act, so this PR says `Part of` and the card stays open. Every comment or docblock site in scope that cited a tracker number answering 404 has been rewritten in ruling C+D's form C (comment 5749154545 on objectstack-ai#19123), by the method of stages 1 to 17 (the latest is PR objectstack-ai#20866, landed as `6c96b37be`, the base here). That is **1 site on 1 line in 1 file, covering 1 number**: - `src/translations/index.ts:27`, the census's one site in this package at the base (a docblock). No test comment, test string, source string or gate-invisible spelling in this package carries a dead number (see the supplementary reading below), so the census site is the whole population. The rewritten line now cites the commit in this repository that decided what it describes: **1 commit sha**. No ADR or ruling record records that decision (see the per-number table), so ruling C's commit rung applies. No number was dropped. Only a comment changed. The file keeps its line count (1 line out, 1 in), so no line citation into it moves. No code token moves (see the guard below). **No citation number is added**: the only tracker number on the added line is the live `objectstack-ai#12069`, which already stood on it. The rewritten line is byte-identical to the line the seven sibling translation sets already carry (`plugin-approvals:26`, `plugin-audit:28`, `plugin-security:26`, `plugin-sharing:26`, `plugin-webhooks:26`, `service-messaging:29`, `service-storage:29`), landed by stages 1, 2, 4, 6, 7, 9 and 16. **No changeset.** The rewritten docblock does not reach `dist`, and `dist` is byte-identical with and without the rewrite (see Changeset below), so this PR takes `skip-changeset`. ## Census: `service-realtime`, before and after **Instrument (A1).** The gate's own `node scripts/check-issue-citations.mjs --census --json`, read-only and unchanged. The count below is its `allocated-but-absent` findings under `packages/services/service-realtime/`. Each run counts as a reading only because its board frontier equals the newest issue or pull-request number, read by a separate request just before and just after the run. | reading | tree | board | whole-repo `allocated-but-absent` | service-realtime sites | lines | files | numbers | |---|---|---|---|---|---|---|---| | before | base `6c96b37be`, run 2026-09-30T14:25:19Z to 14:29:09Z | enumerated, 188 pages, frontier objectstack-ai#20876 (newest objectstack-ai#20876 before and after) | 744 | **1** | 1 | 1 | 1 | | after | head `3e5cba47c`, run 14:40:18Z to 14:44:03Z | enumerated, 188 pages, frontier objectstack-ai#20878 (newest objectstack-ai#20878 before and after) | 743 | **0** | 0 | 0 | 0 | The whole-repo drop is 1, and the finding sets of the two runs differ by exactly one row, `translations/index.ts:27 objectstack-ai#11671`, removed; none was added. The `resolves` tally is 33,322 in both runs, and `resolves-as-pull-request` (1,985) and `cross-repo-unjudged` (1,022) did not move either. Neither run was truncated or discarded: both enumerations read 188 pages at the newest frontier. The seat's census counted 1 here at `6bff748b`, and the base agrees: `6bff748b` is an ancestor of the base, and no commit between them touches this package. At the after head, no package under `packages/services/`, `packages/plugins/` or `packages/triggers/` holds a census finding. **Supplementary instrument, the whole scope.** The census does not read test files or strings. So a second reading runs the gate's own exported `extractCitations` (whole-file and comment-prose projections) and `namesThisRepository` over every `.ts` file under `service-realtime/src` (18 files). It takes its verdicts from the before census's own board reading rather than from a second enumeration: a number is dead when that census reported it `allocated-but-absent`, and alive when the gate's own census-scope extraction (`collectCitations`) judged it and the census did not report it. One number is covered by neither, because it stands only in test files: `objectstack-ai#20044`, read on its own through the read-only tools, answers as an issue. The probe's control: `objectstack-ai#11671` answers 404 on the issues endpoint and on the pull-request endpoint. | reading | citations | dead | src comment | test comment | src string | test string | |---|---|---|---|---|---|---| | before, `6c96b37be` | 20 | **1** | 1 | 0 | 0 | 0 | | after, `3e5cba47c` | 19 | **0** | 0 | 0 | 0 | 0 | Its src-comment column equals the census's 1, which is the control on the second instrument. The 19 live citations are the same in both readings (17 by the census's judgement, 2 by the single read), none is cross-repo, none is unjudged, and the drop of 1 citation is exactly the rewritten site. A third, raw reading (every `#` followed by 2 to 6 digits, whatever surrounds it) finds 20 occurrences before and 19 after, the same drop of 1, and no token beyond the gate's grammar. ## Per-number table Sites and files count every dead occurrence in scope at the base (comments and strings, tests included). | number | sites / files | rewritten / left | anchor: what it decided | |---|---|---|---| | `objectstack-ai#11671` | 1/1 | 1/0 | `09b4f4e4e` (PR objectstack-ai#12557): the extract command's `--source-hashes` option writes a per-locale provenance companion, `LOCALE.source-hashes.generated.ts`, beside the generated translation bundles, recording for each leaf the source revision it is still a byte copy of, per maintainer ruling objectstack-ai#12069 Option A. That is exactly what `:26-27` say. Its message names `objectstack-ai#12069` but not `objectstack-ai#11671`; its own diff names `objectstack-ai#11671` on 16 added lines. `git blame` puts `:27` in `30928a615` (PR objectstack-ai#12724, which wires the serving-time read of that companion into all nine bundle sets), a descendant of the anchor. Reused: stages 1, 2, 4, 6, 7, 9 and 16 gave the identical line in seven sibling packages this anchor | The sha matches exactly one commit (`git rev-parse --disambiguate`, count 1) and is an ancestor of the base (`merge-base --is-ancestor`, exit 0; reverse leg, base against the anchor, exit 1; control leg exit 0: the repository's root commit `1598cabe4`, 15,219 commits behind the base, against the anchor's 3,821; the history is complete, `--is-shallow-repository` false, 15,220 commits at the base). `objectstack-ai#11671` answers 404 on the issues endpoint and on the pull-request endpoint, read one by one. No ADR, `scripts/adr-anchors/` file or ruling record names `objectstack-ai#11671`, `objectstack-ai#12069` or the source-hash companion (`git grep` over `docs/adr` and `scripts/adr-anchors`: one unrelated `source-hash cache` hit in ADR-0080; nothing under `docs/` outside the release pages names either number), so ruling C's first rung is empty. ## Wordings to check - **Tag swap in place.** 「(maintainer ruling objectstack-ai#12069 Option A, objectstack-ai#11671)」 became 「(maintainer ruling objectstack-ai#12069 Option A, commit 09b4f4e)」. It is the form, and the byte-identical line, the seven sibling translation sets carry. The line grows from 77 to 87 characters, as it did in each sibling; `eslint.config.mjs` declares no line-length rule, and reflowing would have moved neighbouring lines. ## Sites left - **In `src`: none.** No test title, assertion message, operator log string, runtime refusal, quoted maintainer ruling or generated file in this package carries a dead number. The three generated `*.source-hashes.generated.ts` headers carry only the live `objectstack-ai#12069` and `objectstack-ai#8765`. - **Outside `src`, listed and left, not edited in this stage:** - `scripts/i18n-extract.config.ts:17` names the dead `objectstack-ai#11671` (beside the live `objectstack-ai#12069`); the anchor for whoever next edits it is `09b4f4e4e`. The file is outside `files[]` and outside the census surface. Its other numbers are live: `objectstack-ai#12559` and `objectstack-ai#10868`. - `tsconfig.scripts.json:1` names the dead `objectstack-ai#11351` (404 on the issue and pull-request endpoints). Its other numbers are live: `objectstack-ai#10756` and `objectstack-ai#5475`. - `vitest.config.ts` names the live `objectstack-ai#10374`; `README.md` names the live `objectstack-ai#2992` on 2 lines. - The release-owned `CHANGELOG.md` names the dead `objectstack-ai#11671` on 2 lines (`:779`, `:825`) and the dead `objectstack-ai#13112` on 1 line (`:696`; 404 on the issue and pull-request endpoints). Its other 15 numbers are live: 11 by the census's judgement, and by single reads `objectstack-ai#18715`, `objectstack-ai#20044` and `objectstack-ai#12642` as issues and `objectstack-ai#2528` as a pull request. - `package.json` and `tsconfig.json` name none. ## Mechanical guard: no code token moves The guard compares, base `6c96b37be` against head, over the one touched `.ts` file: - **Reading 1**, the TypeScript parser's leaf nodes (a `forEachChild` walk, so comments are trivia and JSDoc nodes are never visited). String and template literals are therefore read in full. - **Reading 2**, the full token stream in parser context (a `getChildren` walk, so punctuation and keywords are included; JSDoc nodes skipped). Results: - Real run at the head `3e5cba47c`: 50 base leaf tokens, **0 files with a token change** on either reading (exit 0). - Comment control (「Recording alone changes nothing a user sees」 to 「... alters ...」): 0 files changed, as expected (exit 0). - Positive control, a code identifier renamed (`undefined, zhCNGeneratedSourceHashes)` to `...SourceHashesX)`): DIFFER on the identifier in both readings (exit 1). - Positive control, a string-literal key changed (`'es-ES': withSourceFallback` to `'es-EZ': ...`): DIFFER on the string literal in both readings (exit 1). - Positive control, a keyword changed (`const enSource` to `let enSource`): DIFFER on the keyword in reading 2 (exit 1). Reading 1 cannot see it, which is why both readings run. Every mutation went through `scripts/ablation-replace.mjs` (wrap mode) under a shell trap that restores by absolute path, and each landed (anchor 1 to 0, blob changed). Each restore was proven byte-identical to the HEAD blob (`cb6af4310953`), with `git diff HEAD` empty and a clean tree afterwards. ## Changeset: none (`skip-changeset`) `files[]` is `dist`, `README.md` and `CHANGELOG.md`, and the package is not private. Measured on the built package (A3), after a full `turbo run build` at `3e5cba47c`, where this package's own `tsup` ran (a cache miss) and cleaned its output folder: - The rewritten line, its whole docblock (`:23-49`, which sits on the unexported `const enSource`), the anchor sha, the old number and the live `objectstack-ai#12069` appear in no `dist` file (0 in all 6, source maps included). Nor do its neighbours `:24`, `:26`, `:28`, `:29` and `:46`, the module header `:4`, or a never-written negative phrase. The bundle hoists that declaration to a bare `var enSource, RealtimeTranslations;` inside the lazily imported module's init wrapper, and its docblock does not travel with it. - Positive controls, text that does ship: from this same file, `RealtimeTranslations` (12 hits), `withSourceFallback` (7) and `zhCNGeneratedSourceHashes` (6) are in the JS entries. A docblock line of this package, `realtime-service-plugin.ts:49` (「Services init() registers on every path」, on a class field), is in all four entries: `index.js`, `index.cjs`, `index.d.ts` and `index.d.cts`. So a docblock can reach `dist` here; this one does not. - **Byte identity.** The package was rebuilt with the base line put back (through `scripts/ablation-replace.mjs`, with the file proven equal to the base blob `19744f2a54a4` during the leg), and again after the proven restore. Each leg cleaned the output folder and rebuilt ESM, CJS and declarations. The sha256 of all 6 `dist` files is identical in all three builds: JS entries, declaration files and source maps. So nothing this PR rewrites is published, and a changeset would announce a change no consumer can observe. No `.changeset/*` file is added or touched. ## Gates (head `3e5cba47c`) - **Citation judging, as CI runs it:** `node scripts/check-issue-citations.mjs` exits 0 (「every citation this change adds resolves」; it judged the one added citation, `objectstack-ai#12069`). `pnpm check:issue-citations` exits 0 (self-test, 114 cases, 8 batteries). - **Doc authoring:** `pnpm check:doc-authoring` exits 0 (the sibling-package prose-id baseline holds, no growth). - **Derived gates:** `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` at `3e5cba47c` (change set derived from git: 1 path against the merge base `6c96b37be`) derived 50 commands, all among the dispatch list's 63. - All 63 of the dispatch list ran, each with its exit code captured before any pipe, and all 63 exit 0; none exited 3. - `--ran`, fed each command with its exit code, reports 50 derived, 50 run, 0 NOT MEASURED (a derived zero), 0 unrun, and exits 0. Of the other 13, it classifies 7 as pending-changeset families and 6 as outside this derivation. - A full `turbo run build` over `./packages/*` and `./packages/*/*` ran first under the shared verify lock (71 of 71 tasks), so no gate hit an unbuilt workspace. - **Roster families the derivation lists outside its commands** (their rosters sit in a directory this diff touches): `pnpm check:authz-resolver`, `pnpm check:error-code-casing` and `pnpm check:filter-alias-parity`, plus `node scripts/check-changeset-fixed.mjs`, which the dispatch named. Each exits 0. - **Tests and typecheck, under the verify lock, at `3e5cba47c`:** - `pnpm --filter @objectstack/service-realtime test`: 5 files pass and 33 tests pass, which is every tracked test file under `src/`. - `pnpm --filter @objectstack/service-realtime typecheck` exits 0, and `tsc --noEmit --listFiles` puts the touched file in the program (the config includes `src` and excludes no test file; all 5 test files are listed). The package has no `check:test-typecheck` script. - **Lint, as a proven narrowing:** eslint with inline config disabled, over the touched `.ts` file, gives 1 file, 0 errors and 0 warnings (its `--format json` output). The file is in eslint's own population (not reported ignored; `dist/index.js`, the control, reads ignored). `eslint.config.mjs` never enables type-aware linting (no `parserOptions.project`, as its own lines 327-328 state), so a comment edit here cannot move the verdict on any untouched file. The repo-wide `pnpm lint` is CI's run. - **Control bytes:** `pnpm check:nul-bytes` exits 0, and a raw scan of the changed file for control bytes finds none. ## Acceptance notes - **The gate-invisible spellings, grepped as the claim asked** (objectstack-ai#20636, including the `clause #N` position). At the base and at the head, `#N-word`, `#A/#B`, `option #N`, `clause #N` and URL-spelled links are each on 0 lines of this package's `src` (a known-present spelling, `objectstack-ai#14646`, reads 3 lines as the control), so the claim's 0 / 0 / 0 / 0 / 0 hold. - **`objectstack-ai#11671` elsewhere.** Five comment lines in `packages/platform-objects/src` still name it (`setup.translation.ts:49`, `source-hash.ts:87`, `:214`, `:568`, `metadata-translations/index.ts:31`), all in the census; that package belongs to the engine lane's stage card, objectstack-ai#20595. The anchor measured here, `09b4f4e4e`, is reusable there. - **Outside-`src` residue.** Two dead numbers in files outside `src` and outside `files[]` (`objectstack-ai#11671`, `objectstack-ai#11351`, listed above) are left, as stages 13 to 17 left theirs. They ship nothing and move no gate. - **The census instrument did not truncate in this stage.** Both enumerations read 188 pages at the newest frontier. - **Base.** The branch is on `main` at `6c96b37be`. `main` has since moved six commits (to `9905e61ca`, read at 14:58Z). None touches `packages/services/service-realtime`, `scripts/check-issue-citations.mjs`, `scripts/pm/dispatch-gates.mjs`, `.changeset/config.json` or the doc-authoring prose-id baseline, so no merge was taken; the merge queue rebuilds on the merged generation. The derivation's STALE TREE note names three inputs that moved there (`scripts/check-stack-collection-maps.mjs`, `scripts/fixtures/i18n-walk-parity/every-group.stack.json`, `scripts/role-word-baseline.json`); none of the derived 50 commands names them, and none mentions this package before or after, so a comment-only diff here cannot interact with them. --- _Generated by [Claude Code](https://claude.ai/code/session_01XY5uCwTjZj7884yYtyur4H)_ Co-authored-by: Claude <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Part of #20596
Clause-②: no
What changed
This is the seventeenth stage of the
domain:serviceslane of the dead-citation sweep. It coverspackages/services/service-job/src/**and nothing else. By the seat's claim (5911377566), it is the next of the two single-site packages left in the lane, taken one package per stage. Later stages cover the other packages, so this PR saysPart ofand the card stays open.Every comment or docblock site in scope that cited a tracker number answering 404 has been rewritten in ruling C+D's form C (comment 5749154545 on #19123), by the method of stages 1 to 16 (the latest is PR #20850, landed as
40d6c5fbd, the base here). That is 2 sites on 2 lines in 2 files, covering 1 number:src/never-fires.fixture.ts:30, the census's one site in this package at the base (a docblock);src/db-job-adapter.timeout.test.ts:55, a test-comment site the census defers, found by the supplementary reading below and rewritten too, as stages 1 to 15 did.No test string, source string or gate-invisible spelling in this package carries a dead number, so these two sites are the whole population.
Both rewritten lines now cite the commit in this repository that decided what they describe: 1 commit sha. No ADR or ruling record records that decision (see the per-number table), so ruling C's commit rung applies. No number was dropped.
Only comments changed. Each file keeps its line count (2 lines out, 2 in), so no line citation into either file moves. No code token moves (see the guard below). No citation number is added: the only tracker number on the added lines is the live
#8628, which already stood on its line.No changeset. Neither rewritten line reaches
dist, anddistis byte-identical with and without the rewrite (see Changeset below), so this PR takesskip-changeset.Census:
service-job, before and afterInstrument (A1). The gate's own
node scripts/check-issue-citations.mjs --census --json, read-only and unchanged. The count below is itsallocated-but-absentfindings underpackages/services/service-job/. Each run counts as a reading only because its board frontier equals the newest issue or pull-request number, read by a separate request just before and just after the run.allocated-but-absent40d6c5fbd, run 2026-09-30T12:36:32Z to 12:40:56Z6ac866f86, run 12:46:10Z to 12:49:55ZThe whole-repo drop is 1, and the finding sets of the two runs differ by exactly one row,
never-fires.fixture.ts:30 #8748, removed; none was added. Theresolvestally is 33,221 in both runs, andresolves-as-pull-request(1,985) andcross-repo-unjudged(1,018) did not move either. Neither run was truncated or discarded: both enumerations read 187 pages at the newest frontier. The seat's census counted 1 here at6bff748b, and the base agrees:6bff748bis an ancestor of the base, and no commit between them touches this package'ssrc.Supplementary instrument, the whole scope. The census does not read test files or strings. So a second reading runs the gate's own exported
extractCitations(whole-file and comment-prose projections) andnamesThisRepositoryover every.tsfile underservice-job/src(18 files). It takes its verdicts from the before census's own board reading rather than from a second enumeration: a number is dead when that census reported itallocated-but-absent, and alive when the gate's own census-scope extraction (collectCitations) judged it and the census did not report it. 4 numbers are covered by neither, because they stand only in test files. Each was read on its own through the read-only tools, and each answers as an issue:#8628,#9611,#9631and#9633. The probe's control:#8748answers 404 on the issues endpoint and on the pull-request endpoint.40d6c5fbd6ac866f86Its src-comment column equals the census's 1, which is the control on the second instrument. The 93 live citations are the same in both readings (81 by the census's judgement, 12 by the single reads), none is cross-repo, none is unjudged, and the drop of 2 citations is exactly the two rewritten sites. A third, raw reading (every
#followed by 2 to 6 digits, whatever surrounds it) finds 95 occurrences before and 93 after, the same drop of 2, and no token beyond the gate's grammar.Per-number table
Sites and files count every dead occurrence in scope at the base (comments and strings, tests included).
#8748226cb71d5(PR #8774): every exact-count case in this package moves onto the inertNEVER_FIREScron fixture ('0 0 30 2 *', February 30th, which never occurs), and the fixture moves out of the timeout suite into the sharednever-fires.fixture.ts. Its message records the measurement:30describes: onlyDatefaked, the registration placed 2/5/10/15 ms before the expression's instant, one extra handler run per case under the firing spellings, and two of the three no longer reproducing at a 2 ms lead. That is what:30says, and what:55's 「now shared with the sibling job suites rather than spelled a second time here」 says. Its subject names#8748, and its own diff names it on 2 added lines;git blameputs both rewritten lines in this commitThe sha matches exactly one commit (
git rev-parse --disambiguate, count 1) and is an ancestor of the base (merge-base --is-ancestor, exit 0; reverse leg, base against the anchor, exit 1; control legs exit 0:7246d631d, 5,451 commits behind the base, and the repository's root commit1598cabe4, 15,209 behind, against the anchor's 5,436; the history is complete,--is-shallow-repositoryfalse, 15,210 commits at the base).#8748answers 404 on the issues endpoint and on the pull-request endpoint, read one by one.No ADR,
scripts/adr-anchors/file or ruling record names#8748, PR #8774,NEVER_FIRES,never-fires, February 30th or an inert cron (git grepoverdocs/adrandscripts/adr-anchors: 0 hits), so ruling C's first rung is empty. The repository's other#8748tokens areobjectui#8748, a cross-repo reference the gate never judges.Wordings to check
never-fires.fixture.ts:30, tag swap in place. 「Measured (service-job:cron-job-adapter.test.tscarries the same minute-boundary self-fire hazard fixed in #8628 — four cases register a real every-minute cron and assert exact counts #8748) by faking ONLYDate」 became 「Measured (commit 226cb71) by faking ONLYDate」. The form is the onepackages/lint/src/lint-flow-patterns.ts:1468already carries onmain(「Measured (commit 8ed9c54)」).db-job-adapter.timeout.test.ts:55, tag swap in place. 「(service-job:db-job-adapter.timeout.test.tsreds CI whenever the run crosses a minute boundary — it registers a real every-minute cron and asserts exactly one run row #8628, service-job:cron-job-adapter.test.tscarries the same minute-boundary self-fire hazard fixed in #8628 — four cases register a real every-minute cron and assert exact counts #8748)」 became 「(service-job:db-job-adapter.timeout.test.tsreds CI whenever the run crosses a minute boundary — it registers a real every-minute cron and asserts exactly one run row #8628, commit 226cb71)」. The live#8628stays: it is the report of the wall-clock flake, whose own change,7246d631d(PR test(service-job): make the timeout suite's cron unable to self-fire #8750), first made this suite's cron unable to self-fire. The form is the one stages 7 and 9 landed (for example(#5928, commit 69787f07b)inplugin-audit).eslint.config.mjsdeclares no line-length rule, and reflowing would have moved neighbouring lines.Sites left
src: none. No test title, assertion message, operator log string, runtime refusal, quoted maintainer ruling or generated file in this package carries a dead number.src, listed and left, not edited in this stage:CHANGELOG.mdnames the dead#13112on 1 line (:705; 404 on the issue and pull-request endpoints). Its other 27 numbers are live: 19 by the census's judgement, and by single reads#18715,#14619,#9517,#1893,#9611,#9631and#9633as issues and#9546as a pull request.vitest.config.tsnames the live#10374.README.md,package.jsonandtsconfig.jsonname none.Mechanical guard: no code token moves
The guard compares, base
40d6c5fbdagainst head, over both touched.tsfiles:forEachChildwalk, so comments are trivia and JSDoc nodes are never visited). String and template literals are therefore read in full.getChildrenwalk, so punctuation and keywords are included; JSDoc nodes skipped).Results:
6ac866f86: 755 base leaf tokens, 0 files with a token change on either reading (exit 0).expression: NEVER_FIRES }toexpression: NEVER_FIRESX }): DIFFER on the identifier in both readings (exit 1).'0 0 30 2 *'to'0 0 31 2 *'): DIFFER on the string literal in both readings (exit 1).TIMEOUT_MS = 20to21): DIFFER on the literal in both readings (exit 1).Every mutation went through
scripts/ablation-replace.mjs(wrap mode) under a shell trap that restores by absolute path, and each landed (anchor 1 to 0, blob changed). Each restore was proven byte-identical to the HEAD blobs (1fd5e1b3f612,ce37b1050c78), withgit diff HEADempty and a clean tree afterwards.Changeset: none (
skip-changeset)files[]isdist,README.mdandCHANGELOG.md, and the package is not private.never-fires.fixture.tsis a test-only support module (nothing insrc/index.tsre-exports it, and the tsup entry issrc/index.tsalone), and the other touched file is a test. Measured on the built package (A3), afterpnpm --filter '@objectstack/service-job...' buildat6ac866f86, where the package's owntsupran and cleaned its output folder:distfile (0 in all 6, source maps included). Nor do the old number,#8628, the anchor sha, the neighbouring lines:28,:31,:54and:56,NEVER_FIRES, the'0 0 30 2 *'expression, or a never-written negative phrase.CronJobAdapter(45 hits),DbJobAdapter(73) andsys_job_run(52) across the entries, and two docblock lines of theDbJobAdapterclass JSDoc indb-job-adapter.ts(「{@link DbJobAdapterOptions.recordRuns}isfalse, the on/off switch for」 and therecordRunsgating line below it), each inindex.d.tsandindex.d.cts.scripts/ablation-replace.mjslegs, with each file proven equal to its base blob,919a2e444f23andeb00f6eb1978, during the leg), and again after the proven restore. The sha256 of all 6distfiles is identical in all three builds: JS entries, declaration files and source maps.So nothing this PR rewrites is published, and a changeset would announce a change no consumer can observe. No
.changeset/*file is added or touched.Gates (head
6ac866f86)node scripts/check-issue-citations.mjsexits 0 (「no issue citations added against 40d6c5f」).pnpm check:issue-citationsexits 0 (self-test, 114 cases, 8 batteries).pnpm check:doc-authoringexits 0 (the sibling-package prose-id baseline holds, no growth).node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackat6ac866f86(change set derived from git: 2 paths against the merge base40d6c5fbd) derived 54 commands, all among the dispatch list's 63.--ran, fed each command with its exit code, reports 54 derived, 54 run, 0 NOT MEASURED (a derived zero), 0 unrun, and exits 0. Of the other 9, it classifies 7 as pending-changeset families and 2 as outside this derivation.turbo run buildover./packages/*and./packages/*/*ran first under the shared verify lock (71 of 71 tasks), so no gate hit an unbuilt workspace.pnpm check:authz-resolver,pnpm check:error-code-casingandpnpm check:filter-alias-parity, plusnode scripts/check-changeset-fixed.mjs, which the dispatch named. Each exits 0.6ac866f86:pnpm --filter @objectstack/service-job test: 11 files pass and 117 tests pass, which is every tracked test file undersrc/.pnpm --filter @objectstack/service-job typecheckexits 0, andtsc --noEmit --listFilesputs both touched files in the program (the config includessrcand excludes no test file)..tsfiles, gives 2 files, 0 errors and 0 warnings (its--format jsonoutput). Both files are in eslint's own population (not reported ignored;dist/index.js, the control, reads ignored).eslint.config.mjsnever enables type-aware linting (noparserOptions.project, as its own lines 327-328 state), so a comment edit here cannot move the verdict on any untouched file. The repo-widepnpm lintis CI's run.pnpm check:nul-bytesexits 0, and a raw scan of the changed files for control bytes finds none.Acceptance notes
CITATION_RErefuses a hyphen after the digits, so a dead#N-wordcitation (#13398-class) is invisible to the diff gate and to the census #20636, including theclause #Nposition). At the base and at the head,#N-word,#A/#B,option #N,clause #Nand URL-spelled links are each on 0 lines, so the claim's 0 / 0 / 0 / 0 / 0 hold. The one prefix-joined token,pre-#6617in a test title ofdb-job-adapter.degraded-outcome.test.ts, is inside the gate's grammar and names a live number.service-job/src. It carries no number, neither instrument sees it, and this diff removes no antecedent.srcresidue.CHANGELOG.md:705names the dead#13112; the file is release-owned and is left.mainat40d6c5fbd.mainhas since moved two commits (to660a9b247). Neither touchespackages/services/service-job,scripts/check-issue-citations.mjs,scripts/pm/dispatch-gates.mjsor.changeset/config.json, so no merge was taken; the merge queue rebuilds on the merged generation. The one derivation input that moved isscripts/doc-authoring-prose-id.baseline.json, where the second commit removed onlypackages/objectqlentries; this package has no entry there before or after, so the merged tree cannot move that gate's verdict on this diff.Generated by Claude Code