mcpbeat Sign in

Apm Issue Autopilot Skill for Claude

>- Use this skill to drive any open microsoft/apm issue (bug, feature, docs, refactor, perf) from raw intake to a mergeable PR with triage as the central, paramount gate. Run the apm-triage-panel rubric per issue first, then present ONE consolidated triage review for the whole batch and escalate to the maintainer BY DEFAULT on any doubt (needs-design, decline, duplicate, defer, auto-handle, breaking- change, auth/security/governance surface, low arbiter confidence, unbounded scope, or a missing brief); only auto-implement clear, bounded, high-confidence accepts the maintainer approved. Then drive each accepted PR to mergeability batch-bug- follow-ups by default, watch CI green, iterate under a bounded cap. Invoke MANUALLY, in-session, on an issue list or queue -- never by label or event. Activate when the maintainer asks to auto-tackle the issue queue, clear the backlog to PRs, or run issues to merge -- even if "autopilot" is not named.

5.1k tokens
context cost
SKILL.md, read when the skill is used
28
files
ships runnable scripts
0
copies elsewhere
how many repositories repackaged it
3 460
stars on the repo
on the repository, not the skill itself

Install

one command, takes just this skill from the repository
npx skills add https://github.com/microsoft/apm --skill apm-issue-autopilot

What comes with it

104 656 bytes besides the instruction
assets/acceptance-observer.md
assets/autopilot-triage-schema.json
assets/confidence-gate-rubric.md
assets/final-report-template.md
assets/ground-truth-table.md
assets/ideate-prompt.md
assets/implement-bug.md
assets/implement-docs.md
assets/implement-feature.md
assets/implement-refactor.md
assets/model-routing.md
assets/plan-panel-prompt.md
assets/plan-schema.json
assets/solution-pipeline-prompt.md
assets/task-implement-prompt.md
assets/triage-digest-template.md
assets/triage-prompt.md
assets/wave-gate-rubric.md
evals/.gitignore
evals/README.md
evals/content/gate-escalate-doubtful.json
evals/content/gate-proceed-clean-accept.json
evals/content/mixed-types-one-review.json
evals/evals.json
evals/real-task-refinement.md
evals/triggers.json
scripts/run_evals.py

What it tells the agent to use

found in the instruction text
Task spawns other agents

The instruction itself

17 sections, as written by the author

apm-issue-autopilot - intake-to-merge issue orchestrator

This SKILL.md is the natural-language module derived from a genesis

design packet; refactors re-run the genesis skill from that packet.

This skill is an A11 RECONCILIATION LOOP, MANUALLY INVOKED, over a

queue of issues each driven to a terminal state under non-determinism.

It generalizes batch-bug-shepherd

from bugs-only to ANY issue type, and promotes the full

apm-triage-panel rubric to the central

front gate. It does NOT re-implement triage, panel review, or the

per-PR convergence loop -- it COMPOSES existing skills.

What it composes (do not re-implement)

  • apm-triage-panel -- the triage

rubric, run per issue in DIRECT (orchestrator-return) mode.

  • shepherd-driver -- the per-PR drive-

to-merge convergence loop and cross-PR mergeability gate (which in

turn composes apm-review-panel).

  • pr-description-skill -- authors

the anchored, mermaid-validated body of the ONE issue PR opened at

Phase 4 acceptance-close (see assets/acceptance-observer.md). The

PR body is never hand-rolled.

All three are same-repo LOCAL SIBLINGS. This skill DECLARES each

dependency here AND in apm.yml, and PROBES for each at its use-site

(Phase 1 triage, Phase 4 PR-open, Phase 5 shepherd) with a tool call --

never an assertion from recall (A9 SUPERVISED EXECUTION).

Hard boundaries

  • MANUAL invocation only. No event triggers, no label triggers, no

gh-aw. Labels (status/accepted, status/shepherding) are WRITTEN

for bookkeeping but are NEVER the trigger.

  • Triage is paramount. The autopilot ESCALATES to the maintainer by

default; auto-implementation is the narrow exception, reached only

for a clear, bounded, high-confidence accept the maintainer

approved.

  • ONE consolidated triage review for the whole batch, not drop-by-

drop. Exactly one human checkpoint (Phase 2).

  • Never auto-merge. Mergeability is the terminal state; the human

approves the protected merge.

  • Escalation NEVER auto-closes or auto-declines an issue. It surfaces

the issue to the maintainer running the session and leaves it for

