tickmarkr 2.5.3 → 2.5.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/dist/adapters/registry.js +6 -1
  2. package/dist/adapters/types.d.ts +3 -0
  3. package/dist/cli/commands/approve.d.ts +1 -0
  4. package/dist/cli/commands/approve.js +54 -6
  5. package/dist/cli/commands/doctor.d.ts +4 -0
  6. package/dist/cli/commands/doctor.js +44 -29
  7. package/dist/cli/commands/fleet.js +195 -33
  8. package/dist/cli/commands/init.js +196 -6
  9. package/dist/cli/commands/plan.js +144 -3
  10. package/dist/cli/commands/resume.js +6 -2
  11. package/dist/cli/commands/run.js +21 -2
  12. package/dist/cli/commands/verify.js +1 -1
  13. package/dist/cli/help.d.ts +2 -0
  14. package/dist/cli/help.js +3 -1
  15. package/dist/compile/collateral.d.ts +2 -0
  16. package/dist/compile/collateral.js +50 -9
  17. package/dist/compile/ownership.d.ts +7 -0
  18. package/dist/compile/ownership.js +59 -22
  19. package/dist/config/config.d.ts +23 -8
  20. package/dist/config/config.js +42 -28
  21. package/dist/config/fleet-overlay.d.ts +3 -9
  22. package/dist/config/fleet-overlay.js +68 -11
  23. package/dist/config/fleet-why.d.ts +7 -0
  24. package/dist/config/fleet-why.js +5 -0
  25. package/dist/drivers/herdr.d.ts +5 -0
  26. package/dist/drivers/herdr.js +14 -3
  27. package/dist/drivers/index.d.ts +15 -1
  28. package/dist/drivers/index.js +38 -10
  29. package/dist/drivers/orca.d.ts +99 -10
  30. package/dist/drivers/orca.js +586 -97
  31. package/dist/drivers/types.d.ts +1 -0
  32. package/dist/gates/baseline.d.ts +3 -0
  33. package/dist/gates/baseline.js +2 -1
  34. package/dist/gates/cache.d.ts +100 -0
  35. package/dist/gates/cache.js +389 -0
  36. package/dist/gates/review.d.ts +35 -2
  37. package/dist/gates/review.js +64 -16
  38. package/dist/gates/run-gates.d.ts +5 -0
  39. package/dist/gates/run-gates.js +134 -18
  40. package/dist/gates/test-manifest.d.ts +99 -0
  41. package/dist/gates/test-manifest.js +389 -0
  42. package/dist/gates/test-reporter.d.ts +4 -0
  43. package/dist/gates/test-reporter.js +49 -0
  44. package/dist/route/preference.d.ts +22 -1
  45. package/dist/route/preference.js +123 -25
  46. package/dist/route/router.d.ts +13 -0
  47. package/dist/route/router.js +95 -17
  48. package/dist/run/daemon.d.ts +13 -0
  49. package/dist/run/daemon.js +398 -96
  50. package/dist/run/git.d.ts +35 -1
  51. package/dist/run/git.js +111 -10
  52. package/dist/run/journal.d.ts +14 -2
  53. package/dist/run/journal.js +78 -10
  54. package/dist/run/lease.d.ts +14 -0
  55. package/dist/run/lease.js +87 -0
  56. package/dist/run/merge.d.ts +2 -0
  57. package/dist/run/merge.js +91 -3
  58. package/dist/run/operator-state.d.ts +11 -0
  59. package/dist/run/operator-state.js +17 -3
  60. package/dist/tui/cockpit/board.d.ts +96 -0
  61. package/dist/tui/cockpit/board.js +346 -0
  62. package/dist/tui/cockpit/decision-actions.js +2 -0
  63. package/dist/tui/cockpit/layout.d.ts +5 -1
  64. package/dist/tui/cockpit/layout.js +8 -3
  65. package/dist/tui/cockpit/live-runtime.js +83 -31
  66. package/dist/tui/cockpit/run-view.d.ts +7 -5
  67. package/dist/tui/cockpit/run-view.js +12 -11
  68. package/dist/tui/ink/fleet-app.d.ts +41 -27
  69. package/dist/tui/ink/fleet-app.js +204 -31
  70. package/package.json +1 -1
  71. package/skills/tickmarkr-overseer/SKILL.md +180 -99
@@ -1,16 +1,16 @@
1
1
  ---
2
2
  name: tickmarkr-overseer
3
- description: "Use when the user asks to oversee/supervise/babysit an autonomous tickmarkr run in a Herdr workspace (e.g. '/tickmarkr-overseer run the milestone', 'supervise this tickmarkr run', 'babysit this pipeline'). Requires HERDR_ENV=1. The skill argument is the mission (what to run end-to-end)."
3
+ description: "Use when the user asks to oversee/supervise/babysit an autonomous tickmarkr run in a Herdr workspace or Orca session (e.g. '/tickmarkr-overseer run the milestone', 'supervise this tickmarkr run', 'babysit this pipeline'). Requires a supported host: herdr (HERDR_ENV=1) or Orca (TERM_PROGRAM=Orca and non-empty ORCA_TERMINAL_HANDLE). The skill argument is the mission (what to run end-to-end)."
4
4
  ---
5
5
 
6
6
  # Overseer (tickmarkr)
7
7
 
