headscale leaves the baseline, and offscale gets a design doc

first step of extracting headscale into a plugin. CORE_PROCESSES is five now,
and the catalogue.test CORE[] mirror follows it — not optional, since that list
asserts "the catalogue must not offer a core process" and would have blocked
adding offscale to the catalogue later.

the local generated ecosystem file lost its entry too, and officer-headscale was
stopped and deleted from pm2 by hand. the platform still mounts /api/headscale
and still declares the headscale and vpn capabilities, so the feature is
present-but-unavailable rather than gone.

docs/offscale-plugin.md is a live document for the rest of it. what it records
that nothing else does: core is now `officer` alone and everything else is a
plugin; routes are /api/<app-name> for ours and /api/p/<creator>/<app-name> for
third parties, derived by one function so the two can never become two systems;
tables stay in public with an app-name prefix; mounting becomes genuinely
dynamic, which retires the "every route stays mounted" premise and relocates
assertCapabilityTotality from a boot check to a per-mount transaction.

it also records a rejected experiment with evidence — a postgres schema per
plugin works completely, including cross-schema FK, idempotent push and
DROP SCHEMA CASCADE as uninstall — and the reason not to: drizzle-kit 0.31.8
needs schemaFilter naming every schema, contradicting its own docs, and without
it push reports "No changes detected" and creates nothing. a plugin install that
reports success and makes no tables is the exact failure shape we have hit three
times this week.

and /api/vpn is dead: no caller in the mobile monorepo, none in the web app, no
grants in the database. offscale is permanently standalone, so it never comes
back. the invite flow is unaffected — the phone claims from the Companion, not
from officer.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-14 17:37:55 +00:00
co-authored by Claude Opus 5
parent d000cedf2f
commit bbc60b34ac
3 changed files with 322 additions and 9 deletions
+1 -8
View File
@@ -26,14 +26,7 @@ import { CAPABILITIES } from '../capabilities/registry';
// The processes a core install runs, mirroring CORE_PROCESSES in
// scripts/setup/officer-setup/lib/services.sh. Duplicated deliberately: the generator is shell and this
// is a test, and the alternative is the test reading a file the repository does not contain.
const CORE = [
'officer',
'officer-anthropic-proxy',
'officer-claude-code',
'officer-opencode',
'officer-pty',
'officer-headscale',
];
const CORE = ['officer', 'officer-anthropic-proxy', 'officer-claude-code', 'officer-opencode', 'officer-pty'];
describe('the catalogue against the real estate', () => {
it('does not offer to install the baseline', () => {