tickmarkr 2.5.4 → 2.5.6
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.
- package/README.md +3 -1
- package/dist/adapters/registry.js +6 -1
- package/dist/adapters/types.d.ts +3 -0
- package/dist/cli/commands/approve.d.ts +1 -0
- package/dist/cli/commands/approve.js +118 -9
- package/dist/cli/commands/doctor.d.ts +10 -0
- package/dist/cli/commands/doctor.js +44 -29
- package/dist/cli/commands/fleet.js +199 -33
- package/dist/cli/commands/init.js +196 -6
- package/dist/cli/commands/plan.js +20 -4
- package/dist/cli/commands/resume.js +4 -2
- package/dist/cli/commands/run.js +11 -2
- package/dist/cli/commands/verify.js +102 -81
- package/dist/cli/help.d.ts +2 -0
- package/dist/cli/help.js +3 -1
- package/dist/config/config.d.ts +25 -8
- package/dist/config/config.js +41 -29
- package/dist/config/fleet-overlay.d.ts +3 -9
- package/dist/config/fleet-overlay.js +114 -19
- package/dist/config/fleet-why.d.ts +7 -0
- package/dist/config/fleet-why.js +5 -0
- package/dist/drivers/index.d.ts +15 -1
- package/dist/drivers/index.js +39 -10
- package/dist/drivers/orca.d.ts +119 -10
- package/dist/drivers/orca.js +781 -110
- package/dist/gates/baseline.d.ts +17 -3
- package/dist/gates/baseline.js +63 -15
- package/dist/gates/cache.d.ts +101 -0
- package/dist/gates/cache.js +401 -0
- package/dist/gates/llm.d.ts +3 -0
- package/dist/gates/llm.js +11 -0
- package/dist/gates/review.d.ts +28 -3
- package/dist/gates/review.js +106 -14
- package/dist/gates/run-gates.d.ts +9 -1
- package/dist/gates/run-gates.js +407 -102
- package/dist/gates/test-manifest.d.ts +128 -0
- package/dist/gates/test-manifest.js +463 -0
- package/dist/gates/test-reporter.d.ts +4 -0
- package/dist/gates/test-reporter.js +57 -0
- package/dist/graph/graph.d.ts +2 -0
- package/dist/graph/graph.js +45 -1
- package/dist/route/preference.d.ts +22 -1
- package/dist/route/preference.js +123 -25
- package/dist/route/router.js +31 -6
- package/dist/run/consult.js +5 -4
- package/dist/run/daemon.d.ts +15 -0
- package/dist/run/daemon.js +638 -167
- package/dist/run/execution-budget.d.ts +25 -0
- package/dist/run/execution-budget.js +142 -0
- package/dist/run/git.d.ts +50 -1
- package/dist/run/git.js +131 -12
- package/dist/run/journal.d.ts +16 -2
- package/dist/run/journal.js +115 -25
- package/dist/run/lease.d.ts +58 -0
- package/dist/run/lease.js +310 -0
- package/dist/run/merge.d.ts +2 -0
- package/dist/run/merge.js +91 -3
- package/dist/run/operator-state.d.ts +11 -0
- package/dist/run/operator-state.js +17 -3
- package/dist/run/recovery.d.ts +8 -0
- package/dist/run/recovery.js +25 -0
- package/dist/run/repair-selection.d.ts +12 -0
- package/dist/run/repair-selection.js +56 -0
- package/dist/run/stall.d.ts +6 -1
- package/dist/run/stall.js +60 -3
- package/dist/tui/cockpit/board.d.ts +96 -0
- package/dist/tui/cockpit/board.js +346 -0
- package/dist/tui/cockpit/decision-actions.js +2 -0
- package/dist/tui/cockpit/layout.d.ts +5 -1
- package/dist/tui/cockpit/layout.js +8 -3
- package/dist/tui/cockpit/live-runtime.js +71 -21
- package/dist/tui/cockpit/run-view.d.ts +7 -5
- package/dist/tui/cockpit/run-view.js +12 -11
- package/dist/tui/ink/fleet-app.d.ts +49 -27
- package/dist/tui/ink/fleet-app.js +229 -38
- package/package.json +2 -2
- package/skills/tickmarkr-overseer/SKILL.md +173 -113
- package/skills/tickmarkr-overseer/scripts/grade-ci.sh +29 -2
|
@@ -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
|
|
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.
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
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,76 @@ 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.
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
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
|
|
139
|
-
|
|
140
|
-
|
|
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.
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
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.
|
|
160
181
|
|
|
161
182
|
The orchestrator's run log, handoff, and plan live inside its sandbox root and are artifacts of that orchestrator.
|
|
162
183
|
The overseer reads them from there, using the path the orchestrator reports; do not substitute the
|
|
@@ -164,20 +185,23 @@ overseer's repository or a machine-global planning directory. The orchestrator b
|
|
|
164
185
|
sandbox denies writes under `.git`, report the denial to the overseer and stop; the overseer launches the daemon itself;
|
|
165
186
|
and the daemon host is never sandboxed.
|
|
166
187
|
|
|
167
|
-
|
|
168
|
-
then read the transcript back and verify that the brief's first words are
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
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.
|
|
172
196
|
|
|
173
197
|
### Seat-spawn and Leg-2 recipes
|
|
174
198
|
|
|
175
|
-
Every mission to a Claude or Grok seat is delivered only with `herdr pane run <pane> "<message>"` and
|
|
176
|
-
verified by reading the pane back; never use `agent prompt` for mission delivery. Launch a Grok seat with
|
|
177
|
-
`herdr agent start <seat> --kind grok --pane <pane> -- -m grok-4.6`.
|
|
178
|
-
`
|
|
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
|
|
179
204
|
`<repo>/.tickmarkr/overseer/verdicts/<task>.md`, and its verdict must be written there before it is read.
|
|
180
|
-
|
|
181
205
|
## Supervising tickmarkr as the executor — WHO DOES WHAT
|
|
182
206
|
|
|
183
207
|
When the mission runs `/tickmarkr-auto` (tickmarkr dispatches the workers), supervision changes shape —
|
|
@@ -236,10 +260,12 @@ journal tail to decide what happens next, or sweeping orphans — you have taken
|
|
|
236
260
|
A watch ending the seat's turn is no watch: keep a **blocking journal consumer** alive for those terminal
|
|
237
261
|
events — the shipped watcher below, or a foreground `until grep` on the run's terminal events — and
|
|
238
262
|
ensure it is re-armed at most every twenty minutes. Never rely on a `Monitor`-only wake.
|
|
239
|
-
**
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
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.
|
|
243
269
|
- **Daemon liveness ≠ journal activity.** A dead daemon emits no events, so journal watchers sleep through
|
|
244
270
|
its death. Liveness comes from the lock's OWN pid (`kill -0`), never a command-name grep. Recovery is
|
|
245
271
|
`tickmarkr resume <runId>` — **the orchestrator's command, not yours** — and note that resume REPLAYS the
|
|
@@ -350,6 +376,8 @@ completely different standing:
|
|
|
350
376
|
discounted the two review findings, which are exactly the defect classes the gates exist to catch.
|
|
351
377
|
**Vigilance here means CLASSIFYING reds, never discounting them.**
|
|
352
378
|
|
|
379
|
+
##### On herdr (`HERDR_ENV=1`) — contamination watcher
|
|
380
|
+
|
|
353
381
|
**Arm the instrument; do not promise attention.** This seat's own law — *a watcher whose liveness depends
|
|
354
382
|
on its owner being free is scheduled, not armed* — applies to itself:
|
|
355
383
|
|
|
@@ -382,7 +410,11 @@ detect: **the ruling would have made the worker commit the violation the task wa
|
|
|
382
410
|
> test, classify each against `files[]`, and resolve who owns the out-of-scope ones. A sweep for this class
|
|
383
411
|
> then found **five of six remaining tasks exposed**, so it is a shape, not an accident.
|
|
384
412
|
|
|
385
|
-
|
|
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)
|
|
386
418
|
|
|
387
419
|
**THE TIERS CLEAR EACH OTHER AT 50%. Neither tier clears itself on its own notice.** Operator directive,
|
|
388
420
|
2026-08-28, and it exists because **a seat cannot reliably observe its own exhaustion** — the seat that
|
|
@@ -391,7 +423,14 @@ an overseer ran nine hours at 86% unable to read its own number; a context watch
|
|
|
391
423
|
when the run's own status text pushed the percentage off the statusline; and an orchestrator went
|
|
392
424
|
**366k → 970k of 1M between two checks** while its ACT wake sat unread in a detached log.
|
|
393
425
|
|
|
394
|
-
|
|
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:
|
|
395
434
|
|
|
396
435
|
1. **Overseer sees orch at ≥50%** → nudge it: write `HANDOFF-ORCH-<ver>.md`, then `/clear`, then re-read
|
|
397
436
|
its brief **and** its handoff. **A same-process `/clear` keeps every background task alive**; it clears
|
|
@@ -495,7 +534,7 @@ a beat the other tier reads, a notification, or an artifact the other tier watch
|
|
|
495
534
|
`ACT: orch-215 at 970k/1000k — handoff + /clear NOW` fired correctly and sat unread in a scratchpad log
|
|
496
535
|
while the orchestrator kept working.**
|
|
497
536
|
|
|
498
|
-
|
|
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:
|
|
499
538
|
finish the step, write a handoff, `/clear` **plus a fresh brief — never `/compact`**, because a compaction
|
|
500
539
|
is a lossy summary nobody trusts while a clean session re-oriented from disk-verifiable state is reliable.
|
|
501
540
|
**Do the same for yourself before you are forced to**: write the handoff while your judgment is still
|
|
@@ -508,30 +547,16 @@ number — an unmeasured budget is not a small budget.
|
|
|
508
547
|
.claude/skills/tickmarkr-overseer/scripts/watch-context.sh overseer <overseer-agent-or-pane> 50 50 <handoff-file>
|
|
509
548
|
```
|
|
510
549
|
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
A GO that produces no run is a silent failure until someone notices; on 2026-09-11 an orchestrator's codex
|
|
514
|
-
sandbox was rooted at the main repo, the spec worktree was outside its writable roots, it stopped at the
|
|
515
|
-
denial without reporting, the overseer's 10-minute wake expired un-re-armed, and three hours passed.
|
|
516
|
-
Two rules close that hole:
|
|
517
|
-
|
|
518
|
-
- **Every orchestrator seat is sandbox-rooted at the worktree it will run in** (`cd <worktree>` before
|
|
519
|
-
`herdr agent start … --sandbox workspace-write`), and its brief says: *a denied path or refused command
|
|
520
|
-
is reported to the overseer pane within 60 s — never a silent stop.*
|
|
521
|
-
- **The overseer arms the launch watcher in the SAME act as the GO**, with the lock path the run will
|
|
522
|
-
create, and treats `LAUNCH_OVERDUE` as a first-class event (read the orchestrator pane, fix the seat,
|
|
523
|
-
re-issue the GO):
|
|
550
|
+
#### On Orca (`TERM_PROGRAM=Orca` and non-empty `ORCA_TERMINAL_HANDLE`) — mutual clear
|
|
524
551
|
|
|
525
|
-
|
|
526
|
-
.claude/skills/tickmarkr-overseer/scripts/watch-launch.sh <worktree>/.tickmarkr/graph.lock 900 <overseer-pane> &
|
|
527
|
-
```
|
|
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.
|
|
528
553
|
|
|
529
|
-
|
|
530
|
-
`LAUNCH OVERDUE …` to the overseer pane AND as an OS notification (exit 3). Any wake you arm yourself with
|
|
531
|
-
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
|
|
532
555
|
|
|
556
|
+
#### On herdr (`HERDR_ENV=1`) — launch watcher
|
|
533
557
|
|
|
534
|
-
|
|
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.
|
|
535
560
|
|
|
536
561
|
A GO that produces no run is a silent failure until someone notices; on 2026-09-11 an orchestrator's codex
|
|
537
562
|
sandbox was rooted at the main repo, the spec worktree was outside its writable roots, it stopped at the
|
|
@@ -565,6 +590,10 @@ after a banner read-back proves the percentage dropped; only then does it send t
|
|
|
565
590
|
orchestrator the fresh seat is live — or the next seat re-arms silently beside a tier that still
|
|
566
591
|
believes it is alone.
|
|
567
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
|
+
|
|
568
597
|
## Supervising GSD legs — when the mission dispatches `/gsd:*` instead of `tickmarkr run`
|
|
569
598
|
|
|
570
599
|
Milestones that alternate GSD legs (`/gsd:plan-phase N`, `/gsd:execute-phase N`) under this hierarchy get
|
|
@@ -595,7 +624,8 @@ they are left implicit:
|
|
|
595
624
|
Measured 2026-08-18: two freeze-class directives sat queued behind a planner's teammate fan-out
|
|
596
625
|
while the plan set they froze was still editable from that queue, and THE OPERATOR ended the turn
|
|
597
626
|
by hand (Esc, twice) because no seat owned the interrupt. Every GSD seat brief states: subagents
|
|
598
|
-
run as visible herdr panes in per-task tabs (`herdr agent start …`)
|
|
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
|
|
599
629
|
was produced by invisible subagents is rejected on read.
|
|
600
630
|
2. **Seats are interactive TUI, never headless `-p`.** The P92–P96 exec lane —
|
|
601
631
|
`cat brief | claude -p … ` in a visible pane — satisfied visibility in the letter only: `claude -p`
|
|
@@ -610,8 +640,10 @@ they are left implicit:
|
|
|
610
640
|
way, and three same-family passes confirmed one wrong anchored conclusion with the refuting fact in
|
|
611
641
|
the room. `<state-dir>/doctor.json` already lists every installed+authed adapter and its models (nine
|
|
612
642
|
were authed on 2026-08-17 while every seat ran claude). Priority when independence is scarce:
|
|
613
|
-
**verifier > checker > planner > executors
|
|
614
|
-
(`herdr agent start … --kind codex
|
|
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.
|
|
615
647
|
**A codex seat inside a git WORKTREE cannot commit and cannot write outside the worktree** (OBS-824, measured
|
|
616
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
|
|
617
649
|
at the main repository's object store, so every `git commit` from inside it is refused. Brief such a seat to leave its
|
|
@@ -627,18 +659,28 @@ they are left implicit:
|
|
|
627
659
|
|
|
628
660
|
## Pane mechanics that bite
|
|
629
661
|
|
|
630
|
-
- **Verified send protocol**:
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
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
|
|
637
680
|
already holds a non-ghost draft, wait only the script's bounded window and return `SEND_DEFERRED`
|
|
638
681
|
without writing a byte. An unsubmitted post-send draft returns `SEND_UNSUBMITTED`. This protects both
|
|
639
682
|
Codex's `›` prompt and a HUMAN typing in a pane; delivery is never allowed to glue onto either draft.
|
|
640
|
-
**PROBE THE READ-BACK WITH THE SHORTEST DISTINCTIVE TOKEN — a commit hash, a pid, an OBS id — NEVER a
|
|
641
|
-
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
|
|
642
684
|
message that arrived intact, and **a badly-probed successful send is byte-identical to a truncated one.**
|
|
643
685
|
Both natural reactions to that false negative are wrong: re-sending duplicates the message into the
|
|
644
686
|
target's queue, and escalating reports a delivery failure that never happened. Measured 2026-08-06
|
|
@@ -658,7 +700,9 @@ they are left implicit:
|
|
|
658
700
|
Send only when the seat is idle and the ANSI prompt line is empty or dim-only (the Esc/SGR discriminator
|
|
659
701
|
separates an autosuggest ghost from typed input), then read back activity or an ACK; presence is not
|
|
660
702
|
delivery. If a stale draft must be replaced, supersede it explicitly with
|
|
661
|
-
|
|
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.
|
|
662
706
|
- **A MESSAGE TO A WORKING SEAT IS A QUEUED MESSAGE, AND THE QUEUE DRAINS ONLY AT TURN BOUNDARIES.**
|
|
663
707
|
Delivery is not arrival: a message sent to a `working` claude seat lands in its queue (`Press up to
|
|
664
708
|
edit queued messages` on the seat's prompt line is the tell) and is READ only when the current turn
|
|
@@ -679,7 +723,7 @@ they are left implicit:
|
|
|
679
723
|
- Five distinct send failures in one leg — front-truncation, sitting unsubmitted, two silent losses,
|
|
680
724
|
a probe that mistook its own echo for a reply — is what a prose send protocol costs under load:
|
|
681
725
|
run `scripts/seat-send.sh` instead.
|
|
682
|
-
- **
|
|
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
|
|
683
727
|
shell buffers the line and executes it the instant the foreground process exits — which, when that
|
|
684
728
|
process is a run daemon, means *at run-end*, unattended, possibly hours later. Measured 2026-08-24: a
|
|
685
729
|
resume typed into the run pane while the daemon still held it fired by itself at the next run-end;
|
|
@@ -721,7 +765,7 @@ they are left implicit:
|
|
|
721
765
|
name-keyed poll script exits with `agent_not_running` — an exit shaped exactly like a real wake.
|
|
722
766
|
Re-arm name-keyed watchers in the same act as the rename; file-keyed artifact watchers are
|
|
723
767
|
unaffected (one more reason to prefer them).
|
|
724
|
-
-
|
|
768
|
+
- **On herdr (`HERDR_ENV=1`)**, stale typed input is unclearable via CLI — supersede it:
|
|
725
769
|
`herdr pane run <pane> "<-- disregard everything before this arrow (stale draft). ACTUAL: <message>"`.
|
|
726
770
|
**But DISCRIMINATE before you supersede or file it: text on an idle seat's prompt line has FOUR
|
|
727
771
|
authors** — the seat's own draft, an operator, another agent's `agent send` (writes WITHOUT Enter),
|
|
@@ -733,9 +777,15 @@ they are left implicit:
|
|
|
733
777
|
the text still sat there. An origin question you can close in ten seconds at the pane becomes
|
|
734
778
|
permanently open the moment anyone clears the box.
|
|
735
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
|
+
|
|
736
784
|
## Supervision watcher
|
|
737
785
|
|
|
738
|
-
###
|
|
786
|
+
### On herdr (`HERDR_ENV=1`) — supervision instruments
|
|
787
|
+
|
|
788
|
+
#### ⛔ EDITING A WATCHER WHILE WATCHERS ARE ARMED: REPLACE BY RENAME, NEVER IN PLACE
|
|
739
789
|
|
|
740
790
|
**`bash` reads a running script BY BYTE OFFSET.** Edit the file a live watcher is executing and every
|
|
741
791
|
offset after your edit shifts — a comment-only insertion is enough — and the process runs garbage from
|
|
@@ -977,8 +1027,14 @@ containing its terminal marker**, or `blocked`, or the pane being gone. Those ar
|
|
|
977
1027
|
actually require you. The same applies to a run: the journal's `run-end` event is the signal, never an
|
|
978
1028
|
orchestrator turn boundary.
|
|
979
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
|
+
|
|
980
1034
|
## Specialist pipeline rules
|
|
981
1035
|
|
|
1036
|
+
### On herdr (`HERDR_ENV=1`) — specialist panes
|
|
1037
|
+
|
|
982
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.
|
|
983
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.
|
|
984
1040
|
- **One fresh pane per consult ROUND** (operator rule, 2026-08-04): every consult round spawns a NEW pane in
|
|
@@ -1040,6 +1096,10 @@ orchestrator turn boundary.
|
|
|
1040
1096
|
measurement without carrying the number reproduces the defect at full price.** The floor lives in
|
|
1041
1097
|
`src/`; every seat that hand-splits panes is outside it and re-learns this by hand.
|
|
1042
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
|
+
|
|
1043
1103
|
## Non-negotiable rules
|
|
1044
1104
|
|
|
1045
1105
|
1. **Do not drive the run.** The ORCHESTRATOR owns `compile`/`plan`/`run`/`resume`, the watchers, the
|
|
@@ -50,14 +50,41 @@ while IFS=$'\t' read -r id name status conclusion; do
|
|
|
50
50
|
skipped=$(printf '%s\n' "$files" | grep -oE '[0-9]+ skipped' | awk '{s+=$1} END{print s+0}')
|
|
51
51
|
failed=$(printf '%s\n' "$files" | grep -oE '[0-9]+ failed' | awk '{s+=$1} END{print s+0}')
|
|
52
52
|
timedout=$(grep -cE 'Test timed out|Error: Hook timed out' "$log" || true)
|
|
53
|
+
# Vitest reports errors thrown outside any test (unhandled rejections, worker crashes) in an
|
|
54
|
+
# "Unhandled Errors" block that leaves the file summary green and the count oracle satisfied;
|
|
55
|
+
# its own tally line names how many. Any unhandled error is RED, never a green suite.
|
|
56
|
+
unhandled=$(grep -oE 'Vitest caught [0-9]+ unhandled error' "$log" | grep -oE '[0-9]+' | awk '{s+=$1} END{print s+0}')
|
|
57
|
+
if [ "$unhandled" -eq 0 ]; then
|
|
58
|
+
unhandled=$(grep -cE 'Unhandled Errors' "$log" || true)
|
|
59
|
+
fi
|
|
60
|
+
# OBS-1058 (RULING-231-17 precedent, v2.5.5 close R115 add.7): a vitest-worker RPC timeout
|
|
61
|
+
# ("Timeout calling \"onTaskUpdate\"") is the starved runner talking, not a test — every green
|
|
62
|
+
# release run has carried one. Only a timeout that is ITSELF an unhandled entry counts: the first
|
|
63
|
+
# payload line under a per-error header, nothing later. The header is Vitest's own structural line —
|
|
64
|
+
# a run of ⎯ on each side of "Unhandled Error", ANSI stripped (both the raw ESC byte and gh's `^[` rendering of it), nothing else on the line — so prose that
|
|
65
|
+
# merely contains the words never opens a window — and the payload must be Vitest's whole line
|
|
66
|
+
# (`Error: [vitest-worker]: Timeout calling "<method>"`), so an assertion quoting it stays RED. Per-error headers are honoured only inside Vitest's own block —
|
|
67
|
+
# after its structural "Unhandled Errors" line and "Vitest caught N" tally, until the file summary — and
|
|
68
|
+
# the count never exceeds N, so a test that prints a header and a timeout to stdout forges nothing. A stray diagnostic elsewhere in the log never
|
|
69
|
+
# offsets a real unhandled error; anything else under a header stays RED.
|
|
70
|
+
esc=$(printf '\033')
|
|
71
|
+
rpc=$(awk -v esc="$esc" '{ line = $0; gsub(/\^\[\[[0-9;]*m/, "", line); gsub(esc "\\[[0-9;]*m", "", line); sub(/^[^\t]*\t[^\t]*\t[0-9T:.-]+Z[ ]?/, "", line) }
|
|
72
|
+
line ~ /^(⎯)+ Unhandled Errors (⎯)+[ \t]*$/ { opening = 1; next }
|
|
73
|
+
opening && line !~ /[^ \t]/ { next }
|
|
74
|
+
opening { opening = 0; if (line ~ /^Vitest caught [0-9]+ unhandled error/) { armed = 1; cap = line; sub(/^Vitest caught /, "", cap); sub(/ .*$/, "", cap) } }
|
|
75
|
+
armed && line ~ /^[ \t]*Test Files / { armed = 0 }
|
|
76
|
+
armed && line ~ /^(⎯)+ Unhandled Error (⎯)+[ \t]*$/ { pending = 1; next }
|
|
77
|
+
pending && line ~ /[^ \t]/ { pending = 0; if (line ~ /^Error: \[vitest-worker\]: Timeout calling "[A-Za-z]+"[ \t]*$/) n++ }
|
|
78
|
+
END { if (n > cap + 0) n = cap + 0; print n + 0 }' "$log")
|
|
79
|
+
if [ "$rpc" -gt 0 ] && [ "$unhandled" -ge "$rpc" ]; then unhandled=$((unhandled - rpc)); fi
|
|
53
80
|
errors=$(grep -oE '##\[error\].*' "$log" | sort | uniq -c | sed 's/^ *//' | tr '\n' ';')
|
|
54
81
|
|
|
55
|
-
echo "$name: oracle=[${oracle:-MISSING}] files=[$(printf '%s' "$files" | tr '\n' '|')] passed=$passed skipped=$skipped failed=$failed timedout=$timedout errors=[$errors]"
|
|
82
|
+
echo "$name: oracle=[${oracle:-MISSING}] files=[$(printf '%s' "$files" | tr '\n' '|')] passed=$passed skipped=$skipped failed=$failed timedout=$timedout unhandled=$unhandled runner_rpc_timeouts=${rpc:-0} errors=[$errors]"
|
|
56
83
|
if [ -z "$oracle" ] || [ -z "$files" ]; then
|
|
57
84
|
echo "$name: UNREADABLE"
|
|
58
85
|
mark_unreadable
|
|
59
86
|
elif [ "$oracle" = "COUNT_ORACLE GREEN expected=$expected actual=$expected" ] \
|
|
60
|
-
&& [ "$failed" -eq 0 ] && [ "$timedout" -eq 0 ] \
|
|
87
|
+
&& [ "$failed" -eq 0 ] && [ "$timedout" -eq 0 ] && [ "$unhandled" -eq 0 ] \
|
|
61
88
|
&& [ $((passed + skipped)) -eq "$expected" ]; then
|
|
62
89
|
echo "$name: GREEN"
|
|
63
90
|
else
|