8
- Become the OVERSEER for this workspace. Do no heavy work directly — build and supervise a two-tier
8
+ Become the OVERSEER for this workspace or session. Do no heavy work directly — build and supervise a two-tier
9
9
  hierarchy of VISIBLE agents (you → orchestrator → tickmarkr's own worker fleet), and route human decisions
10
10
  to the user with evidence.
11
11
 
12
12
  The mission is the skill argument. If empty, ask the user what to run end-to-end before doing anything else.
13
- Requires `HERDR_ENV=1`; if unset, say so and stop.
13
+ Requires a supported host: herdr (`HERDR_ENV=1`) or Orca (`TERM_PROGRAM=Orca` and non-empty `ORCA_TERMINAL_HANDLE`); if neither host is detected, say so and stop.
14
14
 
15
15
  Use the canonical loop skill's [cockpit, parked decisions and printed twins](../tickmarkr-loop/SKILL.md#cockpit-parked-decisions-and-printed-twins)
16
16
  when reading or relaying operator evidence. Delivered views are **1 Home, 4 Run, 5 Evidence**;
@@ -57,18 +57,24 @@ through brief lineage. **An executor choice nobody made is still an executor cho
57
57
  (rule 11's liveness test — a loop of single `pgrep -f <token>` snapshots is what returned eight
58
58
  phantom pids at an adopt on 2026-08-31, every one of them the probing shell itself), and re-arm every
59
59
  one the table does not show. A zero here is not absence until the same probe has been run once against
60
- a watcher you know is alive. Earned 2026-08-25 (OBS-622): a handoff recorded *"artifact watcher armed"*
61
- over two live consult verdicts; at adopt the only `watch-artifacts.sh` on the machine belonged to a
62
- different repository, and nothing had been watching either file.
63
- **WATCHER OWNERSHIP IS THE ARMING SEAT'S RECORDED PID, NEVER A NAME PATTERN.** Every bundled
64
- `watch-*.sh` arm sets `TKR_ARMING_SEAT=<seat>` and writes its own pid under
65
- `<state-dir>/overseer/pids/<arming-seat>-<script>-<pid>.pid`. A seat retires only watchers it armed,
66
- by reading those files and killing the exact recorded pids; it never uses `pkill -f`, `pgrep -f`, or
67
- any argv/path pattern. A journal path is shared by partner tiers and therefore cannot prove ownership.
68
- Verify each executing pid in two process-table reads before acting, kill-by-pid, arm the replacement,
69
- then verify its new pid in two process-table reads. A stand-down order inventories both sets: the
70
- ordering seat's recorded pids to retire, and the partner's watchers armed on the ordering seat that
71
- must survive it. This is the stand-down order of 222-11, not a best-effort sweep.
60
+ a watcher you know is alive.
61
+ **WATCHER OWNERSHIP IS THE ARMING SEAT'S RECORDED PID, NEVER A NAME PATTERN.**
62
+ - **On herdr (`HERDR_ENV=1`)**: Every bundled `watch-*.sh` arm, including `watch-artifacts.sh`, sets `TKR_ARMING_SEAT=<seat>` and writes its own pid under
63
+ `<state-dir>/overseer/pids/<arming-seat>-<script>-<pid>.pid`. A seat retires only watchers it armed,
64
+ by reading those files and killing the exact recorded pids; it never uses `pkill -f`, `pgrep -f`, or
65
+ any argv/path pattern. A journal path is shared by partner tiers and therefore cannot prove ownership.
66
+ Verify each executing pid in two process-table reads before acting, kill-by-pid, arm the replacement,
67
+ then verify its new pid in two process-table reads. A stand-down order inventories both sets: the
68
+ ordering seat's recorded pids to retire, and the partner's watchers armed on the ordering seat that
69
+ must survive it. This is the stand-down order of 222-11, not a best-effort sweep.
70
+ Earned 2026-08-25 (OBS-622): a handoff recorded *"artifact watcher armed"* over two live consult
71
+ verdicts; at adopt the only `watch-artifacts.sh` on the machine belonged to a different repository,
72
+ and nothing had been watching either file.
73
+ - **On Orca (`TERM_PROGRAM=Orca` and non-empty `ORCA_TERMINAL_HANDLE`)**: File and journal watchers record
74
+ owner pid and arm id beside the evidence files; a seat retires only watchers it armed, by those
75
+ recorded pids. It never uses `pkill -f`, `pgrep -f`, or any argv/path pattern. Verify each executing
76
+ pid in two process-table reads before acting. A stand-down inventories this seat's recorded pids
77
+ and the partner's watchers that must survive it.
72
78
  **An adopted seat ANNOUNCES itself, in the same act as re-arming:** tell the adopted orchestrator the
73
79
  fresh seat is live (verified send: probe token + read-back). Through the gap its view of your tier read
74
80
  STALE, and a tier that believes it is unsupervised escalates into a file nobody is reading. Earned
@@ -102,61 +108,100 @@ through brief lineage. **An executor choice nobody made is still an executor cho
102
108
  *"widen the start-of-session read to include layout/convention entries, not only discipline ones"* —
103
109
  and on 2026-08-17 the same skip put a planning seat inside the ORCH tab. A standing operator layout is
104
110
  not cosmetic; it is how the operator reads the fleet, and it binds exactly like a discipline rule.
105
- 1. Load the `herdr` skill. `herdr pane list` to map the workspace — the focused pane is yours. Rename your
106
- tab OVERSEER; create ONE tab ORCHESTRATOR.
107
- **FIVE-TAB CANON (standing operator layout — corrected three times on 2026-07-27, layout approved
108
- 2026-07-29, re-earned 2026-08-17):**
109
- - `OVERSEER` — you. Do not add a second live run surface: the daemon self-places the shipped board
110
- ABOVE the supervising seat that invokes the run.
111
- - `ORCH` — the orchestrator with the daemon-placed, run-id-pinned shipped board BESIDE it: the board
112
- takes the RIGHT half of the tab and the orchestrator's own narration keeps the LEFT half. (It was a
113
- full-width board above a narration rail until 2026-08-25; the operator changed it, because a task
114
- table is a few rows and it was spending height it did not need while squeezing the narration.) **Look for that `role: "watch"` pane; never hand-place or hand-roll a live
115
- run surface. Nothing else, ever: a work seat NEVER splits into the ORCH tab.** Operator verbatim:
116
- *"in orch tab should be the orch and the watcher only."* Re-earned 2026-08-17: a planning seat split
117
- beside the orchestrator, and the operator caught it, again. The daemon owns this vertical stack and
118
- places it the same way at every terminal width; neither the worker-pane halving floor, nor a
119
- measured column count, nor an overseer split command places this pane.
120
- - Worker/seat tabs — tickmarkr opens ONE TAB PER TASK itself; GSD-leg seats get the same treatment
121
- (own tab, or a shared WORKERS tab), never the ORCH tab.
122
- - `CONSULT · <topic>` — ONE shared tab for ALL consultants of a round, side-by-side splits; never one
123
- tab per consultant; do NOT auto-close after adjudication (operator, 2026-08-09 — keep the round's
124
- panes until the thread is confirmed finished or a successor round supersedes them).
125
- - `REVIEW <task>` — reviewer panes.
126
- Never multiply beyond these without asking. **Tabs you did not create are the OPERATOR'S — provenance
127
- decides: never close, rename, reuse, or send input to one, however idle it looks.** An "idle
128
- stale-looking" tab an overseer once swept was the operator's in-progress thinking (2026-07-14).
129
- **Live tab labels (standing operator rule, 2026-07-12):** on every decision or state change (role
130
- handoff, task done/merged, run end) rename the affected tabs — and keep labels SHORT: the role as the
131
- main name plus at most ONE hot-state token. Vocabulary: ORCH carries the milestone and progress
132
- fraction (`ORCH · v1.19 4/5`, updated on every task-done); tickmarkr opens ONE TAB PER TASK, labelled
133
- with the task id and holding that task's worker plus its judge/review/consult panes (tickmarkr
134
- updates it). Never long context strings or ✓-chains.
135
- 2. **Orchestrator**: Launch the orchestrator with your agent host. Spawning on current herdr is two-step — the one-shot `agent start --cwd` form was removed in the herdr CLI redesign and now fails with `unknown option` (OBS-138): first create the pane with `herdr tab create --workspace <ws> --cwd <repo> --label "ORCH · <version>"` and parse `result.root_pane.pane_id` from its JSON, then start the agent in it. For Claude Code, use `herdr agent start orchestrator --kind claude --pane <root-pane-id> -- --permission-mode bypassPermissions` (append `--model <m>` after the `--` if the operator has a policy). For Codex, use `herdr agent start orchestrator --kind codex --pane <root-pane-id> -- --dangerously-bypass-approvals-and-sandbox` (add `--model <m>` to specify the model). The unsandboxed flag is REQUIRED: codex's `workspace-write` sandbox keeps `.git` refs read-only, so a sandboxed orchestrator's `tickmarkr run` dies at integration-branch creation — do not downgrade it. Workers you never spawn — tickmarkr spawns its own visible worker panes. Auxiliary agents you do spawn (consultants, reviewers, scouts) follow the same forms: never launch a claude session in plan mode or default permission mode for autonomous work — both stall on per-command approval prompts nobody is watching; claude is always `--permission-mode bypassPermissions --settings '{"promptSuggestionEnabled":false}'`. **For a codex consultant, use `-a never --sandbox workspace-write` — NOT `--sandbox read-only`.** ⚠ **`--sandbox read-only` CONTRADICTS this skill's own completion protocol and will hang the seat.** Every seat you spawn is told to deliver an ARTIFACT ending in a terminal MARKER, because that is the only completion signal the artifact watcher can key on (`done` is turn end). A read-only sandbox cannot write that artifact, so codex blocks on `Would you like to make the following edits?` for its OWN report — and the report exists ONLY in the pending edit, so abandoning the prompt destroys the work rather than merely delaying it. Measured 2026-08-28: a consultant spawned `--sandbox read-only` finished a 14,604-byte verdict, sat blocked on the write, and the operator saw the prompt before the supervising tier did. `read-only` is correct ONLY for a seat that writes nothing at all — which, under the artifact+marker rule, is no seat this skill tells you to spawn. When the prompt does appear, answer **"Yes, and don't ask again for these files"** rather than plain yes: plain yes re-blocks on the next write of the same file. **That `--settings` pair is not cosmetic and it is not optional:** claude-code's AUTOSUGGEST renders context-plausible ghost text into an idle seat's prompt line that is BYTE-IDENTICAL to a typed draft in text-format reads (OBS-482), so a supervising tier cannot tell a seat's own unsent work from a rendering artifact without `agent read --format ansi`. Turning the suggester off at spawn removes the ambiguity at its source instead of paying for the discrimination at every read. Verified against the shipped binary: `claude --settings '{"promptSuggestionEnabled":false}' -p …` exits 0 with a real response, and the key appears in the binary's own settings schema. **For kimi, pass `-y`** (`herdr agent start <name> --kind kimi --pane <id> -- -y`) — the adapter already launches its own workers that way (`src/adapters/kimi.ts:204`), and a kimi seat spawned without it sits on an approval prompt having done nothing. **Herdr cannot see that state**: it reports a kimi pane as `agent_status: working` with `screen_detection_skipped: true` while the prompt is up, so the BLOCKED-STATE watcher below is blind on this vendor and the spawn flag is the ONLY control. Every vendor you spawn needs its auto-approve form named here; a vendor absent from this list is a seat that will hang.
111
+ 1. **Workspace setup (host-specific)**:
112
+ - **On herdr (`HERDR_ENV=1`)**: Load the `herdr` skill. `herdr pane list` to map the workspace — the focused pane is yours. Rename your
113
+ tab OVERSEER; create ONE tab ORCHESTRATOR.
114
+ **FIVE-TAB CANON (standing operator layout — corrected three times on 2026-07-27, layout approved
115
+ 2026-07-29, re-earned 2026-08-17):**
116
+ - `OVERSEER` — you. Do not add a second live run surface: the daemon self-places the shipped board
117
+ ABOVE the supervising seat that invokes the run.
118
+ - `ORCH` — the orchestrator with the daemon-placed, run-id-pinned shipped board BESIDE it: the board
119
+ takes the RIGHT half of the tab and the orchestrator's own narration keeps the LEFT half. (It was a
120
+ full-width board above a narration rail until 2026-08-25; the operator changed it, because a task
121
+ table is a few rows and it was spending height it did not need while squeezing the narration.) **Look for that `role: "watch"` pane; never hand-place or hand-roll a live
122
+ run surface. Nothing else, ever: a work seat NEVER splits into the ORCH tab.** Operator verbatim:
123
+ *"in orch tab should be the orch and the watcher only."* Re-earned 2026-08-17: a planning seat split
124
+ beside the orchestrator, and the operator caught it, again. The daemon owns this vertical stack and
125
+ places it the same way at every terminal width; neither the worker-pane halving floor, nor a
126
+ measured column count, nor an overseer split command places this pane.
127
+ - Worker/seat tabs — tickmarkr opens ONE TAB PER TASK itself; GSD-leg seats get the same treatment
128
+ (own tab, or a shared WORKERS tab), never the ORCH tab.
129
+ - `CONSULT · <topic>` — ONE shared tab for ALL consultants of a round, side-by-side splits; never one
130
+ tab per consultant; do NOT auto-close after adjudication (operator, 2026-08-09 — keep the round's
131
+ panes until the thread is confirmed finished or a successor round supersedes them).
132
+ - `REVIEW <task>` — reviewer panes.
133
+ Never multiply beyond these without asking. **Tabs you did not create are the OPERATOR'S — provenance
134
+ decides: never close, rename, reuse, or send input to one, however idle it looks.** An "idle
135
+ stale-looking" tab an overseer once swept was the operator's in-progress thinking (2026-07-14).
136
+ **Live tab labels (standing operator rule, 2026-07-12):** on every decision or state change (role
137
+ handoff, task done/merged, run end) rename the affected tabs — and keep labels SHORT: the role as the
138
+ main name plus at most ONE hot-state token. Vocabulary: ORCH carries the milestone and progress
139
+ fraction (`ORCH · v1.19 4/5`, updated on every task-done); tickmarkr opens ONE TAB PER TASK, labelled
140
+ with the task id and holding that task's worker plus its judge/review/consult panes (tickmarkr
141
+ updates it). Never long context strings or ✓-chains.
142
+ - **On Orca (`TERM_PROGRAM=Orca` and non-empty `ORCA_TERMINAL_HANDLE`)**: Do not load the `herdr` skill and do not map a Herdr workspace. Work from the current Orca terminal context. Keep the overseer in the launching terminal and inspect terminals with `orca terminal list --json`. The daemon self-places the watch board as a horizontal split of the launching terminal (`ORCA_TERMINAL_HANDLE`).
143
+ 2. **Orchestrator**: Launch the orchestrator with your agent host.
144
+ - **On herdr (`HERDR_ENV=1`)**: Spawning on current herdr is two-step — the one-shot `agent start --cwd` form was removed in the herdr CLI redesign and now fails with `unknown option` (OBS-138): first create the pane with `herdr tab create --workspace <ws> --cwd <repo> --label "ORCH · <version>"` and parse `result.root_pane.pane_id` from its JSON, then start the agent in it. For Claude Code, use `herdr agent start orchestrator --kind claude --pane <root-pane-id> -- --permission-mode bypassPermissions` (append `--model <m>` after the `--` if the operator has a policy). For Codex, use `herdr agent start orchestrator --kind codex --pane <root-pane-id> -- --dangerously-bypass-approvals-and-sandbox` (add `--model <m>` to specify a model). The unsandboxed flag is REQUIRED: codex's `workspace-write` sandbox keeps `.git` refs read-only, so a sandboxed orchestrator's `tickmarkr run` dies at integration-branch creation — do not downgrade it. Workers you never spawn — tickmarkr spawns its own visible worker panes. Auxiliary agents you do spawn (consultants, reviewers, scouts) follow the same forms: never launch a claude session in plan mode or default permission mode for autonomous work — both stall on per-command approval prompts nobody is watching; claude is always `--permission-mode bypassPermissions --settings '{"promptSuggestionEnabled":false}'`. **For a codex consultant, use `-a never --sandbox workspace-write` — NOT `--sandbox read-only`.** ⚠ **`--sandbox read-only` CONTRADICTS this skill's own completion protocol and will hang the seat.** Every seat you spawn is told to deliver an ARTIFACT ending in a terminal MARKER, because that is the only completion signal the artifact watcher can key on (`done` is turn end). A read-only sandbox cannot write that artifact, so codex blocks on `Would you like to make the following edits?` for its OWN report — and the report exists ONLY in the pending edit, so abandoning the prompt destroys the work rather than merely delaying it. Measured 2026-08-28: a consultant spawned `--sandbox read-only` finished a 14,604-byte verdict, sat blocked on the write, and the operator saw the prompt before the supervising tier did. `read-only` is correct ONLY for a seat that writes nothing at all — which, under the artifact+marker rule, is no seat this skill tells you to spawn. When the prompt does appear, answer **"Yes, and don't ask again for these files"** rather than plain yes: plain yes re-blocks on the next write of the same file. **That `--settings` pair is not cosmetic and it is not optional:** claude-code's AUTOSUGGEST renders context-plausible ghost text into an idle seat's prompt line that is BYTE-IDENTICAL to a typed draft in text-format reads (OBS-482), so a supervising tier cannot tell a seat's own unsent work from a rendering artifact without `agent read --format ansi`. Turning the suggester off at spawn removes the ambiguity at its source instead of paying for the discrimination at every read. Verified against the shipped binary: `claude --settings '{"promptSuggestionEnabled":false}' -p …` exits 0 with a real response, and the key appears in the binary's own settings schema. **For kimi, pass `-y`** (`herdr agent start <name> --kind kimi --pane <id> -- -y`) — the adapter already launches its own workers that way (`src/adapters/kimi.ts:204`), and a kimi seat spawned without it sits on an approval prompt having done nothing. **Herdr cannot see that state**: it reports a kimi pane as `agent_status: working` with `screen_detection_skipped: true` while the prompt is up, so the BLOCKED-STATE watcher below is blind on this vendor and the spawn flag is the ONLY control. Every vendor you spawn needs its auto-approve form named here; a vendor absent from this list is a seat that will hang.
145
+ - **On Orca (`TERM_PROGRAM=Orca` and non-empty `ORCA_TERMINAL_HANDLE`)**: Seats spawn with `orca terminal create` on a path worktree selector with a command:
146
+ `orca terminal create --worktree path:<repo> --title "ORCH · <version>" --command "<agent-cmd>" --json`
147
+ For Claude Code: `orca terminal create --worktree path:<repo> --title "ORCH · <version>" --command "claude --permission-mode bypassPermissions" --json`. For Codex: `orca terminal create --worktree path:<repo> --title "ORCH · <version>" --command "codex --dangerously-bypass-approvals-and-sandbox" --json`. Parse `result.terminal.handle` from the create receipt.
136
148
  3. **Standing instructions travel as a brief FILE, never as pane text** — PTY input truncates at ~1024B and a
137
149
  truncated brief silently drops policy. Write the full brief to `<repo>/.tickmarkr/overseer/ORCH-BRIEF.md`
138
- (inside the tickmarkr state dir — already self-gitignored, no exclude step needed), then send one line:
139
- `herdr pane run <orch> "Read .tickmarkr/overseer/ORCH-BRIEF.md and follow it exactly."` The brief MUST contain: the
140
- mission, the five-tab canon from step 1, the pane mechanics below, rules 1–2, the GSD-leg rules
150
+ (inside the tickmarkr state dir — already self-gitignored, no exclude step needed), then announce the brief file:
151
+ - **On herdr (`HERDR_ENV=1`)**: Send one line with `herdr pane run`:
152
+ `herdr pane run <orch> "Read .tickmarkr/overseer/ORCH-BRIEF.md and follow it exactly."`
153
+ - **On Orca (`TERM_PROGRAM=Orca` and non-empty `ORCA_TERMINAL_HANDLE`)**: Briefs travel as a file announced by `terminal send` with enter and a submit wait whose receipt is read for observed submission rather than input acceptance:
154
+ `orca terminal send --terminal <handle> --text "Read .tickmarkr/overseer/ORCH-BRIEF.md and follow it exactly." --enter --wait-submit 15 --json`
155
+ Read `result.send.prompt.stages` and treat the brief as delivered only when a `turn_started` stage is present; `accepted: true` proves input acceptance, not a started turn; never resend on `accepted` alone.
156
+ The brief MUST contain: the mission, the five-tab canon (on herdr) or seat layout (on Orca), the pane mechanics below, rules 1–2, the GSD-leg rules
141
157
  (below) whenever the mission dispatches `/gsd:*` legs, and require a verbatim one-sentence
