ace-overseer 0.26.1 → 0.28.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: c0228801ebed27e7b1fca7fe8f580dc4fdc2a5a5be9e8d76d3c6cf59b1f8cf48
4
+ data.tar.gz: 2fae06ba1fc9174fc41f53f3ddcbcc1ee8dddd0152faaaa7e894a862d6f0e8c5
5
5
  SHA512:
6
- metadata.gz: 30b3626aaf30e4297b6000aa0f00cc32320fb0b0eedbb98c33e26f1f867a60690dfdc6b008bcc737b59b80e0c87b28c616450763ad8c3c7acad22809435aba54
7
- data.tar.gz: 397b3f3774a3e3f6d80aacf41bd8b2da542ee7597c08d48ce4d876d89b3dcd852f2a879fcead3f9ee511ea6ae2593ae596fc96ef7a622aa36ba77e5369205c2e
6
+ metadata.gz: 2ede68b20a4104eeb494014ca34a05627e8367aa5d1b6cf71cbd5f8fcfa0e4168e2029c3ca78be121e353e3e24a25bc0dd0c5ae153850b9797a7bff5bf504e6c
7
+ data.tar.gz: 611af27c6c2b7febc096cefeaff5545d8f3ce7fd1dd9e377932371359c850ec0e1f757476d9ffba937135f3ea021bd87f4c268007ab81b0e571c1723b48c4d88
data/CHANGELOG.md CHANGED
@@ -7,6 +7,144 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.28.0] - 2026-10-31
11
+
12
+ ### Fixed
13
+
14
+ - Delegate lab bootstrap to workers and independent verification; distinguish
15
+ preparation/printed briefs from running agents and confirmed first turns.
16
+ - Preserve installed operational runtime across project starts.
17
+ - Normalize local observation identities for the eyes wire contract.
18
+
19
+ ## [0.28.0.pre.3] - 2026-10-31
20
+
21
+ ### Fixed
22
+
23
+ - Child project bundles no longer inherit a forced Lab `ACE_TOOLCHAIN` mode;
24
+ project-selected path/source dependencies and explicit child policies remain
25
+ authoritative. The Lab role may perform routine project startup setup without
26
+ taking over project deliverables.
27
+ - `ace-overseer start` bootstraps missing start settings and becomes the Lab
28
+ coordinator in the current terminal without Herdr preflight. Explicit
29
+ `start --reconcile` manages project children after agent initialization. The coordinator can configure itself using the packaged guide.
30
+ - Lab and project workspaces use `overseer` and topology ids such as `ace`,
31
+ independently of session ownership labels. Project startup executes each
32
+ project's own Gemfile/lock and binstub in a separate process; project panes
33
+ use their own bundle instead of inheriting the Lab's gem runtime.
34
+
35
+ ## [0.27.0] - 2026-10-30
36
+
37
+ ### Fixed (review rounds 3/3b)
38
+
39
+ - Start hardening: herdr failures surface as blocked reports on project and
40
+ lab paths; the first prompt is a separate step (a prompt failure never
41
+ strands a started agent); installed toolchain resolution never falls back
42
+ to the checkout; the lab space is `lab-overseer` (no basename collision);
43
+ nested lab scopes are refused; malformed observe.remote entries degrade
44
+ to per-source health markers.
45
+
46
+ ### Added
47
+
48
+ - Remote PR observation (task 8xs.t.pu0.4): `observe.remote.pull_requests`
49
+ configuration projects configured PRs through the existing forge provider
50
+ adapters — lifecycle rows (new HEAD, merge/close/reopen) and activity rows
51
+ (review/approval/comment identity sets) with semantic revisions, wake
52
+ payloads (forge, number/title, event kind, author, link), and per-source
53
+ degradation on API failures with one wake per failure class.
54
+
55
+ - `ace-overseer observe` projects the six local source classes (task
56
+ 8xs.t.pu0.3): project and `_overseer` tasks, worktrees, coworker
57
+ availability and assignment progress alongside HITL events — every row
58
+ read from its state owner with stable key/revision semantics, per-source
59
+ health (`ok`/`degraded`), and degraded-source markers that wake once per
60
+ failure class while healthy sources keep projecting.
61
+
62
+ - `ace-overseer start [--dry-run] [--format table|json]` (task 8xs.t.pu0.1):
63
+ starts or reuses the project overseer session from an explicit `start`
64
+ section (scope/profile/instructions) in the `.ace/overseer/config.yml`
65
+ cascade. Canonical project-root resolution (subdirectory, symlink, and
66
+ worktree share one owner), Herdr-backed session identity
67
+ (`overseer-<project>` label) with reuse/conflict/dead-replacement
68
+ semantics, guide resolution through the handbook chain, and the packaged
69
+ project-overseer start guide (`wfi://overseer/start`).
70
+
71
+ ### Fixed
72
+
73
+ - Lab scope starts the lab's OWN overseer session (review 8xte508e): `lab_start`
74
+ previously created the `overseer-lab` space and only started project sessions,
75
+ so the lab-start guide reached no agent (`pane` stayed nil). The lab session
76
+ now boots or is reused in the lab space with the same identity rules as a
77
+ project session (label from the lab root, cwd at the lab root, live owner
78
+ reused, foreign owner refused, empty configured list still runs the lab
79
+ overseer).
80
+ - The lab starts each project in its OWN herdr space (review 8xte508b /
81
+ readiness F2): the lab space hosts only the lab overseer session; each
82
+ configured project gets a space titled by its session label
83
+ (`overseer-<project>`), created/reused by title and passed into the nested
84
+ start through an explicit workspace factory seam. Project sessions are
85
+ isolated from each other and from the lab overseer, never re-resolve the
86
+ caller's ambient workspace (a plain terminal without a herdr pane works),
87
+ and a live session found in another workspace is reused and reports that
88
+ workspace without leaving an empty space behind.
89
+ - Installed toolchain isolation for start instructions (readiness F4): the
90
+ `wfi://` guide resolution now selects the `ace-nav` executable through
91
+ `Ace::Support::Cli::Toolchain` — under `ACE_TOOLCHAIN=installed` the
92
+ installed gem launcher is always used, never the checkout's `bin/`
93
+ binstubs even when the project contains an executable ACE checkout; auto
94
+ mode is unchanged. An unavailable installed executable is a blocked
95
+ start, never a fallback to source.
96
+ - Lab-level failures keep their lab context (review 8xte508k): a raise
97
+ during lab start (e.g. herdr unavailable while resolving the lab space)
98
+ previously collapsed into the generic project-style blocked report with
99
+ `scope: nil`; `lab_start` now maps it to `status: blocked` with the lab
100
+ `scope`/`root`/`label` intact and a "lab start failed: …" message. A
101
+ herdr workspace entry that carries the title but no id is treated as the
102
+ space itself (reused by title) instead of falling through to
103
+ `workspace_create`, which would duplicate the `overseer-lab` space.
104
+ - `start` sends the first prompt after `herdr agent start` (review F3):
105
+ `agent start` success only means the interactive agent is ready for input, so
106
+ a session booted without a prompt sat idle (no state read, no `/eyes`
107
+ arming). `boot_session` now submits a first-turn prompt (the standing
108
+ instructions' "First turn after start" contract) right after the agent
109
+ starts; a reused session is never prompted again. The prompt is a separate
110
+ step from the boot (review 8xtiatf0): a delivery failure after a started
111
+ agent stays `started` with `prompt_failed: true` and a repairable warning —
112
+ a live idle agent is never reported as a failed start.
113
+ - herdr failures surface as blocked starts, never raw exceptions (reviews
114
+ 8xth38bw/8xtiatez): the project path's rescue now covers every
115
+ `Ace::Herdr::ExecutorError` (pane list, agent probe, session boot) with a
116
+ "herdr failed while preparing the overseer session: …" message, and the
117
+ lab-level rescue covers `CommandError` from workspace/pane calls with the
118
+ lab context intact ("lab start failed: …"). Dry-run probes no herdr state.
119
+ - Readiness requires a CONFIRMED first turn, and a failed delivery is
120
+ repaired on restart (re-review R7): the first-turn prompt is submitted
121
+ through herdr's activity gate (`agent prompt --wait` — new `wait:`/
122
+ `timeout_ms:` options on `HerdrExecutor#agent_prompt`), so success proves
123
+ observed working activity rather than a mere submission. A lab is `ready`
124
+ only when every session (lab overseer included) has its first turn
125
+ confirmed; an unconfirmed delivery keeps `prompt_failed: true` with a
126
+ visible reason instead of a ready declaration. On a repeated start, a live
127
+ reused agent is distinguished from a completed start through the existing
128
+ herdr session state: working/blocked = mid-conversation (never
129
+ interrupted); idle/done = the first-turn prompt is re-delivered through
130
+ the existing session, repairing missing initialization without restarting
131
+ anything; an unclassifiable state stays visibly unconfirmed.
132
+ - The lab space title is namespaced to `lab-overseer` (review 8xtiatf4): a
133
+ project rooted at a directory literally named `lab` owns the session/space
134
+ title `overseer-lab`; the old lab space title collided with it. Session
135
+ labels (`overseer-<root>`) are unchanged.
136
+ - Workspace ids dig with exactly ace-herdr's canonical keys
137
+ (`workspace_id`/`workspaceId`, review 8xtiatf2) — no broader key guessing.
138
+ - Auto-mode binstub use is again root-guarded (review 8xtiatf3): `start`
139
+ passes `prefer_project: !Process.uid.zero?` to the toolchain executable
140
+ resolver, so root never executes a project-owned `bin/` binstub (installed
141
+ mode ignores the flag).
142
+ - A project cascade declaring `scope: lab` is refused per-project (review
143
+ 8xthrjsm) — a nested lab start never recurses. The topology read rescue is
144
+ narrowed to `Ace::Lab::InvalidConfigurationError` (review 8xthrjsn) so
145
+ programming errors surface instead of becoming "topology could not be
146
+ read" blocks.
147
+
10
148
  ## [0.26.1] - 2026-10-25
