diff --git a/src/servers/api/command-hq/directory.ts b/src/servers/api/command-hq/directory.ts index 0f668a5b..4e99a216 100644 --- a/src/servers/api/command-hq/directory.ts +++ b/src/servers/api/command-hq/directory.ts @@ -107,10 +107,11 @@ export function notifySection(): string[] { 'curl -X POST "$OFFICER_API_URL/api/notify/_officer/notify" \\', ' -H "Authorization: Bearer $OFFICER_API_KEY" -H "Host: $OFFICER_API_HOST" \\', ' -H "content-type: application/json" \\', - ' -d \'{"code":"officer/core:commander","id":"1","title":"Voice Memos","body":"3 memos filed"}\'', + ' -d \'{"code":"officer/core:commander","id":"1","title":"","body":""}\'', '```', '', - 'That arrives as **Commander: Voice Memos** / *3 memos filed*.', + 'A commander named Ledgers sending "4 invoices filed" arrives as **Commander: Ledgers** / *4 invoices', + 'filed*.', '', 'Almost every notification in Officer carries only a code and a number, and the device renders the', 'words itself — so nothing readable leaves the machine. This one is the exception: `title` and `body`', @@ -181,10 +182,9 @@ export function commanderClaudeMd(params: CommanderClaudeMdParams): string { 'A commander is a trigger, then up to three steps: **act**, **classify**, **dispatch**. Only the trigger', 'and the ledger are compulsory. The rest are chosen per commander, and most need fewer than all three.', '', - 'The simplest useful one has no classification at all: fire on a new recording, transcribe it, write the', - 'text beside the original. Trigger, act, dispatch — and at that point the commander is a schedule over a', - 'task that already exists, which is the right answer rather than a lesser one. Do not invent steps to', - 'fill the shape.', + 'The simplest useful one has no classification and no dispatch: fire when something new appears, run one', + 'task on it, keep the result here. At that point the commander is a schedule over a task the platform', + 'already has, which is the right answer rather than a lesser one. Do not invent steps to fill the shape.', '', '**One trigger.** A schedule that asks a single question: what has appeared that I have not handled?', 'The trigger runs constantly, so it must never need judgement. If deciding whether something happened', @@ -204,9 +204,9 @@ export function commanderClaudeMd(params: CommanderClaudeMdParams): string { 'A crash between doing the work and writing the line costs a repeat; the other order loses the item', 'silently. Append, never rewrite — two writers cannot corrupt an append.', '', - 'Key it on a HASH of the source, not a name. Names change: a recording gets renamed from a phone, a', - 'file is moved, and a name-keyed ledger quietly does all of it again. Do not key it on the OUTPUT', - 'either — outputs move, get filed, get renamed. The source is the only thing that holds still.', + 'Key it on a HASH of the source, not a name. Names change — renamed on the device that made it, moved,', + 'tidied — and a name-keyed ledger quietly does all of it again. Do not key it on the OUTPUT either:', + 'outputs move, get filed, get renamed. The source is the only thing that holds still.', '', 'Two consequences to accept deliberately. The same content under two names is one item, done once. And', 'deleting an output does not bring it back, because the ledger still says done.', @@ -215,9 +215,9 @@ export function commanderClaudeMd(params: CommanderClaudeMdParams): string { 'those live here, in your own directory. The reference path holds its subject and nothing about how you', 'are getting on with it.', '', - 'Output is a different thing and goes wherever the job says. Beside the source, with the same name, is', - 'often exactly right — a transcript next to its recording is the most useful place it could be. That is', - 'dispatch making a decision, not a rule being broken.', + 'Output goes in THIS directory, by default and without discussion — the layout below. Somewhere else is', + 'a dispatch decision, made later and only if the owner asks for it. Do not raise it on the first turn', + 'and do not put anything of yours in the reference path unless you have been told to.', '', '**A spawned agent follows a FILE, not a prompt.** Put the rules in `procedures/.md` here and', 'point the agent at it. When the rule changes you edit one document; a prompt baked into a loop is a', @@ -263,31 +263,38 @@ export function commanderClaudeMd(params: CommanderClaudeMdParams): string { '## The first turn', '', "Two things were named before anything was said: this commander's name, and the reference path above.", - 'That is all anybody has decided. Everything else is settled in conversation, on this turn.', + 'Everything else is settled in conversation, and it is settled ONE QUESTION AT A TIME.', '', - '**Look before you ask.** Go and read the reference path first — how many items, what kinds, how they', - 'are named, how recently they arrive. A first question grounded in what is actually there is worth ten', - 'generic ones: "there are nine `.m4a` files, newest twenty minutes ago, all named', - '`memo--