142
158
  acknowledgment of the human-checkpoint rule before anything is dispatched.
143
- **⚠ HARVEST BEFORE YOU DELETE.** At mission end the brief dir goes — but a long mission accumulates
144
159
  *method guards* in that brief (how to know a thing, not what is true of this spec), and deleting them
145
160
  re-earns each one at full price on the next mission. So before removing the dir: lift every durable,
146
161
  mission-independent guard into **this skill** (Evidence discipline, below) or the project's `CLAUDE.md`,
147
162
  and only then delete. A guard's home must outlive the mission that earned it. The project ledger does
148
163
  NOT count as that home — `CLAUDE.md` itself says planning records are read-only archives and current
149
164
  guidance belongs in the memory file or the shipped docs.
150
- 4. Arm the watcher and your own supervision beat (Supervision). Report the hierarchy map (pane ids + names) to the user.
165
+ 4. **Supervision setup**: Report the hierarchy map to the user.
166
+ - **On herdr (`HERDR_ENV=1`)**: Arm the watcher and supervision beat from the On herdr section of Supervision watcher; report pane ids and names.
167
+ - **On Orca (`TERM_PROGRAM=Orca` and non-empty `ORCA_TERMINAL_HANDLE`)**: Follow the On Orca section of Supervision watcher; record terminal handles, file/journal watcher ownership and evidence paths.
168
+
169
+ ### Restart, seat identity, and verified launch law (host-specific)
170
+
171
+ - **On herdr (`HERDR_ENV=1`)**: After **ANY restart**, whether the overseer itself or Herdr restarted,
172
+ re-read the overseer's pane id from Herdr; never continue with an id remembered before the restart.
173
+ Then re-announce that fresh pane id to every live seat and re-arm every watcher with it, verifying each
174
+ announcement and arm by reading back the resulting pane/process state.
175
+ A live seat must never keep a pre-restart overseer pane id.
176
+ - **On Orca (`TERM_PROGRAM=Orca` and non-empty `ORCA_TERMINAL_HANDLE`)**: Re-list terminals, re-read the
177
+ recorded terminal handles and evidence files, and re-arm only file/journal watchers. Do not use a Herdr
178
+ pane id, `agent start`, `pane run`, tab canon, or a name-keyed Herdr watcher on an Orca launch.
179
+ When briefing a seat on either host, take its current address from the handoff file; never hardcode a pane id
180
+ or terminal handle in a brief or command template.
181
+
182
+ The orchestrator's run log, handoff, and plan live inside its sandbox root and are artifacts of that orchestrator.
183
+ The overseer reads them from there, using the path the orchestrator reports; do not substitute the
184
+ overseer's repository or a machine-global planning directory. The orchestrator brief must say: if the seat's
185
+ sandbox denies writes under `.git`, report the denial to the overseer and stop; the overseer launches the daemon itself;
186
+ and the daemon host is never sandboxed.
187
+
188
+ **On herdr (`HERDR_ENV=1`)**, after every `agent start`, wait for and read the model banner. Only then
189
+ deliver the brief with `pane run`, then read the transcript back and verify that the brief's first words are
190
+ present before any deadline is armed. **On Orca (`TERM_PROGRAM=Orca` and non-empty
191
+ `ORCA_TERMINAL_HANDLE`)**, wait for the `terminal create` receipt, send the file announcement with
192
+ `terminal send --enter --wait-submit`, and read `result.send.prompt.stages` (treat the brief as delivered only when a `turn_started` stage is present; `accepted: true` proves input acceptance, not a started turn; never resend on `accepted` alone) and terminal output. That
193
+ host-specific read-back proves the brief was sent; a brief absent from the transcript was not sent.
194
+ Every Claude seat is started with `--effort high` and has its banner read.
195
+ Inventories retain the **full suite log**, not a tail or summary, and no one runs `git checkout` in a clone while that clone's suite is running.
151
196
 
152
197
  ### Seat-spawn and Leg-2 recipes
153
198
 
154
- Every mission to a Claude or Grok seat is delivered only with `herdr pane run <pane> "<message>"` and
155
- verified by reading the pane back; never use `agent prompt` for mission delivery. Launch a Grok seat with
156
- `herdr agent start <seat> --kind grok --pane <pane> -- -m grok-4.6`. For Leg-2, a Codex reviewer under
157
- `workspace-write` must be briefed with an in-worktree verdict path such as
199
+ - **On herdr (`HERDR_ENV=1`)**: Every mission to a Claude or Grok seat is delivered only with `herdr pane run <pane> "<message>"` and
200
+ verified by reading the pane back; never use `agent prompt` for mission delivery. Launch a Grok seat with
201
+ `herdr agent start <seat> --kind grok --pane <pane> -- -m grok-4.6`.
202
+ - **On Orca (`TERM_PROGRAM=Orca` and non-empty `ORCA_TERMINAL_HANDLE`)**: Seats spawn with `orca terminal create --worktree path:<repo> --command "<cmd>" --json`. Brief delivery travels as a file announced by `orca terminal send --terminal <handle> --text "<announcement>" --enter --wait-submit 15 --json`. Read `result.send.prompt.stages` and treat the brief as delivered only when a `turn_started` stage is present; `accepted: true` proves input acceptance, not a started turn; never resend on `accepted` alone.
203
+ For Leg-2 (both hosts), a Codex reviewer under `workspace-write` must be briefed with an in-worktree verdict path such as
158
204
  `<repo>/.tickmarkr/overseer/verdicts/<task>.md`, and its verdict must be written there before it is read.
159
-
160
205
  ## Supervising tickmarkr as the executor — WHO DOES WHAT
161
206
 
162
207
  When the mission runs `/tickmarkr-auto` (tickmarkr dispatches the workers), supervision changes shape —
@@ -215,10 +260,12 @@ journal tail to decide what happens next, or sweeping orphans — you have taken
215
260
  A watch ending the seat's turn is no watch: keep a **blocking journal consumer** alive for those terminal
216
261
  events — the shipped watcher below, or a foreground `until grep` on the run's terminal events — and
217
262
  ensure it is re-armed at most every twenty minutes. Never rely on a `Monitor`-only wake.
218
- **All four are covered by one shipped instrument** — `scripts/watch-journal.sh <runs-dir> [poll] [cap]
219
- [events-csv]` — which arms on a line baseline, wakes once, and grades a `run-end` against every green
220
- clause. `scripts/watch-parks.sh` stays the park-specific wake for THIS seat (it counts parks and speaks
221
- about rulings); the two overlap on `task-human` deliberately, and arming both is coverage, not a bug.
263
+ - **On herdr (`HERDR_ENV=1`)**: Use the shipped journal instruments:
264
+ **All four are covered by one shipped instrument** — `scripts/watch-journal.sh <runs-dir> [poll] [cap]
265
+ [events-csv]` — which arms on a line baseline, wakes once, and grades a `run-end` against every green
266
+ clause. `scripts/watch-parks.sh` stays the park-specific wake for THIS seat (it counts parks and speaks
267
+ about rulings); the two overlap on `task-human` deliberately, and arming both is coverage, not a bug.
268
+ - **On Orca (`TERM_PROGRAM=Orca` and non-empty `ORCA_TERMINAL_HANDLE`)**: Arm a file/journal consumer for the same terminal events and inspect the seat with `orca terminal read --terminal <handle> --screen --json`; re-arm after every wake.
222
269
  - **Daemon liveness ≠ journal activity.** A dead daemon emits no events, so journal watchers sleep through
223
270
  its death. Liveness comes from the lock's OWN pid (`kill -0`), never a command-name grep. Recovery is
224
271
  `tickmarkr resume <runId>` — **the orchestrator's command, not yours** — and note that resume REPLAYS the
@@ -329,6 +376,8 @@ completely different standing:
329
376
  discounted the two review findings, which are exactly the defect classes the gates exist to catch.
330
377
  **Vigilance here means CLASSIFYING reds, never discounting them.**
331
378
 
379
+ ##### On herdr (`HERDR_ENV=1`) — contamination watcher
380
+
332
381
  **Arm the instrument; do not promise attention.** This seat's own law — *a watcher whose liveness depends
333
382
  on its owner being free is scheduled, not armed* — applies to itself:
334
383
 
@@ -361,7 +410,11 @@ detect: **the ruling would have made the worker commit the violation the task wa
361
410
  > test, classify each against `files[]`, and resolve who owns the out-of-scope ones. A sweep for this class
