ace-overseer 0.28.1 → 0.29.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.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +6 -0
  3. data/README.md +2 -2
  4. data/docs/getting-started.md +1 -1
  5. data/docs/usage.md +47 -25
  6. data/handbook/workflow-instructions/overseer/bootstrap-delegation.wf.md +224 -37
  7. data/handbook/workflow-instructions/overseer/lab-start.wf.md +49 -21
  8. data/handbook/workflow-instructions/overseer/queue.wf.md +13 -8
  9. data/handbook/workflow-instructions/overseer/start.wf.md +198 -21
  10. data/lib/ace/overseer/atoms/observation_sources.rb +17 -0
  11. data/lib/ace/overseer/atoms/start_contract.rb +20 -0
  12. data/lib/ace/overseer/cli/commands/handoff.rb +4 -0
  13. data/lib/ace/overseer/cli/commands/process_reports.rb +4 -2
  14. data/lib/ace/overseer/cli/commands/start.rb +37 -5
  15. data/lib/ace/overseer/cli/commands/work_on.rb +6 -2
  16. data/lib/ace/overseer/cli.rb +2 -0
  17. data/lib/ace/overseer/molecules/coworker_launcher.rb +189 -0
  18. data/lib/ace/overseer/molecules/event_observation.rb +54 -19
  19. data/lib/ace/overseer/molecules/eyes_evidence.rb +103 -0
  20. data/lib/ace/overseer/molecules/eyes_readiness.rb +21 -0
  21. data/lib/ace/overseer/molecules/eyes_session_evidence.rb +132 -0
  22. data/lib/ace/overseer/molecules/hitl_inbox.rb +13 -5
  23. data/lib/ace/overseer/molecules/local_sources.rb +83 -19
  24. data/lib/ace/overseer/molecules/project_bundle.rb +1 -1
  25. data/lib/ace/overseer/molecules/project_observations.rb +82 -0
  26. data/lib/ace/overseer/molecules/project_sessions.rb +99 -0
  27. data/lib/ace/overseer/molecules/remote_sources.rb +46 -16
  28. data/lib/ace/overseer/molecules/session_environment.rb +126 -0
  29. data/lib/ace/overseer/organisms/handoff_orchestrator.rb +26 -15
  30. data/lib/ace/overseer/organisms/report_processor.rb +42 -10
  31. data/lib/ace/overseer/organisms/start_orchestrator.rb +105 -55
  32. data/lib/ace/overseer/organisms/work_on_orchestrator.rb +43 -1
  33. data/lib/ace/overseer/version.rb +1 -1
  34. data/lib/ace/overseer.rb +2 -1
  35. metadata +64 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4d96c79ae10f470e6358022f081234f5080eba56cd58353471a33aa6f187e0c5
4
- data.tar.gz: 5e4eadc41222d3448b57f938ad5c2716b1941ddfe7b800479d69a6a3f72f3cb9
3
+ metadata.gz: 63ca7632088fe02d6d6b6ada4d2e57f18698438aee83c85cefa20fdb08e88715
4
+ data.tar.gz: 47a0f865c3b88d3f62e2dea93987f2b55e23d519516486fc46c91789e95736c2
5
5
  SHA512:
6
- metadata.gz: f9fdda6024283fd16b8be35da318b7e4eb6a85574ef623cc1395c4c7af0d77fc1971a541bb2a28abe3a6ce7a6d52f1c04df442c69eaff53e09f7d3974b6b89e3
7
- data.tar.gz: 4fe70abfe425a0c399763c790125f391bbca8099f5a96e4a24677047148fc4b7e1c578ae976853195a28f1e5306500e259de498a491601e241e1c82e1b514c91
6
+ metadata.gz: 40c524665ec8df3ca2574f9790ad6e1752e0a4c1ebd82e7fe43c5fbb97aef58faa10f5a0fe836ea3eb6834ec178f6e88dbd1c4ac8dd27663ae927bce1a8df5cf
7
+ data.tar.gz: 32e253694e889a23e2e838e9a0426e639aa6869aaba94b56be4f245aa15f4f42ca5621efc35a07a715735cdd9290caa5866b7419a3cfd88505ece8aad5ffb0ef
data/CHANGELOG.md CHANGED
@@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.29.0] - 2026-11-10
11
+
12
+ ### Added
13
+
14
+ - Start real workers from work-on/handoff, persist native executor identities on existing commissions, and require active observation before delegation. Accept reports before retirement and continuation through worker, reviewer and integrator roles; refuse duplicate or uncertain starts. Build explicit installed environments, select per-project observation credentials, and observe issue bodies/labels plus project sessions. Verify first-turn/eyes evidence on Linux and macOS; delegate configuration and diagnosis in packaged instructions.
15
+
10
16
  ## [0.28.1] - 2026-10-31
