Skip to content

docs(plugin-webhooks): re-anchor the dead tracker citation to the commit that decided it - #20850

Merged
objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/issue-20596-plugin-webhooks-citations
Sep 30, 2026
Merged

objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/issue-20596-plugin-webhooks-citations

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Part of #20596
Clause-②: no

What changed

This is the sixteenth stage of the domain:services lane of the dead-citation sweep. It covers packages/plugins/plugin-webhooks/src/** and nothing else. By the seat's claim (5909908590), it is the next of the three single-site packages left in the lane, taken one package per stage. Later stages cover the other packages, 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 #19123), by the method of stages 1 to 15 (the latest is PR #20836, landed as bbe03f406). That is 1 site on 1 line in 1 file, covering 1 number:

  • src/translations/index.ts:26, the census's one site in this package at the base. 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 #12069, which already stood on it.

The rewritten line is byte-identical to the line the six sibling translation sets already carry (plugin-approvals:26, plugin-audit:28, plugin-security:26, plugin-sharing:26, service-messaging:29, service-storage:29), landed by stages 1, 2, 4, 6, 7 and 9.

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: plugin-webhooks, 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/plugins/plugin-webhooks/. 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 plugin-webhooks sites lines files numbers
before base bbe03f406, run 2026-09-30T11:09:05Z to 11:12:38Z enumerated, 187 pages, frontier #20841 (newest #20841 before and after) 748 1 1 1 1
after head 01312906e, run 11:26:38Z to 11:30:05Z enumerated, 187 pages, frontier #20843 (newest #20842 before; #20843 after, a pull request opened 11:29:02Z inside the run, so the frontier equals the newest at the run's end) 747 0 0 0 0

The whole-repo drop is 1, exactly this diff's census site. The resolves tally is 33,194 in both runs, and resolves-as-pull-request (1,985) and cross-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 at 6bff748b, and the base agrees: 6bff748b is an ancestor of the base, and the one commit between them that touches this package's src (7184436a4, a re-translation of generated object leaves) does not touch translations/index.ts:26.

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 plugin-webhooks/src (34 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 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: #10619 answers as an issue; #8556, #13565 and #15687 answer as pull requests. The probe's controls: #11671 and the known issue #10619 answer 404 on the pull-request endpoint.

reading citations dead src comment test comment src string test string
before, bbe03f406 369 1 1 0 0 0
after, 01312906e 368 0 0 0 0 0

Its src-comment column equals the census's 1, which is the control on the second instrument. The 368 live citations are the same in both readings (363 by the census's judgement, 5 by the single reads), 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 378 occurrences before and 377 after, the same drop of 1. The 9 tokens beyond the gate's grammar are the same before and after, and none is dead (see Acceptance notes).

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
#11671 1/1 1/0 09b4f4e4e (PR #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 #12069 Option A. That is exactly what :25-26 say. Its message names #12069 but not #11671; its own diff names #11671 on 16 added lines, the first of them its changeset's headline. git blame puts :26 in 30928a615 (PR #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 and 9 gave the identical line in six 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 legs exit 0: stage 1's landing 422db788a, and the repository's root commit, 15,200 commits deep against the anchor's 3,802; the history is complete, --is-shallow-repository false, 15,201 commits). #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 #11671, #12069 or the source-hash companion (git grep over docs/adr and scripts/adr-anchors: one unrelated source-hash cache hit in ADR-0080), so ruling C's first rung is empty.

Wordings to check

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.
  • Outside src, listed and left, not edited in this stage:
    • scripts/i18n-extract.config.ts:17 names the dead #11671 (beside the live #12069); the anchor for whoever next edits it is 09b4f4e4e. The file is outside files[] and outside the census surface.
    • tsconfig.scripts.json:1 names the dead #11351 (404 on the issue and pull-request endpoints).
    • tsconfig.test.json:3 and :56 name the dead #13176 (404 on both endpoints; stage 4 measured it dead).
    • The other numbers in those files and in vitest.config.ts are live: #12069, #12559, #10868, #10756, #5475, #14062, #5286, #5449, #12542, #10772, #10374, #12642.
    • The release-owned CHANGELOG.md names #11671 on 2 lines.
    • package.json, tsconfig.json and tsup.config.ts name none. files[] lists README.md, but the package has none.

Mechanical guard: no code token moves

The guard compares, base bbe03f406 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 01312906e: 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 token renamed (undefined, zhCNGeneratedSourceHashes) to ...SourceHashesX)): DIFFER on the identifier in both readings (exit 1).
  • Positive control, a string-literal key changed ('es-ES' to 'es-EZ'): DIFFER on the string 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 blob (929fa19989e2), 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 pnpm --filter '@objectstack/plugin-webhooks...' build at 01312906e, where the package's own tsup ran and cleaned its output folder:

  • The rewritten line, its whole docblock (:22-55, which sits on the unexported const enSource) and the old number appear in no dist file (0 in all 20, source maps included). Nor do its neighbours :23, :25, :27 and :30, or a never-written negative phrase.
  • Positive controls, text that does ship: WebhooksTranslations from this same file is in index.js, index.cjs and both translations chunks (8), and zhCNGeneratedSourceHashes is in both translations chunks (4). A docblock line of this package, auto-enqueuer.ts:33 (「Enqueue callback into the shared service-messaging HTTP outbox (ADR-0018 M3).」), is in index.d.ts and index.d.cts.
  • 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 686646fac51d during the leg), and again after the proven restore. The sha256 of all 20 dist files is identical in all three builds: JS entries, declaration files, chunks 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 01312906e)

  • Citation judging, as CI runs it: node scripts/check-issue-citations.mjs exits 0 (「every citation this change adds resolves」). 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 01312906e (change set derived from git: 1 path against the merge base bbe03f406) derived 50 commands, all among the dispatch list's 65.
    • All 65 of the dispatch list ran, each with its exit code captured before any pipe, and all 65 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.
    • 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 01312906e:
    • pnpm --filter @objectstack/plugin-webhooks test: 13 files pass and 160 tests pass, which is every tracked test file under src/.
    • pnpm --filter @objectstack/plugin-webhooks typecheck exits 0, and tsc --noEmit --listFiles puts the touched file in the program (the config includes src and excludes no test file).
    • pnpm --filter @objectstack/plugin-webhooks check:test-typecheck exits 0 (0 files held in the package's debt ledger).
  • 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 (check-issue-citations closeout (extractor spellings): CITATION_RE refuses a hyphen after the digits, so a dead #N-word citation (#13398-class) is invisible to the diff gate and to the census #20636, including the clause #N position). At the base and at the head, #N-word is on 0 lines. #A/#B is on 8 lines (8 second numbers), and every second number is live: #8022 (3 lines), #7986 (2) and #8043 (2) by the census's own judgement, and #8565 read on its own as a pull request. option #N, clause #N and URL-spelled links are on 0 lines. So the claim's 0 / 8 / 0 / 0 / 0 hold, and nothing dead hides behind them. The one other raw token beyond the grammar is PD #12 at auto-enqueuer.ts:919, a Prime Directive ordinal the extractor excuses on purpose.
  • Outside-src residue. Three dead numbers in files outside src and outside files[] (#11671, #11351, #13176, listed above) are left, as stages 13 to 15 left theirs. They ship nothing and move no gate.
  • The census instrument did not truncate in this stage. Both enumerations read 187 pages at the newest frontier.
  • Anchor for the next stages: #11671 → 09b4f4e4e. service-realtime/src/translations/index.ts:27 still carries the dead number in the identical sentence.
  • Base. The branch is on main at bbe03f406. main has since moved five commits (to 688ddef3c). None touches packages/plugins/plugin-webhooks, scripts/check-issue-citations.mjs, scripts/pm/dispatch-gates.mjs or .changeset/config.json. No merge was taken; the merge queue rebuilds on the merged generation.

Generated by Claude Code

…mit that decided it

One docblock site under packages/plugins/plugin-webhooks/src cited a tracker
number that answers 404: translations/index.ts:26, which says where the
per-locale provenance companion comes from. It now cites the commit in this
repository that decided it (ruling C's commit rung; no ADR records it):

- #11671 -> 09b4f4e, the extract command's --source-hashes option that
  writes the per-locale source-hashes companion beside the generated bundles,
  per maintainer ruling #12069 Option A (1 line).

The rewritten line is byte-identical to the one the six sibling translation
sets already carry. The file keeps its line count; no code token moves; no
citation number is added.

Claude-Session: https://claude.ai/code/session_01XY5uCwTjZj7884yYtyur4H
Co-authored-by: Claude <noreply@anthropic.com>
@objectstack-fleet objectstack-fleet Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 30, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

⚠️ 1 changed file(s) yielded no anchor (packages/plugins/plugin-webhooks/src/translations/index.ts), so the pages documenting them are NOT COVERED by this run — this is not a clean bill of health for those files. Nothing else in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 1 changed package(s)).

What this run could not see
  • 1 changed file(s) yielded no anchor (packages/plugins/plugin-webhooks/src/translations/index.ts) — pages documenting those are invisible to this run
  • a page that states a rule by its inputs shares no identifier with the emitter that implements the rule, so an emitter-only diff cannot list it — not on this run and not on any run. Measured on fix(driver-sql): emit varchar(maxLength) for a text field a declared index keys on #11430: content/docs/protocol/objectql/types.mdx documents the text-family column mapping by the ObjectQL type names it maps FROM (text / textarea / html) while the diff changed createColumn; it went unlisted, and it was the page that diff falsified, in four places. No shared token exists to detect this on, so a rule your change carries has to be re-read by hand in the pages that restate it.
  • a key NAME is not a key, so the hand re-read the line above prescribes can land on the wrong schema. The same spelling is authorable on one governed type and a [REMOVED] tombstone on another for each of active, aria, joins, objects, template, tools and version (censused on [finding] tools is a key on BOTH AgentSchema (tombstoned, dead) and SkillSchema (live, cloud-attested), so a name-based search attributes skill examples to the agent key — it produced a false stop-the-line alarm on PR #19059 #19093 over the liveness ledger's governed types, top-level keys); nothing in a search result distinguishes the two, so a grep hit on a LIVE example reads as evidence about the DEAD key. Measured on fix(spec): the agent.tools liveness row says dead — it claimed live on a key the schema tombstoned #19059: content/docs/ai/agents.mdx was reported as contradicting the agent.tools tombstone over its tools: example at :161, which is inside the defineSkill({ block opened at :155 — the page was already correct. Settle ownership by PARSING the value against both schemas, never by the name: that literal PASSES SkillSchema, and as an AgentSchema it FAILS at tools with the tombstone prescription. ⛔ These names are not the whole class — a key retired through a .strict() guidance map leaves no tombstone in the walked shape and none of them here (tool.category, live as AIToolDefinition.category).

Coarse fallback — 4 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): node scripts/docs-audit/affected-docs.mjs --json 688ddef3c32199cbb6d0c66ef39ed9679f1a9705 → packageMentionDocs.

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review September 30, 2026 12:12
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Sep 30, 2026
Merged via the queue into main with commit 40d6c5f Sep 30, 2026
40 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-20596-plugin-webhooks-citations branch September 30, 2026 12:29
akarma-synetal pushed a commit to akarma-synetal/framework that referenced this pull request Oct 7, 2026
…that decided it (objectstack-ai#20866)

Part of objectstack-ai#20596
Clause-②: no

## What changed

This is the seventeenth stage of the `domain:services` lane of the
dead-citation sweep. It covers `packages/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 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 16 (the latest is PR
objectstack-ai#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 `objectstack-ai#8628`, which already stood on
its line.

**No changeset.** Neither rewritten line reaches `dist`, and `dist` is
byte-identical with and without the rewrite (see Changeset below), so
this PR takes `skip-changeset`.

## Census: `service-job`, 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-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.

| reading | tree | board | whole-repo `allocated-but-absent` |
service-job sites | lines | files | numbers |
|---|---|---|---|---|---|---|---|
| before | base `40d6c5fbd`, run 2026-09-30T12:36:32Z to 12:40:56Z |
enumerated, 187 pages, frontier objectstack-ai#20855 (newest objectstack-ai#20854 before; objectstack-ai#20855
after, an issue opened 12:40:06Z inside the run, so the frontier equals
the newest at the run's end) | 745 | **1** | 1 | 1 | 1 |
| after | head `6ac866f86`, run 12:46:10Z to 12:49:55Z | enumerated, 187
pages, frontier objectstack-ai#20856 (newest objectstack-ai#20856 before and after) | 744 | **0** |
0 | 0 | 0 |

The whole-repo drop is 1, and the finding sets of the two runs differ by
exactly one row, `never-fires.fixture.ts:30 objectstack-ai#8748`, removed; none was
added. The `resolves` tally is 33,221 in both runs, and
`resolves-as-pull-request` (1,985) and `cross-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 at `6bff748b`, and the base agrees: `6bff748b` is an
ancestor of the base, and no commit between them touches this package's
`src`.

**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-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 it `allocated-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: `objectstack-ai#8628`, `objectstack-ai#9611`, `objectstack-ai#9631` and
`objectstack-ai#9633`. The probe's control: `objectstack-ai#8748` answers 404 on the issues endpoint
and on the pull-request endpoint.

| reading | citations | dead | src comment | test comment | src string |
test string |
|---|---|---|---|---|---|---|
| before, `40d6c5fbd` | 95 | **2** | 1 | 1 | 0 | 0 |
| after, `6ac866f86` | 93 | **0** | 0 | 0 | 0 | 0 |

Its 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).

| number | sites / files | rewritten / left | anchor: what it decided |
|---|---|---|---|
| `objectstack-ai#8748` | 2/2 | 2/0 | `226cb71d5` (PR objectstack-ai#8774): every exact-count case
in this package moves onto the inert `NEVER_FIRES` cron fixture (`'0 0
30 2 *'`, February 30th, which never occurs), and the fixture moves out
of the timeout suite into the shared `never-fires.fixture.ts`. Its
message records the measurement `:30` describes: only `Date` faked, 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 `:30` says, and
what `:55`'s 「now shared with the sibling job suites rather than spelled
a second time here」 says. Its subject names `objectstack-ai#8748`, and its own diff
names it on 2 added lines; `git blame` puts both rewritten lines in this
commit |

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 legs exit
0: `7246d631d`, 5,451 commits behind the base, and the repository's root
commit `1598cabe4`, 15,209 behind, against the anchor's 5,436; the
history is complete, `--is-shallow-repository` false, 15,210 commits at
the base). `objectstack-ai#8748` 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#8748`, PR
objectstack-ai#8774, `NEVER_FIRES`, `never-fires`, February 30th or an inert cron
(`git grep` over `docs/adr` and `scripts/adr-anchors`: 0 hits), so
ruling C's first rung is empty. The repository's other `objectstack-ai#8748` tokens
are `objectui#8748`, a cross-repo reference the gate never judges.

## Wordings to check

- **`never-fires.fixture.ts:30`, tag swap in place.** 「Measured (objectstack-ai#8748)
by faking ONLY `Date`」 became 「Measured (commit 226cb71) by faking
ONLY `Date`」. The form is the one
`packages/lint/src/lint-flow-patterns.ts:1468` already carries on `main`
(「Measured (commit 8ed9c54)」).
- **`db-job-adapter.timeout.test.ts:55`, tag swap in place.** 「(objectstack-ai#8628,
objectstack-ai#8748)」 became 「(objectstack-ai#8628, commit 226cb71)」. The live `objectstack-ai#8628` stays: it
is the report of the wall-clock flake, whose own change, `7246d631d` (PR
objectstack-ai#8750), first made this suite's cron unable to self-fire. The form is
the one stages 7 and 9 landed (for example `(objectstack-ai#5928, commit 69787f0)`
in `plugin-audit`).
- Neither line was reflowed, so each is 11 characters longer than before
(70 to 81, and 72 to 83), a little past its block's wrap.
`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.
- **Outside `src`, listed and left, not edited in this stage:**
- The release-owned `CHANGELOG.md` names the dead `objectstack-ai#13112` on 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
`objectstack-ai#18715`, `objectstack-ai#14619`, `objectstack-ai#9517`, `objectstack-ai#1893`, `objectstack-ai#9611`, `objectstack-ai#9631` and `objectstack-ai#9633` as
issues and `objectstack-ai#9546` as a pull request.
  - `vitest.config.ts` names the live `objectstack-ai#10374`.
  - `README.md`, `package.json` and `tsconfig.json` name none.

## Mechanical guard: no code token moves

The guard compares, base `40d6c5fbd` against head, over both touched
`.ts` files:

- **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 `6ac866f86`: 755 base leaf tokens, **0 files with
a token change** on either reading (exit 0).
- Comment control (「croner resolves Feb 29 forward」 to 「croner rolls Feb
29 forward」): 0 files changed, as expected (exit 0).
- Positive control, a code identifier renamed (`expression: NEVER_FIRES
}` to `expression: NEVER_FIRESX }`): DIFFER on the identifier in both
readings (exit 1).
- Positive control, a string literal changed (`'0 0 30 2 *'` to `'0 0 31
2 *'`): DIFFER on the string literal in both readings (exit 1).
- Positive control in the second file, a numeric literal changed
(`TIMEOUT_MS = 20` to `21`): 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`), 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. `never-fires.fixture.ts` is a test-only support module
(nothing in `src/index.ts` re-exports it, and the tsup entry is
`src/index.ts` alone), and the other touched file is a test. Measured on
the built package (A3), after `pnpm --filter
'@objectstack/service-job...' build` at `6ac866f86`, where the package's
own `tsup` ran and cleaned its output folder:

- Neither rewritten line appears in any `dist` file (0 in all 6, source
maps included). Nor do the old number, `objectstack-ai#8628`, the anchor sha, the
neighbouring lines `:28`, `:31`, `:54` and `:56`, `NEVER_FIRES`, the `'0
0 30 2 *'` expression, or a never-written negative phrase.
- Positive controls, text that does ship: `CronJobAdapter` (45 hits),
`DbJobAdapter` (73) and `sys_job_run` (52) across the entries, and two
docblock lines of the `DbJobAdapter` class JSDoc in `db-job-adapter.ts`
(「`{@link DbJobAdapterOptions.recordRuns}` is `false`, the on/off switch
for」 and the `recordRuns` gating line below it), each in `index.d.ts`
and `index.d.cts`.
- **Byte identity.** The package was rebuilt with the base text put back
in both files (through nested `scripts/ablation-replace.mjs` legs, with
each file proven equal to its base blob, `919a2e444f23` and
`eb00f6eb1978`, during the leg), and again after the proven restore. 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 `6ac866f86`)

- **Citation judging, as CI runs it:** `node
scripts/check-issue-citations.mjs` exits 0 (「no issue citations added
against 40d6c5f」). `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 `6ac866f86` (change set derived
from git: 2 paths against the merge base `40d6c5fbd`) derived 54
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 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.
- 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 `6ac866f86`:**
- `pnpm --filter @objectstack/service-job test`: 11 files pass and 117
tests pass, which is every tracked test file under `src/`.
- `pnpm --filter @objectstack/service-job typecheck` exits 0, and `tsc
--noEmit --listFiles` puts both touched files in the program (the config
includes `src` and excludes no test file).
- **Lint, as a proven narrowing:** eslint with inline config disabled,
over the 2 touched `.ts` files, gives 2 files, 0 errors and 0 warnings
(its `--format json` output). Both files are 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 files 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, so the claim's 0 / 0 / 0 / 0 / 0 hold. The one
prefix-joined token, `pre-objectstack-ai#6617` in a test title of
`db-job-adapter.degraded-outcome.test.ts`, is inside the gate's grammar
and names a live number.
- **Wording only:** 「the card」 / 「this card」 stands on 4 comment lines
in 3 files under `service-job/src`. It carries no number, neither
instrument sees it, and this diff removes no antecedent.
- **Outside-`src` residue.** `CHANGELOG.md:705` names the dead `objectstack-ai#13112`;
the file is release-owned and is left.
- **The census instrument did not truncate in this stage.** Both
enumerations read 187 pages at the newest frontier.
- **Base.** The branch is on `main` at `40d6c5fbd`. `main` has since
moved two commits (to `660a9b247`). Neither touches
`packages/services/service-job`, `scripts/check-issue-citations.mjs`,
`scripts/pm/dispatch-gates.mjs` or `.changeset/config.json`, so no merge
was taken; the merge queue rebuilds on the merged generation. The one
derivation input that moved is
`scripts/doc-authoring-prose-id.baseline.json`, where the second commit
removed only `packages/objectql` entries; 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](https://claude.ai/code/session_01XY5uCwTjZj7884yYtyur4H)_

Co-authored-by: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/xs skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants