Skip to content

docs(adr-0025): the granted permission set is REGISTERED at load and enforces nothing — §3.7 said the opposite (#17147) - #17756

Draft
hotlong wants to merge 1 commit into
mainfrom
claude/adr-0025-permissions-not-enforced-17147
Draft

docs(adr-0025): the granted permission set is REGISTERED at load and enforces nothing — §3.7 said the opposite (#17147)#17756
hotlong wants to merge 1 commit into
mainfrom
claude/adr-0025-permissions-not-enforced-17147

Conversation

@hotlong

@hotlong hotlong commented Sep 12, 2026

Copy link
Copy Markdown
Contributor

⛔ Governed surface — stays DRAFT for maintainer merge

docs/adr/** is a governed surface (Prime Directive #14). This PR is not queued, not armed for auto-merge, and is not flipped out of draft. It is split out of #17753 precisely so that PR's code / spec / test / generated-docs half can land the ordinary way.

#17147 stays OPEN — this PR is not its closer either. See #17753 for why the card stays open.

⚠️ Worded this way deliberately. The earlier phrasing put a closing keyword immediately before the number, and GitHub's reference parser matches the keyword plus the number and ignores the negation around it — so on #17753's merge the card was auto-closed as COMPLETED (reopened since; see that PR's body).

⚠️ CI state before you merge — one red remains, and it is advisory

check state why
Check Changeset cleared This PR releases nothing (one file under docs/adr/), so the gate's own prescription applies: the skip-changeset label, applied live. ⛔ An empty-frontmatter changeset is explicitly not a third option (#5471).
Part-of PR must not also close its card red, and staying red RULE 2 only: the single commit on this branch ends Refs #17147, and that rule forbids any card-relation trailer in a commit message. RULE 3 (the body half) is clear — the body carries no closing keyword, verified with the gate's own regex.

The Part-of red is not a required context (absent from the required-context registry; its workflow subscribes to no merge_group event), Refs lands as a reference and moves no card, and the gate's own log states that the repair is ⛔ never a history rewrite. So it is a red to read, not to act on. Nothing else is outstanding.

The two corrections

§3.7 Permissions carried the parenthetical "(service/hook/file/network already enforced)". Measured on 9bd4344e4:

persisted consent record + re-consent on a widening upgrade ✅ live, §3.8 as written
artifact carriage + AppPlugin.init()registerGrantedPermissions ✅ live (#13457)
anything that queries the registry enforceServiceAccess / enforceHookTrigger reachable only via SecurePluginContext (zero production construction sites); enforceFileRead / enforceFileWrite / enforceNetworkRequest called by nothing at all

The bullet now states that split and names §3.5 step 7's per-plugin context as the materialize seam ruling 5486840233 assigns to this ADR's own install-flow design work — tracked as #17147, deliberately not built here.

The Status line is stale in the other direction: the 2026-07-16 audit says install-time consent is unimplemented, and it has since landed for package installs. Replaced with a 2026-09-12 audit that separates what landed (consent, carriage, registration) from what did not — no os plugin install, no .osplugin loader, and no runtime path on which a distributed plugin's code executes; an environment artifact carries sys_package_version.manifest_json and never the blob.

Related

🤖 Generated with Claude Code

…enforces nothing — §3.7 said the opposite (#17147)

§3.7's Permissions bullet carried the parenthetical "(service/hook/file/network
already enforced)". It was never true of the install-time GRANTED set, and two
of the four classes have no enforcement surface at all.

Measured on `9bd4344e4`:

  • persisted consent record + re-consent on a widening upgrade — LIVE, §3.8 as
    written;
  • artifact carriage and `AppPlugin.init()` →
    `PluginPermissionEnforcer.registerGrantedPermissions` — LIVE (#13457);
  • nothing queries the registry: `enforceServiceAccess` / `enforceHookTrigger`
    are reachable only through `SecurePluginContext`, which has zero production
    construction sites, and `enforceFileRead` / `enforceFileWrite` /
    `enforceNetworkRequest` are called by nothing at all.

The bullet now states that split, and names §3.5 step 7's per-plugin context as
the materialize seam maintainer ruling `5486840233` assigns to this ADR's own
install-flow design work — tracked as #17147, not built.

The Status line's 2026-07-16 audit is also stale in the other direction: it says
install-time consent is unimplemented, and it has since landed for PACKAGE
installs. Replaced with a 2026-09-12 audit that separates the two halves — what
landed (consent, carriage, registration) from what did not (no `os plugin
install`, no `.osplugin` loader, no runtime path that executes a distributed
plugin's code; an artifact carries `manifest_json`, never the blob).

⛔ Governed surface (Prime Directive #14): this PR stays DRAFT for maintainer
merge. Split out of #17753 for exactly that reason — its code, spec, test and
generated-docs half is an ordinary PR and lands on its own.

Refs #17147 · #11333 · #13457 · `5486840233`

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/s skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant