diff --git a/deploy/2026.08.26.02.md b/deploy/2026.08.26.02.md new file mode 100644 index 00000000..c4f857de --- /dev/null +++ b/deploy/2026.08.26.02.md @@ -0,0 +1,57 @@ +# 2026.08.26.02 + +**One fix, and it is a crash.** A screen whose layout names a panel it does not own now renders instead of +failing with React #185, "maximum update depth exceeded". + +**No schema change. No dependency change. Do not run `bun install`.** `bun db:push` stays a step because it +is cheap and proves the database agrees with the code, but it must report no changes. + +## What broke, and where it shows + +`useAuthoredLayout` shipped in `2026.08.26.01`: a locked screen persists its SIZES and takes its STRUCTURE +from source on every render. That is still right, and it is what lets a plugin change its layout and reach +people who have already opened it. + +What it did not account for is `WorkspaceView`'s `appTypes` guard, which repairs an unrecognised `appType` +and **writes the repair back**. That was self-limiting while structure was persisted — the repair stuck and +the next render agreed with it. With structure coming from source it can never stick, so it is recomputed, +rewritten, discarded and recomputed every render until React gives up. + +**The `browser` plugin's layout names `officerdev/chat`**, which is not one of its own panel keys. So +`/browser` fails to render on any host with that plugin installed. That is every host running +`2026.08.26.01` with it — which is the fleet. + +The fix drops a write whose result equals the current value. Not an optimisation: it is what terminates the +loop, and persisting an identical tree was pointless anyway. + +## Every host + +1. `git fetch origin --tags` then `git merge --ff-only deploy/2026.08.26.02` +2. `bun db:push` — expect **no changes**. If it wants to alter something, stop and report it. +3. `bun run plugins:update` +4. `pm2 restart officer` + +**`fofos` is already at the fix** — it was fast-forwarded by hand at 05:22 to `a7c9dab2` while the owner was +working on it. Step 1 will fast-forward it to this tag anyway, which only adds the version bump and this +plan. Nothing about that is a problem; note it rather than treating it as drift. + +**`macbookpro`:** append `/opt/homebrew/bin` to PATH for the `bun` commands, run `pm2` separately. Asleep is +a skip with a note. + +**Do not restart `officer-claude-code`.** Unchanged from the last release, same reason: it ends every live +agent session on the host, and it is the owner's call. Nothing in this release needs it. + +## Hosts + +- **`officer-dev`** — skip it. Restarting `officer` there ends the rollout. It already has this code. +- **`edge-pertento-bridge`** — skipped. Still 300+ commits behind with no `roles` table; its catch-up is a + by-hand job. Do not contact it. +- **`alpha`**, **`fofos`**, **`production-pertento-bridge`**, **`deadpool-rezio-bridge`** — the targets. +- **`macbookpro`** — a target if it is awake. + +## What to check + +**Open `/browser`.** It should render rather than showing "This screen failed to render". That is the whole +release, and it is one click to confirm. Hard refresh first — a stale bundle looks identical to the bug. + +No direct SQL is needed anywhere, and none is authorised. diff --git a/package.json b/package.json index be525dd8..f9945869 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "officer", - "version": "2026.08.26.01", + "version": "2026.08.26.02", "private": true, "type": "module", "workspaces": [