human action (inherits batch-bug-shepherd terminal-handling).

Architecture invariants

  • Fan-out, not serial. Triage, solution-pipeline (and its Plan

lenses + per-wave task children), and shepherd-driver all run as

parallel child threads via the runtime task affordance. A

single-loop variant is an anti-pattern. Subagent capacity is

UNLIMITED and is NEVER a deferral reason.

  • Worktree isolation, with one-writer integration. Every solution-

pipeline and shepherd-driver child runs in its OWN git worktree (one

per issue/PR). Within Phase 4, a pipeline child further spawns ONE

task child per task PER WAVE, each in its OWN worktree branched off

the issue branch at the wave base; the pipeline child is the SOLE

WRITER of the issue branch and integrates task branches via `git

merge --no-ff` at the wave gate. Tasks in a wave are mutually

independent and touch disjoint files by construction (planner-

enforced), so integration is conflict-free -- a real conflict is a

planning error and triggers a re-plan, never a hand-resolve. Do NOT

fan out against one shared working tree. Triage and verifier/lens

children are read-only and may share a read-only REPO_ROOT.

  • One persisted state table. A single plan.md ground-truth table

plus a machine-readable proceed_manifest is the canonical session

state (B4 PLAN MEMENTO). Reload it at every phase boundary; never

keep parallel state in memory. The orchestrator is the SOLE writer

(one-writer rule); children return JSON, the parent writes rows.

  • Escalate by default. The confidence gate

(assets/confidence-gate-rubric.md)

routes anything doubtful to the human. Auto-proceed is the exception.

  • Triage children are advisory-only. A triage child runs the

apm-triage-panel rubric and returns structured JSON. It MUST NOT

post a comment, apply a label, touch the working tree, or use any

GitHub safe-output channel. A child that emits a comment is a hard

retry/fail.

  • Fold by default at the PR layer. Inherited from shepherd-driver:

every follow-up inside a PR's stated scope is folded; only scope-

crossing items defer with a one-line boundary note.

  • Deterministic tool bridge. Every consequential write (label,

assign, PR open, push, comment, merge probe) and every present-state

fact (CI status, mergeable, head sha, duplicate existence, PR-in-

flight) goes through a deterministic CLI (gh, git, `uv run

ruff`) wrapped in plan + execute + verify. Never assert these from

recall.

  • ASCII only. All artifacts (tables, comments, commits, the

digest) stay within printable ASCII; status symbols `[+] [!] [x]

[i] [*] [>]`.

Dependency probes (run before composing)

Phase 1 (before triage fan-out):

test -f ../apm-triage-panel/SKILL.md \
  && echo "apm-triage-panel present" \
  || echo "MISSING apm-triage-panel - stop and ask the operator"

Phase 5 (before shepherd-driver fan-out):

test -f ../shepherd-driver/assets/shepherd-driver-prompt.md \
  && test -f ../shepherd-driver/assets/completion-schema.json \
  && test -f ../shepherd-driver/scripts/owner_touch_gate.py \
  && echo "shepherd-driver present" \
  || echo "MISSING shepherd-driver - stop and ask the operator"

Phase 4 (before a pipeline child opens the issue PR -- the child

re-probes this in its own worktree before gh pr create):

test -f ../pr-description-skill/SKILL.md \
  && test -f ../pr-description-skill/assets/pr-body-template.md \
  && echo "pr-description-skill present" \
  || echo "MISSING pr-description-skill - stop and ask the operator"

On a probe MISS, STOP and ask the operator to restore the sibling; do

NOT re-implement the composed logic inline.

Phases

Work through the phases in order. Reload the ground-truth table and

proceed_manifest at each phase boundary (B8 ATTENTION ANCHOR). Do

not skip the consolidated-review gate (Phase 2).

Phase 0 - scope and seed

Take the issue list or queue from the maintainer (explicit issue

numbers, a search query, or "the open backlog"). Resolve it to a

concrete set via gh issue list. Seed the ground-truth table

(assets/ground-truth-table.md) with

one row per issue at status: pending-triage. Record the seed source

and HEAD sha in plan.md. No labels are written in this phase.

Phase 1 - triage fan-out (read-only)

PROBE for apm-triage-panel (above). Then, for EACH issue, spawn ONE

triage child using

assets/triage-prompt.md, at PLANNER class

(claude-opus-4.8) per model-routing.md (Phase 1 triage binding -- the

paramount front gate is front-loaded heavy: a wrong accept burns a whole

downstream pipeline). Each child runs

