Compare commits

..
2 Commits
Author SHA1 Message Date
pastilhasandClaude Opus 5 c24859c925 skill names are identifiers, not labels
lowercase-hyphenated and equal to the directory, per both harnesses' rules. the
human name moves to `title`. a skill named "Deploying Officer" was listed to an
agent and could not be loaded by it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-27 13:11:20 +00:00
pastilhasandClaude Opus 5 91596b7965 db:push can offer data loss at a prompt, and it waits
catching edge-pertento-bridge up by 215 commits, drizzle-kit stopped and asked
whether dav_app_passwords had been RENAMED to command_hq_spawned. both answers
destroy something: rename turns the DAV app passwords into the spawned-commander
table, create drops them.

the table had not gone anywhere — it moved to a plugin the same day. installing
the plugin first declares it and the question disappears.

records the whole sequence, including `< /dev/null` so an unattended push fails
rather than hangs on a prompt, the expected one-failure-then-seed-roles dance on
a host predating the roles table, and that the env var is OFFICERDEV_POSTGRES_URL
on several hosts rather than POSTGRES_URL.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-27 08:49:20 +00:00
4 changed files with 40 additions and 6 deletions
+2 -1
View File
@@ -1,5 +1,6 @@
--- ---
name: Commanders name: commander
title: Commanders
description: >- description: >-
Use when the user asks about a commander — what one is, how to start one, why one is not firing, how much Use when the user asks about a commander — what one is, how to start one, why one is not firing, how much
one costs — or when they describe work that should keep happening while they are away ("watch X and do Y", one costs — or when they describe work that should keep happening while they are away ("watch X and do Y",
+2 -1
View File
@@ -1,5 +1,6 @@
--- ---
name: Delegating the writing name: delegating
title: Delegating the writing
description: >- description: >-
Use when a feature has been agreed and somebody has to type it — how to hand the writing to a cheaper Use when a feature has been agreed and somebody has to type it — how to hand the writing to a cheaper
agent, what a brief has to contain, and how to review what comes back. Also read it before deciding NOT agent, what a brief has to contain, and how to review what comes back. Also read it before deciding NOT
+34 -1
View File
@@ -1,5 +1,6 @@
--- ---
name: Deploying Officer name: deploy
title: Deploying Officer
description: >- description: >-
Use when asked to deploy, release or roll out Officer, to watch for a release and deploy it, or when a Use when asked to deploy, release or roll out Officer, to watch for a release and deploy it, or when a
deploy has gone wrong — a host behind, a tag not noticed, a rollout that stopped halfway. Points at the deploy has gone wrong — a host behind, a tag not noticed, a rollout that stopped halfway. Points at the
@@ -66,6 +67,38 @@ money. That is not hypothetical.
- **A dirty tree means TRACKED changes.** `git status --porcelain` counts untracked files; a stray script a - **A dirty tree means TRACKED changes.** `git status --porcelain` counts untracked files; a stray script a
fast-forward could never touch is not a reason to skip a host. Use `--untracked-files=no`. fast-forward could never touch is not a reason to skip a host. Use `--untracked-files=no`.
# `db:push` can offer data loss at a prompt, and it waits for an answer
A schema push on a host that is many commits behind can stop and ask whether a table was RENAMED. Both
answers destroy something, so neither is safe to guess and neither is safe to automate.
Seen 2026-08-27 catching `edge-pertento-bridge` up by 215 commits:
```
Is command_hq_spawned table created or renamed from another table?
❯ + command_hq_spawned create table
~ dav_app_passwords › command_hq_spawned rename table
```
drizzle-kit saw one table leaving the platform schema and another arriving, and could not tell a rename
from a coincidence. `rename` would have turned the DAV app passwords into the spawned-commander table;
`create` would have dropped them.
**The table had not gone anywhere — it had moved to a PLUGIN.** Caldav was extracted that day, so
`dav_app_passwords` belongs to `plugins/caldav/db/schema.ts` and reaches the barrel through
`gen-plugin-schemas`. Installing the plugin FIRST declares it, and the question disappears.
So, on a host far enough behind that a plugin extraction is in the gap:
1. Install the plugins whose tables are involved, **before** pushing.
2. Then `bun db:push < /dev/null` — stdin closed, so it can never hang waiting on a prompt in an
unattended run. A push that needs an answer fails instead, which is the outcome you want.
3. Expect ONE failure on a `role_permissions` foreign key, then `seed-roles.ts`, then push again. That
sequence is normal on a host predating the roles table.
**Back up the database first.** `pg_dump` against the URL in `.env` — and read the variable name rather
than assuming: several hosts use `OFFICERDEV_POSTGRES_URL`, not `POSTGRES_URL`.
# The report is an artefact, the lock is the record # The report is an artefact, the lock is the record
Write the local record FIRST, then commit and push the report. If the push fails, say so and stop: the Write the local record FIRST, then commit and push the report. If the push fails, say so and stop: the
+2 -3
View File
@@ -1,5 +1,6 @@
--- ---
name: Officer platform name: platform
title: Officer platform
description: >- description: >-
Use when the user asks what Officer can do, how to use a feature, what an endpoint is, why something is Use when the user asks what Officer can do, how to use a feature, what an endpoint is, why something is
refused, or how permissions and accounts work — "how do I start a commander", "can a member see my files", refused, or how permissions and accounts work — "how do I start a commander", "can a member see my files",
@@ -51,8 +52,6 @@ diligence.
- **Memos** (`memos`) — Notes - **Memos** (`memos`) — Notes
- screen `/memos` - screen `/memos`
- **Calendar and contacts** (`calendar`) — Calendars, contacts, and the app passwords that sync them to a phone
- API `/caldav`, `/dav` · screen `/calendar`, `/contacts`
- **SendOff** (`sendoff`) — Send files to your own machines, and to accounts that have allowed you - **SendOff** (`sendoff`) — Send files to your own machines, and to accounts that have allowed you
- API `/sendoff` · screen `/sendoff` - API `/sendoff` · screen `/sendoff`