From a01ae73a1fe3e85f34e48cb1294c7d3fe1ccc2c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Padez?= Date: Sat, 22 Aug 2026 00:22:25 +0000 Subject: [PATCH] todo: plugin permissions on by default for every role Co-Authored-By: Claude Fable 5 --- TODO.md | 64 +++++++++---------- ...gin-s-permission-should-be-on-for-every.md | 36 +++++++++++ 2 files changed, 68 insertions(+), 32 deletions(-) create mode 100644 todo/multi-user/a-plugin-s-permission-should-be-on-for-every.md diff --git a/TODO.md b/TODO.md index f8ae14da..0b78169f 100644 --- a/TODO.md +++ b/TODO.md @@ -20,38 +20,38 @@ the owner's OS user and can never be granted. Indirection there really is accide ## Themes -**84 open, 22 closed**, across 28 themes. +**85 open, 22 closed**, across 28 themes. -| Theme | Open | Closed | -| --- | --- | --- | -| [Affordances](todo/affordances/) | 1 | 0 | -| [Speaking into a session from the backend](todo/agent-delivery/) | 2 | 0 | -| [Backburner](todo/backburner/) | 2 | 0 | -| [Background jobs](todo/background-jobs/) | 2 | 0 | -| [Chat interface](todo/chat/) | 1 | 0 | -| [Code editor](todo/code-editor/) | 1 | 0 | -| [Components — the shared UI layer](todo/components/) | 1 | 0 | -| [File watchers](todo/file-watchers/) | 1 | 0 | -| [Fleet — one command across every server](todo/fleet/) | 5 | 2 | -| [Headscale](todo/headscale/) | 0 | 5 | -| [Infra (alpha)](todo/infra/) | 6 | 0 | -| [Known bugs](todo/known-bugs/) | 4 | 1 | -| [Mobile apps](todo/mobile-apps/) | 3 | 0 | -| [Multi-user](todo/multi-user/) | 17 | 3 | -| [Notifications](todo/notifications/) | 1 | 0 | -| [Plugin ecosystem — before it opens to third parties (2026-08-18)](todo/plugin-ecosystem/) | 3 | 0 | -| [Plugin infrastructure](todo/plugin-infrastructure/) | 2 | 0 | -| [Plugin repos — what writing their READMEs turned up](todo/plugin-repos/) | 10 | 9 | -| [Plugin system — gaps the email extraction found (2026-08-18)](todo/plugin-system/) | 3 | 0 | -| [Prompt library](todo/prompt-library/) | 1 | 0 | -| [Shell — spotlight and the dock](todo/shell/) | 1 | 1 | -| [Sub-agents — agents spawning agents](todo/sub-agents/) | 1 | 1 | -| [Sudo terminal modal](todo/sudo-terminal-modal/) | 1 | 0 | -| [Tooling — the list about the list](todo/tooling/) | 1 | 0 | -| [Transmission](todo/transmission/) | 6 | 0 | -| [URL state — routing, query strings and selection](todo/url-state/) | 4 | 0 | -| [Waiting on the owner to run it](todo/waiting-on-owner/) | 2 | 0 | -| [Workspaces & Panels](todo/workspaces-panels/) | 2 | 0 | +| Theme | Open | Closed | +| ------------------------------------------------------------------------------------------ | ---- | ------ | +| [Affordances](todo/affordances/) | 1 | 0 | +| [Speaking into a session from the backend](todo/agent-delivery/) | 2 | 0 | +| [Backburner](todo/backburner/) | 2 | 0 | +| [Background jobs](todo/background-jobs/) | 2 | 0 | +| [Chat interface](todo/chat/) | 1 | 0 | +| [Code editor](todo/code-editor/) | 1 | 0 | +| [Components — the shared UI layer](todo/components/) | 1 | 0 | +| [File watchers](todo/file-watchers/) | 1 | 0 | +| [Fleet — one command across every server](todo/fleet/) | 5 | 2 | +| [Headscale](todo/headscale/) | 0 | 5 | +| [Infra (alpha)](todo/infra/) | 6 | 0 | +| [Known bugs](todo/known-bugs/) | 4 | 1 | +| [Mobile apps](todo/mobile-apps/) | 3 | 0 | +| [Multi-user](todo/multi-user/) | 18 | 3 | +| [Notifications](todo/notifications/) | 1 | 0 | +| [Plugin ecosystem — before it opens to third parties (2026-08-18)](todo/plugin-ecosystem/) | 3 | 0 | +| [Plugin infrastructure](todo/plugin-infrastructure/) | 2 | 0 | +| [Plugin repos — what writing their READMEs turned up](todo/plugin-repos/) | 10 | 9 | +| [Plugin system — gaps the email extraction found (2026-08-18)](todo/plugin-system/) | 3 | 0 | +| [Prompt library](todo/prompt-library/) | 1 | 0 | +| [Shell — spotlight and the dock](todo/shell/) | 1 | 1 | +| [Sub-agents — agents spawning agents](todo/sub-agents/) | 1 | 1 | +| [Sudo terminal modal](todo/sudo-terminal-modal/) | 1 | 0 | +| [Tooling — the list about the list](todo/tooling/) | 1 | 0 | +| [Transmission](todo/transmission/) | 6 | 0 | +| [URL state — routing, query strings and selection](todo/url-state/) | 4 | 0 | +| [Waiting on the owner to run it](todo/waiting-on-owner/) | 2 | 0 | +| [Workspaces & Panels](todo/workspaces-panels/) | 2 | 0 | ## Records — no items, kept for the reasoning @@ -62,6 +62,7 @@ the owner's OS user and can never be granted. Indirection there really is accide ## Newest ten +- `2026-08-22` **A plugin's permission should be on for every role by default, off only on request** — [multi-user/a-plugin-s-permission-should-be-on-for-every](todo/multi-user/a-plugin-s-permission-should-be-on-for-every.md) - `2026-08-21` **No way to see which affordances are reaching your agents, or to turn one off** — [affordances/no-way-to-see-which-affordances-are-reaching](todo/affordances/no-way-to-see-which-affordances-are-reaching.md) - `2026-08-21` **Generalise it: deliver a turn to a named session, from anywhere in the backend** — [agent-delivery/generalise-it-deliver-a-turn-to-a-named](todo/agent-delivery/generalise-it-deliver-a-turn-to-a-named.md) - `2026-08-21` **The cost of resuming grows with the transcript** — [agent-delivery/the-cost-of-resuming-grows-with-the-transcript](todo/agent-delivery/the-cost-of-resuming-grows-with-the-transcript.md) @@ -71,4 +72,3 @@ the owner's OS user and can never be granted. Indirection there really is accide - `2026-08-21` **Watch a directory, and attach actions to what lands in it** — [file-watchers/watch-a-directory-and-attach-actions-to-what](todo/file-watchers/watch-a-directory-and-attach-actions-to-what.md) - `2026-08-21` **Settings to choose which server each feature uses** — [fleet/settings-to-choose-which-server-each-feature](todo/fleet/settings-to-choose-which-server-each-feature.md) - `2026-08-21` **'A deploy verifies PM2, not that the app still works'** — [fleet/a-deploy-report-verifies-pm2-not-that-the-app](todo/fleet/a-deploy-report-verifies-pm2-not-that-the-app.md) -- `2026-08-21` **'The deploy commander cannot finish its own host'** — [fleet/the-deploy-commander-cannot-finish-its-own-host](todo/fleet/the-deploy-commander-cannot-finish-its-own-host.md) diff --git a/todo/multi-user/a-plugin-s-permission-should-be-on-for-every.md b/todo/multi-user/a-plugin-s-permission-should-be-on-for-every.md new file mode 100644 index 00000000..04a8c88b --- /dev/null +++ b/todo/multi-user/a-plugin-s-permission-should-be-on-for-every.md @@ -0,0 +1,36 @@ +--- +id: multi-user/a-plugin-s-permission-should-be-on-for-every +title: "A plugin's permission should be on for every role by default, off only on request" +theme: multi-user +status: open +created: 2026-08-22 +date_source: stated +order: 21 +--- + +**A plugin's permission should be on for every role by default, off only on request.** The owner's call, +2026-08-22. Installing a plugin should make it reachable by every role; taking it away from a role is +then a deliberate act. Today the opposite is true: install a plugin and nobody but the owner can see it +until someone grants it, role by role. + +**This inverts a default that two files argue for explicitly, so it needs his decision on the record — +which this is.** `permissions/schema.ts` states it plainly: *"A MISSING ROW MEANS NO ACCESS. There is no +row that denies; absence denies… an empty table is a platform where members can reach nothing but their +own account, which is the correct state for a server that has just been installed."* And +`authorize.ts` opens with *"the failure mode of a permissive default is not a bug report — it is someone +else's session."* Both were written about the platform's own surface, not about plugins, which is the +distinction this item turns on. + +Two facts that bound how far the change reaches, both from `authorize.ts`: + +- **It can only ever mean `app` (and `confined`) permissions.** `execution` and `admin` are stripped even + when a row grants them, and `confined` is dropped for an account with no Linux user. A plugin declares + `app`, so the blast radius is the grantable surface and nothing below it. +- **There is no way to represent "no" today.** An opt-out model needs one — either a negative row, or + grants written for every role at install time so that absence keeps its current meaning. The second + needs no resolver change and keeps the table readable as the whole truth; it does mean a role added + later starts with nothing until backfilled. **Which of the two is his call, not mine.** + +Related and unresolved: `multi-user/a-plugin-s-settings-routes-are-reachable-by` — a plugin granted to a +Member already exposes its `/_config`, and making plugins on-by-default makes that reachable by default +too. These two should land together, or the second stops being a latent hole and becomes an open one.