docs(skills): owner loop-doctrine + collaborator delivery discipline, remediated (#44)

ms-communications: integrated as-authored - owner preamble restructure +
collaborator delivery-discipline hunks from the #43 calibration (own
session output is not a send path; the tool performs the preamble flip;
receiving rule 3 requires actually running agent-send.sh).

ms-conductor: collaborator redraft integrated (canon-aligned tracking
surfaces, one-action cadence, fail-closed core) with one conductor
remediation - step 3 now distinguishes refusal (fail closed, never
bypass) from runner outage (direct dispatch to a qualified live seat via
ms-communications permitted, recorded loudly as degraded: no sandbox, no
run record; suites still gate integration). Preserves the owner's
outage-dispatch intent inside invariant 6.

docs/TOOLS.md: release.sh ensure row added (M16 subcommand existed in
code but not in the doc - flagged by the collaborator, verified in
release.sh usage).

Authorship: owner (ms-conductor doctrine, preamble restructure) +
ms-test collaborator (delivery hunks, redraft); remediation + integration
by conductor (dragon-lin:darkwing). Suites 24/74/14/17 + verify green;
unslop clean.
This commit is contained in:
2026-09-03 17:17:29 -05:00
parent c8f433131c
commit bf56583a49
4 changed files with 63 additions and 16 deletions
+24 -10
View File
@@ -16,24 +16,35 @@ SESSIONS.md, never in a pane that scrolls away.
submits reliably (bracketed paste, Enter flush, draft detection), and ships
itself over ssh for remote targets. Never raw `tmux send-keys`; that is how
messages die as unsubmitted drafts.
- Non-Fleet seats use the default docket.
- Fleet seats use the named socket: `-L mosaic-fleet` (or `MOSAIC_TMUX_SOCKET`).
Fleet traffic stays off the user's default tmux server.
- Address durable fleet seats exactly: `=coder0`, not a prefix that might match
two sessions.
- Tool spec and internals: `tools/tmux/README.md`.
- Your own session output is not a send path either. A reply composed as
assistant prose, however well formatted, delivers nothing to the
recipient's pane; a hand-written preamble in prose is decoration, not
delivery. A reply exists only once `agent-send.sh` has run, and its exit
code is the delivery receipt. No rc, no send.
## Preamble (required)
### Preamble
Preamble is prepended to the message when using the `agent-send.sh` script.
Check the script for usage instructions.
```
[<src_host>:<src_session> -> <dst_host>:<dst_session>] <message>
[<src> -> <dst> class=<CLASS>] <message> # with triage class
```
`host` is `hostname -s` of the sender's machine; `session` is the tmux session
name. `agent-send.sh` writes the preamble for you. Two rules carry the protocol:
- Non-Fleet seats use the default docket.
- Fleet seats use the named socket: `-L mosaic-fleet` (or `MOSAIC_TMUX_SOCKET`).
Fleet traffic stays off the user's default tmux server.
- Address durable fleet seats exactly: `=coder0`, not a prefix that might match
two sessions.
- Tool spec and internals: `tools/tmux/README.md`
- `host` is `hostname -s` of the sender's machine; `session` is the tmux session
name. `agent-send.sh` writes the preamble for you. Two rules carry the protocol:
1. Replying? Flip it: `[<dst> -> <src>] ...`. Answer under your own lane.
The tool performs the flip: aim your send at the original sender's session
(`agent-send.sh -s <src_session> -C <class>`) and it writes the flipped
preamble for you. Never write the bracket line yourself.
2. A preamble-less cross-agent message is malformed. If you receive one, ask
the sender to resend before acting on it.
@@ -66,7 +77,10 @@ Class honestly. Never downgrade a question you want answered to `terminal-log`.
1. Read the preamble first. Confirm you are the `dst`. Note the `src`.
2. Triage by class (table above). `actionable` or absent: act now, or reply why not.
3. Reply with the preamble flipped. Cite the run id or issue you acted on.
3. Reply by sending: invoke `agent-send.sh` aimed at the sender's session; the
tool writes the flipped preamble. Cite the run id or issue you acted on.
Formatting the reply into your own output without running the tool leaves
the sender with nothing; that is a dropped reply, not a late one.
## Delivery mechanics
+37 -6
View File
@@ -10,12 +10,43 @@ Conducting discipline: direct workers without being one.
## Order of operations
1. Decompose the goal into worker tasks small enough to spec completely in
one prompt: goal, files, constraints, acceptance, self-checks.
2. Dispatch through the task runner. Never raw pi; never a shell one-liner.
3. Extract the worker's diff. Review it line by line before integration.
4. Verify with the suites. A failure reverts; the refusal is recorded.
5. Integrate with attribution. Update the plan and registry.
1. Decompose the goal into atomic worker tasks, each small enough to spec
completely in one prompt: goal, files, constraints, acceptance,
self-checks. Recursive decomposition is "fail → smaller task", never hope.
2. Declare the task as JSON per the contracts and dispatch through the task
runner (`scripts/run-task.sh run <task.json>`). Never raw pi; never a
shell one-liner. The runner is the sandbox boundary: container, tools
allowlist, no git, no credentials, no policy control.
3. Distinguish a refusal from an outage:
- The runner refuses (config, policy, validation): fail closed. Diagnose,
report blocked, stop. Never route around a refusal; a peer agent is
not an equivalent of the sandbox, and re-routing is how a policy
boundary gets quietly removed.
- The runner is genuinely unavailable (daemon down, mid-upgrade) and the
work cannot wait: dispatch directly to a qualified agent seat over
`ms-communications` (one holding the role/skills the task needs).
Record the degradation loudly: no sandbox, no run record. Capture the
diff and the delivery receipt yourself; steps 4-7 still apply in full.
4. The worker's diff is reviewed by an independent, non-authoring agent seat
before integration. The seat that authored a change never reviews it.
Bad output goes back: refine the prompt, re-dispatch, same session.
5. Verify with the suites. A failure reverts; the refusal is recorded.
6. Integrate with attribution (`scripts/conductor-apply.sh`). Commit only
after suites are green; push stays an explicit act.
7. Record in the repo's canon surfaces only: `docs/plans/CURRENT.md` (the
one next action), `BUILD-LOG.md` (phase entries), `docs/SESSIONS.md`
(session registration). There is no TASKS.md or STATE.md here; do not
invent scratch tracking files.
8. Send status updates with `ms-communications`; its triage classes apply.
## Cadence
One action in flight. Read `docs/plans/CURRENT.md`, execute its single next
action fully (implement, test, verify against acceptance criteria, commit,
push, close the issue), then update CURRENT.md and register in SESSIONS.md.
A batch mandate ("run the queue") repeats the loop until green or blocked.
Blocked means stop and report, never improvise. Waiting on a long worker run?
Arm `agent-watch` on the condition; never poll a colleague's pane.
## Gotcha ledger