362
411
  > then found **five of six remaining tasks exposed**, so it is a shape, not an accident.
363
412
 
364
- ### Context is a supervised resource, for BOTH tiers
413
+ ##### On Orca (`TERM_PROGRAM=Orca` and non-empty `ORCA_TERMINAL_HANDLE`) — contamination evidence
414
+
415
+ Watch journal gate-result events and load evidence through a file consumer; inspect the seat with `orca terminal read --terminal <handle> --screen --json`. Classify infrastructure failures separately from review findings and record the evidence in files.
416
+
417
+ ### Context is a supervised resource, for BOTH tiers (host-specific)
365
418
 
366
419
  **THE TIERS CLEAR EACH OTHER AT 50%. Neither tier clears itself on its own notice.** Operator directive,
367
420
  2026-08-28, and it exists because **a seat cannot reliably observe its own exhaustion** — the seat that
@@ -370,7 +423,14 @@ an overseer ran nine hours at 86% unable to read its own number; a context watch
370
423
  when the run's own status text pushed the percentage off the statusline; and an orchestrator went
371
424
  **366k → 970k of 1M between two checks** while its ACT wake sat unread in a detached log.
372
425
 
373
- The protocol, in both directions:
426
+ **On Orca (`TERM_PROGRAM=Orca` and non-empty `ORCA_TERMINAL_HANDLE`)**, use the same mutual-clear
427
+ policy through brief/handoff files and `orca terminal send --enter --wait-submit`; identify seats by
428
+ terminal handle, verify submission from the receipt, and read the terminal before continuing. Do not
429
+ run the Herdr pane commands or Herdr context watcher below.
430
+
431
+ #### On herdr (`HERDR_ENV=1`) — mutual clear
432
+
433
+ **On herdr (`HERDR_ENV=1`) only**, use this protocol in both directions:
374
434
 
375
435
  1. **Overseer sees orch at ≥50%** → nudge it: write `HANDOFF-ORCH-<ver>.md`, then `/clear`, then re-read
376
436
  its brief **and** its handoff. **A same-process `/clear` keeps every background task alive**; it clears
@@ -474,7 +534,7 @@ a beat the other tier reads, a notification, or an artifact the other tier watch
474
534
  `ACT: orch-215 at 970k/1000k — handoff + /clear NOW` fired correctly and sat unread in a scratchpad log
475
535
  while the orchestrator kept working.**
476
536
 
477
- Arm a context watcher on the orchestrator at spawn time and treat a threshold wake as a first-class event:
537
+ **On herdr (`HERDR_ENV=1`) only**, arm a context watcher on the orchestrator at spawn time and treat a threshold wake as a first-class event:
478
538
  finish the step, write a handoff, `/clear` **plus a fresh brief — never `/compact`**, because a compaction
479
539
  is a lossy summary nobody trusts while a clean session re-oriented from disk-verifiable state is reliable.
480
540
  **Do the same for yourself before you are forced to**: write the handoff while your judgment is still
@@ -487,30 +547,16 @@ number — an unmeasured budget is not a small budget.
487
547
  .claude/skills/tickmarkr-overseer/scripts/watch-context.sh overseer <overseer-agent-or-pane> 50 50 <handoff-file>
