You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
[finding] docs-drift's route bridge can reach only 45 of the 221 client-bound ledger routes — 176 have no registrar tail at all, and the variable-path recall half of #9503 is a small slice of it #9572
Filed unassigned by the os-dev seat working #9503 (session session_01XqDQYVU5smx29ts9pAErja), whose PR closes that card's precision half only. Recording, not fixing — the recall half turned out to be a much larger, differently-shaped hole than the card assumed, and it needs its own measurement before anyone attempts it.
What
parseRegistrarSource in scripts/docs-audit/affected-docs.mjs indexes a route by the tail of a literal path:. The sdk anchor kind then joins those tails against the route/client rows the route ledgers declare. A ledger row whose route no registrar tail matches is structurally unreachable: no symbol change can ever bridge to it, and api/client-sdk.mdx never enters the advisory through it.
Measured on e7daea169
Replicating the scan's own file walk (REGISTRAR_FILE_RE over packages/**, comment-masked as of #9432) and its own ledger parse:
registrar tails the scan can produce ...... 42
ledger rows carrying a `client` .......... 221
ledger rows NO registrar tail can select .. 176 (79.6%)
The 176 break into at least three unrelated causes, which is why this is not one fix:
Registrars that take no path: property at all. The bulk. plugin-auth alone contributes ~55 rows (/api/v1/auth/sign-in/email to auth.login, the whole organization/* and two-factor/* families) — those doors are mounted through better-auth, not through a { method, path, handler } literal, so the filename-convention walk finds the file and the path: scan finds nothing in it.
Rows whose route the tail matcher declines even where a literal exists — e.g. /api/v1/packages/:id to packages.get. Not yet diagnosed; may be routeTailOf or may be a genuinely absent registration.
Why it is worth recording
anchorlessChanges reports when a change derives nothing, and the file's own comment on REGISTRAR_FILE_RE says a missed registrar "costs recall on the sdk anchor kind only, and anchorlessChanges reports the silence". Neither statement covers this: the ledger declares 221 client bindings and the bridge can honour 45 of them, and nothing anywhere prints that ratio. A sign-in handler change simply never mentions api/client-sdk.mdx, silently, and the run looks healthy.
Sibling of #9433, which records that the two bridge exclusion rules are silent while only the cross-cutting cap publishes what it withheld. Same shape of complaint (the tool does not report its own blind spots), different mechanism.
Direction, not a prescription
The cheap first move is reporting, not recovery: emit the unreachable-ledger-row count the way crossCuttingSymbols and overbroadAnchors are already emitted, so the number is visible and can be ratcheted. Recovery is at least three separate pieces of work with three different costs, and per #9432's standard none should be attempted without before/after numbers on real commits.
Filed unassigned by the
os-devseat working #9503 (sessionsession_01XqDQYVU5smx29ts9pAErja), whose PR closes that card's precision half only. Recording, not fixing — the recall half turned out to be a much larger, differently-shaped hole than the card assumed, and it needs its own measurement before anyone attempts it.What
parseRegistrarSourceinscripts/docs-audit/affected-docs.mjsindexes a route by the tail of a literalpath:. Thesdkanchor kind then joins those tails against theroute/clientrows the route ledgers declare. A ledger row whose route no registrar tail matches is structurally unreachable: no symbol change can ever bridge to it, andapi/client-sdk.mdxnever enters the advisory through it.Measured on
e7daea169Replicating the scan's own file walk (
REGISTRAR_FILE_REoverpackages/**, comment-masked as of #9432) and its own ledger parse:The 176 break into at least three unrelated causes, which is why this is not one fix:
path:property at all. The bulk.plugin-authalone contributes ~55 rows (/api/v1/auth/sign-in/emailtoauth.login, the wholeorganization/*andtwo-factor/*families) — those doors are mounted through better-auth, not through a{ method, path, handler }literal, so the filename-convention walk finds the file and thepath:scan finds nothing in it.path:registrations — the recall half of docs-drift's registrar window swallows the NEXT route whole when that route'spath:is a variable — a foreign handler's code identifiers bridge to the previous route #9503.path: publishedPathatrest-server.ts:5747costs/api/v1/meta/:type/:name/publishedand/api/v1/meta/:type/:section/:name/published, both bound tometa.getPublished;path: metaPathcosts/api/v1/metatometa.getTypes;path: packagesPathcosts/api/v1/packagestopackages.list. Four rows, and the only ones a one-hop binding lookup could recover —publishedPathis afor…ofover an array of template literals,metaPath/packagesPathare in-file consts./api/v1/packages/:idtopackages.get. Not yet diagnosed; may berouteTailOfor may be a genuinely absent registration.Why it is worth recording
anchorlessChangesreports when a change derives nothing, and the file's own comment onREGISTRAR_FILE_REsays a missed registrar "costs recall on thesdkanchor kind only, andanchorlessChangesreports the silence". Neither statement covers this: the ledger declares 221 client bindings and the bridge can honour 45 of them, and nothing anywhere prints that ratio. Asign-inhandler change simply never mentionsapi/client-sdk.mdx, silently, and the run looks healthy.Sibling of #9433, which records that the two bridge exclusion rules are silent while only the cross-cutting cap publishes what it withheld. Same shape of complaint (the tool does not report its own blind spots), different mechanism.
Direction, not a prescription
The cheap first move is reporting, not recovery: emit the unreachable-ledger-row count the way
crossCuttingSymbolsandoverbroadAnchorsare already emitted, so the number is visible and can be ratcheted. Recovery is at least three separate pieces of work with three different costs, and per #9432's standard none should be attempted without before/after numbers on real commits.Refs: #9503 (precision half, PR #9571), #9433 (the exclusion-silence sibling), #9294, #9192.
Generated by Claude Code