From eee73e777cab1710be0bc3c20e4764dcb9a29e51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Padez?= Date: Fri, 21 Aug 2026 17:29:02 +0000 Subject: [PATCH] =?UTF-8?q?DEPLOY=5FNOW=202026.08.21.01=20=E2=80=94=20the?= =?UTF-8?q?=20night's=20work,=20to=20all=20six?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit First release under yyyy.mm.dd.NN, and the first deploy of the plugin extractions, the regenerated themes, Spotlight, and the chat fixes. The plan is deploy/2026.08.21.01.md. Two steps in it are required rather than optional and both would be easy to skip: bun install, because bun.lock changed and sharp left the platform's dependencies for atelier's; and db:push, because users.username becomes NOT NULL with a case-insensitive unique index. That second one can refuse — on a null username, or two names differing only in case. Checked on all six hosts before writing this rather than discovering it mid-rollout: 12 users, zero nulls, zero collisions. Co-Authored-By: Claude Opus 5 --- deploy/2026.08.21.01.md | 43 +++++++++++++++++++++++++++++++++++++++++ package.json | 2 +- 2 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 deploy/2026.08.21.01.md diff --git a/deploy/2026.08.21.01.md b/deploy/2026.08.21.01.md new file mode 100644 index 00000000..7c1f502e --- /dev/null +++ b/deploy/2026.08.21.01.md @@ -0,0 +1,43 @@ +# 2026.08.21.01 + +The first release under this scheme, and the first deploy of the night's work. Everything since +`0.1.0`, which is to say everything. + +## What is in it + +- **Two plugins extracted**: `desktop` (VNC) and `browser` (the relay, its extension and its panels), + with the platform losing the VNC vocabulary it should never have had. +- **Themes regenerated** — all 22 from Omarchy, 84 tokens each, contrast-checked. The eleven that + shipped with 34 of an 84-token contract are replaced. +- **Spotlight**, on `shift-space`. +- **Chat fixes**: a turn waiting on a person is no longer killed as stalled, and an answer that goes + nowhere now says so. +- **Plugin infrastructure**: `importFresh` (a reinstalled plugin was being read from the deleted one), + `ownerOnly` paths, dependency `scope`, extensions published unauthenticated, `plugins:update`. +- An **Update button** in maintenance, and the **sub-agent budget guard**. + +## Steps, in order, on every host + +Same on all six — nothing here is host-specific. + +1. `git pull --ff-only` +2. `bun install` — **required.** `bun.lock` changed and `sharp` was removed from the platform's + dependencies (it moved into atelier's `npmDependencies`). Without this the lockfile and the tree + disagree, and the frozen-lockfile rule turns that into a failed install later rather than now. +3. `bun run plugins:update` +4. `bun db:push` — **required.** `users.username` becomes `NOT NULL` and gains a case-insensitive + unique index. +5. `pm2 restart officer` +6. Then, and only for hosts that have them: `pm2 restart officer-claude-code officer-pty` — both load + changed sidecar code. **Not** the whole ecosystem, ever. + +## The one thing that could have gone wrong, and did not + +`db:push` refuses if any account has a null username, or if two differ only by case. **Checked on all +six before writing this**: 12 users across the fleet, zero nulls, zero case-collisions. If a future +host fails here, that is why, and the fix is data rather than schema. + +## Post-deploy check + +`pm2 jlist` — every restarted process `online` with a moved `restart_time`, and the platform's own +domain answering 200. `docs/servers.md` has the domain per host. diff --git a/package.json b/package.json index 245495ae..7cff1f28 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "officer", - "version": "0.1.0", + "version": "2026.08.21.01", "private": true, "type": "module", "workspaces": [