docs(qa): re-measure the two route-census figures #16955 left behind, and split the two moves inside one sentence - #17110
Merged
os-project-manager merged 1 commit intoSep 9, 2026
Conversation
… and split the two moves inside one sentence Five sites in the tree read 76% false-ungated; two still read the pre-repair figures, and one file carried both — `authz-probe-blind-spot.census.ts:129` said 8 while `:147`, eighteen lines down, said 76%. Which number a reader got depended on which line they reached first. Carrier 1 (`authz-conformance.matrix.ts`) is arithmetic: 22 of 30 -> 22 of 29, 73% -> 76%. The five existing 76% sites are the authority; nothing new was measured for it. Carrier 2 is not arithmetic, which is why #16955 left it alone: the 8 carried a ledger-grade decomposition (3 server-only / 3 public / 2 sdk) and 29 - 22 = 7 does not say how the four numbers redistribute. Measured rather than guessed, with an AST instrument over `rest-server.ts` — the two registration spellings the census's own population rule counts, gatedness read from the call expression's syntax tree so comments cannot answer for code. It reproduces the recorded 80 / 51 gated / 29 ungated and all four pinned controls at `5abca1792e`, the commit the census anchors its own re-measurement to, and reads identically at `f6b7c53db7` despite 78 lines of drift in that file. The 7 mounts grade 3 `server-only` / 3 `public` / 1 `sdk` — the arithmetic-looking answer, arrived at by measurement. A naive text scan of the same sites reads 59/21 instead: its paren matcher runs away on an apostrophe in a comment, spanning one site from line 5244 to 10360. That is the failure mode this file already warns about for its forwarder slice, and it is why the reading is taken from a parser. The same sentence also carried `sdk` 84 / `server-only` 7 / `public` 3, which moved for an unrelated reason — #14503 took three REST package rows out of the ledger (94 -> 91), a re-measurement this file's own probe row already records. Both figures are corrected and the two causes are now named apart, because a reader had no way to tell which of them moved for which reason. The population is still 80, deriving authorization from source syntax stays rejected, and "the single route in this whole population ever measured unguarded" is preserved verbatim — guarding the route did not make it false. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015QE8qk46e5CHJxyQEUjbf8
Contributor
📓 Docs Drift CheckNothing in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 0 changed package(s)), so this run has no opinion about the docs. What this run could not see
Coarse fallback — 0 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
os-project-manager
marked this pull request as ready for review
September 9, 2026 10:04
os-project-manager
enabled auto-merge
September 9, 2026 10:04
os-project-manager
deleted the
claude/issue-16954-route-census-stale-carriers
branch
September 9, 2026 10:31
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.
Fixes #16954
Clause-②: no
Five sites in the tree already read
76%false-ungated. Two still read the pre-repair figures, and the sharpest fact is one the card did not state: one file carried both.authz-probe-blind-spot.census.ts:129said8;:147, eighteen lines further down, said76%. That is not a repair that missed two sites — it is one file contradicting itself, and which number a reader gets depends on which line they reach first.The two carriers cost completely different things
Carrier 1 —
authz-conformance.matrix.ts:34-35— arithmetic.22 of 30becomes22 of 29,73%becomes76%. Nothing new was measured for it: the five existing76%sites are the authority, exactly as the card says.Carrier 2 —
authz-probe-blind-spot.census.tsblocker 1 — measured, not guessed. This is why #16955 left it alone: the8carried a ledger-grade decomposition (3 server-only / 3 public / 2 sdk), and29 - 22 = 7does not say how those four numbers redistribute. The card is explicit that guessing7 = 3+3+1is not acceptable. So it was measured.The instrument, and why a text scan was not good enough
Gatedness is read from the syntax tree of each registration call, using the two spellings the census's own
populationRulecounts, with the forwarder's own call sliced out. The AST is what keeps comments from answering for code.It reproduces the census's recorded reading exactly, at the commit the census anchors its own re-measurement to and at this branch point:
5abca1792e(census anchor)f6b7c53db7(branch point)this.routeManager.register(registerPerItemRoute(const registerPerItemRoute =register(enforceAuthrest-server.tsmoved 78 lines between those two commits. None of the figures moved with it, so the drift is eliminated as a variable rather than assumed away.The measurement
29 ungated, less the 22 false ones (19 inside
registerMetadataEndpoints, 3 sharing a handler const inregisterSecurityExplainEndpoints), leaves 7:GET /api/v1server-onlyGET /api/v1/openapi.jsonserver-onlyGET /api/v1/docsserver-onlyGET /api/v1/forms/:slugpublicPOST /api/v1/forms/:slug/submitpublicGET /api/v1/forms/:slug/lookup/:fieldpublicGET /api/v1/discoverysdk⇒ 3
server-only/ 3public/ 1sdk. Every one of the 7 has a ledger row; none is unmatched. The answer is the arithmetic-looking one — arrived at by measurement, which is the whole point of the card's instruction not to guess it.The row the set lost is
GET /api/v1/ui/view/:object/:type, guarded atcc837dbfec. Its ledger row did not move at all: stillsdk, shape-identical to every othersdkrow on both sides of the gate line. That makes blocker 1's own argument stronger than it was — the grade did not notice the gate arriving, and would not notice one leaving.The card attributes
sdk 84 / server-only 7 / public 3to "the reading that moved". It does not descend from that reading at all. Measured:73709893f1^(before packages/rest package read routes claim to SHADOW their dispatcher twins, but the dispatcher answers /packages and /packages/:id on a stock showcase boot #14503): ledger = 94 rows,sdk84 /server-only7 /public3 — exactly the census prose.f6b7c53db7(today): ledger = 91 rows,sdk81 /server-only7 /public3.#14503 took the three REST package read/delete rows out of the ledger. Guarding a route never changes its disposition. The figure is corrected, and the two causes are now named apart in the docblock — a reader had no way to tell which of the two figures in that one sentence moved for which reason.
This site is repaired because the card names it explicitly as part of carrier 2. Its cause is corrected in the report rather than silently adopted.
Red lines, all preserved
Verification
Every exit code captured by redirect-then-
$?, never through a pipe.node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack→ 44 commands. 40 exit 0. The other 4 (check:dts-closure,check:dual-build-cjs-loads,check:lean-entry-closure,check:sourcemap-no-sources-content) exit 3 =PREREQUISITE NOT MET— they read a whole-treedist/. Recorded as NOT MEASURED, neither pass nor finding.pnpm turbo run build --filter="@objectstack/dogfood^..." --concurrency=2underscripts/pm/os-verify-lock.sh:VERDICT command-exit 0, 64/64 tasks.pnpm --filter @objectstack/dogfood typecheck—VERDICT command-exit 0.authz-probe-blind-spot.test.ts+authz-conformance.test.ts:Test Files 2 passed (2),Tests 80 passed (80). Re-run at the final commitc07b9ff381.22 of,73%,false-ungated,8 REST,50 gated,30 ungated,all 80): after this change zero carriers of22 of 30,73%or the stale8remain. The only surviving73%in the tree isscripts/tenant-audit-census.mjs:114, an unrelated rhetorical phrase about tenant-audit coverage.node scripts/docs-audit/affected-docs.mjs:0 docs name something this change touched (no anchors derived) across 0 changed package(s).content/docscompared by tree object (80bf4e530eb2dd75b3d72bfc44017ed874226494, unchanged) rather than by the bot's sha.content/docs/releases/untouched.pnpm check:nul-bytesexit 0, plus a direct sweep of both files:grep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]'→ no match.No changeset.
@objectstack/dogfoodisprivate: truewith nofiles[]; both edited paths are test sources inside it. Nothing published moves.验收备注
Noted, not filed — handed to the PM seat rather than acted on, because the dispatch's instruction was to report additional stale sites rather than quietly repair them:
authz-conformance.matrix.ts:27carries the stale ledger size too — "The population comes frompackages/rest/src/rest-route-ledger.ts(94 rows / 19 families)", present tense and undated, seven lines above carrier 1 in the same docblock. Measured 91 rows / 19 families atf6b7c53db7; the families count is right, the row count is not. Same cause as thesdk 84above (packages/rest package read routes claim to SHADOW their dispatcher twins, but the dispatcher answers /packages and /packages/:id on a stock showcase boot #14503), not the gate move. Left alone: the card does not name it, and it is not a carrier of22 of 30or73%.authz-ledger-population.baseline.ts:61also says "94 rows / 19 families", but explicitly dated ("MEASURED 2026-08-31") and the key arithmetic it supports is genuinely unmoved — the three departing rows all carriedfamily: packages, which survives on the publish row. A dated reading of a past state, not a false present-tense claim. Weaker case; noted for completeness.this.routeManager.register(— false once #16243 lands, and one of the four is inside the census file that PR itself repaired #16307 尚未合并" reading was wrong, and the method is the reason. It usedgit log --grep=16307— the issue number. The repair landed as PR docs(rest,runtime,qa): attribute the 80 route registrations to both spellings, and re-measure the gated split #16955 (07c56b5388), and squash commits here carry only the PR number, so the issue number never appears in the log. The card's sentence "After [finding] four docblocks attribute all 80 route registrations tothis.routeManager.register(— false once #16243 lands, and one of the four is inside the census file that PR itself repaired #16307 lands this is the only remaining carrier" is therefore no longer a prediction: it landed before triage read the tree, and this branch confirms it as a reading.73%/22 of 30. The stale figures in note 1 belong to a different figure family (ledger row counts) with a different cause, so this stays p3 and is not routed to [finding] check-ratchet-remedy-authority's corpus note andwhyfor check-i18n-walk-parity.mjs still say its ledger "ships EMPTY" — it now ships with three #15189 — that call is the PM seat's, on this evidence.Carrier ownership: no open PR holds either edited file.
pnpm-lock.yamlwas not touched.🤖 Generated with Claude Code
https://claude.ai/code/session_015QE8qk46e5CHJxyQEUjbf8
Generated by Claude Code