Skip to content

plugins: net: is requested, never granted — stop the consent prompt implying otherwise - #38

Merged
codeitlikemiley merged 1 commit into
mainfrom
plugin-net-honest
Aug 23, 2026
Merged

plugins: net: is requested, never granted — stop the consent prompt implying otherwise#38
codeitlikemiley merged 1 commit into
mainfrom
plugin-net-honest

Conversation

@codeitlikemiley

Copy link
Copy Markdown
Owner

panday_plugins already states the principle, above requested_fs_writable:

The manifest requests; the sandbox enforces (docs/16). Deriving the policy here keeps the two from drifting — a capability that grants nothing in the sandbox is a lie told at the consent prompt.

net was that lie.

The prompt rendered network: api.github.com, which a person reasonably reads as "this plugin may reach that host". Nothing granted it — the value never reached SandboxPolicy, no tier can enforce a per-domain allowlist, and since M14.8 a NetPolicy naming a host is refused outright. Meanwhile docs/16 said "Install-time consent; the sandbox tiers enforce", which is true of fs, secrets and hooks, and false of net.

The choice, stated

Kept the field, fixed the prompt. The alternative was rejecting net: at parse time; that breaks the shipped example-plugin fixture and forces every author to re-edit the day the proxy lands, to buy nothing a truthful prompt doesn't already buy. So the manifest still expresses the requirement once, and the prompt now reads:

network: NONE — requested api.github.com but no tier can grant it (M14.8); the plugin will have no egress

The hosts stay in the text because a user refusing a plugin needs specifics — that is what the_consent_summary_names_every_grant_individually is for, and it still passes.

Falsified

Restoring the old line turns the new test red:

the line must say the request is not granted, not merely list it:   network: api.github.com

Green again after restoring: 25/25.

Verification

fmt · clippy --workspace --all-targets -D warnings · 1093 workspace tests, 0 failed · schemas · ts-sdk · sbom (609 components) · deny.

docs/16 corrected in the same commit with the reason, per CLAUDE.md §1.

https://claude.ai/code/session_017kFpYDqvz6sKGSkM4YKaRf

… implying otherwise

`panday_plugins` carries this note above `requested_fs_writable`:

    The manifest *requests*; the sandbox *enforces* (docs/16). Deriving the
    policy here keeps the two from drifting — a capability that grants nothing
    in the sandbox is a lie told at the consent prompt.

`net` was that lie. The prompt rendered `network: api.github.com`, which a
person reasonably reads as "this plugin may reach that host". Nothing granted
it: the value never reached `SandboxPolicy`, no tier can enforce a per-domain
allowlist, and since M14.8 a `NetPolicy` naming a host is refused outright.
docs/16 meanwhile said "Install-time consent; the sandbox tiers enforce", which
was true of `fs`, `secrets` and `hooks` and false of `net`.

**Kept the field, fixed the prompt** — the choice the brief asks me to state.
Rejecting `net:` at parse time was the alternative; it would break the shipped
`example-plugin` fixture and force every author to re-edit the day the proxy
lands, to buy nothing a truthful prompt does not already buy. So the manifest
still expresses the requirement once, and the prompt now reads:

    network: NONE — requested api.github.com but no tier can grant it (M14.8);
    the plugin will have no egress

The hosts stay in the text because a user refusing a plugin needs specifics —
that is what `the_consent_summary_names_every_grant_individually` exists for,
and it still passes.

Falsified: restoring the old line turns
`a_requested_network_capability_is_not_presented_as_a_grant` red with "the line
must say the request is not granted, not merely list it:   network:
api.github.com". Green after restoring.

docs/16 corrected in the same commit, with the reason, per CLAUDE.md §1.

Verified: fmt, clippy -D warnings, 1093 workspace tests, schemas, ts-sdk, sbom,
deny.

Claude-Session: https://claude.ai/code/session_017kFpYDqvz6sKGSkM4YKaRf
@codeitlikemiley
codeitlikemiley marked this pull request as ready for review August 23, 2026 20:33
@codeitlikemiley
codeitlikemiley merged commit 1e13624 into main Aug 23, 2026
6 checks passed
@codeitlikemiley
codeitlikemiley deleted the plugin-net-honest branch August 23, 2026 20:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant