Runs long-lived delivery as a coordinator with parallel lanes. Sets authority and pacing dials up front, keeps lanes alive and fed, lands work through a single-writer release train, and reports status only when something changed. Runs only on `/lever deliver`, "/autonomous-delivery" or an explicit request to run multi-hour, overnight or multi-lane delivery ("run this overnight", "keep N streams going", "don't stop until it ships"), or to re-arm an existing run after a restart.
npx skills add https://github.com/github/lever --skill autonomous-delivery
Organize the work, keep it moving, and keep improving how it is organized. This is the coordination skill for build mode: large new work where the process is to file issues, let independent sessions work them in parallel, then merge and deploy. There may be no metric to climb, and that's fine. When a lane does have a measurable signal, that lane runs find-the-loop. A coordinator holds your intent, splits it into lanes, and delegates each lane to a child session that owns an outcome. Children may run their own workers. The coordinator optimizes for verified outcomes per hour, not agent activity. Quality and throughput are joint goals, and you never buy speed by weakening the outcome. For a delivery mandate, the outcome is working behavior observed on the real path, not source code or an open PR.
A skill is not authorization. But existing delegation *is* authority within its scope, and it doesn't need to be requested again at every step.
Version 3 builds on the public autonomous-delivery skill, v2.1 (MIT). It keeps the adaptive orchestrator-worker pattern and adds the rules that weeks of real unattended runs forced into existence. Dials are set up front. Stalled children are restarted automatically. The watchdog metric is time since last merge. Wakes with nothing new stay silent. A stuck lane gets re-planned after two hours. Releases have one writer. The backlog never runs dry. Constraints that agents invent come with a source and an expiry.
Worked examples, templates and the full list of changes since v2.1 are in reference.md.
Don't use it for:
pr-shepherd.brief first and hand the result to this skill.Long-running coordinators fall behind. At session start and after any long gap:
Ask only for the dials the prompt didn't already answer, in one message that takes under a minute. Offer a preset. Store the answers in the ledger header (templates/ledger.md). Echo the contract back in one line, for example: Overnight preset · L2 (your dial; ceiling L4) · standard spend · 3–5 lanes · refill when idle · sweep 30m · report 08:30 PT. When re-invoked, read the stored dials and continue without asking again.
| Dial | pair (you're here) | overnight (you're away until a set time) | unattended (ongoing, no end time) |
|---|---|---|---|
| Autonomy | your dial (unchanged) | your dial (unchanged) | your dial (unchanged) |
| Spend | your tier | your tier; offer max for a deadline push | your tier, premium for judgment only |
| Lanes (min–max), capped by your tier | 1–3 | 3–5 | 5–8 |
| Idle policy | wait for events | refill from the backlog | refill from the backlog |
| Liveness sweep | off (events only) | every 30 min | every 15 min |
| Stall threshold (time since last merge) | report only | 2 h → act | 45 min in active hours → act |
| Stuck rule | 2 h → re-plan and ask | 2 h → re-plan with a rubber duck | 2 h → re-plan with a rubber duck |
| Status | at milestones | once, at your wake time | daily digest plus milestones |
| Human-only questions | ask now | queue for the morning report | queue for the daily digest |
| Budget stop | none | report at 80% | hard stop at 80%; won't start without a finite budget |
| Self-edit of this skill | off | propose | propose |
Presets change pacing, parallelism and spend. They never change autonomy. Lane counts and sweeps stay inside your spend tier's caps (docs/spend.md), and a preset never switches your tier without asking.
The autonomy level is resolved per docs/autonomy.md: your latest explicit word (dial file, kickoff or chat), capped by .github/lever.yml and GitHub. If the prompt already said "then merge" or "hand off to the owning team", that is the answer. Don't ask again. Silence is not a grant. Without an explicit merge grant from you, work at L2 at most.
unattended has no end time, so it needs a finite budget before it starts: budgets: in .github/lever.yml, a cap in your spend dial, or a number you give in the setup answer. No budget, no start. Say so in one line.
Owner directive format. When the operator changes direction mid-run, record it as: outcomes (priority, label rule, cap) · workers: N · merge authority: <who> · release owner: <who> · tracking: <issue> · until: <condition>. A newer directive supersedes older ones and any repo doc that conflicts with it, except .github/lever.yml, rulesets and CODEOWNERS, which change only by PR. Fix a conflicting doc in a follow-up PR rather than obeying it.
find-the-loop for any lane without one).landing-plan for batches.Fit the organization to the work. A small fix or one tightly coupled investigation stays with one worker. Independent outcomes get separate owners. A large domain can get its own orchestrator when its local decisions would overload you. max_lanes is a cap, not a quota. Don't create agents to review each other just to satisfy process, and collapse layers that only relay messages.
Parallel by default. When the user raises a new outcome mid-stream, start a new dedicated owner for it right away and keep current work moving. Don't queue independent investigations, fixes or experiments behind a release or another lane unless they really share a resource. The user should never have to say "in parallel".
Claim before you write. Find or create a tracking issue for each outcome, labelled lever and assigned to the outcome owner, with lanes as sub-issues (docs/tracking.md). Given #issue, resume from it: the brief, the lanes and the status section are the state. Write yourself into its marker as coordinator. If the marker names another coordinator, stay read-only and say who's driving. Take over only on an explicit handoff, or a stale marker per docs/tracking.md, and re-read the marker right before each write. If it isn't yours anymore, back off. Check assignees, linked PRs and active sessions before claiming. Assignment is not an atomic lock: if two owners claim the same thing, reconcile instead of starting a second writer.
Each child gets a standalone brief (templates/brief.md; see the envelope in reference.md) with the user's words verbatim, the outcome and its done-when, the feedback loop, the files it owns, its slice of the shared budget, and the inherited autonomy level. Its escalation target is the parent, not the human, and it runs in autopilot, never waiting on a human prompt.
Every constraint carries provenance and an expiry:
constraint | source (operator | repo | platform | agent:<lane>) | set | expires | why
agent_constraint_ttl. It never becomes a project-wide rule."Narrow, never widen" on its own drives authority toward zero down a three-level tree, because every layer adds a gate and nobody clears them.
Handoff message. A worker finishing a PR sends one line: READY <pr> <head-sha>. The receiver re-runs the gate itself on that head: open, not draft, mergeable, every required check green on that exact SHA, zero unresolved threads, and diff reviewed. It merges with an expected-head guard. A worker's claim is evidence level *claimed*, never *green*.
Model choice: give the coordinator strong reasoning, give well-scoped implementation fast capable workers, and save the strongest reasoning for hard diagnosis and stuck lanes. Respect your stated model preferences.
Start from a concrete hypothesis. Inspect the evidence, make the smallest coherent change, run focused checks and the required CI, land at the resolved level, exercise the real path, inspect the result, and iterate.
Handle child completions and GitHub events as they arrive: reconcile, unblock, route each merged SHA to the release owner, and start the next ready lane. When the sweep fires (sweep_interval, or a scheduled /lever deliver #<issue>), check the marker is still yours, then:
stall_threshold. If it's over, name the binding constraint (empty backlog, CI, review, quota, permission, a stuck lane) and act on it.pr-shepherd.Keep one short current-state checkpoint per lane: owner, outcome, evidence, blocker, next action. Store historical receipts separately; they are evidence, not current restrictions. Don't re-read unchanged ledgers, and don't ask owners for generic status when no decision depends on it. Busy doesn't prove progress, silence doesn't prove a stall, and idle doesn't mean complete or safe to archive.
If nothing changed since the last watermark, end the wake silently: no message, and no task invented to justify the wake. Never sleep or poll inside a turn. Give the waiting agent other work instead.
Per-PR landing belongs to pr-shepherd, at the resolved level. After a merge, release and the next implementation run in parallel: hand the exact merged SHA to the release owner and pick up the next ready work immediately. Don't serialize the team behind deployment, and don't create a second deployer. At L5, one release-owner lane is the only writer of releases. Other lanes send it merged SHAs. The release owner:
Never redeploy unchanged source just to look busy, and never waive CI or compatibility checks to simulate continuous deployment. Use expand → migrate → contract for format changes. Use maintenance windows only for breaking changes or data migrations. Report merge→production latency.
Pick the release target once per train. Late retargets ("final target update", "revert", "ship whichever goes green first") cost a full re-plan each. Batch everything merged since the last release, and change target only for a regression.
idle_policy = refill)"Nothing to do" is not a valid end state for an ongoing mandate. Keep min_lanes busy. When the ready pool runs low, draw from the standing backlog you agreed in setup:
Run standing lanes on change, not on a timer. Revisit affected user journeys after meaningful UI or contract changes and releases, comparing them against agreed reference behavior: loading, error and empty states, accessibility, responsive layout. When you triage tool or error failures, keep the observation window and its limits: failure-only samples can't give you a failure rate, and missing logs don't prove success. Never replay a real mutation to test a hypothesis. Reuse existing findings, and don't re-audit unchanged surfaces.
You can also file new, independently mergeable work with keep-the-pool-full. Refilling counts as a change, so it isn't a silent wake. For finite work with idle_policy = wait, stop when the outcome is verified.
If a lane has gone stuck_threshold without meaningful progress:
cross-model-review).A question that truly needs a human states:
Do the work yourself through APIs and tools whenever a route exists. Never make manual testing, a human sign-in or a settings click a prerequisite when there's an automated way. If a setting really is UI-only, give the exact URL and paste-ready values once, then continue.
Ask it once. In overnight or unattended mode, put it in the next status report instead of interrupting. Keep working on everything that doesn't depend on the answer. An automatic "user unavailable" reply is not new evidence, so don't ask again. Never ask for permission the level already grants. Never invent an approval step, an exact-GO phrase, a lock or a preflight.
When a worker fails permanently, start exactly one replacement per issue. It continues the same branch and PR after reading the predecessor's handoff. Never start a fresh branch, and never start two replacements.
Use progress-contract and templates/status-digest.md.
x → y (Δz%), with merged count, time since last merge, and the previous ETA vs. actual.Before you go offline, or at the end of the absence window:
templates/handoff.md);At meaningful points (after a batch lands, after a stall, at each digest), ask whether this organization is producing verified outcomes faster. Then:
steer-once. Don't just apologise and carry on.experiment-arms), not one before/after change at a time. Search on replayed or seeded tasks, then confirm the winner on live work.The long-term direction is for repeatable lanes (review, CI repair, issue repro, status, next-work pickup) to run as Copilot Automations, while the local coordinator moves toward supervision and exceptions. You don't need a hierarchy or cross-session messaging first. Start with independent jobs that read durable inputs (issues, PRs, artifacts) and write durable outputs (reviews, labels, PRs). Use automate-it for each one.
Move one bounded lane at a time, under explicit ownership:
Rules:
| Dial | Default | Options |
|---|---|---|
| preset | pair | pair, overnight, unattended, custom |
| autonomy | Resolved per docs/autonomy.md | L0–L5, capped by the repo ceiling |
| min_lanes / max_lanes | 1 / 3 | integers; depth ≤ 3 |
| idle_policy | wait | wait, refill, stop |
| standing_backlog | none | list of recurring lane types |
| sweep_interval | off | minutes |
| stall_threshold | 2 h, report only | duration; report or act |
| stuck_threshold | 2 h | duration; escalation models |
| agent_constraint_ttl | end of assignment | duration |
| absence_window | none | until a time, N hours, or indefinite |
| status | milestones; your timezone | cadence, horizon, channel |
| human_questions | ask now | ask now, queue for the next report |
| budget | budgets: in your repo's .github/lever.yml, then your spend tier | API calls per merged PR, CI minutes, credits; stop at a percentage. Required for unattended |
| release | none | none, train (single writer), per merge |
| self_edit | off | off, propose, commit (through the level) |
stall_threshold without a named cause.progress-contract exists.Take github/autonomous-delivery from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.