ace-overseer 0.26.1 → 0.27.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ec144ec980c58f2cf9fde48558e42ffdb7798d45c94897dcd28112d4cf348d1a
4
- data.tar.gz: 95a59adbdc0244152f79c0d0cce6f4cd60e4b1a29b84e8a86d18ff3130a2c63c
3
+ metadata.gz: 5204d8b317b630a73e16ddc196fc90c3d6efa1e0f39a62406e1b6f7bd6de4c2e
4
+ data.tar.gz: 5293bfde27b37ca690442f2ffcc60446913ec54052b2426b47d82c55d48c1614
5
5
  SHA512:
6
- metadata.gz: 30b3626aaf30e4297b6000aa0f00cc32320fb0b0eedbb98c33e26f1f867a60690dfdc6b008bcc737b59b80e0c87b28c616450763ad8c3c7acad22809435aba54
7
- data.tar.gz: 397b3f3774a3e3f6d80aacf41bd8b2da542ee7597c08d48ce4d876d89b3dcd852f2a879fcead3f9ee511ea6ae2593ae596fc96ef7a622aa36ba77e5369205c2e
6
+ metadata.gz: 96747e1a1d70f884fb302110f0f12197b81a4b6a7701ce0ef0aeb000581daaae7bc6ccb7660f15fdf1ef067e6c879c0e3c86e774881b99ffdd351ec82204a740
7
+ data.tar.gz: 61e8da9b71790c8f7f5252e61652d4d7af4dd881d4bb8e716504c84ee60cfc1af3e784f0c5d8172d096e471d353d010e674984a9cee99d1a0b63e1e40d0c9eac
data/CHANGELOG.md CHANGED
@@ -5,7 +5,118 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
- ## [Unreleased]
8
+ ## [0.27.0] - 2026-10-30
9
+
10
+ ### Fixed (review rounds 3/3b)
11
+
12
+ - Start hardening: herdr failures surface as blocked reports on project and
13
+ lab paths; the first prompt is a separate step (a prompt failure never
14
+ strands a started agent); installed toolchain resolution never falls back
15
+ to the checkout; the lab space is `lab-overseer` (no basename collision);
16
+ nested lab scopes are refused; malformed observe.remote entries degrade
17
+ to per-source health markers.
18
+
19
+ ### Added
20
+
21
+ - Remote PR observation (task 8xs.t.pu0.4): `observe.remote.pull_requests`
22
+ configuration projects configured PRs through the existing forge provider
23
+ adapters — lifecycle rows (new HEAD, merge/close/reopen) and activity rows
24
+ (review/approval/comment identity sets) with semantic revisions, wake
25
+ payloads (forge, number/title, event kind, author, link), and per-source
26
+ degradation on API failures with one wake per failure class.
27
+
28
+ - `ace-overseer observe` projects the six local source classes (task
29
+ 8xs.t.pu0.3): project and `_overseer` tasks, worktrees, coworker
30
+ availability and assignment progress alongside HITL events — every row
31
+ read from its state owner with stable key/revision semantics, per-source
32
+ health (`ok`/`degraded`), and degraded-source markers that wake once per
33
+ failure class while healthy sources keep projecting.
34
+
35
+ - `ace-overseer start [--dry-run] [--format table|json]` (task 8xs.t.pu0.1):
36
+ starts or reuses the project overseer session from an explicit `start`
37
+ section (scope/profile/instructions) in the `.ace/overseer/config.yml`
38
+ cascade. Canonical project-root resolution (subdirectory, symlink, and
39
+ worktree share one owner), Herdr-backed session identity
40
+ (`overseer-<project>` label) with reuse/conflict/dead-replacement
41
+ semantics, guide resolution through the handbook chain, and the packaged
42
+ project-overseer start guide (`wfi://overseer/start`).
43
+
44
+ ### Fixed
45
+
46
+ - Lab scope starts the lab's OWN overseer session (review 8xte508e): `lab_start`
47
+ previously created the `overseer-lab` space and only started project sessions,
48
+ so the lab-start guide reached no agent (`pane` stayed nil). The lab session
49
+ now boots or is reused in the lab space with the same identity rules as a
50
+ project session (label from the lab root, cwd at the lab root, live owner
51
+ reused, foreign owner refused, empty configured list still runs the lab
52
+ overseer).
53
+ - The lab starts each project in its OWN herdr space (review 8xte508b /
54
+ readiness F2): the lab space hosts only the lab overseer session; each
55
+ configured project gets a space titled by its session label
56
+ (`overseer-<project>`), created/reused by title and passed into the nested
57
+ start through an explicit workspace factory seam. Project sessions are
58
+ isolated from each other and from the lab overseer, never re-resolve the
59
+ caller's ambient workspace (a plain terminal without a herdr pane works),
60
+ and a live session found in another workspace is reused and reports that
61
+ workspace without leaving an empty space behind.
62
+ - Installed toolchain isolation for start instructions (readiness F4): the
63
+ `wfi://` guide resolution now selects the `ace-nav` executable through
64
+ `Ace::Support::Cli::Toolchain` — under `ACE_TOOLCHAIN=installed` the
65
+ installed gem launcher is always used, never the checkout's `bin/`
66
+ binstubs even when the project contains an executable ACE checkout; auto
67
+ mode is unchanged. An unavailable installed executable is a blocked
68
+ start, never a fallback to source.
69
+ - Lab-level failures keep their lab context (review 8xte508k): a raise
70
+ during lab start (e.g. herdr unavailable while resolving the lab space)
71
+ previously collapsed into the generic project-style blocked report with
72
+ `scope: nil`; `lab_start` now maps it to `status: blocked` with the lab
73
+ `scope`/`root`/`label` intact and a "lab start failed: …" message. A
74
+ herdr workspace entry that carries the title but no id is treated as the
75
+ space itself (reused by title) instead of falling through to
76
+ `workspace_create`, which would duplicate the `overseer-lab` space.
77
+ - `start` sends the first prompt after `herdr agent start` (review F3):
78
+ `agent start` success only means the interactive agent is ready for input, so
79
+ a session booted without a prompt sat idle (no state read, no `/eyes`
80
+ arming). `boot_session` now submits a first-turn prompt (the standing
81
+ instructions' "First turn after start" contract) right after the agent
82
+ starts; a reused session is never prompted again. The prompt is a separate
83
+ step from the boot (review 8xtiatf0): a delivery failure after a started
84
+ agent stays `started` with `prompt_failed: true` and a repairable warning —
85
+ a live idle agent is never reported as a failed start.
86
+ - herdr failures surface as blocked starts, never raw exceptions (reviews
87
+ 8xth38bw/8xtiatez): the project path's rescue now covers every
88
+ `Ace::Herdr::ExecutorError` (pane list, agent probe, session boot) with a
89
+ "herdr failed while preparing the overseer session: …" message, and the
90
+ lab-level rescue covers `CommandError` from workspace/pane calls with the
91
+ lab context intact ("lab start failed: …"). Dry-run probes no herdr state.
92
+ - Readiness requires a CONFIRMED first turn, and a failed delivery is
93
+ repaired on restart (re-review R7): the first-turn prompt is submitted
94
+ through herdr's activity gate (`agent prompt --wait` — new `wait:`/
95
+ `timeout_ms:` options on `HerdrExecutor#agent_prompt`), so success proves
96
+ observed working activity rather than a mere submission. A lab is `ready`
97
+ only when every session (lab overseer included) has its first turn
98
+ confirmed; an unconfirmed delivery keeps `prompt_failed: true` with a
99
+ visible reason instead of a ready declaration. On a repeated start, a live
100
+ reused agent is distinguished from a completed start through the existing
101
+ herdr session state: working/blocked = mid-conversation (never
102
+ interrupted); idle/done = the first-turn prompt is re-delivered through
103
+ the existing session, repairing missing initialization without restarting
104
+ anything; an unclassifiable state stays visibly unconfirmed.
105
+ - The lab space title is namespaced to `lab-overseer` (review 8xtiatf4): a
106
+ project rooted at a directory literally named `lab` owns the session/space
107
+ title `overseer-lab`; the old lab space title collided with it. Session
108
+ labels (`overseer-<root>`) are unchanged.
109
+ - Workspace ids dig with exactly ace-herdr's canonical keys
110
+ (`workspace_id`/`workspaceId`, review 8xtiatf2) — no broader key guessing.
111
+ - Auto-mode binstub use is again root-guarded (review 8xtiatf3): `start`
112
+ passes `prefer_project: !Process.uid.zero?` to the toolchain executable
113
+ resolver, so root never executes a project-owned `bin/` binstub (installed
114
+ mode ignores the flag).
115
+ - A project cascade declaring `scope: lab` is refused per-project (review
116
+ 8xthrjsm) — a nested lab start never recurses. The topology read rescue is
117
+ narrowed to `Ace::Lab::InvalidConfigurationError` (review 8xthrjsn) so
118
+ programming errors surface instead of becoming "topology could not be
119
+ read" blocks.
9
120
 
