agent-conveyor 0.1.23 → 0.1.24

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.
package/README.md CHANGED
@@ -194,7 +194,12 @@ worker have visible app-thread send receipts, fresh app heartbeats, durable
194
194
  received/accepted acknowledgements, and an `app-smoke status` result with
195
195
  `real_work_allowed=true`. The plain CLI records and evaluates receipts; the
196
196
  Codex app skill/operator layer must perform live `send_message_to_thread`
197
- delivery and record `sent`, `blocked`, or skipped/advisory evidence.
197
+ delivery and record `sent`, `blocked`, or skipped/advisory evidence. After
198
+ required smoke passes, pair and worker-set skills start `app-autopilot` before
199
+ real work so the just-proved sessions keep polling. A setup is autonomous only
200
+ when the emitted heartbeat automation specs have been applied, or explicitly
201
+ deferred as `manual-poll only`; smoke-passed by itself only proves connection
202
+ plumbing at that moment.
198
203
  When the manager is itself running in the Codex app and
199
204
  thread tools are available, the skill should first call `create_thread` for a
200
205
  fresh same-project worker, name it with `set_thread_title`, pass the returned
@@ -560,7 +565,9 @@ stay out of receipts.
560
565
  same blockers without blocking, and skip mode records an explicit bypass. The
561
566
  CLI does not call Codex app thread tools; use the
562
567
  `conveyor-smoke-app-connections` plugin skill from a Codex app operator
563
- session for live `send_message_to_thread` delivery.
568
+ session for live `send_message_to_thread` delivery. A smoke-passed operator
569
+ flow should immediately run `app-autopilot start` and handle the emitted
570
+ automation specs before sending real task prompts.
564
571
  - `app-worker-rotation-plan TASK --old-worker-thread-id ID [--require-handoff]
565
572
  [--reason TEXT] [--json]` — Prepare a Codex app fresh-worker rotation. The
566
573
  CLI verifies that `ID` exactly matches the active bound worker session before
@@ -845,7 +852,8 @@ stay out of receipts.
845
852
  either received, accepted, or blocked on it. `received` requires delivery;
846
853
  `accepted` and `blocked` require consumption. Use this after visible Codex app
847
854
  sessions print `CONVEYOR RECEIVED`; do not use direct app-thread text as the
848
- durable receipt.
855
+ durable receipt. `--from-stdin` expects a JSON object, for example
856
+ `printf '%s\n' '{"summary":"accepted","evidence":["consumed notification"],"blockers":[]}' | conveyor inbox-ack ... --from-stdin`.
849
857
 
850
858
  ### Actuation
851
859
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-conveyor",
3
- "version": "0.1.23",
3
+ "version": "0.1.24",
4
4
  "description": "Local agent manager/worker conveyor control plane for Codex sessions.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-conveyor",
3
- "version": "0.1.23",
3
+ "version": "0.1.24",
4
4
  "description": "Codex operator skills for Agent Conveyor manager-worker setup.",