11
17
 
12
18
  ### Fixed
data/README.md CHANGED
@@ -16,7 +16,7 @@
16
16
 
17
17
  > **State owner:** the private, gitignored overseer task list in
18
18
  > `.ace-tasks/_overseer/`, a normal task folder reached through
19
- > `ace-task --in _overseer …` (see [docs/lab-flow.md](../docs/lab-flow.md)).
19
+ > `ace-task list --in _overseer` (see [docs/lab-flow.md](../docs/lab-flow.md)).
20
20
  > Task worktrees live in `.ace-wt/`; assignment plans and steps stay in
21
21
  > `.ace-local/assign/` (ace-assign) and are never copied into the overseer
22
22
  > list.
@@ -80,7 +80,7 @@ or create your own.
80
80
  > assignment sequence -- not available yet.
81
81
  >
82
82
  > **L6 (partial):** the private overseer queue is coordinated through the
83
- > gitignored `.ace-tasks/_overseer/` list (`ace-task --in _overseer`):
83
+ > gitignored `.ace-tasks/_overseer/` list (`ace-task list --in _overseer`):
84
84
  > managing tasks with lifecycle subtasks (prepare, implement, review,
85
85
  > integrate), integration-gated dependencies, and one active executor per
86
86
  > worktree. See the
@@ -10,7 +10,7 @@ ace-docs:
10
10
  # Getting Started with ace-overseer
11
11
 
12
12
  > **State owner:** `.ace-tasks/_overseer/` (private, gitignored task folder
13
- > reached via `ace-task --in _overseer`) and `.ace-wt/` (one worktree per
13
+ > reached via `ace-task list --in _overseer`) and `.ace-wt/` (one worktree per
14
14
  > project task). Assignment plans stay in `.ace-local/assign/`. See
15
15
  > [docs/lab-flow.md](../../docs/lab-flow.md).
16
16
 
data/docs/usage.md CHANGED
@@ -10,7 +10,7 @@ ace-docs:
10
10
  # Usage
11
11
 
12
12
  > **State owner:** `.ace-tasks/_overseer/` (private, gitignored task folder
13
- > reached via `ace-task --in _overseer`) and `.ace-wt/` (one worktree per
13
+ > reached via `ace-task list --in _overseer`) and `.ace-wt/` (one worktree per
14
14
  > project task). Assignment plans live in `.ace-local/assign/` and are not
15
15
  > copied here. See [docs/lab-flow.md](../../docs/lab-flow.md).
16
16
 
@@ -84,14 +84,16 @@ Behavior:
84
84
  `herdr agent start` success only means the interactive agent is ready for
85
85
  input, the start submits a first-turn prompt right after the agent starts —
86
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.
87
+ Herdr's activity gate (`agent prompt --wait`) only confirms working
88
+ activity. Readiness also requires the completed first turn and fresh,
89
+ healthy eyes evidence tied to the current live Pi process and session. A
90
+ delivery failure after a started agent does not remove that agent:
91
+ the report stays `started` with `prompt_failed: true` and an uncertain
92
+ delivery warning. A later start never re-sends the prompt solely because a
93
+ reused agent is idle or done: either state can follow a delivered prompt.
94
+ A healthy reused session can become ready once its current observation is
95
+ verified; a blocked agent is never interrupted. Process identity evidence
96
+ currently supports Linux only; other systems remain unconfirmed.
95
97
  - The report carries `status` (`started|reused|blocked|dry_run`), `scope`,
96
98
  `root`, `label`, `workspace`, `pane`, `agent`, `profile`, `instructions`
97
99
  (`source` + resolved `path`) and a `message`. Exit 0 only for a ready
@@ -153,17 +155,14 @@ explicitly through `start --scope lab`:
153
155
  nesting): the lab context owns the per-project spaces by creating and
154
156
  reusing them from this one start flow.