10
121
  ## [0.26.1] - 2026-10-25
11
122
 
data/docs/usage.md CHANGED
@@ -16,8 +16,9 @@ ace-docs:
16
16
 
17
17
  ## Command Surface
18
18
 
19
- Local work uses five primary commands (`projects` lists configured lab projects):
19
+ Local work uses six primary commands (`projects` lists configured lab projects):
20
20
 
21
+ - `ace-overseer start` - start or reuse the project overseer session from configuration.
21
22
  - `ace-overseer work-on` - prepare a worktree, assignment, and terminal.
22
23
  - `ace-overseer handoff` - hand the task worktree to the next role in the prepared sequence.
23
24
  - `ace-overseer process-reports` - interpret ace-hitl reports and continue the queue.
@@ -29,6 +30,189 @@ launcher are removed in L1 and are not normal paths. Status and prune read
29
30
  local assignment/task/worktree/Git state only; there is no journal, attempt or
30
31
  authority execution model. tmux and Herdr are transports, never state owners.
31
32
 
33
+ ## `ace-overseer start`
34
+
35
+ Start or reuse the PROJECT overseer session from the directory's own
36
+ configuration (task 8xs.t.pu0.1). The start contract is explicit — nothing is
37
+ guessed and no interim default model applies:
38
+
39
+ ```yaml
40
+ # .ace/overseer/config.yml (project tier of the cascade)
41
+ start:
42
+ scope: project # project | lab (lab: not implemented yet)
43
+ profile: overseer-default # reference into the profiles map below
44
+ instructions: wfi://overseer/start # handbook source (or absolute file path)
45
+ profiles:
46
+ overseer-default:
47
+ harness: pi
48
+ model: zai/glm-5.3-flash
49
+ thinking: high
50
+ ```
51
+
52
+ | Option | Purpose |
53
+ |--------|---------|
54
+ | `--dry-run` | Show the start plan; no session, no sync, no model call |
55
+ | `--format` | `table` (default) or `json` |
56
+
57
+ Behavior:
58
+
59
+ - The project root is canonical: a subdirectory, a symlinked checkout, and a
60
+ linked worktree of one repository resolve to the SAME owner, so one project
61
+ never runs two whole-project overseers.
62
+ - Session identity is Herdr's: the tab/pane label `overseer-<project>` on the
63
+ caller's herdr workspace. A live owner pane is REUSED (`status: reused`); a
64
+ live pane whose cwd resolves elsewhere is a conflict (`status: blocked`,
65
+ never taken over); a dead owner pane is replaced and the new identity is
66
+ reported (`replaced_pane`).
67
+ - The guide resolves through the normal handbook chain (`wfi://` sources via
68
+ the project's `ace-nav`; absolute paths verbatim) and boots the harness
69
+ agent as standing instructions with the configured profile. The `ace-nav`
70
+ binary follows the repo toolchain policy: auto mode prefers the project's
71
+ `bin/` binstub for a NON-ROOT caller and falls back to PATH, while
72
+ `ACE_TOOLCHAIN=installed`
73
+ always uses the installed gem launcher — a checkout inside the project is
74
+ data, never the runtime source. Because
75
+ `herdr agent start` success only means the interactive agent is ready for
76
+ input, the start submits a first-turn prompt right after the agent starts —
77
+ the session actually begins its first turn (state read, `/eyes` arming).
78
+ Delivery is confirmed through herdr's activity gate (`agent prompt
79
+ --wait`): success means observed working activity, so the turn began. A
80
+ delivery failure after a started agent never reports the start as failed:
81
+ the report stays `started` with `prompt_failed: true` and a repairable
82
+ warning. On a later start, a live reused agent ready for input gets the
83
+ first-turn prompt re-delivered through the same gate (repairing a missing
84
+ initialization without restarting anything); a working/blocked agent is
85
+ never interrupted, and an unclassifiable state stays visibly unconfirmed.
86
+ - The report carries `status` (`started|reused|blocked|dry_run`), `scope`,
87
+ `root`, `label`, `workspace`, `pane`, `agent`, `profile`, `instructions`
88
+ (`source` + resolved `path`) and a `message`. Exit 0 only for a ready
89
+ start/reuse (dry-run included); a blocked start is a CLI error naming the
90
+ missing configuration.
91
+ - The started overseer coordinates and delegates (guide:
92
+ `wfi://overseer/start`); it never substitutes for a missing coworker.
93
+
94
+ ### Lab scope (8xs.t.pu0.a)
95
+
96
+ `scope: lab` in the LAB coordination directory's own `.ace/overseer/config.yml`
97
+ starts the whole lab from one external entry point:
98
+
99
+ - The project list and CANONICAL locations come from the existing ace-lab
100
+ topology (`topology.projects` id/path, read internally — the public
101
+ projection keeps its no-paths allowlist; locations are never derived from
102
+ an id/label/repo name). The lab root is a coordination directory with its
103
+ own `_overseer`; a directory declaring itself as both lab and project is
104
+ refused, and a project whose own cascade declares `scope: lab` is refused
105
+ per-project (a nested lab start never recurses). An unreadable topology
106
+ (missing or unparseable `.ace/lab/config.yml`) is a blocked start with
107
+ the concrete cause.
108
+ - The lab creates/reuses its own herdr space (`lab-overseer` — namespaced
109
+ so it can never collide with a session/space title derived from a project
110
+ directory name, e.g. a project rooted at a directory named `lab` owns
111
+ `overseer-lab`) and boots or
112
+ reuses the lab's OWN overseer session there (label `overseer-<lab-root>`,
113
+ cwd at the lab root, the lab guide as standing instructions, first-turn
114
+ prompt included) — the lab-start instructions always reach a real agent,
115
+ and an empty configured project list still runs the lab overseer (idle).
116
+ - EACH project then starts or is found through the SAME operation as a
117
+ standalone start (its own cascade, root, and session identity) in its OWN
118
+ herdr space, titled by its session label (`overseer-<project>`) and
119
+ created/reused by title by the lab flow — project sessions are isolated
120
+ from each other and from the lab overseer, never share one space, and
121
+ never re-resolve the caller's ambient workspace (a plain terminal without
122
+ a herdr pane works). The per-project report carries its space id; a live
123
+ session found in another workspace is reused and reports that workspace
124
+ without creating an empty space. herdr spaces are flat (no parent/child
125
+ nesting): the lab context owns the per-project spaces by creating and
126
+ reusing them from this one start flow.
127
+ - Statuses: `ready` (all projects started/reused AND every first turn
128
+ confirmed delivered — the lab overseer's included; an empty configured
129
+ list is a valid idle lab once its own session is initialized), `partial`
130
+ (an unhealthy project — or a session whose first turn failed or stays
131
+ unconfirmed — is reported with its concrete reason while healthy projects
132
+ run — never false success), `blocked` (unreadable topology / conflicting
133
+ roles). A repeated start repairs only what is missing: healthy sessions
134
+ are reused, manual panes are never closed, nothing healthy is restarted,
135
+ and a reused session that is ready for input gets its first-turn prompt
136
+ re-delivered through herdr's activity gate (`agent prompt --wait`) to
137
+ confirm or repair initialization; a working/blocked agent is never
138
+ interrupted, and an unclassifiable one stays visibly unconfirmed.
139
+ - `--dry-run` lists the plan (space + per-project would_start) and creates
140
+ nothing. The report carries per-project results (`projects`), the count,
141
+ and the lab-level readiness; exit 0 for ready, non-zero for partial and
142
+ blocked. The lab guide (`wfi://overseer/lab-start`) binds the lab
143
+ overseer to cross-project coordination, delegation to project overseers,
144
+ and per-project escalation.
145
+
146
+ ## `ace-overseer observe`
147
+
148
+ Read-only standing observation the started overseer's eyes poll (task
149
+ 8xs.t.pu0.3). The projection merges the six local source classes, each read
150
+ from its state owner — never a second task/assignment state:
151
+
152
+ - HITL events (semantic revisions; reports/questions toward this owner),
153
+ - project tasks and private `_overseer` tasks (`ace-task`),
154
+ - worktrees (`ace-git-worktree`),
155
+ - coworker availability and assignment progress (`ace-coworker` probe over the
156
+ `ace-assign` inventory; live/stale judged by existing run identifiers —
157
+ commissioned assignment ids — never pane names).
158
+
159
+ Every row carries a stable `key` and a `revision` that changes only when the
160
+ owner's data changes: identical state projects identical revisions (healthy
161
+ silence consumes zero model turns), and a real change wakes the observer once.
162
+ A failing source degrades ONLY itself — it contributes a `source-health` row
163
+ whose revision is keyed by the failure class (an identical repeated failure
164
+ never re-wakes; a new failure mode wakes once) while the healthy sources keep
165
+ projecting. `sources` maps each source to `ok`/`degraded`. After a restart,
166
+ pending revisions reconcile before new work is chosen, so a report that
167
+ arrived during the overseer's absence is recognized exactly once.
168
+
169
+ ### Remote PR observation
170
+
171
+ Configure the observed pull requests in the same cascade (task 8xs.t.pu0.4)
172
+ — the project's own declarations, never a scan of every accessible account:
173
+
174
+ ```yaml
175
+ # .ace/overseer/config.yml
176
+ observe:
177
+ remote:
178
+ pull_requests:
179
+ - server: github-cs3b # configured git server (ace-git ServerRegistry)
180
+ number: 398
181
+ ```
182
+
183
+ Rows project through the EXISTING forge provider adapters (Forgejo and
184
+ GitHub — `Ace::Git::Providers.for`; no separate HTTP client, no webhook
185
+ service). Each configured PR contributes two rows: its lifecycle (`pr:` —
186
+ new HEAD via `head_sha`, merge, close, reopen, title/draft) and its activity
187
+ (`pr-activity:` — the sorted identity set of reviews and comments, so a new
188
+ review, formal approval or comment revises once while re-ordered payloads and
189
+ volatile counters never do). Row payloads carry the wake facts: forge, PR
190
+ number/title, event kind, author and link. Technical polling of identical
191
+ state projects identical revisions — zero model turns.
192
+
193
+ A failing forge (401/403, rate limit, timeout, malformed payload) degrades
194
+ only its source (`source-health` marker keyed by failure class: one wake per
195
+ failure mode, never an empty healthy list); retry/backoff stays inside the
196
+ provider adapters. After access returns, the changed state is recognized
197
+ through its normal revision. Remote data stays data: re-read the current
198
+ state and evidence before any merge decision. CI check changes are
199
+ information, never a merge gate.
200
+
201
+ ### Cold-cycle acceptance (8xs.t.pu0.e)
202
+
203
+ `wfi://overseer/cold-cycle-acceptance` binds the end-to-end acceptance of
204
+ the whole family: explicit preconditions (a fresh runtime from the
205
+ PUBLISHED set — a missing dependency is a readiness failure, never a
206
+ binstub fallback), the run's non-interference contract (the operator only
207
+ answers decisions/OTP), the ONE identity axis every acceptance record
208
+ captures (task → assignments/roles + auth leases → HITL case/suggestion/
209
+ decision/lesson → PR+HEAD → head-bound review/tests → publish versions+
210
+ digests → installed runtime paths + target-account result → record PR), the
211
+ mandatory negative flow (refuse one install step after publish: no done, no
212
+ record, correct escalation; resume the same cycle without re-publishing),
213
+ and re-run idempotence (a start after closure re-publishes, re-delegates
214
+ and re-applies nothing).
215
+
32
216
  ## `ace-overseer work-on`
