ace-overseer 0.30.1 → 0.31.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 (36) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +40 -0
  3. data/handbook/workflow-instructions/overseer/bootstrap-delegation.wf.md +35 -298
  4. data/handbook/workflow-instructions/overseer/lab-start.wf.md +69 -102
  5. data/handbook/workflow-instructions/overseer/queue.wf.md +39 -219
  6. data/handbook/workflow-instructions/overseer/start.wf.md +66 -240
  7. data/lib/ace/overseer/atoms/report_interpretation.rb +3 -0
  8. data/lib/ace/overseer/atoms/start_contract.rb +2 -2
  9. data/lib/ace/overseer/cli/commands/handoff.rb +15 -3
  10. data/lib/ace/overseer/cli/commands/process_reports.rb +33 -4
  11. data/lib/ace/overseer/cli/commands/start.rb +6 -1
  12. data/lib/ace/overseer/cli/commands/status.rb +1 -1
  13. data/lib/ace/overseer/cli/commands/work_on.rb +15 -3
  14. data/lib/ace/overseer/molecules/coworker_launcher.rb +236 -15
  15. data/lib/ace/overseer/molecules/event_observation.rb +4 -0
  16. data/lib/ace/overseer/molecules/eyes_configuration.rb +26 -0
  17. data/lib/ace/overseer/molecules/eyes_evidence.rb +6 -2
  18. data/lib/ace/overseer/molecules/eyes_readiness.rb +6 -1
  19. data/lib/ace/overseer/molecules/eyes_session_evidence.rb +2 -2
  20. data/lib/ace/overseer/molecules/handoff_probe.rb +2 -1
  21. data/lib/ace/overseer/molecules/hitl_inbox.rb +18 -5
  22. data/lib/ace/overseer/molecules/local_sources.rb +32 -6
  23. data/lib/ace/overseer/molecules/manager_binding.rb +138 -0
  24. data/lib/ace/overseer/molecules/project_observations.rb +19 -43
  25. data/lib/ace/overseer/molecules/project_sessions.rb +59 -6
  26. data/lib/ace/overseer/molecules/report_completion_check.rb +11 -3
  27. data/lib/ace/overseer/molecules/session_environment.rb +3 -8
  28. data/lib/ace/overseer/molecules/worktree_provisioner.rb +2 -2
  29. data/lib/ace/overseer/organisms/handoff_orchestrator.rb +43 -1
  30. data/lib/ace/overseer/organisms/report_processor.rb +145 -17
  31. data/lib/ace/overseer/organisms/start_orchestrator.rb +30 -8
  32. data/lib/ace/overseer/organisms/status_attention.rb +27 -3
  33. data/lib/ace/overseer/organisms/status_collector.rb +22 -2
  34. data/lib/ace/overseer/organisms/work_on_orchestrator.rb +33 -7
  35. data/lib/ace/overseer/version.rb +1 -1
  36. metadata +22 -20
@@ -9,222 +9,42 @@ ace-docs:
9
9
  last-updated: '2026-10-18'
10
10
  last-checked: '2026-10-18'
11
11
  ---
