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