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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +40 -0
- data/handbook/workflow-instructions/overseer/bootstrap-delegation.wf.md +35 -298
- data/handbook/workflow-instructions/overseer/lab-start.wf.md +69 -102
- data/handbook/workflow-instructions/overseer/queue.wf.md +39 -219
- data/handbook/workflow-instructions/overseer/start.wf.md +66 -240
- data/lib/ace/overseer/atoms/report_interpretation.rb +3 -0
- data/lib/ace/overseer/atoms/start_contract.rb +2 -2
- data/lib/ace/overseer/cli/commands/handoff.rb +15 -3
- data/lib/ace/overseer/cli/commands/process_reports.rb +33 -4
- data/lib/ace/overseer/cli/commands/start.rb +6 -1
- data/lib/ace/overseer/cli/commands/status.rb +1 -1
- data/lib/ace/overseer/cli/commands/work_on.rb +15 -3
- data/lib/ace/overseer/molecules/coworker_launcher.rb +236 -15
- data/lib/ace/overseer/molecules/event_observation.rb +4 -0
- data/lib/ace/overseer/molecules/eyes_configuration.rb +26 -0
- data/lib/ace/overseer/molecules/eyes_evidence.rb +6 -2
- data/lib/ace/overseer/molecules/eyes_readiness.rb +6 -1
- data/lib/ace/overseer/molecules/eyes_session_evidence.rb +2 -2
- data/lib/ace/overseer/molecules/handoff_probe.rb +2 -1
- data/lib/ace/overseer/molecules/hitl_inbox.rb +18 -5
- data/lib/ace/overseer/molecules/local_sources.rb +32 -6
- data/lib/ace/overseer/molecules/manager_binding.rb +138 -0
- data/lib/ace/overseer/molecules/project_observations.rb +19 -43
- data/lib/ace/overseer/molecules/project_sessions.rb +59 -6
- data/lib/ace/overseer/molecules/report_completion_check.rb +11 -3
- data/lib/ace/overseer/molecules/session_environment.rb +3 -8
- data/lib/ace/overseer/molecules/worktree_provisioner.rb +2 -2
- data/lib/ace/overseer/organisms/handoff_orchestrator.rb +43 -1
- data/lib/ace/overseer/organisms/report_processor.rb +145 -17
- data/lib/ace/overseer/organisms/start_orchestrator.rb +30 -8
- data/lib/ace/overseer/organisms/status_attention.rb +27 -3
- data/lib/ace/overseer/organisms/status_collector.rb +22 -2
- data/lib/ace/overseer/organisms/work_on_orchestrator.rb +33 -7
- data/lib/ace/overseer/version.rb +1 -1
- 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
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
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
|
|
12
|
+
# Project Overseer
|
|
13
13
|
|
|
14
|
-
|
|
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
|
-
|
|
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
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
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
|
-
|
|
14
|
-
|
|
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
|