docs(lint): security-anchor-high-privilege states its scope — declared everyone suggestions, not guest bindings - #16429
Conversation
security-anchor-high-privilege judged declared isDefault:true (everyone) suggestions only, but nothing in the module header or the rule-site comment said so — the rule id read as coverage for any anchor-bound set, including one an operator binds to guest at install time. That binding is outside what a package-time linter can see and is held by the bind-time gate (describeAnchorForbiddenBits(set, 'guest')) instead. Docblock-only: catalogue table row, header paragraph, and the rule-site comment now state the scope explicitly. No message/hint string moved, no behaviour changed, no new finding branch. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Vbw3RPgdtqesx4azk9SbW8
📓 Docs Drift CheckThis PR changes 1 package(s): 1 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:
⛔ 2 release-owned page(s) also name something this change touched. These are read-only:
What this run could not see
Coarse fallback — 5 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): Which tree this was computed onThis run read A worktree cut from an older # while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 4b7ef0fbb4e2bfe7137bd112122ea03dac75b9cf && git checkout 4b7ef0fbb4e2bfe7137bd112122ea03dac75b9cf
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 0a038cc06d92ba3ae663f9f1e12c52e72dbc7d39 9f7b597e149480e4b256abd928d47819da2b070c && git checkout -B drift-repro 0a038cc06d92ba3ae663f9f1e12c52e72dbc7d39 && git merge --no-ff 9f7b597e149480e4b256abd928d47819da2b070c
node scripts/docs-audit/affected-docs.mjs --json 0a038cc06d92ba3ae663f9f1e12c52e72dbc7d39
|
|
Queue reading 2026-09-07T00:41Z (PM seat devx, session_01Vbw3RPgdtqesx4azk9SbW8) — still queued, regroup count 1, no
Seat action: none (a regroup is not a removal, per #16173). Next probe at 00:54Z; the seat's one re-queue stays unspent. Generated by Claude Code |
Fixes #16110
What
security-anchor-high-privilege's docblock and rule-catalogue entry did not state its own scope. The rule judges a declaredisDefault: true(aneveryone-suggested set) at author time — the same predicate the bind-time gate (describeAnchorForbiddenBits(set, 'everyone' | 'guest')) enforces at bind time. It does not, and cannot, see a set an operator binds toguestat install: that decision happens after authoring, andisDefault: trueis the only suggestion a package can declare today (suggested-audience-bindings.ts's "the only declarable suggestion" line; ADR-0090 D9 — "a package may suggest bindings toeveryoneorguest; the admin confirms each individually"). Without a stated scope, the rule id read as coverage it did not have for an app-authored anchor set bound toguest.Three sites now say so explicitly:
errorrule mirrors a runtime enforcement point" discussionisDefault === truecheckWhy not a behaviour change
Per the maintainer's ruling on the card (comment 5557093062, adopting recommendation 2): a package-declarable
guestsuggestion key is refused as a rider here — "adding a package-declarableguestsuggestion key is a feature on the manual floor." This PR states the existing scope; it adds no schema key, no new rule, no new finding branch. The retirement-ledger consequence (hotcrm's local assertion for aguest-bound anchor set stays; this rule's row may not be counted as live coverage for it) is already on the card — nothing to do here in another repo.Diff
Docblock/comment-only — no
message/hintstring moved, no behaviour changed.skip-changeset(no user-read string moved; the PM applies the label).Tests
pnpm --filter @objectstack/lint exec vitest run --maxWorkers=2 src/validate-security-posture.test.ts— 109 passed (existing suite is the regression control; no new finding, none needed).pnpm --filter @objectstack/lint test(through the shared verify lock) — 100 files / 3444 passed, 5 skipped.pnpm --filter @objectstack/lint typecheck(through the shared verify lock) — clean.pnpm --filter '@objectstack/lint...' buildforcheck:docs-transcript-drift, and a fullpnpm build— 72/72 tasks — forcheck:dual-build-cjs-loads; both re-ran green afterward).🤖 Generated with Claude Code
https://claude.ai/code/session_01Vbw3RPgdtqesx4azk9SbW8
Generated by Claude Code