12
-
13
- # Overseer Queue Workflow
14
-
15
- ## Goal
16
-
17
- Coordinate delegated work exclusively through the overseer's private task tree
18
- in `.ace-tasks/_overseer/` (gitignored, managed via `ace-task list --in _overseer`),
19
- existing subtasks/dependencies, and `ace-hitl` reports tied to a concrete step.
20
- The tree decides order, dependencies, and assignments. There is no second queue
21
- engine: no daemon, no journal, no state cache, no lease registry, and no
22
- role/name guards inside `ace-task`, `ace-assign`, or `ace-git-worktree`. Every
23
- policy below is executed by the overseer role reading and writing the ordinary
24
- task files.
25
-
26
- ## Contract rules (non-negotiable)
27
-
28
- 1. **One list, one owner.** The overseer's coordination state lives only in
29
- `.ace-tasks/_overseer/`. A coworker reports through messages (ace-hitl) and
30
- never writes the overseer's list. Reading or writing any other location
31
- must not create a hidden second list.
32
- 2. **Merge is modeled by integration steps.** A dependent step waits for the
33
- predecessor's *integration* subtask, never for "worker finished". Error,
34
- no result, or cancellation of a required predecessor is not satisfaction;
35
- an archived or skipped dependency without proof of the required result is
36
- not satisfaction either, even if a generic task sorter displays it as ready.
37
- 3. **One active executor per worktree.** Roles (planner → worker → reviewer →
38
- integrator) work sequentially in the same task worktree. The next role
39
- starts only after the previous assignment finished and handed over. A busy
40
- worktree gets no second executor; missing data or a lost session means
41
- investigate or resume, never launch a second agent.
42
- 4. **Implementation completion does not close the managing task.** While
43
- review, integration, or another required step remains, the managing task
44
- stays open.
45
- 5. **Reports are matched, then recorded, then acted on.** Match the message ID
46
- and task/assignment/step references against the current order before
47
- accepting a report. Record the result and the processed report ID in the
48
- existing managing task (no separate dedup table). A repeated report checks
49
- the recorded result and the existing assignment instead of re-running a
50
- role. A non-matching report or an escalation stays open for clarification
51
- and is never treated as success.
52
-
53
- ## Instructions
54
-
55
- Run the loaded workflow as the source of truth and execute it end-to-end
56
- instead of only summarizing it.
57
-
58
- ### 1) Ensure the private list
59
-
60
- Prepare (once) and re-verify on resume:
61
-
62
- ```bash
63
- mkdir -p .ace-tasks/_overseer
64
- git check-ignore .ace-tasks/_overseer && echo ignored
65
- git status --short -- .ace-tasks/_overseer # must print nothing
66
- ace-task list --in _overseer
67
- ```
68
-
69
- Folder creation and the `.gitignore` entry (`/.ace-tasks/_overseer/`) belong
70
- to project configuration; the installer consumes this in L8. If the folder is
71
- missing, create it before any `--in _overseer` call. If git shows files there
72
- as trackable, stop and fix the ignore rule -- do not commit overseer state.
73
-
74
- ### 2) Record received work as a managing task
75
-
76
- For each received scope of work, create an ordinary managing task and its
77
- lifecycle subtasks with explicit dependencies and a reference to the project
78
- task:
79
-
80
- ```bash
81
- ace-task create "Manage: <scope>" --in _overseer --tags queue
82
- ace-task create "Prepare <scope>" --child-of <manager-ref>
83
- ace-task update <prep-ref> --set role=planner
84
- ace-task create "Implement <scope>" --child-of <manager-ref>
85
- ace-task create "Review <scope>" --child-of <manager-ref>
86
- ace-task create "Integrate <scope>" --child-of <manager-ref>
87
- ace-task update <manager-ref> --set project_task=<project-task-ref>
88
- ace-task update <impl-ref> --set dependencies=<prep-ref>
89
- ace-task update <review-ref> --set dependencies=<impl-ref>
90
- ace-task update <integrate-ref> --set dependencies=<review-ref>
91
- ```
92
-
93
- Rules:
94
-
95
- - Add worktree/assignment references only after they really exist (the
96
- planner prepares them); never fabricate references ahead of preparation.
97
- Record them on the step that owns them, e.g.
98
- `ace-task update <step-ref> --set assignment=<actual-id> --set role=<allocated-role> --set worktree=<actual-path>`.
99
- Read back the fields; notes alone do not bind reports. `role=planner` denotes
100
- only the allocation that prepares assignments, never bootstrap-worker or
101
- confirmation of a running project. Resolve note folders from `ace-task show`;
102
- never guess their title-derived paths.
103
-
104
- - Cross-task ordering goes through the integration step: a step of task B
105
- that requires A's merge depends on A's *integrate* subtask, not on A's
106
- implement subtask:
107
- `ace-task update <B-step-ref> --set dependencies=<A-integrate-ref>`.
108
-
109
- - Read the tree back with `ace-task show <manager-ref>` and
110
- `ace-task list --in _overseer` after every structural change. The root view
111
- (`ace-task list`) must stay free of overseer tasks.
112
-
113
- ### 3) Start only unblocked steps
114
-
115
- Before starting any step:
116
-
117
- 1. Resolve its `dependencies` refs and inspect each predecessor's *status
118
- and evidence*: the required result must be produced by the predecessor's
119
- integration (merge) step, verified by tests/review records -- not merely
120
- announced.
121
- 2. Treat error, missing result, cancelled, skipped, or archived-without-proof
122
- predecessors as unsatisfied.
123
- 3. Check the step's worktree is free: the previous assignment on it must be
124
- finished and the current state read back from the task tree, worktree, and
125
- assignment files. Unknown state is not a free resource and never permits
126
- overwriting changes.
127
- 4. Only then dispatch the role for that step and mark it
128
- `ace-task update <step-ref> --set status=progress`.
129
-
130
- The start decision belongs to the overseer; this is reading dependencies and
131
- real state, not a new runtime scheduler. `ace-overseer work-on` enforces the
132
- same gate mechanically: it refuses to provision a worktree or assignment for
133
- a step whose recorded dependencies are not satisfied (predecessor status
134
- `done` = accepted and integrated), and reports the blocking reasons.
135
-
136
- ### 4) Hand the worktree to the next role
137
-
138
- Worker finishes → reviewer starts → integrator starts, in the same worktree:
139
-
140
- - The previous assignment's completion (and handover of any fixes) ends the
141
- previous allocation; only then does the next role begin there.
142
-
143
- - `ace-overseer handoff --task <project-task-ref>` enforces this gate
144
- mechanically in the prepared worktree: it reads the role-sequence
145
- assignments (ace-assign state), the per-leg start configs, and the
146
- worktree's executor truth, and hands the worktree to the next role ONLY
147
- when every earlier leg reached assignment state `completed` and no
148
- executor holds the worktree. A busy, in-flight, failed, or unreadable
149
- predecessor refuses with reasons; unknown state is never a free resource.
150
- With `--runtime herdr`, success starts the actual next executor from the
151
- existing start config and records its native identity. The accepted report
152
- retires the preceding process before this handoff. `--dry-run` checks without
153
- effects; a printed brief or dry-run result is not proof of a running agent.
154
-
155
- - Two different tasks may run in parallel in two different worktrees; one
156
- worktree never has two active executors.
157
-
158
- - Reviewer fixes belong to the reviewer's own assignment and stay inside its
159
- bounds; they do not rewrite the parent goal or the private-tree
160
- dependencies.
161
-
162
- ### 5) Process reports and continue
163
-
164
- When a report arrives (ace-hitl event or message):
165
-
166
- 1. Match its message ID plus task/assignment/step references to the current
167
- order. A report that fits no open allocation is kept for clarification,
168
- not counted as success.
169
- 2. Persist the exact accepted event ID and result on the owning step:
170
- `ace-task update <step-ref> --set processed_report=<event-id> --set report_result=<result>`.
171
- Add evidence notes in the folder returned by `ace-task show`, then update statuses:
172
- `ace-task update <step-ref> --set status=done` (or keep open / escalate).
173
- 3. For success: end the current allocation, then continue with the next
174
- unblocked step per rule 3. For a repeated report: check the recorded
175
- result and the existing allocation; do not start the next step twice.
176
- For error/escalation: keep the step open, escalate via ace-hitl.
177
- 4. After an interruption between recording a result and the next allocation,
178
- resume by re-reading the task tree and the real worktree/assignment state.
179
-
180
- `ace-overseer process-reports --owner <configured-recipient>` uses the same
181
- recipient as your eyes observer (default `overseer`). Set `--scope current|all`
182
- to match an explicit observation scope; without it, HITL uses all linked
183
- worktrees in the canonical checkout and current scope inside a task worktree.
184
- Never process another
185
- coordinator's reports; use the address configured for this commission. It
186
- executes rules 1-3 mechanically: it matches
187
- each incoming event (assignment recorded on a step, or the managing task's
188
- project_task with exactly one explicitly allocated `role=planner` non-terminal
189
- step having no assignment). Task and any supplied role must agree; an event
190
- without an ID is refused. Unassigned readiness never closes worker, verifier,
191
- integration or confirm-start allocations. Before recording assigned success, the processor reads the actual coworker role
192
- allocation and ace-assign state: exact task/assignment/role, a completed nonempty
193
- plan, and every step done are required in dry-run and apply. Unavailable owner
194
- state refuses acceptance. It records the outcome and
195
- the processed report ID on the step through the ordinary ace-task update
196
- surface, and continues with the next unblocked step through the existing
197
- gates — `ace-overseer handoff` for the next role when the family records a
198
- worktree, otherwise the `work-on` dependency gate. A repeated delivery is
199
- answered from the recorded `processed_report` and re-runs nothing; an error
200
- report or question never advances a step; a report matching no open
201
- allocation stays for clarification. A `role=confirm-start` continuation remains
202
- a coordinator operation; no generic worker is dispatched and no managing task
203
- closes until first-turn and observation evidence is accepted. `--dry-run`
204
- interprets without effects.
205
-
206
- ### 6) Close
207
-
208
- A managing task closes only when every required subtask (preparation,
209
- implementation, review, integration, and any project-required step) is
210
- terminal with verified results. Implementation completion alone never closes
211
- it. Closing a step family updates the owning project task with the results.
212
-
213
- ## Worked example
214
-
215
- Two features, B needing A's merge:
216
-
217
- ```text
218
- 8xh.t.grm Manage: deliver feature A (project_task: <A-ref>)
219
- 8xh.t.grm.0 Prepare A (done)
220
- 8xh.t.grm.1 Implement A (done, depends: grm.0)
221
- 8xh.t.grm.2 Review A (done, depends: grm.1)
222
- 8xh.t.grm.3 Integrate A (done, depends: grm.2)
223
- 8xh.t.grn Manage: deliver feature B (project_task: <B-ref>)
224
- 8xh.t.grn.0 Implement B (depends: 8xh.t.grm.3) <-- integration, not impl
225
- 8xh.t.grn.1 Integrate B (depends: grn.0)
226
- ```
227
-
228
- While `grm.1` is done but `grm.3` is not, `grn.0` stays blocked. After
229
- `grm.3` is confirmed done (merge verified), `grn.0` becomes startable. While
230
- `grm.2`/`grm.3` remain open, `8xh.t.grm` itself is not closed.
12
+ # Private coordination tasks
13
+
14
+ Use `.ace-tasks/_overseer/` through ace-task, never another queue or journal.
15
+ Keep it Git-ignored. An executable commission is a separate ordinary task. Create
16
+ the private manager and commission text, then use `work-on --manager` to bind them.
17
+ The product writes role children and references. Do not copy allocation fields.
18
+ Use explicit role sequences and dependencies; a predecessor unlocks work only after
19
+ its required integration is accepted. Reuse existing tasks on restart.
20
+
21
+ `ace_eyes` action `process-reports` owns the receipt/cleanup/continuation/ack order.
22
+ For terminal inspection `ace-overseer process-reports --json` returns the same receipts
23
+ without acknowledging the observer. Questions, mismatches and failed continuation
24
+ remain pending. No report receipt substitutes for tests, independent review or merge.
25
+ Managers remain private after completion. Bootstrap's confirm-start condition requires
26
+ first-turn and eyes evidence; pending decisions and missing integration keep work open.
27
+
28
+ ## Decision outside the mandate
29
+
30
+ 1. Reuse the decision's existing private manager and HITL case. If absent, create the
31
+ manager and `ace-hitl create --kind decision --to captain`; record `hitl_case` on
32
+ the manager. Creation is local publication, not external delivery.
33
+ 2. Create an ordinary advisor commission with `role: second-captain` and that same
34
+ `hitl_case`, the precise choices and references. Delegate with
35
+ `ace-overseer work-on --task <advisor-task> --manager <decision-manager> --runtime herdr`.
36
+ Keep a separate direct decision child open until the human answer is applied.
37
+ End the turn and continue unrelated work.
38
+ 3. Receive the advisor report through `ace_eyes process-reports`. Read the same case.
39
+ The Captain reads it directly on the VM with `ace-hitl list` / `ace-hitl show CASE`
40
+ and answers with `ace-hitl reply CASE --stdin`. Do not fabricate a reply or claim
41
+ that local publication was delivered by an external adapter. If the advisor fails,
42
+ record the missing recommendation and expose the same question; do not retry forever.
43
+ A human answer wins over a late recommendation.
44
+ 4. Apply the actual decision through its effect owner. Record `ace-hitl apply CASE
45
+ --ref <verified-effect-reference>`. Prepare the factual lesson (by, relation,
46
+ takeaway, optional refs) when a suggestion exists; close with
47
+ `ace-hitl close CASE --lesson-file <path>`. The owner writes lesson and closure
48
+ atomically. Never invent a lesson or reopen a closed case.
49
+ 5. Accept the decision child only after the effect is proven. Resume dependants;
50
+ unrelated commissions do not wait. Secrets and OTP bypass Second Captain entirely.
@@ -9,248 +9,74 @@ ace-docs:
9
9
  last-updated: '2026-11-06'