5
5
  "skills": [
6
6
  "conveyor-app-wake-relay",
@@ -28,6 +28,14 @@ tranche.
28
28
  `conveyor-smoke-app-connections` skill in required mode. If smoke fails, do
29
29
  not send the real task prompt; return the exact smoke blockers and repair
30
30
  action.
31
+ - After required smoke passes, start app-autopilot before sending real work:
32
+ `conveyor app-autopilot start "$TASK" --dispatcher-id dispatch-local --path "$LEDGER" --json`.
33
+ Apply the emitted Codex app automation specs when automation tools are
34
+ available. If they are unavailable, report the pair as `manual-poll only`
35
+ and include the manager/worker heartbeat prompts.
36
+ - Do not report a created pair as autonomous unless required smoke passed,
37
+ `app-autopilot start` succeeded, and automation specs were either applied or
38
+ explicitly deferred by the operator.
31
39
  - Tell the operator to use `conveyor-app-wake-relay` for stale app threads;
32
40
  direct app-thread prompts are wake prompts only, not durable task truth.
33
41
 
@@ -45,7 +53,14 @@ LEDGER="$PWD/.codex-workers/workerctl.db"
45
53
  3. Run `conveyor create-disposable-binding` with the created thread ids and:
46
54
  `--path "$PWD/.codex-workers/workerctl.db" --json`.
47
55
  4. Run `conveyor-smoke-app-connections` for the created task. Required smoke
48
- must pass before the real task starts.
49
- 5. Return the manager thread title/id, worker thread title/id, ledger path,
56
+ must pass before the real task starts, and the smoke skill must start
57
+ app-autopilot before returning `real_work_allowed=true` as actionable.
58
+ 5. If automation tools are available, create the manager and worker heartbeat
59
+ automations from the `app-autopilot start` output. If automation tools are
60
+ not available, return the automation specs and mark the setup
61
+ `manual-poll only`.
62
+ 6. Return the manager thread title/id, worker thread title/id, ledger path,
50
63
  task name, and exact status command:
51
64
  `TASK="example-task"; conveyor app-loop-status "$TASK" --path "$PWD/.codex-workers/workerctl.db" --json`.
65
+ Include `app-autopilot status` and whether heartbeat automation specs were
66
+ applied, deferred, or blocked.
@@ -22,6 +22,14 @@ not run a campaign, Ralph loop, ship-it loop, or tmux workflow.
22
22
  set passes only when every required worker smoke passes. If any smoke fails,
23
23
  do not send real task prompts to any worker; return exact blockers and repair
24
24
  actions.
25
+ - After each worker task's required smoke passes, start app-autopilot for that
26
+ task before sending real work:
27
+ `conveyor app-autopilot start "$TASK" --dispatcher-id dispatch-local --path "$LEDGER" --json`.
28
+ Apply emitted Codex app automation specs when automation tools are available,
29
+ or report that shard as `manual-poll only`.
30
+ - Do not report a worker set as autonomous unless every worker task has passed
31
+ smoke, started app-autopilot, and had automation specs applied or explicitly
32
+ deferred by the operator.
25
33
  - Tell the operator to use `conveyor-app-wake-relay` for stale app threads;
26
34
  only Dispatch inboxes and Conveyor receipts are durable task truth.
27
35
 
@@ -60,6 +68,8 @@ conveyor create-disposable-binding "$TASK" \
60
68
 
61
69
  5. Run `conveyor-smoke-app-connections` once per worker task. Aggregate the
62
70
  resulting `app-smoke status` receipts. Required smoke must pass for every
63
- worker before the real task starts.
71
+ worker before the real task starts. Each shard must also start
72
+ app-autopilot before it is treated as autonomous.
64
73
  6. Return a setup receipt listing every task, worker role, thread id/title,
65
- manager thread id/title, ledger path, smoke id/status, and status command.
74
+ manager thread id/title, ledger path, smoke id/status, autopilot status,
75
+ automation spec state, and status command.
@@ -35,6 +35,9 @@ only.
35
35
  `app-smoke status`.
36
36
  - If `conveyor app-smoke status` reports `real_work_allowed=false`, do not send
37
37
  the real task prompt.
38
+ - Prompts that ask a manager or worker to use `--from-stdin` must include an
39
+ explicit JSON stdin example. Do not rely on the target session to infer the
40
+ payload format.
38
41
 
39
42
  ## Default Ledger
40
43
 
@@ -109,9 +112,12 @@ Then poll for the worker smoke report:
109
112
  conveyor manager-inbox '<TASK>' --consume-next --wait --timeout 60 --path '<LEDGER>' --json
110
113
 
111
114
  If you consume a manager inbox item for smoke <NONCE>, record:
112
- conveyor inbox-ack '<TASK>' --notification-id '<consumed.id>' --role manager --status received --from-stdin --path '<LEDGER>' --json
113
- conveyor inbox-ack '<TASK>' --notification-id '<consumed.id>' --role manager --status accepted --from-stdin --path '<LEDGER>' --json
114
- conveyor app-smoke record '<TASK>' --smoke-id '<SMOKE_ID>' --nonce '<NONCE>' --role manager --status accepted --thread-id '<MANAGER_THREAD_ID>' --notification-id '<consumed.id>' --from-stdin --path '<LEDGER>' --json
115
+ printf '%s\n' '{"summary":"manager received worker smoke report","evidence":["consumed manager inbox item for smoke <NONCE>"],"blockers":[]}' \
116
+ | conveyor inbox-ack '<TASK>' --notification-id '<consumed.id>' --role manager --status received --from-stdin --path '<LEDGER>' --json
117
+ printf '%s\n' '{"summary":"manager accepted worker smoke report","evidence":["worker report nonce matched <NONCE>"],"blockers":[]}' \
118
+ | conveyor inbox-ack '<TASK>' --notification-id '<consumed.id>' --role manager --status accepted --from-stdin --path '<LEDGER>' --json
119
+ printf '%s\n' '{"summary":"manager accepted app smoke","evidence":["fresh manager heartbeat","worker smoke report consumed","worker nonce matched <NONCE>"],"blockers":[]}' \
120
+ | conveyor app-smoke record '<TASK>' --smoke-id '<SMOKE_ID>' --nonce '<NONCE>' --role manager --status accepted --thread-id '<MANAGER_THREAD_ID>' --notification-id '<consumed.id>' --from-stdin --path '<LEDGER>' --json
115
121
 
116
122
  If blocked, record app-smoke blocked with the exact blocker.
117
123
  Stop after the smoke receipt. Do not start real work.
@@ -152,12 +158,16 @@ conveyor app-heartbeat '<TASK>' --role worker --path '<LEDGER>' --json
152
158
  conveyor worker-inbox '<TASK>' --consume-next --wait --timeout 60 --path '<LEDGER>' --json
153
159
 
154
160
  For the consumed smoke item, record:
155
- conveyor inbox-ack '<TASK>' --notification-id '<consumed.id>' --role worker --status received --from-stdin --path '<LEDGER>' --json
156
- conveyor app-smoke record '<TASK>' --smoke-id '<SMOKE_ID>' --nonce '<NONCE>' --role worker --status received --thread-id '<WORKER_THREAD_ID>' --notification-id '<consumed.id>' --from-stdin --path '<LEDGER>' --json
161
+ printf '%s\n' '{"summary":"worker received smoke item","evidence":["consumed worker inbox item for smoke <NONCE>"],"blockers":[]}' \
162
+ | conveyor inbox-ack '<TASK>' --notification-id '<consumed.id>' --role worker --status received --from-stdin --path '<LEDGER>' --json
163
+ printf '%s\n' '{"summary":"worker received app smoke","evidence":["fresh worker heartbeat","worker inbox item consumed","nonce matched <NONCE>"],"blockers":[]}' \
164
+ | conveyor app-smoke record '<TASK>' --smoke-id '<SMOKE_ID>' --nonce '<NONCE>' --role worker --status received --thread-id '<WORKER_THREAD_ID>' --notification-id '<consumed.id>' --from-stdin --path '<LEDGER>' --json
157
165
 
158
166
  Then record accepted:
159
- conveyor inbox-ack '<TASK>' --notification-id '<consumed.id>' --role worker --status accepted --from-stdin --path '<LEDGER>' --json
160
- conveyor app-smoke record '<TASK>' --smoke-id '<SMOKE_ID>' --nonce '<NONCE>' --role worker --status accepted --thread-id '<WORKER_THREAD_ID>' --notification-id '<consumed.id>' --from-stdin --path '<LEDGER>' --json
167
+ printf '%s\n' '{"summary":"worker accepted smoke item","evidence":["smoke instructions understood","no product work started"],"blockers":[]}' \
168
+ | conveyor inbox-ack '<TASK>' --notification-id '<consumed.id>' --role worker --status accepted --from-stdin --path '<LEDGER>' --json
169
+ printf '%s\n' '{"summary":"worker accepted app smoke","evidence":["smoke item accepted","nonce matched <NONCE>"],"blockers":[]}' \
170
+ | conveyor app-smoke record '<TASK>' --smoke-id '<SMOKE_ID>' --nonce '<NONCE>' --role worker --status accepted --thread-id '<WORKER_THREAD_ID>' --notification-id '<consumed.id>' --from-stdin --path '<LEDGER>' --json
161
171
 
162
172
  Finally notify the manager:
163
173
  conveyor enqueue-notify-manager '<TASK>' --message 'CONVEYOR SMOKE <NONCE>: worker accepted smoke.' --correlation-id '<SMOKE_ID>-worker-report' --path '<LEDGER>' --json
@@ -189,6 +199,33 @@ conveyor app-smoke status "$TASK" --smoke-id "$SMOKE_ID" --path "$LEDGER" --json
189
199
  If `real_work_allowed=true`, the setup may send the real work prompt. If
190
200
  `real_work_allowed=false`, report exact blockers and stop.
191
201
 
202
+ 8. Start app-autopilot immediately after required smoke passes and before
203
+ sending real work:
204
+
205
+ ```bash
206
+ conveyor app-autopilot start "$TASK" \
207
+ --dispatcher-id dispatch-local \
208
+ --path "$LEDGER" \
209
+ --json
210
+ ```
211
+
212
+ The operator or manager must apply the emitted Codex app automation specs with
213
+ Codex app automation tools. If automation tools are unavailable, report the
214
+ task as `manual-poll only` and include the manager and worker heartbeat prompts
215
+ from the autopilot output. Do not report the pair as autonomous until autopilot
216
+ is started and its automation specs are either applied or explicitly deferred.
217
+
218
+ 9. After autopilot start, run:
219
+
220
+ ```bash
221
+ conveyor app-autopilot status "$TASK" --path "$LEDGER" --json
222
+ conveyor app-loop-status "$TASK" --path "$LEDGER" --json
223
+ ```
224
+
225
+ If `app-loop-status` reports stale manager or worker immediately after
226
+ autopilot setup, wake the stale role or report the exact blocker before sending
227
+ real work.
228
+
192
229
  ## Worker Set Flow
193
230
 
194
231
  For worker sets, run the pair flow once per bound worker task. Treat each worker
@@ -214,7 +251,10 @@ End with:
214
251
  - `blocked_roles`
215
252
  - `status_after`
216
253
  - `real_work_allowed`
254
+ - `autopilot_status`
255
+ - `automation_specs_applied_or_deferred`
217
256
  - `next_action`
218
257
 
219
258
  If any role is blocked, name the exact blocker and do not report the smoke as
220
- passed.
259
+ passed. If smoke passed but autopilot was not started or automation specs were
260
+ not applied/deferred, report the pair as smoke-passed but not autonomous.