33
217
 
34
218
  Create or reuse local worktrees and prepare one assignment.
@@ -0,0 +1,95 @@
1
+ ---
2
+ name: overseer-cold-cycle-acceptance
3
+ description: The repeatable cold-start full-cycle acceptance scenario — two projects, one delegated task, HITL with a Second Captain suggestion, independent review, merge, publish, install, record; negative install refusal and idempotent re-run
4
+ allowed-tools: Bash, Read
5
+ doc-type: workflow
6
+ title: Cold-Cycle Acceptance Scenario
7
+ purpose: Bind the end-to-end acceptance of the autonomous lab family (8xs.t.pu0): explicit preconditions, one identity axis for every handoff, the operator's non-interference contract, a negative install flow, and re-run idempotence — executed on the installed, published set only.
8
+ ace-docs:
9
+ last-updated: '2026-10-30'
10
+ last-checked: '2026-10-30'
11
+ ---
12
+ # Cold-Cycle Acceptance Scenario (8xs.t.pu0.e)
13
+
14
+ ## Goal
15
+
16
+ Prove that every handoff composes into ONE autonomous cycle on the
17
+ INSTALLED lab: a cold start with at least two configured projects, a task
18
+ carried by real delegation through spec/planning, worker execution, an HITL
19
+ question carrying a Second Captain suggestion, independent review, merge,
20
+ publication, installation, runtime acceptance under the target account, and
21
+ the integrated record. The operator presses START and answers ONLY the
22
+ decisions/OTP the Captain must give — no further prompts, no pasted
23
+ answers, no manual deploy.
24
+
25
+ ## Preconditions (explicit, NOT hidden autonomy)
26
+
27
+ - A fresh runtime from the PUBLISHED set: every component (core, wake
28
+ extension projection, all three auth plugins) comes from installed gems —
29
+ a missing dependency/runner/projection is a readiness FAILURE, never
30
+ permission to fall back to the checkout's binstubs (`ACE_TOOLCHAIN=installed`).
31
+ - `ace-lab install` converged the manifest (gem closure, exact versions,
32
+ extension projections); `ace-lab verify` passes under the target accounts.
33
+ - At least two configured projects (one carries the task; the other proves
34
+ isolation); accounts, keys and auth profiles prepared by install.
35
+
36
+ ## Run
37
+
38
+ 1. `ace-overseer start` in the lab directory (scope lab). Expect: lab space,
39
+ both project overseers started/reused, per-project statuses.
40
+ 2. State the goal with acceptance criteria to the lab overseer (one explicit
41
+ message). From here the operator only answers HITL.
42
+ 3. The overseer accepts the goal, delegates spec/planning through the
43
+ EXISTING roles, records the task, and drives dependencies to acceptance —
44
+ delegation is proved by role/assignment evidence, not by the overseer
45
+ doing the work.
46
+ 4. Worker executes with a developer lease (`ace-lab auth request → use →
47
+ revoke`); reviewer with a reviewer lease (identity DISTINCT from the
48
+ author); integrator with an integrator lease and the formal approver
49
+ account from the configured lane.
50
+ 5. The required HITL decision carries a marked Second Captain suggestion in
51
+ the SAME case BEFORE the Captain answers; only the human answer releases
52
+ the gated step (the suggestion never does). An OTP ask is `--secret`: the
53
+ value never appears in any wake, log, or argv.
54
+ 6. Merge only through the gate: HEAD-bound tests, HEAD-bound independent
55
+ review verdict, HEAD-bound formal approval by a different account; the
56
+ adapter's expected-head condition refuses drift.
57
+ 7. Publisher releases from the published queue (resume by version+digest);
58
+ install converges the runtime; runtime acceptance runs UNDER THE TARGET
59
+ ACCOUNT with the actually installed paths/versions.
60
+ 8. The record (`wfi://release/cycle-record`) integrates through a reviewed
61
+ record-only PR; the task closes only after acceptance AND record.
62
+
63
+ ## The one identity axis (the acceptance record)
64
+
65
+ Every handoff names the SAME verifiable chain — capture the real values, no
66
+ fabricated suffixes: task id → assignments/roles (worker/reviewer/integrator
67
+ + auth lease ids per role with principal/scope/use_until/expiry_mode) →
68
+ HITL case id (suggestion id, decision revision, lesson) → PR + merged HEAD →
69
+ review/tests evidence (heads, commands, results) → publish versions +
70
+ digests → installed runtime paths/versions + target-account result → record
71
+ PR. Producer → consumer at every step; command success alone proves
72
+ nothing.
73
+
74
+ ## Negative flow (mandatory)
75
+
76
+ After a successful publish, REFUSE one required install step (e.g. remove
77
+ one manifest dependency or the extension projection). Expect: no done, no
78
+ ready, no record; the blocked state names the concrete missing dependency
79
+ and the correct escalation addressee; healthy parts keep reporting. After
80
+ restoring the cause, resume THE SAME cycle without re-publishing (matching
81
+ version+digest = already published).
82
+
83
+ ## Re-run idempotence
84
+
85
+ After the cycle closes, run `ace-overseer start` again: no re-delegation, no
86
+ re-publication, no re-application of a closed decision; previously
87
+ started/reused sessions stay; the answer-only replay of an applied decision
88
+ is refused by the lifecycle.
89
+
90
+ ## Boundaries
91
+
92
+ - Tests and scenarios live with their existing owners (ace-lab,
93
+ ace-overseer); no separate test service.
94
+ - The scenario is repeatable: a second cold run produces the same evidence
95
+ shape with fresh identifiers.
@@ -0,0 +1,50 @@
1
+ ---
2
+ name: overseer-lab-start
3
+ description: Standing instructions for a started LAB overseer session (aggregate project readiness, escalate across projects, delegate to project overseers)
4
+ allowed-tools: Bash, Read
5
+ doc-type: workflow
6
+ title: Lab Overseer Start Guide
7
+ purpose: Define the lab overseer's coordination role across projects — readiness aggregation, cross-project escalation, delegation to project overseers — without taking over any project's tasks or private state.
8
+ ace-docs:
9
+ last-updated: '2026-10-30'
10
+ last-checked: '2026-10-30'
11
+ ---
12
+ # Lab Overseer Start Guide
13
+
14
+ ## Goal
15
+
16
+ You are the LAB overseer started by `ace-overseer start` with `scope: lab`
17
+ in the lab coordination directory. Your role is coordination ACROSS
18
+ projects: ensuring each configured project has a healthy overseer session,
19
+ aggregating their status and escalations, and routing the Captain's goals to
20
+ the right project. You never take over a project's tasks, worktrees, or
21
+ private `_overseer` state — those belong to each project's overseer.
22
+
23
+ ## First turn after start
24
+
25
+ 1. Read your own coordination tasks: `ace-task --in _overseer list`.
26
+ 2. Read per-project readiness from the start report and the state owners
27
+ (`ace-overseer status`); a project reported `blocked` is an escalation
28
+ with its concrete reason, never something to work around by starting a
29
+ duplicate session or doing the project's work yourself.
30
+ 3. Re-run `ace-overseer start` to repair missing pieces only — it reuses
31
+ healthy sessions and never restarts them or closes manual panes.
32
+
33
+ ## Delegation and escalation
34
+
35
+ - Route goals to a project by working through THAT project's overseer (its
36
+ session is labeled `overseer-<project-root>`); you do not dispatch its
37
+ coworkers directly.
38
+ - Cross-project blockers (shared forge access, missing host capability, a
39
+ project repeatedly failing) escalate to the Captain through `ace-hitl`
40
+ with the per-project evidence.
41
+ - One project's failure never blocks the healthy ones: keep their work
42
+ flowing and report the failure separately.
43
+
44
+ ## Boundaries
45
+
46
+ - The lab root is a coordination directory with its own `_overseer`; project
47
+ locations come from the lab topology (`ace-lab`), never from names.
48
+ - Idle is correct: when every project overseer is healthy and no cross-
49
+ project work exists, record that state and wait.
50
+ - Capabilities not yet delivered are reported as gaps, not simulated.
@@ -0,0 +1,79 @@
1
+ ---
2
+ name: overseer-start
3
+ description: Standing instructions for a started project overseer session (coordination, delegation, escalation, idle) loaded by ace-overseer start
4
+ allowed-tools: Bash, Read
5
+ doc-type: workflow
6
+ title: Project Overseer Start Guide
7
+ purpose: Define the started project overseer's role boundaries, observation and delegation loop, HITL escalation, and completion semantics; the overseer coordinates and never substitutes for a missing coworker.
8
+ ace-docs:
9
+ last-updated: '2026-10-30'
10
+ last-checked: '2026-10-30'
11
+ ---
12
+ # Project Overseer Start Guide
13
+
14
+ ## Goal
15
+
16
+ You are the project overseer started by `ace-overseer start` with this guide as
17
+ your standing instructions. Your role is COORDINATION: reading real state,
18
+ choosing the next action, delegating execution to coworkers, and escalating to
19
+ the Captain through HITL. You do not implement, review, or publish in place of
20
+ a missing coworker — you report the gap and escalate.
21
+
22
+ ## First turn after start
23
+
24
+ 1. Read your private task list: `ace-task --in _overseer list` (your
25
+ coordination tasks live there; you own them).
26
+ 2. Read project truth from the state owners — never a second cache:
27
+ `ace-task list`, `ace-overseer status`, `ace-git-worktree list`,
28
+ `git status --short`, and pending escalations with `ace-hitl list`.
29
+ 3. Continue EXISTING commissioned work before choosing anything new.
30
+ 4. When the lists are empty and no report awaits processing: record that state
31
+ and remain idle. Silence is a correct state; do not invent work.
32
+
33
+ ## Delegation
34
+
35
+ - Prepare work through the owners: task (`ace-task`), worktree
36
+ (`ace-git-worktree`), assignment (`ace-assign`), and the coworker roles
37
+ (`ace-coworker prepare`). Never hand-edit another owner's files.
38
+ - Delegate to the coworker roles with scope, context, completion criteria, and
39
+ the access the task grants. A missing coworker or missing permission is
40
+ REPORTED (and escalated when blocking) — never filled by doing the work
41
+ yourself.
42
+ - Merge gate: executed tests plus an independent reviewer verdict. CI is
43
+ advisory.
44
+
45
+ ## Escalation (HITL)
46
+
47
+ - Decisions outside your granted autonomy go to the Captain:
48
+ `ace-hitl create` with a precise question, then end your turn armed for the
49
+ wake. Blocking wait is an emergency path only.
50
+ - Answers return through the same case; apply them once and close the case.
51
+
52
+ ## Standing observation
53
+
54
+ After start, arm `/eyes` with the project's eyes configuration (interval 15s is
55
+ the default reconcile cadence). `ace-overseer observe` — what eyes polls —
56
+ projects the six local source classes from their owners: project tasks,
57
+ private `_overseer` tasks, worktrees, coworker availability (existing run
58
+ identifiers, never pane names), assignment progress and HITL events. A real
59
+ revision wakes you once; identical state stays silent; a degraded source is
60
+ visible data (`source-health` rows and the `sources` map), never an empty
61
+ healthy list. After a restart, reconcile pending revisions first — a report
62
+ that arrived in your absence surfaces as an unacknowledged revision — then
63
+ choose work by the existing plan/dependency order (`ace-overseer
64
+ process-reports`, `ace-overseer work-on`). Acknowledge (`/eyes ack KEY
65
+ REVISION`) only AFTER the proper task/assignment accepted the work: model
66
+ settlement alone is not proof of handling.
67
+
68
+ ## Boundaries
69
+
70
+ - One overseer per project: you own the session label you were started with.
71
+ Another start reuses you; you never spawn a second whole-project overseer.
72
+ - Access is limited to what the project configuration and the delegated task
73
+ grant. Credentials and OTP values never enter prompts, reports, or files.
74
+ - Remote PR observation (observe.remote.pull_requests) and the HITL reply
75
+ receiver (`ace-hitl reply CASE --stdin`) are delivered surfaces: watch the
76
+ configured remote sources through them and report what you actually see.
77
+ Capabilities genuinely not yet delivered (e.g. the Hermes transport
78
+ producer on the host) are explicitly not available in this slice; do not
79
+ simulate them. Missing capability is a reported gap, not a workaround.