488
548
  ```
489
549
 
490
- ### A GO has a deadline — arm `watch-launch.sh` in the same act as the GO
491
-
492
- A GO that produces no run is a silent failure until someone notices; on 2026-09-11 an orchestrator's codex
493
- sandbox was rooted at the main repo, the spec worktree was outside its writable roots, it stopped at the
494
- denial without reporting, the overseer's 10-minute wake expired un-re-armed, and three hours passed.
495
- Two rules close that hole:
496
-
497
- - **Every orchestrator seat is sandbox-rooted at the worktree it will run in** (`cd <worktree>` before
498
- `herdr agent start … --sandbox workspace-write`), and its brief says: *a denied path or refused command
499
- is reported to the overseer pane within 60 s — never a silent stop.*
500
- - **The overseer arms the launch watcher in the SAME act as the GO**, with the lock path the run will
501
- create, and treats `LAUNCH_OVERDUE` as a first-class event (read the orchestrator pane, fix the seat,
502
- re-issue the GO):
550
+ #### On Orca (`TERM_PROGRAM=Orca` and non-empty `ORCA_TERMINAL_HANDLE`) — mutual clear
503
551
 
504
- ```bash
505
- .claude/skills/tickmarkr-overseer/scripts/watch-launch.sh <worktree>/.tickmarkr/graph.lock 900 <overseer-pane> &
506
- ```
552
+ Write the handoff and announce it with `orca terminal send --terminal <handle> --text "Read <handoff> and <brief>" --enter --wait-submit 15 --json`. Require observed submission (`result.send.prompt.stages.includes("turn_started")`) and inspect `orca terminal read --terminal <handle> --screen --json` before and after clearing. Arm file/journal and context evidence watchers for both seats.
507
553
 
508
- It prints `LAUNCH_OK` with the lock's contents when the run starts (exit 0) and, past the deadline, delivers
509
- `LAUNCH OVERDUE …` to the overseer pane AND as an OS notification (exit 3). Any wake you arm yourself with
510
- a cap (a background `until` loop) must be RE-ARMED on every expiry; an expired wake is not a watch.
554
+ ### A GO has a deadline — arm the launch observer in the same act as the GO
511
555
 
556
+ #### On herdr (`HERDR_ENV=1`) — launch watcher
512
557
 
513
- ### A GO has a deadline — arm `watch-launch.sh` in the same act as the GO
558
+ **On herdr (`HERDR_ENV=1`) only:** this launch watcher sends to an overseer pane and the following
559
+ `agent start`/notification instructions are Herdr commands.
514
560
 
515
561
  A GO that produces no run is a silent failure until someone notices; on 2026-09-11 an orchestrator's codex
516
562
  sandbox was rooted at the main repo, the spec worktree was outside its writable roots, it stopped at the
@@ -544,6 +590,10 @@ after a banner read-back proves the percentage dropped; only then does it send t
544
590
  orchestrator the fresh seat is live — or the next seat re-arms silently beside a tier that still
545
591
  believes it is alone.
546
592
 
593
+ #### On Orca (`TERM_PROGRAM=Orca` and non-empty `ORCA_TERMINAL_HANDLE`) — launch deadline
594
+
595
+ Arm a file watcher for the run lock and run-start journal row in the same act as GO. On expiry inspect `orca terminal read --terminal <handle> --screen --json` and write the missing-launch evidence to a file and announce its path with `orca terminal send --terminal <supervisor-handle> --text "Launch overdue: read <evidence-file>" --enter --wait-submit 15 --json`. Renew the watcher after each wake.
596
+
547
597
  ## Supervising GSD legs — when the mission dispatches `/gsd:*` instead of `tickmarkr run`
548
598
 
549
599
  Milestones that alternate GSD legs (`/gsd:plan-phase N`, `/gsd:execute-phase N`) under this hierarchy get
@@ -574,7 +624,8 @@ they are left implicit:
574
624
  Measured 2026-08-18: two freeze-class directives sat queued behind a planner's teammate fan-out
575
625
  while the plan set they froze was still editable from that queue, and THE OPERATOR ended the turn
576
626
  by hand (Esc, twice) because no seat owned the interrupt. Every GSD seat brief states: subagents
577
- run as visible herdr panes in per-task tabs (`herdr agent start …`), and a seat report whose work
627
+ - **On herdr (`HERDR_ENV=1`)**, subagents run as visible herdr panes in per-task tabs (`herdr agent start …`);
628
+ - **On Orca (`TERM_PROGRAM=Orca` and non-empty `ORCA_TERMINAL_HANDLE`)**, they run as visible terminals created with the Orca seat-spawn recipe. A seat report whose work
578
629
  was produced by invisible subagents is rejected on read.
579
630
  2. **Seats are interactive TUI, never headless `-p`.** The P92–P96 exec lane —
580
631
  `cat brief | claude -p … ` in a visible pane — satisfied visibility in the letter only: `claude -p`
@@ -589,8 +640,10 @@ they are left implicit:
589
640
  way, and three same-family passes confirmed one wrong anchored conclusion with the refuting fact in
590
641
  the room. `<state-dir>/doctor.json` already lists every installed+authed adapter and its models (nine
591
642
  were authed on 2026-08-17 while every seat ran claude). Priority when independence is scarce:
592
- **verifier > checker > planner > executors** — the independent seat goes cross-vendor
593
- (`herdr agent start … --kind codex`), ruled at dispatch, never debated under time pressure.
643
+ **verifier > checker > planner > executors**.
644
+ - **On herdr (`HERDR_ENV=1`)** the independent seat goes cross-vendor with `herdr agent start … --kind codex`;
645
+ - **On Orca (`TERM_PROGRAM=Orca` and non-empty `ORCA_TERMINAL_HANDLE`)** it uses the Orca terminal-create
646
+ seat recipe. The choice is ruled at dispatch, never debated under time pressure.
594
647
  **A codex seat inside a git WORKTREE cannot commit and cannot write outside the worktree** (OBS-824, measured
595
648
  twice on 2026-09-01): its sandbox pins writes to the worktree's own path, and a worktree's `.git` is a FILE pointing
596
649
  at the main repository's object store, so every `git commit` from inside it is refused. Brief such a seat to leave its
@@ -606,18 +659,28 @@ they are left implicit:
606
659
 
607
660
  ## Pane mechanics that bite
608
661
 
609
- - **Verified send protocol**: `herdr agent send` writes WITHOUT Enter, and `pane run`'s Enter can be swallowed
610
- by bracketed-paste on long payloads. Robust sequence: read the pane (bare prompt required) → send-text →
611
- sleep 2–3s → send-keys Enter → read back (input empty / agent `working`). Never report "briefed" without
612
- the read-back. Long content goes in a brief file, never pane text. `scripts/seat-send.sh` encodes
613
- this whole path — size guard, atomic prompt, prompt-line read-back, optional interrupt — and never
614
- auto-resends. Each adapter declares its prompt glyph beside its input-box matchers; `seat-send.sh` reads
615
- that declaration rather than assuming Claude's `❯`. **Probe the prompt line before writing:** if it
662
+ - **Verified send protocol**:
663
+ - **On herdr (`HERDR_ENV=1`)**: `herdr agent send` writes WITHOUT Enter, and `pane run`'s Enter can be swallowed
664
+ by bracketed-paste on long payloads. Robust sequence: read the pane (bare prompt required) → send-text →
665
+ sleep 2–3s → send-keys Enter → read back (input empty / agent `working`). Never report "briefed" without
666
+ the read-back. Long content goes in a brief file, never pane text. `scripts/seat-send.sh` encodes
667
+ this whole path — size guard, atomic prompt, prompt-line read-back, optional interrupt — and never
668
+ auto-resends. Each adapter declares its prompt glyph beside its input-box matchers; `seat-send.sh` reads
669
+ that declaration rather than assuming Claude's `❯`.
670
+ - **On Orca (`TERM_PROGRAM=Orca` and non-empty `ORCA_TERMINAL_HANDLE`)**: Briefs travel as a file announced by `terminal send` with enter and a submit wait whose receipt is read for observed submission rather than input acceptance:
671
+ `orca terminal send --terminal <handle> --text "Read <brief-file> and follow it exactly." --enter --wait-submit 15 --json`
672
+ Read `result.send.prompt.stages` and treat the brief as delivered only when a `turn_started` stage is present; `accepted: true` proves input acceptance, not a started turn; never resend on `accepted` alone.
673
+ - **Evidence collection**:
674
+ - **On herdr (`HERDR_ENV=1`)**: Evidence is read from watcher files, journal events, and `herdr pane read <pane>`.
675
+ - **On Orca (`TERM_PROGRAM=Orca` and non-empty `ORCA_TERMINAL_HANDLE`)**: Evidence is files beside `terminal read`: read verdict files, journals, and pane state with `orca terminal read --terminal <handle> --limit <lines> --json` (or `--screen`).
676
+
677
+ ### On herdr (`HERDR_ENV=1`) — pane mechanics
678
+
679
+ **Probe the prompt line before writing (herdr):** if it
616
680
  already holds a non-ghost draft, wait only the script's bounded window and return `SEND_DEFERRED`
617
681
  without writing a byte. An unsubmitted post-send draft returns `SEND_UNSUBMITTED`. This protects both
618
682
  Codex's `›` prompt and a HUMAN typing in a pane; delivery is never allowed to glue onto either draft.
619
- **PROBE THE READ-BACK WITH THE SHORTEST DISTINCTIVE TOKEN — a commit hash, a pid, an OBS id — NEVER a
620
- sentence.** A long phrase crosses the pane's render wrap boundary, so grepping for it returns zero on a
683
+ **PROBE THE READ-BACK WITH THE SHORTEST DISTINCTIVE TOKEN — a commit hash, a pid, an OBS id — NEVER a sentence.** A long phrase crosses the pane's render wrap boundary, so grepping for it returns zero on a
621
684
  message that arrived intact, and **a badly-probed successful send is byte-identical to a truncated one.**
622
685
  Both natural reactions to that false negative are wrong: re-sending duplicates the message into the
623
686
  target's queue, and escalating reports a delivery failure that never happened. Measured 2026-08-06
@@ -637,7 +700,9 @@ they are left implicit:
637
700
  Send only when the seat is idle and the ANSI prompt line is empty or dim-only (the Esc/SGR discriminator
638
701
  separates an autosuggest ghost from typed input), then read back activity or an ACK; presence is not
639
702
  delivery. If a stale draft must be replaced, supersede it explicitly with
640
- `herdr pane run <pane> "<-- disregard … ACTUAL: …"` instead of stacking another instruction behind it.
703
+ **On herdr (`HERDR_ENV=1`)**, use `herdr pane run <pane> "<-- disregard … ACTUAL: …"` instead of
704
+ stacking another instruction behind it. On Orca, send the replacement through the verified
705
+ terminal-send branch above.
641
706
  - **A MESSAGE TO A WORKING SEAT IS A QUEUED MESSAGE, AND THE QUEUE DRAINS ONLY AT TURN BOUNDARIES.**
642
707
  Delivery is not arrival: a message sent to a `working` claude seat lands in its queue (`Press up to
