Repository navigation
docs(adr),refactor(plugin-security): restate the ADR text that names C3-retired security machinery; delete the unreachable audience-anchor binding gate - #23412
Conversation
…C3-retired security machinery; delete the unreachable audience-anchor binding gate SecurityPlugin.assertAudienceAnchorBindingGate guarded writes to sys_position_permission_set alone, and C3 stage 8 unregistered that object, so no write reached it. The gate, its middleware call and its three unit cases are deleted, with the two imports only it used. The ADRs that still named the retired machinery are restated to what main does: - ADR-0138: the anchor binding tier runs for everyone on confirm and on every derivation, and no door binds a set to guest until the bind door; the anchor to the deleted gate is dropped. - ADR-0094: the projector's module and suite are recorded as deleted by stage 7a. - ADR-0126: a path note on the deleted projection module. - ADR-0131: notes on the consumer and code lists the C3 stages emptied. - ADR-0103: the provenance note says which gate guarded which object, and that no write reaches it after stage 8. Claude-Session: https://claude.ai/code/session_01287UbjvrigpWwNfGDmdwpS Co-authored-by: Claude <noreply@anthropic.com>
…ssue-23403-adr-c3-restatement
📓 Docs Drift CheckThis PR changes 3 package(s): 11 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:
⛔ 11 release-owned page(s) also name something this change touched. These are read-only:
What this run could not see
Coarse fallback — 30 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 25141ce88ebfb6f14a7d6c04b355e5fe2b3d88d5 && git checkout 25141ce88ebfb6f14a7d6c04b355e5fe2b3d88d5
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin c857a93ee42d0144b4643f49f899053ea099e200 64c2e410492c2d3037c4eabf8cf901ab71352e64 && git checkout -B drift-repro c857a93ee42d0144b4643f49f899053ea099e200 && git merge --no-ff 64c2e410492c2d3037c4eabf8cf901ab71352e64
node scripts/docs-audit/affected-docs.mjs --json c857a93ee42d0144b4643f49f899053ea099e200
|
Contract reviewServed-tier: PR #23412, card #23403 (Tier H, governed by
Read for this record: card #23403, its claim 6161966159 and the dev report 6162484475; on #22975, the seat's answers 6161961558 and 8-post's report 6161864889; the PR body and its ① Derived judgments1. The gate: holds.
2. The ADR edits: true of
3. Gates: green on the head.
4. The 速读 draft: true of the diff, except for the gaps below.
Findings
② Semver level
③ Boundary flags
FAIL rests on finding A alone. If A is fixed and nothing else moves, a delta review of the new head should be able to pass it. Adopted by
Implemented-by: VERDICT: FAIL |
…bjects is still registered, not which objects carry the column sys_email_template and sys_webhook also carry managed_by; the sentence claimed sys_sharing_rule alone did. It now says only that, of the three objects the passage names, sys_sharing_rule is the one still registered. Claude-Session: https://claude.ai/code/session_01287UbjvrigpWwNfGDmdwpS Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewServed-tier: PR #23412, card #23403 (Tier H by path, ① Derived judgments
② Semver level
③ Boundary flagsThe dev raised no Check-runs on Implemented-by: VERDICT: PASS Tier H: the maintainer's approval lands it. Nothing further is owed by the dev; the two 终稿 lines above are the engine seat's. |
Contract reviewServed-tier: Delta review of PR #23412, card #23403 (Tier H, governed by
Read for this record:
① Derived judgments1. Finding A: fixed. The new sentence is true of
2. The delta changes nothing else.
3. Everything the previous record judged right still holds.
4. Gates and check-runs.
5. The 速读 draft: true of the final diff.
② Semver levelStill
③ Boundary flags
PASS:
Findings B, C and D and the 速读 gap stay non-blocking. Before the seat asks the maintainer to approve, it should:
This PR is Tier H. This record does not approve it: only the maintainer's authorized approval lifts the landing. Adopted by
Implemented-by: VERDICT: PASS |
…deleted audience-anchor binding gate as live The security-plugin and engine preview docblocks listed it among the pre-resolution gates; the engine's and the dangling-reference audit's comments (and their two tests' comments) said it has to resolve a bound permission set; the lint rule said the runtime gate holds a guest binding; the authz conformance matrix's position-active note named it among the unfiltered write gates. Each now says the gate retired with sys_position_permission_set in C3 stage 8, or drops it. Comments and one note string only. Claude-Session: https://claude.ai/code/session_01287UbjvrigpWwNfGDmdwpS Co-authored-by: Claude <noreply@anthropic.com>
维护者速读 · PR #23412(#23403:ADR 文字更正,删除一个失效的安全闸门)·
|
Fixes #23403
Clause-②: no
Restates the ADR text that still names security machinery C3 (#15204) has retired, and deletes one gate that has been unreachable since stage 8. A sub-card of #22975. It cites 7a's deletions (#23368) as done, so the seat lands it after 7a.
维护者速读(草稿)
改了什么
enforced改为「everyone已执行;guest待后续 F4」。这是状态更正,不是新的决定。为什么改
sys_position_permission_set表。这个闸门只检查对这张表的写入,此后再也不会执行,但 ADR 仍写着「由它负责拦截」,读者会误以为这层防护还在起作用。everyone锚点,同样的高权限检查实际在「确认建议」和「重新推导」两处执行,ADR 现在如实写明。对guest,目前没有任何入口能绑定权限集,ADR 也写明了这一点。风险与代价(含回滚)
席位意见
你要做的
审阅后批准合并(Tier H:改动了受管路径
docs/adr/**)。What this changes
Code:
@objectstack/plugin-security, patch.SecurityPlugin.assertAudienceAnchorBindingGateis deleted, with its call in the security middleware and its three cases insecurity-plugin.test.ts. The two imports only it used (describeAnchorForbiddenBits,AnchorBindingContext) go too.sys_position_permission_set. Stage 8 (feat(plugin-security)!: retire the four security-catalog row objects (#15204 stage 8) #23222) unregistered that object, so no write has reached the gate since.confirmAudienceBindingSuggestionand theeveryonederivation (readAcceptedEveryoneSets), both insuggested-audience-bindings.ts;guest, no door binds a set..changeset/23403-audience-anchor-binding-gate-retired.md.ADRs. Each item was checked first against
a581c57eae(#23362), which recorded stage 8's retirement.ADR-0138:
guesttier has no caller onmainuntil item 5's bind door.everyoneon confirm and on every derivation;guestby the bind door when built.everyone;guest: follow-up F4".a581c57eaedid not touch this ADR.ADR-0094:
a581c57eaealready restated the TL;DR, D1–D4 and the addendum. Three lines still pointed at the module as living:permission-set-projection.test.ts;All three now record the deletion by stage 7a (refactor(plugin-security)!: delete the permission-set projection, the seed-name lookup and the refusal sink (C3 stage 7a) #23368).
ADR-0126: "Three real mechanisms" gains a path note: stage 8 retired the
sys_permission_setrow whoseactivecolumn carried the row state, and stage 7a deleted the module. This follows the ADR's existing path-note convention, and the path is kept as the record of what the section measured.ADR-0131: both lists are dated evidence (re-verified at
2514d49f3), so they are annotated rather than rewritten.permission-set-projection.tswith 7a.ADR-0103 (:52): the provenance note said
assertSystemRowWriteGateguardssys_sharing_rule,sys_positionandsys_capability. Measured onmain, its map (SYSTEM_ROW_PROVENANCE) holdssys_positionandsys_capabilityonly.sys_sharing_ruleis deliberately ungated: plugin-sharing's provenance hook (sharing-rule-provenance.ts) stamps an edited rowcustomizedinstead. And since stage 8 unregistered both objects, no write reaches that gate. The note now says this.Acceptance notes
assertSystemRowWriteGateis unreachable for the same reason as the deleted gate, since its two objects are unregistered. It stays here because this card names only the anchor gate; it belongs with 8-post's residue or its own card.declared-capability-context.tsdocblock ("all three runtime consumers", "the gate the engine middleware re-enforces on the insert");examples/app-showcase/src/security/permission-sets.ts:360.plugin-sharing/CHANGELOG.mdnames the gate as history and is not edited.security-plugin.ts(about:6151) andobjectql/src/engine.ts(about:5518);:8859) and its sandbox gate list (about:20842);integrity/dangling-reference-audit.ts(about:375), and the same phrase in two test comments (engine-lookup-referential-integrity.test.ts,dangling-reference-audit.test.ts);lint/src/validate-security-posture.ts(about:37);position-activerow'snoteinqa/dogfood/test/authz-conformance.matrix.ts(prose: no test readsnote).Verification
On
64c2e41049(maindac99c2277's successor merged once, atbd13bf7808, to sit on 7a; not re-merged since):check:adr-symbol-anchorsandcheck:adr-links: exit 0.plugin-security,objectql,lintand the dogfood package: exit 0.authz-conformance.test.ts(the matrix row changed): 61/61.bd13bf7808, before this round's comment-only changes:plugin-securitysuite: 185/185 files, 3,773 passed;check:scripts-symbol-anchorsandcheck:spec-docblock-symbol-anchors: exit 0.59761d4a71: the derived gate sweep, 74 derived, 74 run, all exit 0, with--ranreconciling at 0 NOT-MEASURED and 0 UNRUN.Generated by Claude Code