the apm-triage-panel rubric in DIRECT mode and returns ONE

autopilot-triage-decision JSON matching

assets/autopilot-triage-schema.json.

Children are read-only and post nothing.

This is "A11 per-item child thread running an existing triage module",

not a nested panel-of-panels: each child invokes apm-triage-panel

(which itself spawns no sub-agents) once and returns its decision.

On each return: schema-validate, write the row (decision, type,

confidence, red_flags), set status: triaged. On a child that posted

a comment or mutated the tree, discard and re-spawn ONCE; on a second

violation, mark the row blocked and escalate it in Phase 2.

Phase 2 - consolidated triage review + the ONE human checkpoint

This is the heart of the skill and the single human gate. Do it ONCE

for the whole batch, not per issue.

  • For every triaged row, apply

assets/confidence-gate-rubric.md

to compute a gate: auto-proceed | escalate | terminal.

Escalate by default; auto-proceed only for a clear, bounded, high-

confidence accept whose implementation brief is complete.

  • Write the machine-readable proceed_manifest into plan.md (one

row per issue: `issue, gate, maintainer_decision, override_reason,

implementation_brief_ref, status). maintainer_decision` starts

pending.

  • Render ONE consolidated digest from

assets/triage-digest-template.md:

every issue with its decision, type, confidence, gate, red flags,

and (for auto-proceed rows) the implementation brief. Present it to

the maintainer in-session.

  • Capture the maintainer's decision per row: approved | rejected

| overridden (with override_reason). The maintainer may approve

an escalated row (override to proceed) or reject an auto-proceed

row. Write the result into the proceed_manifest.

All later phases select rows ONLY where gate resolves to proceed AND

maintainer_decision in (approved, overridden-to-proceed). Rows the

maintainer left escalated/terminal are handled in Phase 7.

Phase 3 - ownership signaling + PR-in-flight xref

For each proceed row: cross-reference open PRs that already address

the issue (gh pr list --search). Record pr and pr_in_flight.

Apply status/accepted to the issue and, on the issue (and the PR if

one exists), assign @me and add status/shepherding. Record every

label THIS run adds in the row's labels_added column so Phase 7 (and

Phase 5 teardown) strip ONLY those and never touch pre-existing

labels.

Phase 4 - solution pipeline (Ideate -> Plan -> Implement waves)

For each proceed row WITHOUT an in-flight PR, spawn ONE solution-

pipeline child in its OWN git worktree on the issue branch (provision

with git worktree add at HEAD; record its slug in the row's

worktree column so Phase 7 tears down only worktrees this run

created). Spawn it at IMPLEMENTER class (claude-sonnet-4.6); it and

every child it spawns route models per

assets/model-routing.md (B12 MODEL ROUTER).

The child runs

assets/solution-pipeline-prompt.md,

a four-stage per-issue pipeline (A2 PIPELINE), and returns the opened

PR. It is the SOLE WRITER of the issue branch:

  • Ideate (assets/ideate-prompt.md,

devx-ux-expert) -- frame the brief and derive a testable

acceptance_shape (the B5 contract). Spawn at PLANNER class

(claude-opus-4.8) per model-routing.md -- front-loaded heavy

because this contract is the verification spine for every wave.

  • Plan (assets/plan-panel-prompt.md,

python-architect lead + conditional performance / test-coverage /

supply-chain / auth lenses) -- emit a persisted task DAG matching

assets/plan-schema.json: per-task

staffing, interdependencies, ordering, and WAVES with checkpoints

(B4 PLAN MEMENTO). Trivial issue -> ONE task in ONE wave; skip the

full gate ceremony (scale-down).

  • Implement (A5 WAVE EXECUTION) -- per wave, spawn ONE task child

(assets/task-implement-prompt.md)

per task, each in its OWN worktree off the issue branch at the wave

base; the pipeline integrates the task branches into the issue

branch, then runs the inter-wave checkpoint

(assets/wave-gate-rubric.md, plan-

guardian + ideator verifiers). PASS advances; FAIL re-plans from the

failed wave (cap 2 re-plans).

  • Acceptance close

(assets/acceptance-observer.md, B5)

-- verify every acceptance_shape condition deterministically, then

