Files
platform/deploy/2026.08.27.02.md
T
pastilhasandClaude Opus 5 91147b403b deploy/2026.08.27.02 — a plan with commands, and a schema claim that is checked
2026.08.27.01 was REFUSED before a single host was contacted, and the commander
was right twice over. its plan described the release instead of instructing the
rollout — no step list at all, where deploy/README.md defines a plan as "what to
run, in order, on which hosts" and steps 4 and 5 of the procedure are plan-driven.
and it asserted "nothing here changes a schema" on the day dav/schema.ts was
deleted out of core.

that second one was not a formatting mistake. dav_app_passwords now lives in
plugins/caldav, and gen-plugin-schemas follows plugin DIRECTORIES — so on a host
without that directory the table is in the database and not in the schema, and
`db:push` proposes dropping it. on alpha that is eight device credentials.

so this plan answers it from a survey rather than a guess. alpha has the plugin
and 8 rows; the other six have no plugin and an empty leftover table; zero hosts
run officer-marketplace, which retires the `tags` column question entirely. the
orphan table is dropped EXPLICITLY, guarded by a count, and skipped on alpha —
never as a db:push side effect.

step 6 is new and would have been missed: officer-opencode has to restart or none
of the skills, agent-identity or credential work in this release does anything.

ALSO THE SIGN-OUT. a single 401 from any endpoint wiped the token from both
storages and reloaded — which signs the owner out of every tab and keeps them
there, since nothing is left to recover from. that is the right response to a
revoked session and far too violent a response to one endpoint answering 401 for
its own reasons. it now confirms against /auth/me first, and treats an unreachable
server as emphatically not a revocation: rebooting the box must not end the
session. reported mid-demo, with nothing in the logs and a freshly signed token
working against every route the app loads.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Officer-Session: 656f5c85-e49a-4f1f-b9f3-042a04b4d043
2026-08-28 20:27:11 +01:00

3.8 KiB

2026.08.27.02

Everything in 2026.08.27.01, which was refused before any host was contacted — its plan named no commands and claimed "no schema change", which was false. This plan replaces it. 2026.08.27.01 stays claimed and undeployed; do not try to revive it.

Plus one fix made because of that refusal: a single 401 no longer signs the owner out of every tab.

The schema question, answered per host

officer_db/src/dav/schema.ts was deleted — dav_app_passwords moved into plugins/caldav. gen-plugin-schemas follows plugin DIRECTORIES, so the table is only declared on a host that has plugins/caldav/. Everywhere else bun db:push will propose dropping it.

Surveyed 2026-08-28, every host:

Host plugins/caldav/ dav_app_passwords
alpha present 8 rows
fofos absent present, 0 rows
macbookpro absent present, not read (bun at /opt/homebrew/bin)
macbruno absent present, 0 rows
production-pertento-bridge absent present, 0 rows
edge-pertento-bridge absent present, 0 rows
deadpool-rezio-bridge absent not read (ssh refused at survey time)

So: alpha pushes normally. Everywhere else the table is a leftover of a feature that has left core, and it is empty — but it is dropped explicitly, with a guard, not as a db:push side effect.

officer_marketplace and its new tags column: no host runs officer-marketplace — checked, zero of seven. Nothing to apply. If that changes, the column has no push script and must be added by hand.

Every host

  1. git fetch origin --tags then git merge --ff-only deploy/2026.08.27.02
  2. Only if plugins/caldav/ is ABSENT on this host — retire the orphan table, refusing to if it holds anything:
    psql "$POSTGRES_URL" -Atc "select count(*) from dav_app_passwords"
    # 0 → drop it:   psql "$POSTGRES_URL" -c "drop table dav_app_passwords"
    # anything else → STOP. Report the count and do not continue on this host.
    
    Read the variable name from .env — several hosts use OFFICERDEV_POSTGRES_URL.
  3. bun db:push < /dev/null — stdin closed on purpose, so a push needing an answer fails instead of hanging. Expect no changes after step 2. Anything destructive: stop and report.
  4. bun run plugins:update
  5. pm2 restart officer
  6. pm2 restart officer-opencode — this release rewires how OpenCode gets its skills, its agent identity and its credential, and all of that is built when the sidecar boots. Without this the code ships and nothing about OpenCode changes.

alpha: skip step 2 entirely — it has the plugin and 8 real credentials in that table. Step 3 runs normally and must report no changes.

macbookpro: prepend /opt/homebrew/bin to PATH for bun; run pm2 separately. Asleep is a skip with a note.

deadpool-rezio-bridge: login is br, checkout /home/br/officerdev/platform. SSH refused once during the survey — if it refuses again, note it and move on rather than retrying in a loop.

Do not restart officer-claude-code. It ends every live agent session on the host, nothing here needs it, and it is the owner's call.

Risk

Moderate, and concentrated in step 2 — the only destructive command in this release. It is guarded by a count and it is skipped on the one host where the table has contents.

After the rollout, two things are worth a look: useThemeAsset now reads in requestAnimationFrame, so a themed logo or wallpaper failing to appear points here; and the notify router's mount order changed, so device registration is worth one check (it forwards correctly on officer-dev).

Hosts

alpha · fofos · macbookpro · macbruno · production-pertento-bridge · edge-pertento-bridge · deadpool-rezio-bridge

officer-dev is skipped: it is the host running the rollout.