name: wf-pilot
description: Use when the owner types /wf-pilot in a project session (often an idle session opened from the phone app via Remote Control) to pilot an overnight run of headless wf batch runs; the session itself stays tiny. Args - "[--batch 4] [--lanes a,b] [--for 8h]" (tasks per batch default 4; lanes default all; deadline default 8h).
disable-model-invocation: true
wf pilot (nested overnight run, never asks)
wf = python3 /projects/public/workflow/wf.py. You pilot headless batch orchestrators (wf batch K, each a fresh
claude -p that spawns the workers) — never pick, spawn workers, implement or read code; never wf next --as.
Background: /projects/public/workflow/docs/orchestrator.md 'Pilot (nested)'.
Cloud lane (project cloud = true) runs inside each batch: its prompt makes the batch run wf orch pick cloud until stop, wf cloud pull --all at most every 10 min, wf orch post <id> cloud per ended task; a cloud stop never stops local lanes (pilot needs no extra step). Needs the owner allow rule
Bash(python3 /projects/public/workflow/wf.py batch:*); denied → tell the owner, end.
Start (no proposal, no questions)
K = --batch (4); deadline = now + --for (8h); lanes = --lanes or all. wf lanes · wf list -s awaiting
(remember the awaiting ids). One status line to the owner, then go.
Loop
- Launch:
wf batch K [--lanes …] --left <time left>(K shrinks to the tasks that fit by history,--for= left) →<rid> started→ background Bashwf res wait <rid> --timeout <same>; end the turn.fit: 0 of K …; nothing started→ stop (step 6, why: deadline). Exit 3 (busy) → background Bashsleep 600, then retry. - Wait exit →
wf batch --status(newest summary) → one line to the owner andout/wf-orch.log:<HH:MM> pilot batch <n> rc=<rc> done=<ids> stopped=<lanes: why> added=<ids>. No task bodies, no logs. A handback/awaiting/needs-owner blocks only its task (parked bywf orch post, alert); its lane stays in the next batch while it has pickable tasks. Never wait on the owner while tasks are pickable. - Failure (rc≠0, or no new summary file) → retry once; second failure → stop (step 6).
Memory:
wf resthrottled warning on a running batch → never kill it (workers mid-task); log it (<HH:MM> pilot batch <n> throttled); next batch--mem= 1.5 × last (cap perwf res free). Batch oom-killed → re-run the same N with 1.5 ×--mem. wf list -s awaitinghas new ids → alertwf-pilot <project>: awaiting <ids>; keep going.- Next: deadline passed → stop. Else
wf lanes: a lane pickable → step 1. None, and a lane showsnot runner-ready→ prep batch once per idle spell (until a batch ran again):wf batch 10 --prep [--lanes …] --for 1h(prep: … nothing started→ skip it) → backgroundwf res wait <rid>→wf batch --status→ log line<HH:MM> pilot prep rc=<rc> done=<ids> awaiting=<ids>(new awaiting → alert, step 4) → step 5 again. Else background Bashwf lanes --wait <min(1800, seconds to deadline)>(0 → step 1; 1 → poll again; 2 = stop file → delete it, stop). Seconds left < 60 → stop, no wait. - Stop: append a summary line to
out/wf-orch.log(batches, done ids, added ids, why stopped), tell the owner in ≤ 5 lines, alertwf-pilot <project>: ended (<why>), end. Never kill a running batch.
Alert = PushNotification AND an ALERT <text> line in out/wf-orch.log AND in the summary line/owner message (push may be off; the alert must survive).
Owner messages (win over the loop)
- stop →
wf batch --stop(the running batch spawns nothing more: stops once its running workers finish), then stop after its exit. - skip <id> →
wf move <id> deferred+wf note <id> "pilot: skipped by owner"(a running batch no longer picks it; one already on it finishes). - pause / change lanes / batch size → apply from the next launch. Status? →
wf batch --status, one line. - Never /clear; context stays one line per batch.