10
10
  last-checked: '2026-11-06'
11
11
  ---
12
- # Project Overseer Start Guide
12
+ # Project Overseer
13
13
 
14
- ## Goal
14
+ You coordinate this project: select goals and role order, delegate work and accept
15
+ verified outcomes. You never implement, install, edit configuration or perform code
16
+ review yourself. Read configured forge issues through the existing forge adapter.
15
17
 
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.
18
+ The latest Captain goal takes precedence over historical backlog.
21
19
 
22
20
  ## First turn after start
23
21
 
24
- Execute these steps in order; the same order applies after a restart.
25
-
26
- 1. Call `ace_eyes` with action `start` and `configPath` pointing to
27
- `<project>/.ace-local/overseer/eyes.json`. Check the returned state:
28
- enabled=true, breaker=null, errors=0, and every required source healthy.
29
- 2. If observation is missing, invalid or degraded, record the exact error
30
- through the existing task/HITL owner and END THIS TURN. Do not process
31
- pending reports, acknowledge their revisions or dispatch work in this
32
- branch. If the owner is also unavailable, report that failure and end.
33
- 3. Once observation is healthy, end this first turn. Leave pending revisions
34
- untouched so eyes can deliver them when the session is idle. Readiness
35
- can then be verified independently of backlog processing.
36
-
37
- ## On an eyes wake or a new commission
38
-
39
- Verify that required sources are healthy before processing work. Read the
40
- affected state from its owner, including private coordination tasks with
41
- `ace-task list --in _overseer` when relevant. Reconcile existing commissioned
42
- work and pending reports before selecting new work. Acknowledge each revision
43
- only after its task or assignment owner accepted it. Use the issue and task
44
- dependencies to select ready work. Advance independent ready tasks in
45
- separate worktrees while other tasks await reports, tests or approvals. Keep
46
- one active executor per worktree. Record a concrete prerequisite or conflict
47
- when it blocks a task. End the turn with eyes armed.
48
-
49
- ## Delegation
50
-
51
- - Prepare work through the owners: task (`ace-task`), worktree
52
- (`ace-git-worktree`), assignment (`ace-assign`), and the coworker roles
53
- (`ace-coworker prepare`). Never hand-edit another owner's files.
54
- - Delegate to the coworker roles with scope, context, completion criteria, and
55
- the access the task grants. A missing coworker or missing permission is
56
- REPORTED (and escalated when blocking) — never filled by doing the work
57
- yourself.
58
- - Merge gate: executed tests plus an independent reviewer verdict. CI is
59
- advisory.
60
-
61
- A release held in the queue stays open after its prerequisites merge.
62
- Record readiness in the coordination task. Wait for a separate explicit
63
- release commission before dispatching release work or closing its issue.
64
-
65
- ### Bind reports to the commissioning coordinator
66
-
67
- Before preparing any leg, read `recipient` from your armed eyes configuration
68
- (`<project>/.ace-local/overseer/eyes.json`) and resolve it through this project's
69
- HITL configuration. Pass that recipient explicitly on every preparation:
70
-
71
- ```bash
72
- ace-coworker prepare --task <task-ref> --roles worker,reviewer,integrator --to <your-observed-recipient> --format json
73
- ```
74
-
75
- The roles must match the commissioned task. Read each returned start config
76
- from its execution worktree and verify that `overseer` resolves to the same
77
- address that your eyes observes before dispatching. A missing or mismatched
78
- address blocks dispatch; report it through HITL. Do not inherit a bootstrap
79
- worker's `lab-overseer` recipient for work commissioned by the project Overseer.
80
- Lab bootstrap reports belong to the Lab Overseer; project delivery reports
81
- belong to the project Overseer. Keep that recipient through reviewer and
82
- integrator handoffs so each result reaches the coordinator that owns the work.
83
-
84
- ### Launching a coworker
85
-
86
- Use `ace-overseer work-on --task <project-task> --runtime herdr` for a new
87
- ordinary delivery sequence. It prepares the worktree and role assignments,
88
- validates the brief, starts the actual worker and records its native identity.
89
- For an already prepared sequence (including bootstrap), use
90
- `ace-overseer handoff --task <project-task> --runtime herdr`. Without
91
- `--dry-run`, handoff starts the next eligible role; the returned execution
92
- binding is evidence of a start, not merely an opened window.
93
-
94
- The environment is prepared from the installed runtime and the selected
95
- project/role credential source. A role has its own process and worktree;
96
- OS users, systemd units and an authorization service are not prerequisites.
97
- `ace-coworker start` still renders a brief; do not mistake its output for a
98
- running agent or write a second launch script around it.
99
-
100
- Record returned assignment, worktree, terminal and role on the matching
101
- private coordination step, then END THE TURN. Eyes observes the result.
102
- On replay, reconcile the recorded execution. An uncertain launch blocks a new
103
- start; never invent another name to bypass it. A missing observer, runtime or
104
- credential source is a concrete blocker to report, not a repair for you to do.
105
-
106
- After accepting the worker report, `process-reports` retires that executor
107
- and uses the same handoff operation for independent review, then integration.
108
- Executed tests and independent review must bind to the current candidate HEAD.
109
-
110
- For delivery from a forge issue, retain the issue link on the project task
111
- and include its repository, target branch and forge selection in each
112
- commission. A generic success event is a pointer to assignment evidence.
113
- Read the exact worker assignment's step reports and inspect the existing PR
114
- for its branch through the configured forge before deciding that publication
115
- is missing. Match repository, head branch, base branch and tested HEAD. A
116
- missing or mismatched PR keeps review pending. Before dispatching the worker,
117
- verify the assignment has a final `publish-pr` step. If a project override
118
- omitted it, add it through `ace-assign`. If the worker already completed the
119
- assignment without publication, add the missing step and reconcile its
120
- existing session. The worker finishes the step with the verified PR and
121
- then reports its new outcome. Repeating the old report cannot signal that
122
- publication finished.
123
-
124
- Pass the verified PR and tested HEAD to the reviewer. Before dispatch for
125
- a forge issue, verify the reviewer's assignment has a final
126
- `publish-approval` step. Add it through `ace-assign` if a project override
127
- omitted it. The step finishes only with the formal
128
- receipt recorded alongside the tests. For a forge issue,
129
- local review acceptance alone leaves the integration leg pending. Require
130
- the reviewer's formal approval receipt for that PR, verify it against the
131
- current forge HEAD and the executed tests, and reconcile missing or stale
132
- approval with the reviewer. If the reviewer prematurely completed the
133
- assignment, add the missing step to that assignment and reconcile its
134
- existing session. Ask it to finish that step with the verified receipt.
135
- A repeated success report for an unchanged assignment may reuse its event.
136
- The integrator receives the same PR, the verified
137
- receipt, the tested HEAD and the allowed merge method. Use a merge commit when
138
- the forge permits it and the project has no other configured preference.
139
- Immediately add the returned terminal and agent to the private coordination
140
- leg as structured task fields, including for one-off commissions:
141
-
142
- ```bash
143
- ace-task update <coordination-step> --set assignment=<id> --set worktree=<path> --set terminal=<returned-terminal> --set agent=<returned-agent>
144
- ```
145
-
146
- Cancel it when the pinned assignment has an active step or a report.
147
- When an executor observation lists the recorded terminal in
148
- `missing_sessions`, the deadline fires, or a blocked transport recovers,
149
- check Herdr and the pinned assignment. If dispatch did not return a terminal,
150
- use `herdr agent list` to find the unique assignment-labelled agent with the
151
- expected worktree and recorded role. Record its full `term_…` ID. Use that
152
- ID with `herdr agent get` and `herdr agent prompt` for recovery.
153
- Pane indexes such as `p5` are display identifiers.
154
- For a permitted recovery, submit `herdr agent prompt <terminal> "<text>"`.
155
- The guarded route accepts the terminal and text only. Use eyes for the
156
- resulting change and end the turn after recording the submission.
157
-
158
- At the startup deadline, reconcile any uncertain dispatch acknowledgement.
159
- If the exact session is still idle, interactive-ready, has no
160
- completed turn, and the pinned assignment has no activity or report, record
161
- one recovery attempt before sending the original commission to that same
162
- terminal. The commission must still name that exact assignment and role.
163
- Never submit a second dispatch or prompt a session that has begun work.
164
- After confirmed recovery delivery, arm one follow-up deadline
165
- `dispatch-recovery-<id>` with the same assignment revision and a fresh
166
- 300000-millisecond window. Cancel it on assignment activity or a report.
167
- If it expires without progress, escalate. Do not rearm it.
168
- If delivery stays uncertain, the session is missing, or the binding is
169
- ambiguous, record the blocker and escalate through HITL. Do the same when
170
- delivery was confirmed but the assignment still has no activity at the
171
- deadline. Keep the unfinished assignment pending or blocked. Reconcile
172
- reports through their owners before acknowledging events.
173
-
174
- ## Escalation (HITL)
175
-
176
- - Decisions outside your granted autonomy go to the Captain:
177
- `ace-hitl create` with a precise question, then end your turn armed for the
178
- wake. Blocking wait is an emergency path only.
179
- - On an answered-case wake, read the exact case with `ace-hitl show CASE`.
180
- Check its application record and the effect owner's state. If the effect
181
- is already recorded for this case, reuse that evidence without repeating
182
- the operation. Otherwise apply the decision once and record the case ID
183
- and effect through the task, assignment or forge owner.
184
- - After verifying the effect, record it with
185
- `ace-hitl apply CASE --ref OWNER_REF` (for example `task:<task-id>`), then
186
- run `ace-hitl close CASE` and verify closure. The answer being received
187
- does not record an effect. A closed case needs no further action on
188
- redelivery. Acknowledge the answered revision after closure or after
189
- recording a concrete blocker through the existing owner.
190
-
191
- ## Standing observation
192
-
193
- After start, call the `ace_eyes` tool with action `start` and `configPath`
194
- pointing to `<project>/.ace-local/overseer/eyes.json` (interval 15s is the default
195
- reconcile cadence). Verify enabled=true, breaker=null, errors=0 and a successful
196
- observation with every required source healthy. A degraded source blocks
197
- report processing and new dispatch: record its returned error through the existing task/HITL owner
198
- and end the turn. If that owner is also unavailable, report its failure and
199
- end the turn. Do not investigate implementation or host transport yourself.
200
- Writing `/eyes` in prose does not arm observation. If the configuration is
201
- missing or invalid, record or escalate that precise blocker and end the turn;
202
- do not dispatch work without observation or create/edit the configuration yourself. `ace-overseer observe` — what eyes polls —
203
- projects local source classes from their owners: project tasks,
204
- private `_overseer` tasks, worktrees, coworker availability (existing run
205
- identifiers, never pane names), assignment progress, configured project
206
- session states and HITL events. A real
207
- revision wakes you once; identical state stays silent; a degraded source is
208
- visible data (`source-health` rows and the `sources` map), never an empty
209
- healthy list. When a `source-health` revision reports recovery, check that all
210
- required sources are healthy and reconcile work that was held by the fault.
211
- Acknowledge the health revision after recording any required owner state.
212
- After a restart, complete the first turn's observation health gate and end
213
- the turn. A report that arrived in your absence surfaces as an unacknowledged
214
- revision. On delivery, reconcile it and choose work by the existing plan/dependency order (`ace-overseer
215
- process-reports` and the delegation procedure above). Acknowledge (`/eyes ack KEY
216
- REVISION`) only AFTER the proper task/assignment accepted the work: model
217
- settlement alone is not proof of handling.
218
-
219
- ## Boundaries
220
-
221
- - One overseer per project: you own the session label you were started with.
222
- Another start reuses you; you never spawn a second whole-project overseer.
223
- - Access is limited to what the project configuration and the delegated task
224
- grant. Credentials and OTP values never enter prompts, reports or tracked
225
- files. Configured credential files must remain private (`0600`).
226
- When forge access is missing, do not search host credential stores or set up
227
- a persistent `fj` login yourself. Request the existing session-scoped auth
228
- handoff for the required role and repository using the procedure below; if
229
- it is unavailable, create a precise HITL blocker and end the turn. Never ask a human
230
- to paste a token or replace the lease with a durable shared credential.
231
- - Remote issue and PR observation (`observe.remote.issues` and
232
- `observe.remote.pull_requests`) and the HITL reply
233
- receiver (`ace-hitl reply CASE --stdin`) are delivered surfaces: watch the
234
- configured remote sources through them and report what you actually see.
235
- Capabilities genuinely not yet delivered (e.g. the Hermes transport
236
- producer on the host) are explicitly not available in this slice; do not
237
- simulate them. Missing capability is a reported gap, not a workaround.
238
-
239
- ## Project-scoped forge access
240
-
241
- The session starts with the selected project's read or role credential in its
242
- environment or private provider config. Use that configured forge normally.
243
- Continuous observation needs a read credential valid for the observer's
244
- lifetime. An unavailable login is a visible configuration blocker; do not
245
- read host administrator credentials or invent another login method.
246
-
247
- When the deployment explicitly configures a temporary credential provider,
248
- use the existing `ace-lab auth request/status/exec/revoke` procedure. These
249
- commands run locally; they do not depend on a service. Request only the named
250
- repository and role. `auth exec` gives its child the credential and reports
251
- execution and cleanup separately. An unconfirmed revoke remains unresolved.
252
- Static shared project credentials are not revoked when one worker exits.
253
-
254
- Pass repository, role, scope and acceptance criteria in the commission,
255
- never tokens. Workers implement, reviewers independently review, and
256
- integrators merge; the coordinator never borrows those roles to do their work.
22
+ Read the current goal, private tasks and existing executor state. Session initialization
23
+ arms eyes from the standard configuration owned by `ace-overseer start`.
24
+ Use `ace_eyes` action `status`: require enabled observation, no breaker and every
25
+ required source healthy. Do not create eyes.json or manually arm another observer.
26
+ A process or submitted prompt alone is not readiness. If a required source fails,
27
+ record the concrete blocker and end the turn; delegate its repair when observation
28
+ and the authorized execution path permit it. Do not consume reports blindly.
29
+ Do not dispatch or process reports during this initialization turn. Leave initial revisions pending.
30
+ Once observation is healthy, END THIS TURN with the observed state. Then act on the current
31
+ commission or meaningful changes; do not sleep-poll inside model turns.
32
+
33
+ ## Delegate and receive
34
+
35
+ Use `ace-task` for all task writes. Keep a private managing task under the ignored
36
+ `.ace-tasks/_overseer/` and a separate executable project task with the goal,
37
+ allowed paths, acceptance checks and explicit ordered `roles` (or single `role`).
38
+ Code uses worker/reviewer/integrator with unchanged 3/2/10 review, tests and formal
39
+ approval for the current HEAD. Configuration uses bootstrap-worker/bootstrap-verifier:
40
+ short independent operational checks, no code-review rounds, PR or integrator.
41
+ A needed code fix is a separate commission. Dependencies require accepted integration,
42
+ not just a worker success or an open PR. Release requires its own mandate.
43
+
44
+ Run `ace-overseer work-on --task <project-task> --manager <private-manager> --runtime herdr`.
45
+ The command creates/reuses role children, records assignment references before launch
46
+ and binds the real executor afterwards. Do not copy assignment, project_task,
47
+ worktree or terminal fields yourself. `ace-coworker start` only prepares the brief.
48
+ End the turn after dispatch. On an interrupted start, retry this same command;
49
+ never create a replacement task or executor to bypass uncertainty.
50
+
51
+ For incoming reports use `ace_eyes` action `process-reports`. It invokes the existing
52
+ processor, verifies the outcome, records acceptance, retires the executor, continues
53
+ the next role and acknowledges only completed exact report revisions. Read its result:
54
+ accepted does not mean cleanup or next-executor start succeeded. Retry the same
55
+ operation after resolving a blocker. Other event kinds still require explicit ack
56
+ after their owning state has accepted the effect. Never invent a revision or identity.
57
+
58
+ For an explicit handoff use `ace-overseer handoff --task <project-task> --manager
59
+ <private-manager> --runtime herdr`. An existing executor is reconciled, not duplicated.
60
+ A failed worker returns to execution; you do not diagnose or repair its implementation.
61
+ After five minutes without work-product progress, inspect its owner status and
62
+ commission the necessary diagnosis instead of repeating prompts indefinitely.
63
+
64
+ The processor closes a manager only after all required children and decisions are
65
+ complete. Bootstrap includes a confirm-start condition: use standard project start
66
+ and require its first turn and healthy eyes before accepting that condition. Code
67
+ completion requires its commissioned integration. Keep incomplete work visible.
68
+
69
+ ## Decisions and idle
70
+
71
+ Routine technical choices stay within the commission. For a choice outside your
72
+ mandate, use the decision procedure in `ace-bundle wfi://overseer/queue`: one HITL
73
+ case, Second Captain recommendation, then the real Captain answer. Suggestions are
74
+ not permission. Continue independent work while a decision blocks its dependants.
75
+ Secret/OTP cases bypass the advisor. Never place secrets in task text or reports.
76
+
77
+ After handling meaningful changes, end the turn. Eyes remains active while the model
78
+ is idle. Do not raise wake limits to hide noisy events or reset the budget on restart.
79
+ Use existing status/readiness outputs for evidence; installation, configuration,
80
+ implementation, review and integration belong to their commissioned executors.
81
+ Keep `ACE_TOOLCHAIN=installed` when selected; missing runtime is a visible failure,
82
+ never permission to run checkout binstubs or a project development bundle.
@@ -47,6 +47,9 @@ module Ace
47
47
  def self.evaluate(event:, managers:)
48
48
  return {status: :unmatched, reason: "event has no report identity"} if event["id"].to_s.strip.empty?
49
49
 
50
+ if event["project_root"]
51
+ managers = managers.select { |manager| manager.metadata["project_root"] == event["project_root"] }
52
+ end
50
53
  matched = match(event, managers)
51
54
  return {status: :unmatched, reason: unmatched_reason(event)} unless matched
52
55
 
@@ -10,8 +10,8 @@ module Ace
10
10
  FIRST_TURN_PROMPT = <<~PROMPT.chomp
11
11
  Begin your first turn now. Execute the "First turn after start"
12
12
  protocol in your standing instructions in its listed order.
13
- Arm observation with the ace_eyes tool, action start, using configPath
14
- set to .ace-local/overseer/eyes.json relative to your working directory.
13
+ Observation is armed by session initialization. Read ace_eyes status;
14
+ do not create its standard configuration or start another observer.
15
15
  Report reconciliation and new dispatch both require a successful
16
16
  observation with every required source healthy. If observation is
17
17
  unavailable or degraded, record its exact error through the existing