155
157
  - Statuses: `ready` (all projects started/reused AND every first turn
156
- confirmed delivered — the lab overseer's included; an empty configured
158
+ completed with live, healthy eyes — the lab overseer's included; an empty configured
157
159
  list is a valid idle lab once its own session is initialized), `partial`
158
160
  (an unhealthy project — or a session whose first turn failed or stays
159
161
  unconfirmed — is reported with its concrete reason while healthy projects
160
162
  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.
163
+ roles). Repeated start reuses live sessions and never closes manual panes.
164
+ A reused session remains unconfirmed without trustworthy first-turn and
165
+ current-process observation evidence. No first prompt is re-sent automatically.
167
166
  - `--dry-run` lists the plan (space + per-project would_start) and creates
168
167
  nothing. The report carries per-project results (`projects`), the count,
169
168
  and the lab-level readiness; exit 0 for ready, non-zero for partial and
@@ -174,7 +173,7 @@ explicitly through `start --scope lab`:
174
173
  ## `ace-overseer observe`
175
174
 
176
175
  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
176
+ 8xs.t.pu0.3). The projection merges local source classes, each read
178
177
  from its state owner — never a second task/assignment state:
179
178
 
180
179
  - HITL events (semantic revisions; reports/questions toward this owner),
@@ -182,7 +181,10 @@ from its state owner — never a second task/assignment state:
182
181
  - worktrees (`ace-git-worktree`),
183
182
  - coworker availability and assignment progress (`ace-coworker` probe over the
184
183
  `ace-assign` inventory; live/stale judged by existing run identifiers —
185
- commissioned assignment ids — never pane names).
184
+ commissioned assignment ids — never pane names),
185
+ - configured project Overseer session states from `ace-lab` project locations
186
+ and Herdr. Session activity is a wake signal, not proof that project eyes
187
+ are armed; inspect the session for that evidence.
186
188
 
187
189
  Every row carries a stable `key` and a `revision` that changes only when the
188
190
  owner's data changes: identical state projects identical revisions (healthy
@@ -190,11 +192,13 @@ silence consumes zero model turns), and a real change wakes the observer once.
190
192
  A failing source degrades ONLY itself — it contributes a `source-health` row
