# 2026.08.23.04 The web UI can be read in Portuguese. The shell and the shared components are fully keyed — 581 keys across two locales, with the build failing on a missing one — plus an endpoint for spawning an agent, and spawned agents becoming visible in both directions. **No schema change.** Nothing under `src/databases/**/schema.ts` moved across `deploy/2026.08.23.03..HEAD`. `bun db:push` is still a step because it is cheap and it verifies the database agrees with the code, but it should report no changes. **No dependency change.** `bun.lock` is untouched. **Do not run `bun install`.** ## What is in it - **Localization, phases 0 through 2.** `src/apps/officer-web` and `src/workspaces/components` have no hardcoded user-facing strings left: 555 and 47 occurrences respectively, both now zero. `en-GB` and `pt-PT` are complete and in step at 581 keys. - **Every locale ships a complete catalogue.** There is no fallback between regional variants, so a Portuguese reader is never served Brazilian wording. What enforces that is a **key-parity test that fails the build** on a gap — verified by removing one key and watching it go red. - **The language picker offers only locales that exist.** It listed about twenty codes, eighteen of which silently rendered English. Stored bare codes widen on read (`en` → `en-GB`), with no database migration. - **Dates, numbers and plurals follow the account's locale**, not the browser's, through `useFormat()` and `Intl.PluralRules`. Roughly 23 call sites moved. - **`POST /api/sub-agents/spawn`** — an endpoint for starting an agent from a prompt, for callers that are not a chat and so cannot reach the harness's own tool. Budget-checked before spawning, and it refuses with a 429 naming the window rather than burning the last of one. - **Spawned agents are visible in both directions.** A commander's pane lists its children as links; opening one shows which commander started it, linking back. - **A dropped sidecar command says so.** `sendFire` did nothing when no sidecar was registered — no log, no error — so answering a question during a restart window vanished and the card spun forever. ## Every host 1. `git fetch origin --tags` then `git merge --ff-only deploy/2026.08.23.04` 2. `bun db:push` — expect **no changes**. If it wants to alter something, stop and report it: that means this tree and that host's database disagree about something this release did not touch. 3. `bun run plugins:update` 4. `pm2 restart officer` `officer` only. Step 3 restarts each plugin's own sidecar; that is the script's behaviour and belongs in the report. **`macbookpro`:** append `/opt/homebrew/bin` to PATH for the `bun` commands, run `pm2` separately. ## What to check, this release The visible change is the language picker in profile settings. It should offer exactly **English (UK)** and **Português (Portugal)** and nothing else. A host still offering twenty languages did not pick up the frontend bundle. No direct SQL is needed and none is authorised. ## Hosts - **`edge-pertento-bridge`** — skipped, per `docs/servers.md`. Name it and spend nothing on it. - **`production-pertento-bridge`** — deployed cleanly last release after being two behind. Nothing expected. ## `officer-dev` — skip it The rollout runs from here. It is already at this commit and `officer` has been restarted on it.