docs(service-realtime): re-anchor the dead tracker citation to the commit that decided it - #20881
Merged
objectstack-fleet[bot] merged 1 commit intoSep 30, 2026
Conversation
…mmit that decided it One docblock site under packages/services/service-realtime/src cited a tracker number that answers 404: translations/index.ts:27, 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 seven 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 — 8 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-realtime-citations
branch
September 30, 2026 15:35
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 eighteenth stage of the
domain:serviceslane of the dead-citation sweep, and the lane's last package. It coverspackages/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 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 17 (the latest is PR #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
#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, anddistis byte-identical with and without the rewrite (see Changeset below), so this PR takesskip-changeset.Census:
service-realtime, 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-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.allocated-but-absent6c96b37be, run 2026-09-30T14:25:19Z to 14:29:09Z3e5cba47c, run 14:40:18Z to 14:44:03ZThe whole-repo drop is 1, and the finding sets of the two runs differ by exactly one row,
translations/index.ts:27 #11671, removed; none was added. Theresolvestally is 33,322 in both runs, andresolves-as-pull-request(1,985) andcross-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 at6bff748b, and the base agrees:6bff748bis an ancestor of the base, and no commit between them touches this package.At the after head, no package under
packages/services/,packages/plugins/orpackages/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) andnamesThisRepositoryover every.tsfile underservice-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 itallocated-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:#20044, read on its own through the read-only tools, answers as an issue. The probe's control:#11671answers 404 on the issues endpoint and on the pull-request endpoint.6c96b37be3e5cba47cIts 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).
#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:26-27say. Its message names#12069but not#11671; its own diff names#11671on 16 added lines.git blameputs:27in30928a615(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, 9 and 16 gave the identical line in seven 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 leg exit 0: the repository's root commit1598cabe4, 15,219 commits behind the base, against the anchor's 3,821; the history is complete,--is-shallow-repositoryfalse, 15,220 commits at the base).#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; nothing underdocs/outside the release pages names either number), 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 seven sibling translation sets carry. The line grows from 77 to 87 characters, as it did in each sibling;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. The three generated*.source-hashes.generated.tsheaders carry only the live#12069and#8765.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. Its other numbers are live:#12559and#10868.tsconfig.scripts.json:1names the dead#11351(404 on the issue and pull-request endpoints). Its other numbers are live:#10756and#5475.vitest.config.tsnames the live#10374;README.mdnames the live#2992on 2 lines.CHANGELOG.mdnames the dead#11671on 2 lines (:779,:825) and the dead#13112on 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#18715,#20044and#12642as issues and#2528as a pull request.package.jsonandtsconfig.jsonname none.Mechanical guard: no code token moves
The guard compares, base
6c96b37beagainst 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:
3e5cba47c: 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': withSourceFallbackto'es-EZ': ...): DIFFER on the string literal in both readings (exit 1).const enSourcetolet 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), 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), after a fullturbo run buildat3e5cba47c, where this package's owntsupran (a cache miss) and cleaned its output folder::23-49, which sits on the unexportedconst enSource), the anchor sha, the old number and the live#12069appear in nodistfile (0 in all 6, source maps included). Nor do its neighbours:24,:26,:28,:29and:46, the module header:4, or a never-written negative phrase. The bundle hoists that declaration to a barevar enSource, RealtimeTranslations;inside the lazily imported module's init wrapper, and its docblock does not travel with it.RealtimeTranslations(12 hits),withSourceFallback(7) andzhCNGeneratedSourceHashes(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.tsandindex.d.cts. So a docblock can reachdisthere; this one does not.scripts/ablation-replace.mjs, with the file proven equal to the base blob19744f2a54a4during the leg), and again after the proven restore. Each leg cleaned the output folder and rebuilt ESM, CJS and declarations. 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
3e5cba47c)node scripts/check-issue-citations.mjsexits 0 (「every citation this change adds resolves」; it judged the one added citation,#12069).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/objectstackat3e5cba47c(change set derived from git: 1 path against the merge base6c96b37be) derived 50 commands, all among the dispatch list's 63.--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.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.3e5cba47c:pnpm --filter @objectstack/service-realtime test: 5 files pass and 33 tests pass, which is every tracked test file undersrc/.pnpm --filter @objectstack/service-realtime typecheckexits 0, andtsc --noEmit --listFilesputs the touched file in the program (the config includessrcand excludes no test file; all 5 test files are listed). The package has nocheck:test-typecheckscript..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-word,#A/#B,option #N,clause #Nand URL-spelled links are each on 0 lines of this package'ssrc(a known-present spelling,#14646, reads 3 lines as the control), so the claim's 0 / 0 / 0 / 0 / 0 hold.#11671elsewhere. Five comment lines inpackages/platform-objects/srcstill 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, dead tracker citations in thedomain:enginepackages (645 sites, 160 numbers, 104 files): the ruling C+D stage for this lane (from #20556) #20595. The anchor measured here,09b4f4e4e, is reusable there.srcresidue. Two dead numbers in files outsidesrcand outsidefiles[](#11671,#11351, listed above) are left, as stages 13 to 17 left theirs. They ship nothing and move no gate.mainat6c96b37be.mainhas since moved six commits (to9905e61ca, read at 14:58Z). None touchespackages/services/service-realtime,scripts/check-issue-citations.mjs,scripts/pm/dispatch-gates.mjs,.changeset/config.jsonor 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