From 4dc7cd90c2e1eb9959b828d724f3006a9cec4978 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Padez?= Date: Fri, 14 Aug 2026 19:25:54 +0000 Subject: [PATCH] a plugin declares permissions, not capabilities, and has no kind MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 'capabilities' already means three things in this codebase — the permission registry, the officer-items store, and the sidecar's routing keys. a fourth would be one too many, and the field is really just permissions. the name is free: the old permissions table went in 044aacf4. and the kind enum is gone with it. the first draft handed a plugin the platform's own five-value CapabilityKind and then forbade three of them. those five exist because the platform has five sorts of surface; a plugin has two — grantable to members, or owner-only. a boolean says it, and says it without needing a prohibition: a plugin cannot claim core if core is not a word it can say. offscale is ownerOnly: true, which is what kind: 'admin' meant. Co-Authored-By: Claude Opus 5 --- docs/offscale-plugin.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/docs/offscale-plugin.md b/docs/offscale-plugin.md index b0274eaf..082c4e56 100644 --- a/docs/offscale-plugin.md +++ b/docs/offscale-plugin.md @@ -491,13 +491,16 @@ export const manifest = { script: 'sidecar/index.ts', }, - /** Permissions this plugin defines. `app` or `admin` only — see below. */ - capabilities: [ + // Named `permissions`, NOT `capabilities`. That word already means three different things here — the + // permission registry, the officer-items store, and the sidecar's routing keys — and a fourth would be + // one too many. `permissions` is accurate and free: the old table of that name went in 044aacf4. + permissions: [ { key: 'offscale', label: 'Offscale', description: 'The tailnet: machines, routes and ACLs', - kind: 'admin', + /** Owner-only, or grantable to members. The whole distinction a plugin needs. */ + ownerOnly: true, }, ],