docs(qa): narrow the authz conformance matrix's completeness claim to what its ratchet checks (#8711) - #9026
Merged
Conversation
… what its ratchet checks (#8711) Half (2), the ruled remainder of #8711 (half (1) landed in #8812). Maintainer ruling: narrow the matrix's written claim to what the mechanism delivers (Option A) — no primitive-discovery ratchet (Option B, measured unachievable in general form), option C (a declaration-side ratchet) deliberately left unruled and preserved as a separate finding. The matrix header and its companion test's header claimed a new declared-but-unenforced primitive "breaks CI." That is true only for the curated set of HTTP/transport entry points `discover()` enumerates (15 probes over 11 named source files) — a primitive enforced by a predicate inside an existing resolver adds no entry point and can be neither UNCLASSIFIED nor STALE, which is exactly why the #8613 `active` flag sat outside the ledger for its whole inert period without breaking CI. Both headers now state the narrowed, routes-completeness claim with the measured numbers so it is load-bearing: 43 of 50 rows carry no `covers` key at all (7 rows, 9 keys, every one an HTTP/transport pin), 37 of the 43 `enforced` rows are in-resolver predicates outside the ratchet entirely, and 5 of the 9 `covers` keys that do exist are gate-pins that vanish (failing CI) when the guard call they name is deleted — the real anti-regression value, preserved. Outside the curated table, "one row per primitive" is stated as the hand-maintained invariant it actually is. Prose and comments only. `discover()`, `PROBES`, `HIGH_RISK`, `checkLedger`, and every row's `state`/`enforcement`/`covers`/`proof` are untouched — the conformance test still reports 15 passed (15), unchanged, which is the evidence this boundary was respected. Claude-Session: https://claude.ai/code/session_01NaS1PAHJcPfAA2acnV53Tn Co-authored-by: Claude <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
Contributor
📓 Docs Drift CheckThis PR changes 1 package(s): 2 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:
|
This was referenced Aug 16, 2026
qq9340100
marked this pull request as ready for review
August 16, 2026 07:06
This was referenced Aug 16, 2026
Merged
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 #8711 — half (2), the ruled remainder. Half (1) (the missing
active-flag rows) already landed in #8812.What this does
Maintainer ruling on #8711 (comment accepting Option A): narrow the matrix's written completeness claim to what the mechanism actually delivers, rather than widen the ratchet (Option B, measured unachievable in general form) or fold in a declaration-side ratchet (Option C, deliberately left unruled and preserved as its own finding).
The matrix header and its companion test's header both claimed a new declared-but-unenforced authorization primitive "breaks CI." That is true only for the curated set of HTTP/transport entry points
discover()enumerates (15 probes over 11 named source files) — a primitive enforced by a predicate inside an existing resolver adds no entry point and can be neither UNCLASSIFIED nor STALE. That is exactly why the ADR-0049/#8613activeflag sat outside the ledger for its whole inert period without breaking CI, per #8711's own diagnosis.Both headers now state the narrowed, routes-completeness claim, carrying the measured numbers so it is load-bearing rather than vague:
coverskey at all (7 rows, 9 keys, every one an HTTP/transport pin).enforcedrows are in-resolver predicates outside the ratchet entirely — the twoactiverows from test(dogfood): add the ADR-0056 D10 matrix rows for the grant-catalogueactiveflag (#8711) #8812 among them, the normal case rather than an exception.discover()reads a curated table of 15 probes over 11 named source files (re-derived; the thread's earlier "10" undercounted by one —http-dispatcher.ts,rest-server.tsandin-memory-realtime-adapter.tseach carry more than one probe).coverskeys are gate-pins tied to the enforcement call itself (not merely a function name) — deleteshouldDenyAnonymousfrom/actions,/automationor/packages, or drop the MCP context-threading / stdio principal binding, and the pinned key vanishes, the row goes STALE, and CI catches it. This anti-regression value is real and is preserved, not narrated away.Outside the curated table, "one row per authorization primitive, each in EXACTLY ONE honest state" is now stated as the hand-maintained invariant it actually is, not a checked one.
A stale sentence in the
[#8711]comment block above the twoactiverows (added in #8812) that referred to "the open half of #8711... deliberately NOT settled here" is also updated — that half is now settled, so the sentence would otherwise contradict the new header.Boundaries respected (per the ruling)
discover(),PROBES,HIGH_RISK, andcheckLedgerare byte-identical. Diff is prose and comments only.id/state/enforcement/covers/proof/note) are untouched, including the twopermission-set-active/position-activerows from test(dogfood): add the ADR-0056 D10 matrix rows for the grant-catalogueactiveflag (#8711) #8812.Numbers re-derived against current
origin/main, not copied from the threadTwo of the four numbers moved because #8812 (half (1) of this same card) added two enforced, no-
coversrows since the original 2026-08-15 measurement: 41/48 → 43/50 rows with nocovers, 35/41 → 37/43 in-resolverenforcedrows. The probe-file count is corrected from 10 to 11 (a miscount at the original measurement, not repo drift — thePROBEStable itself hasn't changed since PR #8040). The gate-pin count (5 of 9) is unchanged and re-verified.Tests
All at HEAD
882055342(clean tree; no commit follows any run).pnpm --filter @objectstack/dogfood exec vitest run authz-conformance→Test Files 1 passed (1),Tests 15 passed (15)— identical to before the edit.npx turbo run test --filter=@objectstack/dogfood --concurrency=2→Test Files 110 passed | 1 skipped (111),Tests 780 passed | 3 skipped (783),Tasks: 62 successful, 62 total, exit 0.pnpm --filter '@objectstack/dogfood^...' build— green.pnpm --filter @objectstack/dogfood typecheck— clean.pnpm check:nul-bytes— OK (5947 files scanned).Gates, re-derived against the actual changed paths (
node scripts/pm/dispatch-gates.mjs packages/qa/dogfood/test/authz-conformance.matrix.ts packages/qa/dogfood/test/authz-conformance.test.ts) rather than assumed from the dispatch prompt — it named two path-matched families and five convention-triggered families (editing a test file):pnpm check:test-source-alias— OK, 72 packages scanned.pnpm check:type-source-resolution— OK, 76 packages scanned.pnpm check:query-options-erasure— OK, ratchet holds, none new.pnpm check:type-check-coverage(no--re-measure) — OK, 64/77 packages type-checked, counts unchanged.pnpm check:engine-double-contract— OK, 303 pinned, 133 in DEBT ledger, 2 exempt — unaffected by a comment-only diff.pnpm check:where-matcher— OK, 243 matchers discovered, all conform.Not run:
check:type-check-debt(the--re-measurevariant). It requires a full-workspace build (pnpm exec turbo run build --filter=./packages/* --filter=./packages/*/*) to re-runtscper DEBT-ledger entry. Skipped deliberately: the diff is comments only in two files whose owntsc --noEmitis already clean, and a comment cannot move a raw-error count for any package — CI's full run is not expected to disagree, and I did not want to force a whole-monorepo build onto the shared verification lock for a change that provably cannot move this ratchet.Truncation check on #8711 and its comments
Read the issue body and all 6 comments via the GitHub API before implementing. Every comment ends with a complete, matching attribution footer (or, for the ruling comment, a complete final sentence + footer) and every quoted/code block closes correctly (the JSON report comment's closing
```and}both present). No comment shows a sanitizer-style mid-word cutoff (a bare angle bracket followed by a letter) or an abrupt mid-sentence stop. Nothing appeared cut off.Generated by Claude Code