diff --git a/deploy/2026.08.23.03.md b/deploy/2026.08.23.03.md new file mode 100644 index 00000000..3d45178c --- /dev/null +++ b/deploy/2026.08.23.03.md @@ -0,0 +1,64 @@ +# 2026.08.23.03 + +Roles become a table, and the localization infrastructure lands. Both are groundwork — nothing in the UI +changes and nothing reads the new table yet. + +**SCHEMA CHANGE.** `bun db:push` is a step, and `postdb:push` now seeds the new table automatically. The +`roles` table is new. Additive only: no constraint is added to an existing column, so this cannot fail on +existing data. + +**No dependency change.** `bun.lock` gained two lines and they are the local `i18n` workspace package being +declared as a dependency of `officerdev` — a workspace path, not a registry fetch. **Do not run +`bun install`.** + +## What is in it + +- **`roles` is a table**, seeded with the four the platform already had, each marked `isSystem` because the + code names it: `rolePermitsDevTools()` tests for `Developer`, bootstrap writes `Super Admin`, `users.role` + defaults to `Member`. Nothing reads the table yet — `USER_ROLES` is still the type and `authorize.ts` is + untouched. **There is deliberately no foreign key on `users.role`**; that change cannot go through + `db:push` and is a later release. +- **The seed runs from `postdb:push`**, so a host gets the four rows on its next schema push with no extra + step here. It never overwrites an existing row. +- **Localization phase 0** — plural selection through `Intl.PluralRules`, a `useFormat()` hook for dates and + numbers, three namespaced catalogs deep-merged at the bridge, `dir` on ``, and key-parity tests that + fail the build on a missing key. The language picker now offers only the two catalogs that exist rather + than twenty codes, eighteen of which silently rendered English. Stored bare codes widen on read + (`en` → `en-GB`), with no database migration. +- **SendOff's folder name is served rather than derived** — `/sendoff/targets` carries `displayName` and + `myFolder` from the same helper the writer uses, so a picker cannot name a folder the writer will not + create. + +## Every host + +1. `git fetch origin --tags` then `git merge --ff-only deploy/2026.08.23.03` +2. **`bun db:push`** — and per the procedure, **verify by query, not by exit code.** Check that `roles` + exists and holds four rows on that host. `db:push` can fail and still exit 0. +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. + +## The check that matters this release + +```sql +select count(*) from roles; -- expect 4 +``` + +Four rows named `Super Admin`, `Admin`, `Developer`, `Member`. If a host shows the table but zero rows, the +`postdb:push` hook did not run — report it as a failure for that host rather than as a success, and say so +per host in the report. + +No direct SQL is needed and none is authorised for this release. + +## Hosts to expect trouble from + +- **`edge-pertento-bridge`** — skipped, per `docs/servers.md`. Name it and spend nothing on it. +- **`production-pertento-bridge`** — came back last release after two behind. Nothing special expected. + +## `officer-dev` — skip it + +The rollout runs from here. It already holds the release and the four rows, verified locally. diff --git a/package.json b/package.json index 64f5bd2c..40a7cb18 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "officer", - "version": "2026.08.23.02", + "version": "2026.08.23.03", "private": true, "type": "module", "workspaces": [