Turns a task you keep doing by hand into a paused GitHub Copilot Automation with an event trigger, a least-privilege tool list, a PARAMETERS + CONTRACT prompt, a quiet exit and a propose-only improver sibling. It creates automations, so it runs only on `/lever automate` or an explicit ask ("automate this", "run this on every PR/issue", "do this nightly", "make this run in the cloud"). When the same task has been done 3 or more times by hand, or a local self-wake has fired 5 or more times for the same job, suggest it in one line instead of running it.
npx skills add https://github.com/github/lever --skill automate-it
Repeatable work belongs in the cloud, on an event, with nobody babysitting it. This skill moves a task you already know how to do (a prompt you keep retyping, a local template, a self-wake loop) into a GitHub Copilot Automation. The automation starts paused, holds only the tools its allowed actions need, ends every run with an explicit outcome, and gets a sibling that proposes improvements for a human to apply. You stop being the motor and the update loop; you become the approver.
find-the-loop first if you can't name the metric.useful outputs / eligible events, for example "opted-in PRs merged within 24 h of first green / opted-in PRs". A duration is not a finish condition. Refuse to continue without a denominator.NOOP is success.-is:draft, label:shepherd, branch:main) on every PR and issue trigger. Don't wake on your own writes. Exclude events whose actor is the automation's own identity, and events for a head SHA the automation just pushed. In one long-running coordinator, about 1 in 6 wakes was the agent reacting to its own push, PR or merge, and about 6 in 10 wakes did nothing. Filter at the subscription; a prompt rule still pays for the wake. Triggers decide cost: an unfiltered per-push trigger can multiply runs per PR without adding signal.github/update_automation to a worker or an improver.ACTED(summary), NOOP(reason) or BLOCKED(reason) — and writes one record per run.create_automation and friends) have to be available. The Copilot app has them built in. Copilot CLI hides them by default: restart with copilot --enable-all-github-mcp-tools. If they're missing, stop here, hand the user the drafted spec, and tell them how to get the tools. Don't pretend you created anything.get_automations_configuration_for_repository: automations are enabled and you can create them; note allowed models and ownership.list_automations: no existing automation with the same name or trigger.list_available_automation_triggers and list_available_automation_tools: every trigger name, field and tool id in your spec exists.create_automation with disabled: true, write_scope: "trigger" unless a repository-wide write is required, allow_copilot_triggers: false unless the job is loop-safe and capped, and require_actor_write_permission: true on public repos where untrusted users can fire the trigger.get_automation must echo the exact triggers, tools, model, write scope and disabled: true. Diff it against your spec. Tool and trigger edits replace the whole list; always resubmit the full list.10. Dry-run on 3 historical items. Set MODE: dry_run in PARAMETERS, then either run the same prompt and tools in a local session (parity: manual and automated runs should be the same thing), or call run_automation with resource_url set to each historical item. run_automation is a real run, so for a strict dry run temporarily submit a read-only tool list, then restore the full list. Pick one item that should ACT, one that should NOOP and one edge case. Show the user the three records.
11. Enable on approval. Ask once, with the dry-run records attached. Then update_automation with disabled: false and MODE: act. Don't ask again for permission you already have (see autonomy).
12. Pair with an improver sibling. Create it from automations/improver, also paused. Optionally group both with create_automation_group and add_automation_to_group.
13. Qualify before you trust it. Treat the automation as migrated only once it has produced real outputs *and* kept picking up work from events, with no local prompting, over an agreed window (for example a week). Stop any local job doing the same work so the two never compete. One good run isn't a migration.
14. Hand off. Report the automation id, revision number, model tier and why, how to pause it, where its records live, and the metric's baseline.
| Dial | Default | Options |
|---|---|---|
| Trigger breadth | One event trigger + query filter + daily or hourly sweep | Event only; sweep only; more event types (each adds runs) |
| Query filter | -is:draft on PR triggers; label or branch filter where possible | None (costly), path filter, label opt-in |
| Wake filter | Exclude self-actor and self-pushed SHAs | Include (only for loop-safe, capped jobs) |
| Model tier | Standard tier | Premium tier costs about 15× per call. Record why in the description; let the improver re-test the choice |
| Write scope | trigger (only the resource that fired) | repository (digests, tracking issues, ledgers) |
| Autonomy level (AUTONOMY) | The level the recipe states, never above the repo default; L0 if the recipe doesn't say | Up to L5 per docs/autonomy.md, capped by repo rules; the tool list enforces it |
| Writes per run | 1 | Integer; plus open-automation-PR cap (5) |
| Evidence budget | 3 items assessed, 10 logs read, 20 records scanned | Integers |
| API budget | 75 REST calls per useful output, shared across automations | Integer; see run-health-review |
| allow_copilot_triggers | false | true with a daily usage limit (it can trigger itself) |
| Ownership | user for the pilot | repository once proven |
| Improver authority | Propose-only | There is no "apply" setting; a human applies |
| Rollout | paused → dry_run → act on one repo | → more repos → org |
The tool list is the enforcement; PARAMETERS is the intent. Below L3 the merge tool is not in the list at all.
automations/<job>/prompt.md) so revisions diff like code. Start from a recipe when one fits.create_pull_request and update_issue_state.Take github/automate-it 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.