11
149
 
12
150
  ### Changed
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,217 @@ 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
+ Run `ace-overseer start` at a shell in the Lab's existing Herdr `overseer`
36
+ space. The command becomes the Lab's Pi agent directly in that same terminal
37
+ and cwd, without any Herdr environment, agent, owner or layout preflight. The agent receives the packaged Lab guide
38
+ and a first-turn prompt to delegate configuration of commissioned projects
39
+ using installed CLI, skills and normal configuration editing.
40
+
41
+ No local start YAML is required for first run. The packaged bootstrap profile
42
+ is `pi`, `zai/glm-5.3-flash`, thinking `high`, in Lab scope. An explicit start
43
+ section overrides bootstrap and is validated without fallback. For an
44
+ explicit project start use:
45
+
46
+ ```yaml
47
+ # .ace/overseer/config.yml (project tier of the cascade)
48
+ start:
49
+ scope: project # project | lab
50
+ profile: overseer-default # reference into the profiles map below
51
+ instructions: wfi://overseer/start # handbook source (or absolute file path)
52
+ profiles:
53
+ overseer-default:
54
+ harness: pi
55
+ model: zai/glm-5.3-flash
56
+ thinking: high
57
+ ```
58
+
59
+ | Option | Purpose |
60
+ |--------|---------|
61
+ | `--dry-run` | Show the start plan; no session, no sync, no model call |
62
+ | `--format` | `table` (default) or `json` |
63
+ | `--reconcile` | Explicitly reconcile project children after the agent configures the Lab; never restart the coordinator |
64
+ | `--scope` | Explicit `lab` or `project` role; an unconfigured bare start bootstraps the Lab |
65
+
66
+ Behavior:
67
+
68
+ - The project root is canonical: a subdirectory, a symlinked checkout, and a
69
+ linked worktree of one repository resolve to the SAME owner, so one project
70
+ never runs two whole-project overseers.
71
+ - Session identity is Herdr's: the tab/pane label `overseer-<project>` on the
72
+ caller's herdr workspace. A live owner pane is REUSED (`status: reused`); a
73
+ live pane whose cwd resolves elsewhere is a conflict (`status: blocked`,
74
+ never taken over); a dead owner pane is replaced and the new identity is
75
+ reported (`replaced_pane`).
76
+ - The guide resolves through the normal handbook chain (`wfi://` sources via
77
+ the project's `ace-nav`; absolute paths verbatim) and boots the harness
78
+ agent as standing instructions with the configured profile. The `ace-nav`
79
+ binary follows the repo toolchain policy: auto mode prefers the project's
80
+ `bin/` binstub for a NON-ROOT caller and falls back to PATH, while
81
+ `ACE_TOOLCHAIN=installed`
82
+ always uses the installed gem launcher — a checkout inside the project is
83
+ data, never the runtime source. Because
84
+ `herdr agent start` success only means the interactive agent is ready for
85
+ input, the start submits a first-turn prompt right after the agent starts —
86
+ the session actually begins its first turn (state read, `/eyes` arming).
87
+ Delivery is confirmed through herdr's activity gate (`agent prompt
88
+ --wait`): success means observed working activity, so the turn began. A
89
+ delivery failure after a started agent never reports the start as failed:
90
+ the report stays `started` with `prompt_failed: true` and a repairable
91
+ warning. On a later start, a live reused agent ready for input gets the
92
+ first-turn prompt re-delivered through the same gate (repairing a missing
93
+ initialization without restarting anything); a working/blocked agent is
94
+ never interrupted, and an unclassifiable state stays visibly unconfirmed.
95
+ - The report carries `status` (`started|reused|blocked|dry_run`), `scope`,
96
+ `root`, `label`, `workspace`, `pane`, `agent`, `profile`, `instructions`
97
+ (`source` + resolved `path`) and a `message`. Exit 0 only for a ready
98
+ start/reuse (dry-run included); a blocked start is a CLI error naming the concrete invalid configuration
99
+ or unavailable capability.
100
+ - The started overseer coordinates and delegates (guide:
101
+ `wfi://overseer/start`); it never substitutes for a missing coworker.
102
+
103
+ ### Project-local bundles
104
+
105
+ In auto mode each project owns its Gemfile/lock and binstubs. Child starts
106
+ clear parent Bundler/Ruby injection and select the project's bundle.
107
+
108
+ Explicit `ACE_TOOLCHAIN=installed` is preserved instead: the installed
109
+ Toolchain launcher and gem closure start the child without reading its
110
+ Gemfile or executing its binstub. Missing installed dependencies fail visibly;
111
+ there is no fallback to checkout code. Terminal backend selection does not
112
+ change toolchain mode.
113
+
114
+ The lab overseer delegates bundle/configuration preparation to a lab worker;
115
+ it never edits the project's binstub or installs gems itself. Follow
116
+ `wfi://overseer/bootstrap-delegation` for the task, worker, independent
117
+ verification and observed completion cycle. `ace-coworker start` prints a
118
+ brief; a separate Herdr agent launch and first prompt are required.
119
+
120
+ ### Lab scope (8xs.t.pu0.a)
121
+
122
+ `scope: lab` in the LAB coordination directory's own `.ace/overseer/config.yml`
123
+ selects the Lab role. Bare `start` launches the foreground harness;
124
+ `start --reconcile` is the explicit tool the agent uses after configuring its
125
+ projects. Reconciliation manages project children without restarting or probing
126
+ the Lab coordinator. The older full orchestration operation remains available
127
+ explicitly through `start --scope lab`:
128
+
129
+
130
+ - The project list and CANONICAL locations come from the existing ace-lab
131
+ topology (`topology.projects` id/path, read internally — the public
132
+ projection keeps its no-paths allowlist; locations are never derived from
133
+ an id/label/repo name). The lab root is a coordination directory with its
134
+ own `_overseer`; a directory declaring itself as both lab and project is
135
+ refused, and a project whose own cascade declares `scope: lab` is refused
136
+ per-project (a nested lab start never recurses). An unreadable topology
137
+ (missing or unparseable `.ace/lab/config.yml`) is a blocked start with
138
+ the concrete cause.
139
+ - The lab creates/reuses its own herdr space (`overseer`, reserved for the Lab) and boots or
140
+ reuses the lab's OWN overseer session there (label `overseer-<lab-root>`,
141
+ cwd at the lab root, the lab guide as standing instructions, first-turn
142
+ prompt included) — the lab-start instructions always reach a real agent,
143
+ and an empty configured project list still runs the lab overseer (idle).
144
+ - EACH project then starts or is found through its own bundle and the SAME operation as a
145
+ standalone start (its own cascade, root, and session identity) in its OWN
146
+ herdr space, titled by its topology id (for example `ace`) and
147
+ created/reused by title by the lab flow — project sessions are isolated
148
+ from each other and from the lab overseer, never share one space, and
149
+ never re-resolve the caller's ambient workspace (a plain terminal without
150
+ a herdr pane works). The per-project report carries its space id; a live
151
+ session found in another workspace is reused and reports that workspace
152
+ without creating an empty space. herdr spaces are flat (no parent/child
153
+ nesting): the lab context owns the per-project spaces by creating and
154
+ reusing them from this one start flow.
155
+ - Statuses: `ready` (all projects started/reused AND every first turn
156
+ confirmed delivered — the lab overseer's included; an empty configured
157
+ list is a valid idle lab once its own session is initialized), `partial`
158
+ (an unhealthy project — or a session whose first turn failed or stays
159
+ unconfirmed — is reported with its concrete reason while healthy projects
160
+ run — never false success), `blocked` (unreadable topology / conflicting
161
+ roles). A repeated start repairs only what is missing: healthy sessions
162
+ are reused, manual panes are never closed, nothing healthy is restarted,
163
+ and a reused session that is ready for input gets its first-turn prompt
164
+ re-delivered through herdr's activity gate (`agent prompt --wait`) to
165
+ confirm or repair initialization; a working/blocked agent is never
166
+ interrupted, and an unclassifiable one stays visibly unconfirmed.
167
+ - `--dry-run` lists the plan (space + per-project would_start) and creates
168
+ nothing. The report carries per-project results (`projects`), the count,
169
+ and the lab-level readiness; exit 0 for ready, non-zero for partial and
170
+ blocked. The lab guide (`wfi://overseer/lab-start`) binds the lab
171
+ overseer to cross-project coordination, delegation to project overseers,
172
+ and per-project escalation.
173
+
174
+ ## `ace-overseer observe`
175
+
176
+ Read-only standing observation the started overseer's eyes poll (task
177
+ 8xs.t.pu0.3). The projection merges the six local source classes, each read
178
+ from its state owner — never a second task/assignment state:
179
+
180
+ - HITL events (semantic revisions; reports/questions toward this owner),
181
+ - project tasks and private `_overseer` tasks (`ace-task`),
182
+ - worktrees (`ace-git-worktree`),
183
+ - coworker availability and assignment progress (`ace-coworker` probe over the
184
+ `ace-assign` inventory; live/stale judged by existing run identifiers —
185
+ commissioned assignment ids — never pane names).
186
+
187
+ Every row carries a stable `key` and a `revision` that changes only when the
188
+ owner's data changes: identical state projects identical revisions (healthy
189
+ silence consumes zero model turns), and a real change wakes the observer once.
190
+ A failing source degrades ONLY itself — it contributes a `source-health` row
191
+ whose revision is keyed by the failure class (an identical repeated failure
192
+ never re-wakes; a new failure mode wakes once) while the healthy sources keep
193
+ projecting. `sources` maps each source to `ok`/`degraded`. After a restart,
194
+ pending revisions reconcile before new work is chosen, so a report that
195
+ arrived during the overseer's absence is recognized exactly once.
196
+
197
+ ### Remote PR observation
198
+
199
+ Configure the observed pull requests in the same cascade (task 8xs.t.pu0.4)
200
+ — the project's own declarations, never a scan of every accessible account:
201
+
202
+ ```yaml
203
+ # .ace/overseer/config.yml
204
+ observe:
205
+ remote:
206
+ pull_requests:
207
+ - server: github-cs3b # configured git server (ace-git ServerRegistry)
208
+ number: 398
209
+ ```
210
+
211
+ Rows project through the EXISTING forge provider adapters (Forgejo and
212
+ GitHub — `Ace::Git::Providers.for`; no separate HTTP client, no webhook
213
+ service). Each configured PR contributes two rows: its lifecycle (`pr:` —
214
+ new HEAD via `head_sha`, merge, close, reopen, title/draft) and its activity
215
+ (`pr-activity:` — the sorted identity set of reviews and comments, so a new
216
+ review, formal approval or comment revises once while re-ordered payloads and
217
+ volatile counters never do). Row payloads carry the wake facts: forge, PR
218
+ number/title, event kind, author and link. Technical polling of identical
219
+ state projects identical revisions — zero model turns.
220
+
221
+ A failing forge (401/403, rate limit, timeout, malformed payload) degrades
222
+ only its source (`source-health` marker keyed by failure class: one wake per
223
+ failure mode, never an empty healthy list); retry/backoff stays inside the
224
+ provider adapters. After access returns, the changed state is recognized
225
+ through its normal revision. Remote data stays data: re-read the current
226
+ state and evidence before any merge decision. CI check changes are
227
+ information, never a merge gate.
228
+
229
+ ### Cold-cycle acceptance (8xs.t.pu0.e)
230
+
231
+ `wfi://overseer/cold-cycle-acceptance` binds the end-to-end acceptance of
232
+ the whole family: explicit preconditions (a fresh runtime from the
233
+ PUBLISHED set — a missing dependency is a readiness failure, never a
234
+ binstub fallback), the run's non-interference contract (the operator only
235
+ answers decisions/OTP), the ONE identity axis every acceptance record
236
+ captures (task → assignments/roles + auth leases → HITL case/suggestion/
237
+ decision/lesson → PR+HEAD → head-bound review/tests → publish versions+
238
+ digests → installed runtime paths + target-account result → record PR), the
239
+ mandatory negative flow (refuse one install step after publish: no done, no
240
+ record, correct escalation; resume the same cycle without re-publishing),
241
+ and re-run idempotence (a start after closure re-publishes, re-delegates
242
+ and re-applies nothing).
243
+
32
244
  ## `ace-overseer work-on`