191
193
  whose revision is keyed by the failure class (an identical repeated failure
192
194
  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,
195
+ projecting. Recovery revises the same row to `ok` and wakes the observer
196
+ even if the work is unchanged. `sources` maps each source to
197
+ `ok`/`degraded`. After a restart,
194
198
  pending revisions reconcile before new work is chosen, so a report that
195
199
  arrived during the overseer's absence is recognized exactly once.
196
200
 
197
- ### Remote PR observation
201
+ ### Remote issue and PR observation
198
202
 
199
203
  Configure the observed pull requests in the same cascade (task 8xs.t.pu0.4)
200
204
  — the project's own declarations, never a scan of every accessible account:
@@ -203,11 +207,25 @@ Configure the observed pull requests in the same cascade (task 8xs.t.pu0.4)
203
207
  # .ace/overseer/config.yml
204
208
  observe:
205
209
  remote:
210
+ issues:
211
+ - server: forgejo-lab # the configured project repository
206
212
  pull_requests:
207
213
  - server: github-cs3b # configured git server (ace-git ServerRegistry)
208
214
  number: 398
209
215
  ```
210
216
 
217
+ Each configured issue source observes the selected repository's open issues
218
+ as one collection. New, changed and closed issues change its semantic
219
+ revision, while reordered identical results do not. Read the current issue
220
+ before acting. The revision covers issue identity, title, state, author, URL
221
+ and available labels; issue comments are not observed by this source. A
222
+ listing with more than 500 open issues, an unsupported
223
+ provider, or an authentication failure degrades the source visibly rather
224
+ than treating a partial or unavailable list as complete. Session credentials
225
+ must be available to the observation command for the duration of observation.
226
+ Currently the Forgejo provider implements issue listing; GitHub does not.
227
+ The Forgejo listing does not currently expose labels to this observation.
228
+
211
229
  Rows project through the EXISTING forge provider adapters (Forgejo and
212
230
  GitHub — `Ace::Git::Providers.for`; no separate HTTP client, no webhook
213
231
  service). Each configured PR contributes two rows: its lifecycle (`pr:` —
@@ -221,8 +239,8 @@ state projects identical revisions — zero model turns.
221
239
  A failing forge (401/403, rate limit, timeout, malformed payload) degrades
222
240
  only its source (`source-health` marker keyed by failure class: one wake per
223
241
  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
242
+ provider adapters. After access returns, the source health revision wakes
243
+ the observer. Remote data stays data: re-read the current
226
244
  state and evidence before any merge decision. CI check changes are
227
245
  information, never a merge gate.
228
246
 
@@ -348,9 +366,13 @@ Matching and outcome rules (enforced mechanically):
348
366
  it `done`, then continues with the next unblocked step (same
349
367
  `DependencyReadiness` gate as `work-on`): `ace-overseer handoff` for the
350
368
  next role when the family records a worktree, otherwise the `work-on`
351
- gate. A refused continuation is reported as blocked with reasons. The
352
- handoff outcome carries the actionable start command (the same one the
353
- Handoff CLI prints); the window is ensured, the agent runs the command.
369
+ gate in local terminal mode. A refused continuation is reported as blocked
370
+ with reasons. Local handoff ensures the window and returns the start command.
371
+ With the Herdr backend, work-on and handoff start the actual executor with
372
+ an explicit environment and record its identity on the coworker commission.
373
+ Accepted reports retire that executor before continuation. A completed role
374
+ sequence does not close pending coordination steps. No authorization daemon
375
+ or isolated operating-system session is required.
354
376
  - A repeated delivery of an already-processed report is `duplicate`: the
355
377
  recorded result and existing allocation answer it; nothing re-runs
356
378
  (delivery repetition is never work repetition). A duplicate whose
@@ -8,6 +8,12 @@ purpose: Complete one lab-owned startup commission without the overseer doing th
8
8
  ---
9
9
  # Delegated project bootstrap
10
10
 
11
+ If tool output truncates any instruction, reload this workflow with
12
+ `wfi://overseer/bootstrap-delegation --output cache --compressor off` and read
13
+ the returned file before proceeding. In installed mode run `ace-bundle`; in
14
+ an ACE source checkout in auto mode use its `bin/ace-bundle`. Never infer a
15
+ missing deadline or command.
16
+
11
17
  ## Commission and ownership
12
18
 
13
19
  The overseer reads owner state and public CLI contracts to establish scope,
@@ -17,6 +23,9 @@ Record the known failure and desired outcome in the commission; discovering
17
23
  the root cause is part of the assigned work, never a prerequisite for dispatch.
18
24
  Use existing readiness state, or a startup dry run only when that state is
19
25
  otherwise unknown. Do not turn that check into a technical investigation.
26
+ Run every `ace-*` command directly, without a pipe, redirection or output
27
+ post-processing. Record its actual exit status; if it prints a path, read the
28
+ file. A pipeline's exit status cannot establish that an ACE operation passed.
20
29
  Once the symptom is known, proceed to task creation/reconciliation, observation
21
30
  and worker dispatch, then end the turn.
22
31
 
@@ -26,15 +35,119 @@ Create one lab coordination task in `_overseer`, with three direct children:
26
35
  prepare, independently verify, confirm start. The latter two depend on their
27
36
  predecessor. Only the lab overseer updates this private tree.
28
37
 
29
- Create a separate executable lab task through `ace-task` for the bootstrap
30
- work, linking it as the manager's `project_task`. Keep its specification in
31
- its task folder. Include the canonical target repository path, required
38
+ From the lab root, use the explicit private-folder selector when creating
39
+ the manager; a title or `lab-coordination` tag does not select its location:
40
+
41
+ ```bash
42
+ ace-task list --in _overseer
43
+ ace-task create "Bootstrap <project> readiness" --in _overseer --tags bootstrap,lab-coordination
44
+ ace-task create "Prepare <project>" --child-of <manager-ref>
45
+ ace-task create "Independently verify <project>" --child-of <manager-ref>
46
+ ace-task create "Confirm start <project>" --child-of <manager-ref>
47
+ ace-task update <verify-ref> --add dependencies=<prepare-ref>
48
+ ace-task update <confirm-ref> --add dependencies=<verify-ref>
49
+ ace-task show <manager-ref>
50
+ ace-task list --in _overseer
51
+ ```
52
+
53
+ Use the full task IDs returned by the commands, not abbreviated references.
54
+ Children inherit the parent's location.
55
+ Before dispatch, verify the manager and its three direct children resolve
56
+ under `<lab>/.ace-tasks/_overseer/` and are gitignored. A manager in the public
57
+ task root does not satisfy this contract. Reconcile its location through the
58
+ task owner's public CLI before dispatch; do not create a duplicate commission
59
+ or treat a successful worker report as proof that the manager is private.
60
+
61
+ Create the executable bootstrap task through `ace-task` in the target project's
62
+ canonical root, linking it as the private lab manager's `project_task` and
63
+ recording `project_root`. Keep its specification in its project task folder.
64
+ Run executable-task creation, lookup, coworker preparation and role handoff
65
+ from that project. Run private coordination-task updates from the lab root.
66
+ Shell calls do not retain a preceding call's working directory. The worker receives
67
+ only the project mount and cannot read lab-private tasks. The lab's installed
68
+ observation reads configured project assignments and reports from their owners;
69
+ records remain in the project rather than being copied into lab state. Include the canonical target repository path, required
32
70
  configuration, observed failure, desired outcome, allowed changes, runtime
33
71
  mode, acceptance checks and report recipient. Assign diagnosis and reproduction
34
- as well as preparation to the worker. This is lab infrastructure work, not a project product task.
35
- Workers must not edit the private coordination tree. Resolve each task folder
36
- from `ace-task show <ref>` before writing commission, dispatch or receipt notes;
37
- never construct a folder from a guessed or expanded title slug.
72
+ as well as preparation to the worker. This task describes infrastructure setup within the project, separate from its product issue backlog.
73
+
74
+ The preparation and verifier acceptance checks stop at a validated project
75
+ configuration and readiness to start. Do not require a running project
76
+ Overseer, a first turn, or active project eyes in either worker assignment:
77
+ those are the coordinator's confirm-start checks after verification. Workers
78
+ must not start the project Overseer themselves. This prevents a circular gate.
79
+ Worker/verifier checks must be executable with their commissioned session's
80
+ permissions. Validate the prepared configuration, installed CLI/gem paths and
81
+ owned project files. `ace-lab prepare`, `ace-lab install` and `ace-lab verify`
82
+ operate on the host deployment manifest even from the project directory.
83
+ The host operator owns them. Never include these commands in a project
84
+ commission or dispatch prompt, including as a dry run or acceptance check.
85
+ Name the exact project configuration files to prepare or validate and the
86
+ installed executable paths to check. If host convergence is required, record
87
+ the missing capability and route it to the host operator.
88
+ Do not require host D-Bus or systemd inspection, reading either overseer's
89
+ private task tree, or a healthy full `ace-overseer observe` projection from a
90
+ worker session. Those checks belong to the host or overseer role. The private
91
+ task tree is the coordinator's responsibility; ordinary same-user sessions do
92
+ not promise operating-system isolation from it.
93
+ Commission task-store checks for the worker or verifier in the execution
94
+ worktree. The project Overseer can audit its canonical private task store
95
+ after start. A worker reports
96
+ missing authority and the exact blocked check instead of repairing host services
97
+ or attempting to access the coordinator's private state. The coordinator proves
98
+ full observation from the authorized project Overseer during confirm-start.
99
+ `ace-coworker status` describes one commissioned executor, not whether a
100
+ project can host an Overseer. A canonical project without a default coworker
101
+ commission is not a bootstrap defect. Do not require or create a canonical
102
+ `.ace-local/coworker/config.yml` merely to make that query ready, and never copy
103
+ a worktree commission into another checkout where its assignment cannot resolve.
104
+ Read an executor's status in its returned worktree with its returned `--config`.
105
+ A configuration parse, exit zero or absence of the words "not ready" is not
106
+ proof of readiness: require the intended identity and resolved assignment.
107
+ Do not require a worker or verifier to rerun `prepare` as an acceptance check
108
+ while its assignment is active. Preparation coordinates executors; its active
109
+ executor conflict is not a configuration validation result. Accept project
110
+ configuration through its own documented schema and installed runtime checks.
111
+
112
+ The commission must include the target project's eyes configuration path
113
+ `<project>/.ace-local/overseer/eyes.json` and
114
+ the project Overseer's configured HITL recipient for its own eyes, separately
115
+ from the lab recipient that receives bootstrap reports: the worker prepares the configuration
116
+ and the independent verifier checks it before project start. Missing or
117
+ ambiguous recipient information is a blocker, never a guessed address. The
118
+ project Overseer arms the prepared configuration; it does not create or edit it.
119
+ Describe the required project observation and recipient in the commission.
120
+ Leave configuration syntax to the executor and its installed validator.
121
+ `scope: project` belongs to the Overseer start configuration. For the eyes
122
+ JSON, use `"scope": "current"` to observe the current project and set
123
+ `"recipient"` to that project's configured recipient. Add sync routes only
124
+ when the commission requires them.
125
+ The project's private task directory is `<project>/.ace-tasks/_overseer`;
126
+ never require or create a top-level `<project>/_overseer` directory.
127
+
128
+ Put all commission and supporting files in the executable task's own tracked
129
+ folder, never in the private `_overseer` tree. Before preparing its worktree,
130
+ commit those files and the task specification using the task/commit tools.
131
+
132
+ Resolve the executable task in its owner checkout and use the returned
133
+ file's parent directory:
134
+
135
+ ```bash
136
+ cd "<canonical-project-root>" && ace-task show "<project-task-id>" --path
137
+ ```
138
+
139
+ If lookup reports not found, check the command's working directory and the
140
+ task ID from the create result. Correct the lookup once. If it still fails,
141
+ record the blocker on the private coordination task and end the turn.
142
+ Check `git status --short -- <task-directory>` in the project: uncommitted
143
+ or untracked supporting files will not appear in the new worktree.
144
+
145
+ After preparation, verify every referenced commission file exists in the
146
+ returned worktree before launch. If one is missing, report a preparation
147
+ failure and keep the worker unstarted.
148
+ Workers must not edit the private coordination tree. Resolve each task
149
+ folder from its owner's checkout before writing commission, dispatch or
150
+ receipt notes. Use the returned path even when it differs from the title slug.
38
151
 
39
152
  Explicit `ACE_TOOLCHAIN=installed` remains installed in every subprocess,
40
153
  worker and resumed session. The project checkout is domain data. Never modify
@@ -44,8 +157,12 @@ do not patch installed gems. Preserve unrelated changes.
44
157
 
45
158
  ## Arm eyes before dispatch
46
159
 
47
- Use the lab's existing eyes JSON configuration. The `ace_eyes` tool accepts
48
- `{"action":"start","configPath":"<absolute eyes JSON path>"}`.
160
+ Use the lab's existing eyes JSON configuration, including its configured
161
+ project observations. Start it once with the `ace_eyes` tool using
162
+ `{"action":"start","configPath":"<absolute eyes JSON path>"}`. If eyes is
163
+ already armed for the same configuration, read `{"action":"status"}`
164
+ and reuse the running observer. A worker-to-verifier handoff does not
165
+ require rearming an observer that remains healthy.
49
166
  Inspect the returned state: enabled=true, breaker=null, errors=0 and at least
50
167
  one observation. Read pending revisions from their original owners, reconcile
51
168
  existing commissions, and ack each exact key/revision only after acceptance.
@@ -54,8 +171,28 @@ report that capability gap. Do not claim that mentioning `/eyes` armed it.
54
171
 
55
172
  ## Prepare and actually launch a worker
56
173
 
57
- Use `ace-coworker prepare --task <executable-task> --roles bootstrap-worker,bootstrap-verifier
58
- --to <configured-overseer-address> --format json`. Read its returned worktree,
174
+ Read the lab's armed eyes configuration to identify the commissioning
175
+ coordinator's recipient, then resolve that address in the target project's
176
+ HITL configuration. Use the target configuration's key for THAT same lab
177
+ address, not its project Overseer address. Lab and project coordinators must
178
+ have distinct configured addresses, with absolute folder paths when using
179
+ folder-form addresses. A relative `.ace-local/hitl` repeated across roots does
180
+ not identify which coordinator owns the report. The task specification, `--to`, and returned start configs
181
+ must agree; do not invent an address or append a machine suffix. If no valid
182
+ recipient is configured, report a blocking gap before dispatch.
183
+
184
+ Bootstrap uses `reporting.delivery: observe`. The recipient is
185
+ a report address, not permission to edit the coordinator's private tasks. Executors publish
186
+ with `ace-coworker report` in their assignment worktree. Lab eyes observes that
187
+ publication on the project side and the Lab Overseer accepts it. Neither
188
+ commission may require the worker or verifier to find, touch, or write the
189
+ Lab Overseer's inbox (for example `/lab/.ace-local/hitl`). Check the configured
190
+ address in the start brief, and prove publication and acceptance at the
191
+ report handoff after execution. Do not turn inbox access into a prerequisite
192
+ for project preparation.
193
+
194
+ From the target project root, use `ace-coworker prepare --task <executable-task> --roles bootstrap-worker,bootstrap-verifier
195
+ --to <configured-lab-recipient> --format json`. Read its returned worktree,
59
196
  assignment IDs and start-config paths; record these on the matching private
60
197
  steps before launch through the task API, not only in prose:
61
198
 
@@ -65,6 +202,12 @@ ace-task update <verify-step> --set assignment=<verifier-assignment> --set role=
65
202
  ace-task update <confirm-step> --set role=confirm-start
66
203
  ```
67
204
 
205
+ Start-config paths returned by preparation are relative to the returned
206
+ execution worktree, not the canonical project root. Pass the returned path with
207
+ that worktree as cwd, or join it to that worktree for an absolute path. Verify
208
+ that exact file exists before dispatch; use the same rule for the verifier's
209
+ handoff config. Never replace its base directory with the canonical project.
210
+
68
211
  Read back the steps with `ace-task show` and verify exact returned identities.
69
212
  A preparation readiness report is not worker completion. It does not complete
70
213
  any of these three steps; never label bootstrap execution as `role=planner`.
@@ -72,47 +215,91 @@ Only a separate, explicitly commissioned planner preparation allocation may
72
215
  accept an unassigned readiness report.
73
216
  The task must be present in the execution worktree before any agent starts.
74
217
 
75
- `ace-coworker start --config <returned-path>` validates and prints a brief;
76
- it does NOT launch an agent. Use the configured Herdr provider/profile to
77
- start a separate worker agent in the returned worktree, load the returned
78
- role instructions, and send its first prompt. The prompt commissions only
79
- that task and pinned assignment, requires the worker to read its start brief,
80
- drive that assignment, and finish with `ace-coworker report`. These operational roles explicitly allow the commissioned canonical target
81
- outside the lab task worktree; ordinary product worker/reviewer roles do not.
82
- Use CLI help for
83
- Herdr's current arguments. Record the returned pane/agent identity and verify
84
- first-turn delivery. Never replace a missing executor with your own work.
218
+ `ace-coworker start --config <returned-path>` validates and prints a brief.
219
+ Launch the first prepared leg with `ace-overseer handoff --task <executable-task>
220
+ --runtime herdr` from the target project. This operation starts the actual
221
+ process in the returned worktree with the role's explicit environment and
222
+ records its native identity on the existing commission. No prompt file,
223
+ service setup or shell workaround is needed from the coordinator.
85
224
 
86
- End the overseer's turn immediately after dispatch. The eyes timer observes
87
- assignment and HITL revisions without invoking the model on unchanged state.
225
+ Record the returned terminal and assignment on the matching private step.
226
+ End the turn with eyes armed. A repeated command reuses recorded work or
227
+ reports an explicit blocker; an uncertain start must not be bypassed by
228
+ another dispatch. Worker or observation failure is delegated/escalated,
229
+ never repaired by the Lab Overseer.
88
230
 
89
231
  ## Receive, verify, start
90
232
 
91
233
  On wake, read the original report and current assignment. Require matching
92
234
  report ID, task, assignment and role; a preparation report, process exit or
93
- unmatched message is not success. Use `ace-overseer process-reports --dry-run`
94
- to inspect the matching and continuation before applying it. Only accept
95
- worker success with a completed non-empty assignment and the promised evidence.
235
+ unmatched message is not success. The observation carries `project_root` and
236
+ the original report ID; read the report and `ace-coworker status` through their
237
+ public CLI in that project/worktree. Only accept worker success with a completed
238
+ non-empty assignment and the promised evidence. The private coordination tree
239
+ stays in the lab: do not run a project-local report processor against lab task
240
+ IDs or infer completion from a report file alone.
96
241
  Record the actual accepted HITL event ID and result in step metadata through
97
242
  `ace-task update <step> --set processed_report=<event-id> --set report_result=<result>`
98
- (or let `process-reports` perform that same write after its dry run is checked).
99
- Mark done only after acceptance; errors keep the step open. Receipt notes in
243
+ using the lab task owner.
244
+ Mark done only after acceptance; errors keep the step open. If the executor
245
+ observation loses the recorded terminal while its assignment is incomplete,
246
+ verify the absence in Herdr and record the interruption before reconciling
247
+ that assignment. A disappeared session cannot complete a bootstrap leg. Receipt notes in
100
248
  the path returned by `ace-task show` supplement these fields, never replace them.
101
249
  Read back the recorded identity before acknowledging the eyes revision.
102
250
  Never put a preparation readiness ID on a worker, verifier or confirm-start step.
103
251
 
104
- Use the existing role handoff gate to prepare the independent reviewer after
105
- worker completion. As with the worker, a printed start command is not a live
106
- agent: launch the reviewer separately with its own returned role/config and
107
- confirm first-turn delivery. Do not launch a second executor while an earlier
108
- one is active or its state is unknown. On repeated delivery, reconcile existing
109
- assignments and agents instead of dispatching again.
252
+ After accepting the worker's report, use `ace-overseer process-reports` to
253
+ retire its recorded executor and continue the prepared sequence. Preserve
254
+ the exact report and assignment identity before starting the verifier.
255
+ Do not launch a second executor while a predecessor is active or unknown.
256
+ Repeated reports reconcile the same commission; they do not repeat the work.
110
257
 
111
258
  Only after accepted worker completion and independent verification does the
112
259
  overseer perform this commission's project-start coordination operation `ace-overseer start --reconcile`. Confirm the target's session, first
113
- turn and active eyes from actual session evidence. A ready process alone is
114
- not initialized observation. Close the confirmation step and managing task
115
- only with these proofs; the worker report alone cannot close the family.
260
+ turn and active eyes through that command's native-session readiness result.
261
+ For the target project, `ready=true` proves the matching session's
262
+ first turn and active eyes; a terminal's `done` or `interactive_ready` alone
263
+ does not. Record the returned target identity and readiness on confirm-start.
264
+
265
+ When the target returns `ready=false`, preserve its session. Arm one eyes
266
+ first-turn deadline (`key=confirm-start-<project-id>`, `revision=<terminal-id>`,
267
+ `at=now_unix_ms + 60000`) and end the turn. On a project-session revision or
268
+ that deadline, rerun `ace-overseer start --reconcile` from the lab root once.
269
+ It reuses the existing session and checks its evidence without resending the
270
+ prompt. Cancel the deadline when readiness is confirmed. The deadline is an
271
+ observation checkpoint, not a startup failure threshold. If it fires while
272
+ readiness remains false, reconcile the actual session activity through Herdr's
273
+ public agent state. A matching session still working on its first turn remains
274
+ pending: record that fact, acknowledge the handled project-session revision,
275
+ cancel the consumed deadline and keep project-session observation armed.
276
+ At this first pending checkpoint, arm one separate startup watchdog
277
+ (`key=confirm-stall-<project-id>`, `revision=<terminal-id>`,
278
+ `at=now_unix_ms + 1800000`) and record its identity on confirm-start before ending the turn. Never
279
+ rearm it on subsequent revisions or after session resume. On its expiry,
280
+ reconcile readiness and, if still unconfirmed, delegate diagnosis while
281
+ preserving the existing session; elapsed time alone never authorizes restart.
282
+ Cancel this watchdog when readiness is confirmed or diagnosis takes ownership.
283
+ On the next project-session revision, check authenticated readiness again.
284
+ Do not ask the Captain whether to keep
285
+ waiting for an active session, repeatedly rearm deadlines or poll.
286
+
287
+ If the session has finished its turn without readiness, exited, or is blocked,
288
+ delegate diagnosis with the observed state and readiness result. Unknown
289
+ activity or unavailable observation is an explicit unresolved state, never
290
+ permission to launch a duplicate or declare success. Escalate only an actual
291
+ decision or missing authority; ordinary first-turn latency needs neither.
292
+
293
+ Do not read implementation files, inspect another session's private files, or
294
+ infer another agent's eyes from your own `ace_eyes status`. The public readiness
295
+ result is the proof boundary; inability to obtain it is a blocker for the
296
+ executor to diagnose. Close the confirmation step and managing task only with
297
+ these proofs; the worker report alone cannot close the family.
298
+ If first-prompt delivery is unconfirmed, preserve the existing session and do
299
+ not submit the prompt again. Inspect its actual activity and escalate an
300
+ unresolved delivery through HITL. The project-session observation can wake you
301
+ on a configured project's Herdr state change; that state alone does not prove
302
+ the project has armed eyes.
116
303
 
117
304
  On error, keep the step open and route repair to the worker. Missing authority
118
305
  or an actual Captain decision becomes a precise HITL question; end the turn