643
708
  edit queued messages` on the seat's prompt line is the tell) and is READ only when the current turn
@@ -658,7 +723,7 @@ they are left implicit:
658
723
  - Five distinct send failures in one leg — front-truncation, sitting unsubmitted, two silent losses,
659
724
  a probe that mistook its own echo for a reply — is what a prose send protocol costs under load:
660
725
  run `scripts/seat-send.sh` instead.
661
- - **A `pane run` into a pane whose FOREGROUND is busy is a DELAYED command, not a lost one.** The
726
+ - **On herdr (`HERDR_ENV=1`), a `pane run` into a pane whose FOREGROUND is busy is a DELAYED command, not a lost one.** The
662
727
  shell buffers the line and executes it the instant the foreground process exits — which, when that
663
728
  process is a run daemon, means *at run-end*, unattended, possibly hours later. Measured 2026-08-24: a
664
729
  resume typed into the run pane while the daemon still held it fired by itself at the next run-end;
@@ -700,7 +765,7 @@ they are left implicit:
700
765
  name-keyed poll script exits with `agent_not_running` — an exit shaped exactly like a real wake.
701
766
  Re-arm name-keyed watchers in the same act as the rename; file-keyed artifact watchers are
702
767
  unaffected (one more reason to prefer them).
703
- - Stale typed input is unclearable via CLI — supersede it:
768
+ - **On herdr (`HERDR_ENV=1`)**, stale typed input is unclearable via CLI — supersede it:
704
769
  `herdr pane run <pane> "<-- disregard everything before this arrow (stale draft). ACTUAL: <message>"`.
705
770
  **But DISCRIMINATE before you supersede or file it: text on an idle seat's prompt line has FOUR
706
771
  authors** — the seat's own draft, an operator, another agent's `agent send` (writes WITHOUT Enter),
@@ -712,9 +777,15 @@ they are left implicit:
712
777
  the text still sat there. An origin question you can close in ten seconds at the pane becomes
713
778
  permanently open the moment anyone clears the box.
714
779
 
780
+ ### On Orca (`TERM_PROGRAM=Orca` and non-empty `ORCA_TERMINAL_HANDLE`) — terminal mechanics
781
+
782
+ Use recorded handles and read `orca terminal read --terminal <handle> --screen --json` before sending. Send a brief file announcement with `orca terminal send --terminal <handle> --text "Read <brief>" --enter --wait-submit 15 --json`. Read `result.send.prompt.stages` and treat the brief as delivered only when a `turn_started` stage is present; `accepted: true` proves input acceptance, not a started turn; never resend on `accepted` alone. Then read back. Watch file/journal progress independently of input acceptance.
783
+
715
784
  ## Supervision watcher
716
785
 
717
- ### ⛔ EDITING A WATCHER WHILE WATCHERS ARE ARMED: REPLACE BY RENAME, NEVER IN PLACE
786
+ ### On herdr (`HERDR_ENV=1`) — supervision instruments
787
+
788
+ #### ⛔ EDITING A WATCHER WHILE WATCHERS ARE ARMED: REPLACE BY RENAME, NEVER IN PLACE
718
789
 
719
790
  **`bash` reads a running script BY BYTE OFFSET.** Edit the file a live watcher is executing and every
720
791
  offset after your edit shifts — a comment-only insertion is enough — and the process runs garbage from
@@ -956,8 +1027,14 @@ containing its terminal marker**, or `blocked`, or the pane being gone. Those ar
956
1027
  actually require you. The same applies to a run: the journal's `run-end` event is the signal, never an
957
1028
  orchestrator turn boundary.
958
1029
 
1030
+ ### On Orca (`TERM_PROGRAM=Orca` and non-empty `ORCA_TERMINAL_HANDLE`) — supervision instruments
1031
+
1032
+ At seat spawn, arm file/journal watchers for artifact completion, run events, missing progress and context evidence. Record each watcher owner and bounded expiry; renew on every wake and stop on stand-down. Read `orca terminal read --terminal <handle> --screen --json` on each wake to detect blocked or pending input. For a human gate, write a checkpoint evidence file and announce it through verified terminal send. Use Orca notifications only when the installed host advertises a notification capability; the current CLI has no `notification` command, so the file and terminal receipt remain the delivery path. A notification or accepted input alone never proves delivery or completion.
1033
+
959
1034
  ## Specialist pipeline rules
960
1035
 
1036
+ ### On herdr (`HERDR_ENV=1`) — specialist panes
1037
+
961
1038
  - **Dedicated consultant tab**: Consultants (agents spawned to gather synthesis input for decisions like SCOPER analysis or architectural reviews) must run in a DEDICATED tab separate from the ORCHESTRATOR tab. When the orchestrator stands down, the consultant panes should persist so their assessments remain available for review and reference.
962
1039
  - **Scoper worktree rule**: The SCOPER (or any worktree-based specialist synthesizing into the spec pipeline) must do ALL git operations in a dedicated worktree (e.g., `git worktree add /private/tmp/tkr-scoper-v155 -b spec/...`), never switching the main checkout's branch. This prevents race conditions between the specialist's branch operations and the orchestrator's shipping logic.
963
1040
  - **One fresh pane per consult ROUND** (operator rule, 2026-08-04): every consult round spawns a NEW pane in
@@ -1019,6 +1096,10 @@ orchestrator turn boundary.
1019
1096
  measurement without carrying the number reproduces the defect at full price.** The floor lives in
1020
1097
  `src/`; every seat that hand-splits panes is outside it and re-learns this by hand.
1021
1098
 
1099
+ ### On Orca (`TERM_PROGRAM=Orca` and non-empty `ORCA_TERMINAL_HANDLE`) — specialist terminals
1100
+
1101
+ Create specialist seats using `orca terminal create --worktree path:<repo> --command "<agent-cmd>" --json` and record each returned handle. For a deliberate split use `orca terminal split --terminal <owned-handle> --direction horizontal --command "<agent-cmd>" --json`, retaining the child receipt. Deliver briefs with `terminal send --enter --wait-submit 15`, verify observed submission (`result.send.prompt.stages.includes("turn_started")`), and collect files beside `orca terminal read --terminal <handle> --screen --json`. File/journal completion watchers close only recorded seats after the terminal artifact marker; timeout never authorizes closure.
1102
+
1022
1103
  ## Non-negotiable rules
1023
1104
 
1024
1105
  1. **Do not drive the run.** The ORCHESTRATOR owns `compile`/`plan`/`run`/`resume`, the watchers, the