docs(plugin-webhooks): re-anchor the dead tracker citation to the commit that decided it - #20850
Merged
objectstack-fleet[bot] merged 1 commit intoSep 30, 2026
Conversation
…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>
Contributor
📓 Docs Drift Check
What this run could not see
Coarse fallback — 4 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-plugin-webhooks-citations
branch
September 30, 2026 12:29
This was referenced Sep 30, 2026
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 sixteenth stage of the
domain:serviceslane of the dead-citation sweep. It coverspackages/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 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 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, anddistis byte-identical with and without the rewrite (see Changeset below), so this PR takesskip-changeset.Census:
plugin-webhooks, 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/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.allocated-but-absentbbe03f406, run 2026-09-30T11:09:05Z to 11:12:38Z01312906e, run 11:26:38Z to 11:30:05ZThe whole-repo drop is 1, exactly this diff's census site. The
resolvestally is 33,194 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 the one commit between them that touches this package'ssrc(7184436a4, a re-translation of generated object leaves) does not touchtranslations/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) andnamesThisRepositoryover every.tsfile underplugin-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 itallocated-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:#10619answers as an issue;#8556,#13565and#15687answer as pull requests. The probe's controls:#11671and the known issue#10619answer 404 on the pull-request endpoint.bbe03f40601312906eIts 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).
#1167109b4f4e4e(PR #12557): the extract command's--source-hashesoption 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-26say. Its message names#12069but not#11671; its own diff names#11671on 16 added lines, the first of them its changeset's headline.git blameputs:26in30928a615(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 anchorThe 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 landing422db788a, and the repository's root commit, 15,200 commits deep against the anchor's 3,802; the history is complete,--is-shallow-repositoryfalse, 15,201 commits).#11671answers 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,#12069or the source-hash companion (git grepoverdocs/adrandscripts/adr-anchors: one unrelatedsource-hash cachehit in ADR-0080), so ruling C's first rung is empty.Wordings to check
check:i18nverifies key presence, not that an untranslated leaf still matches the source string it was filled from — and the drift is sticky #11671)」 became 「(maintainer ruling [Decision] 把 #8765 的 source-hash sidecar 扩展到生成的 i18n bundle —— #9672 写明的升级条件已满足 #12069 Option A, commit 09b4f4e)」. It is the form, and the byte-identical line, the six sibling translation sets carry.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:scripts/i18n-extract.config.ts:17names the dead#11671(beside the live#12069); the anchor for whoever next edits it is09b4f4e4e. The file is outsidefiles[]and outside the census surface.tsconfig.scripts.json:1names the dead#11351(404 on the issue and pull-request endpoints).tsconfig.test.json:3and:56name the dead#13176(404 on both endpoints; stage 4 measured it dead).vitest.config.tsare live:#12069,#12559,#10868,#10756,#5475,#14062,#5286,#5449,#12542,#10772,#10374,#12642.CHANGELOG.mdnames#11671on 2 lines.package.json,tsconfig.jsonandtsup.config.tsname none.files[]listsREADME.md, but the package has none.Mechanical guard: no code token moves
The guard compares, base
bbe03f406against head, over the one touched.tsfile: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:
01312906e: 50 base leaf tokens, 0 files with a token change on either reading (exit 0).undefined, zhCNGeneratedSourceHashes)to...SourceHashesX)): DIFFER on the identifier in both readings (exit 1).'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), withgit diff HEADempty and a clean tree afterwards.Changeset: none (
skip-changeset)files[]isdist,README.mdandCHANGELOG.md, and the package is not private. Measured on the built package (A3), afterpnpm --filter '@objectstack/plugin-webhooks...' buildat01312906e, where the package's owntsupran and cleaned its output folder::22-55, which sits on the unexportedconst enSource) and the old number appear in nodistfile (0 in all 20, source maps included). Nor do its neighbours:23,:25,:27and:30, or a never-written negative phrase.WebhooksTranslationsfrom this same file is inindex.js,index.cjsand both translations chunks (8), andzhCNGeneratedSourceHashesis in both translations chunks (4). A docblock line of this package,auto-enqueuer.ts:33(「Enqueue callback into the sharedservice-messagingHTTP outbox (ADR-0018 M3).」), is inindex.d.tsandindex.d.cts.scripts/ablation-replace.mjs, with the file proven equal to the base blob686646fac51dduring the leg), and again after the proven restore. The sha256 of all 20distfiles 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)node scripts/check-issue-citations.mjsexits 0 (「every citation this change adds resolves」).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/objectstackat01312906e(change set derived from git: 1 path against the merge basebbe03f406) derived 50 commands, all among the dispatch list's 65.--ran, fed each command with its exit code, reports 50 derived, 50 run, 0 NOT MEASURED (a derived zero), 0 unrun, and exits 0.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.01312906e:pnpm --filter @objectstack/plugin-webhooks test: 13 files pass and 160 tests pass, which is every tracked test file undersrc/.pnpm --filter @objectstack/plugin-webhooks typecheckexits 0, andtsc --noEmit --listFilesputs the touched file in the program (the config includessrcand excludes no test file).pnpm --filter @objectstack/plugin-webhooks check:test-typecheckexits 0 (0 files held in the package's debt ledger)..tsfile, gives 1 file, 0 errors and 0 warnings (its--format jsonoutput). The file is 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 file 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-wordis on 0 lines.#A/#Bis 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#8565read on its own as a pull request.option #N,clause #Nand 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 isPD #12atauto-enqueuer.ts:919, a Prime Directive ordinal the extractor excuses on purpose.srcresidue. Three dead numbers in files outsidesrcand outsidefiles[](#11671,#11351,#13176, listed above) are left, as stages 13 to 15 left theirs. They ship nothing and move no gate.#11671→09b4f4e4e.service-realtime/src/translations/index.ts:27still carries the dead number in the identical sentence.mainatbbe03f406.mainhas since moved five commits (to688ddef3c). None touchespackages/plugins/plugin-webhooks,scripts/check-issue-citations.mjs,scripts/pm/dispatch-gates.mjsor.changeset/config.json. No merge was taken; the merge queue rebuilds on the merged generation.Generated by Claude Code