open ONE PR (Closes #N) and return its number.

Each task child writes the TYPED coverage gate first (bug: failing

regression trap + mutation-break; feature: failing acceptance test;

docs: docs build/link check; refactor/perf: behavior-preserving test +

benchmark) for its task type, never opens a PR, and never spawns

children. The orchestrator then applies the Phase 3 ownership signaling

to the new PR. Rows WITH an in-flight PR skip Phase 4 and go straight

to Phase 5. On a status: escalate|blocked return, write the reason to

the row and surface it in Phase 7 (no PR opened). On a pr-opened

return, also record the child's routing_receipts array in the row's

notes (B12 cost audit) so the Ideate=opus / architect=opus front-load

is auditable from plan.md alone, never from a child transcript.

Phase 5 - shepherd-driver fan-out (drive to merge)

PROBE for shepherd-driver (above). For each PR (own-implemented or in-

flight), spawn ONE shepherd-driver subagent using

../shepherd-driver/assets/shepherd-driver-prompt.md. It owns the

convergence loop (Copilot classification, apm-review-panel, fold-vs-

defer, push, CI watch) and returns a completion_return matching

../shepherd-driver/assets/completion-schema.json. Caps: 4 outer

iterations, 2 Copilot rounds, 3 CI recovery iterations.

On each terminal return: schema-validate, persist the returned JSON in

session state, derive BASE_SHA with `git -C <row-worktree> merge-base

<returned-head-sha> origin/main`, and independently run:

uv run python <row-worktree>/.agents/skills/shepherd-driver/scripts/owner_touch_gate.py verify \
  --repo-root <row-worktree> --base $BASE_SHA \
  --head <returned-head-sha> --completion <session-return-json>

Do not write terminal state until both gates pass. A schema or semantic

failure gets one re-spawn; a second failure marks the row blocked

with the verifier diagnostic. This prevents stale evidence or child

self-classification from bypassing canonical owner detection.

After both gates pass, write head_sha and the

mergeable/merge_state_status/ci_status projection into the row's

head_sha and merge_state columns (the crash-survivable A11 stop

evidence), and remove ONLY the status/shepherding labels listed in

the row's labels_added column (assignment stays). Also record the

return's panel_execution (skill-tool|inline), panel_personas,

and routing_receipt in the row's notes -- the inline panel path is

EXPECTED in subagent context, so panel_execution: inline is a normal

healthy value, not a degradation.

Phase 6 - conflict-resolution

For every PR that returned ready-to-merge, probe mergeability (`gh

pr view --json mergeable,mergeStateStatus`). On DIRTY / BEHIND /

CONFLICTING, spawn one conflict-resolution subagent per

../shepherd-driver/assets/conflict-resolution-prompt.md (step-by-

step in ../shepherd-driver/references/mergeability-gate.md).

Phase 7 - final report

Read the table and proceed_manifest one last time. Render

assets/final-report-template.md to

the maintainer: per-issue decision, gate, maintainer decision, PR

link, terminal status, ready-to-merge PRs, advisory-with-deferred

PRs, blockers (with the responsible child's session ref), and every

ESCALATED / terminal row still awaiting human action. Tear down only

the solution-pipeline/shepherd worktrees recorded in the worktree

column (git worktree remove); leave branches on origin for open PRs.

Never auto-close an escalated issue.

Bundled assets

  • assets/triage-prompt.md -- any-type

triage child spawn body (runs apm-triage-panel in DIRECT mode).

  • assets/autopilot-triage-schema.json

-- JSON schema for the autopilot-triage-decision return.

  • assets/confidence-gate-rubric.md

-- escalate-by-default gate policy (Phase 2).

  • assets/triage-digest-template.md

-- the ONE consolidated review presented to the maintainer.

  • assets/solution-pipeline-prompt.md

-- A2 PIPELINE: per-issue Ideate -> Plan -> Implement(waves) ->

Acceptance close (Phase 4 child; sole writer of the issue branch).

  • assets/ideate-prompt.md -- devx-ux-expert

Ideate child: design_brief + testable acceptance_shape (read-only).

  • assets/plan-panel-prompt.md -- Plan

stage: lens-selection rubric + python-architect synthesis emitting

the task DAG.

  • assets/plan-schema.json -- JSON schema for

the persisted issue-solution-plan (tasks, deps, waves, checkpoints).

  • assets/model-routing.md -- B12 MODEL ROUTER:

authoritative role-class -> concrete-model table + per-spawn bindings +

verifier escalation; the pipeline resolves every Phase 4 spawn's model

here. Also records the B14b CAVEMAN BRIEF layer (lens advisors +

wave-gate verifiers ship compressed, fixed-schema briefs), the B14c

audience-boundary PER-SPAWN DECLARATION TABLE, the B13 cache-aware-

prefix discipline, and the B15/B16 status for this harness.

  • assets/task-implement-prompt.md --

ONE task per child in its own worktree; loads the typed coverage gate

by task type; no PR, no further fan-out.

  • assets/implement-bug.md,

assets/implement-feature.md,

assets/implement-docs.md,

assets/implement-refactor.md --

per-type coverage-gate references loaded per task by

task-implement-prompt.md.

  • assets/wave-gate-rubric.md -- inter-wave

checkpoint: integrate + plan-guardian/ideator verify + re-plan policy.

  • assets/acceptance-observer.md -- B5

close: verify acceptance_shape, open the ONE issue PR.

  • assets/ground-truth-table.md --

canonical table template with A11 columns + proceed_manifest.

  • assets/final-report-template.md

-- end-of-session report to the maintainer.

Composed siblings (declared dependencies)

  • apm-triage-panel -- triage rubric

(Phase 1; probed before use).

  • shepherd-driver -- per-PR drive-to-

merge loop + mergeability gate (Phases 5-6; probed before use).

Its declared completion schema and deterministic owner-touch gate

are re-run by this parent before terminal state is accepted.

Transitively composes apm-review-panel.

  • pr-description-skill -- authors

the Phase 4 issue-PR body (probed before the PR-open; never

hand-rolled). Transitively also used by shepherd-driver for any

superseding PR.

Operating contract for the orchestrator thread

  • Before each phase: re-read plan.md (table + proceed_manifest). Do

NOT rely on recall.

  • The orchestrator is the SOLE writer of the ground-truth table and

of the GitHub state it explicitly owns (issue labels, assignment,

tracking issues). PR-side writes -- pushes and PR comments during

the drive and mergeability phases -- are owned by shepherd-driver,

never by the orchestrator.

  • Every consequential write is plan + execute + verify through a CLI.
  • One consolidated review, one human checkpoint, escalate by default.

Other skills for the same job

different authors, same section of the catalogue
Gemini
by softaworks
×2

Use when the user asks to run Gemini CLI for code review, plan review, or big context (>200k) processing. Ideal for comprehensive analysis requiring large context windows. Uses Gemini 3 Pro by default for state-of-the-art reasoning and coding.

2.5k tokens
Claude Skills
by ComeOnOliver
×2

Claude Skills meta-skill: extract domain material (docs/APIs/code/specs) into a reusable Skill (SKILL.md + references/scripts/assets), and refactor existing Skills for clarity, activation reliability, and quality gates.

2k tokens scripts
Backend Atomic Commit
by ComeOnOliver
×1

> Pedantic backend pre-commit and atomic commit Skill for Django/Optimo-style repos. Enforces local AGENTS.md / CLAUDE.md, pre-commit hooks, .security/* helpers, and Monty’s backend engineering taste – with no AI signatures in commit messages.

5.3k tokens
Safe Edit
by ComeOnOliver
×1

Automatically backs up files, saves diffs, uses agents/skills, and ensures modular code (<200 lines) before any implementation. Use this skill for ALL code changes to ensure safe, reversible, and clean implementations.

1.8k tokens
Sharing Skills
by ComeOnOliver
×1

Use when you've developed a broadly useful skill and want to contribute it upstream via pull request - guides process of branching, committing, pushing, and creating PR to contribute skills back to upstream repository

1.2k tokens
Od Code Migration
by nexu-io

Default reference pipeline for the code-migration taskKind — code-import → design-extract → token-map → rewrite-plan → patch-edit ↔ build-test devloop → diff-review → handoff.

384 tokens
Review Agent Setup
by wshobson

Configure human-in-the-loop gating for AI agent review actions in Claude Code. Use when setting up a project where an agent may post PR reviews, comments, merges, or edit CI configuration, and you want a cryptographically auditable approval trail with Cedar-enforced gates.

1.4k tokens
Auto Updater
by anthropics
vendor

> Check installed community skills for updates. Shows a diff and requires explicit approval before applying. Use when the user says "check for updates", "update my skills", "anything new for my installed skills", or when invoked from the registry-sync agent.

2.2k tokens

How to use it

Copy the folder

Take microsoft/apm-issue-autopilot from the repository into ~/.claude/skills for personal use, or into .claude/skills inside a project.

Check the name does not clash

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.