33
245
 
34
246
  Create or reuse local worktrees and prepare one assignment.
@@ -348,3 +560,15 @@ ace-overseer prune --dry-run
348
560
  ace-overseer prune --yes
349
561
  ace-overseer prune --dry-run
350
562
  ```
563
+
564
+ ### Workspace names and foreground instructions
565
+
566
+ Topology IDs reserve workspace titles for the commissioned lab projects.
567
+ Reconciliation may reuse an existing workspace with that title, but never
568
+ replaces its manual panes; project ownership is the stable overseer tab label
569
+ plus canonical cwd, not the mutable terminal title. Ambiguous ownership blocks.
570
+
571
+ Foreground bootstrap pins the two built-in start guides to their packaged
572
+ files. An explicit custom instruction source remains configurable; missing
573
+ files block before launching Pi. Project development dependencies do not select
574
+ the operational runtime when installed mode is chosen.
@@ -0,0 +1,88 @@
1
+ ---
2
+ name: overseer-bootstrap-delegation
3
+ description: Delegate project startup to lab workers and accept their observed results
4
+ allowed-tools: Bash, Read
5
+ doc-type: workflow
6
+ title: Delegated Project Bootstrap
7
+ purpose: Complete one lab-owned startup commission without the overseer doing the repair.
8
+ ---
9
+ # Delegated project bootstrap
10
+
11
+ ## Commission and ownership
12
+
13
+ Read existing tasks and assignments first. Reuse the open commission for the
14
+ same project and goal; unknown execution state never means free capacity.
15
+ Create one lab coordination task in `_overseer`, with three direct children:
16
+ prepare, independently verify, confirm start. The latter two depend on their
17
+ predecessor. Only the lab overseer updates this private tree.
18
+
19
+ Create a separate executable lab task through `ace-task` for the bootstrap
20
+ work, linking it as the manager's `project_task`. Keep its specification in
21
+ its task folder. Include the canonical target repository path, required
22
+ configuration, allowed changes, runtime mode, acceptance checks and report
23
+ recipient. This is lab infrastructure work, not a project product task.
24
+ Workers must not edit the private coordination tree.
25
+
26
+ Explicit `ACE_TOOLCHAIN=installed` remains installed in every subprocess,
27
+ worker and resumed session. The project checkout is domain data. Never modify
28
+ tracked binstubs to bypass this selection. In auto mode retain the project's
29
+ own dependency model. If package code is defective, commission its repair;
30
+ do not patch installed gems. Preserve unrelated changes.
31
+
32
+ ## Arm eyes before dispatch
33
+
34
+ Use the lab's existing eyes JSON configuration. The `ace_eyes` tool accepts
35
+ `{"action":"start","configPath":"<absolute eyes JSON path>"}`.
36
+ Inspect the returned state: enabled=true, breaker=null, errors=0 and at least
37
+ one observation. Read pending revisions from their original owners, reconcile
38
+ existing commissions, and ack each exact key/revision only after acceptance.
39
+ A missing extension, invalid configuration or degraded source blocks dispatch;
40
+ report that capability gap. Do not claim that mentioning `/eyes` armed it.
41
+
42
+ ## Prepare and actually launch a worker
43
+
44
+ Use `ace-coworker prepare --task <executable-task> --roles bootstrap-worker,bootstrap-verifier
45
+ --to <configured-overseer-address> --format json`. Read its returned worktree,
46
+ assignment IDs and start-config paths; record these on the matching private
47
+ steps before launch. A preparation readiness report is not worker completion.
48
+ The task must be present in the execution worktree before any agent starts.
49
+
50
+ `ace-coworker start --config <returned-path>` validates and prints a brief;
51
+ it does NOT launch an agent. Use the configured Herdr provider/profile to
52
+ start a separate worker agent in the returned worktree, load the returned
53
+ role instructions, and send its first prompt. The prompt commissions only
54
+ that task and pinned assignment, requires the worker to read its start brief,
55
+ drive that assignment, and finish with `ace-coworker report`. These operational roles explicitly allow the commissioned canonical target
56
+ outside the lab task worktree; ordinary product worker/reviewer roles do not.
57
+ Use CLI help for
58
+ Herdr's current arguments. Record the returned pane/agent identity and verify
59
+ first-turn delivery. Never replace a missing executor with your own work.
60
+
61
+ End the overseer's turn immediately after dispatch. The eyes timer observes
62
+ assignment and HITL revisions without invoking the model on unchanged state.
63
+
64
+ ## Receive, verify, start
65
+
66
+ On wake, read the original report and current assignment. Require matching
67
+ report ID, task, assignment and role; a preparation report, process exit or
68
+ unmatched message is not success. Use `ace-overseer process-reports --dry-run`
69
+ to inspect the matching and continuation before applying it. Only accept
70
+ worker success with a completed non-empty assignment and the promised evidence.
71
+ Record receipt through task APIs before acknowledging the eyes revision.
72
+
73
+ Use the existing role handoff gate to prepare the independent reviewer after
74
+ worker completion. As with the worker, a printed start command is not a live
75
+ agent: launch the reviewer separately with its own returned role/config and
76
+ confirm first-turn delivery. Do not launch a second executor while an earlier
77
+ one is active or its state is unknown. On repeated delivery, reconcile existing
78
+ assignments and agents instead of dispatching again.
79
+
80
+ After accepted independent verification, the overseer performs its coordination
81
+ operation `ace-overseer start --reconcile`. Confirm the target's session, first
82
+ turn and active eyes from actual session evidence. A ready process alone is
83
+ not initialized observation. Close the confirmation step and managing task
84
+ only with these proofs; the worker report alone cannot close the family.
85
+
86
+ On error, keep the step open and route repair to the worker. Missing authority
87
+ or an actual Captain decision becomes a precise HITL question; end the turn
88
+ armed for its answer. Never self-repair or use sleep-poll while waiting.
@@ -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.