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- shepherd style via the shepherd-driver loop: fold copilot + panel 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.
73
91%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Low
Low-risk findings worth noting
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.
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).
status/accepted, status/shepherding) are WRITTEN
for bookkeeping but are NEVER the trigger.task affordance. A
single-loop variant is an anti-pattern. Subagent capacity is
UNLIMITED and is NEVER a deferral reason.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.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.gh, git, uv run ruff) wrapped in plan + execute + verify. Never assert these from
recall.[+] [!] [x] [i] [*] [>].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.
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).
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.
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.
This is the heart of the skill and the single human gate. Do it ONCE for the whole batch, not per issue.
gate: auto-proceed | escalate | terminal.
Escalate by default; auto-proceed only for a clear, bounded, high-
confidence accept whose implementation brief is complete.proceed_manifest into plan.md (one
row per issue: issue, gate, maintainer_decision, override_reason, implementation_brief_ref, status). maintainer_decision starts
pending.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.
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.
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:
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.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.
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.
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).
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.
autopilot-triage-decision return.issue-solution-plan (tasks, deps, waves, checkpoints).plan.md (table + proceed_manifest). Do
NOT rely on recall.634f7b6
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.