Commit 4fef302
fix(gate): let check:role-word exempt marked vendor-wire fences (#10787)
ADR-0090 D3's ratchet is per-file and EXACT, so no file anywhere has spare
budget and the corpus cannot gain a single new occurrence of the reserved
word. A route whose wire parameter is literally named `role` therefore could
not have its request shape documented by anyone but the maintainer:
`POST /api/v1/auth/organization/add-member` reads `body.role` with no
snake_case alias, and #10050 had to describe a REQUIRED parameter without
naming it.
Per the maintainer ruling of 2026-08-21 (option B), the gate gains a
narrowly-scoped exemption for upstream-owned vocabulary inside fenced code
blocks MARKED as vendor wire payloads. Prose stays fully ratcheted — that is
what D3 is aimed at, and D3's Word ban paragraph already names the better-auth
boundary as its single documented exception, so this clarifies D3 rather than
amending it. The ADR is untouched.
The marking is what bounds the exemption, not the fence. A block is exempt only
when the line directly above its opening fence is exactly
`{/* os:vendor-wire <vendor> */}` (.mdx) or `<!-- os:vendor-wire <vendor> -->`
(.md), naming a vendor declared in VENDOR_BOUNDARIES — the same per-extension
comment convention `os:check` already uses. A marker that opts nothing in is a
loud orphan rather than a silent no-op, an unclosed claimed fence exempts
nothing, and every run publishes how many blocks it suppressed, so the
exemption cannot widen unobserved. Today's corpus: 0 blocks, 0 occurrences.
Self-test covers all three directions over a fixture proven to carry the word
(marked fence passes, prose still fails, UNMARKED fence still fails), plus the
positive control and every near-miss marker, driven both as predicates and
through a real child process.
Refs #10533
Claude-Session: https://claude.ai/code/session_01DdCnBGcHeufjrq7drTD3wt
Co-authored-by: Claude <noreply@anthropic.com>1 parent 109008b commit 4fef302
1 file changed
Lines changed: 606 additions & 16 deletions
0 commit comments