Queue microsoft/apm pull requests labelled `panel-review` (or an explicit named list) and fan them out through an isolated pool (default 2) of autopilot-pr-review-worker sessions. Advisory only. Never implements. Never composes autopilot-pr-merge-worker. Never review every open PR. Works in a local session, Copilot App automation, Cloud Agent, Remote Agent, or Agentic Workflow. Does not triage issues or open greenfield PRs.
63
79%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Low
Low-risk findings worth noting
Fix and improve this skill with Tessl
tessl review fix ./.agents/skills/autopilot-pr-review-scheduler/SKILL.mdUser-facing PR REVIEW queue. This skill SELECTS pull requests and THROTTLES fan-out. It does not triage issues, does not implement, and does not open greenfield PRs.
Compose autopilot-pr-review-worker
one PR per slot (INVOCATION_MODE=session-review,
panel-mode: full for a first advisory). Never compose
autopilot-pr-merge-worker. Drive-to-merge is a different skill.
Never borrow slots from autopilot-issue-triage-scheduler,
autopilot-issue-delivery-scheduler, or
autopilot-pr-triage-scheduler.
activation_card: on. Before any queue read or spawn, emit
this Enter card with every field filled. Missing field -> stop.
skill: autopilot-pr-review-scheduler
skill_path: <resolved directory of this SKILL.md>
mode: run
subject: microsoft/apm
path: review
intent: select accepted review PRs and fan out review workers
origin: unattended | actor-session
write: off
repo: microsoft/apm
fanout_limit: <positive integer>
invocation: agentic-workflow | actor-sessionRules:
write is always off. This scheduler never comments,
labels, assigns, or requests reviewers.write: on -> stop.origin fail-closed unknown -> unattended.invocation is the harness. Copilot App, local session, Cloud
Agent, and Remote Agent are actor-session. agentic-workflow
is only gh-aw / GitHub Actions. Do not copy origin into
invocation.autopilot-pr-merge-worker.After the run, emit this Exit receipt:
skill: autopilot-pr-review-scheduler
subject: microsoft/apm
path: review
write: off
queued: <integer>
spawned: <integer>
approved: n/aWorks in local sessions, Copilot App automations, Cloud Agent, Remote Agent, and Agentic Workflows.
Resolve ORIGIN before spawning slots so each reviewing session can apply ownership writes. This scheduler never comments, labels, assigns, or requests reviewers.
unattended -- slots never assign, never request reviewers.actor-session -- autopilot-pr-review-worker requests @me
as a supplemental reviewer. Never assign the PR. Skip only on
self-review-red-flag (operator is the PR author).Ownership writes:
panel-review is the only request trigger. It matches
.github/workflows/pr-review-panel.md. It is not a human decision
label. Re-apply it (remove + add) for a fresh review after the
panel clears it.
status/accepted on the PR is a sweep source, not a request
trigger. A maintainer already accepted that PR. Union it with
the panel-review list. Do not treat status/accepted on a
linked issue as a sweep source (that would require listing every
open PR).
No accepted, no review. After building the union, drop any PR
that is not status/accepted on the PR or a same-repo linked
issue. Do not spawn it. Do not comment. Do not remove labels.
The review-worker, if already invoked, also stops with no
comment and may clear panel-review.
Modes:
panel-review.queue-open / no names: open PRs that currently have
panel-review or status/accepted on the PR.Never list all open PRs. Never fall back to an unfiltered
gh pr list --state open. Empty label queue -> empty table, stop.
Default (authenticated gh):
gh pr list --state open --label panel-review --json number,title,isDraft,labels,updatedAt
gh pr list --state open --label status/accepted --json number,title,isDraft,labels,updatedAtDeduplicate by number. Skip drafts unless the caller named them. Label sweep: oldest first, cap 10. Named list is not capped.
Do not invent a second trigger label.
Before any spawn, for each candidate PR (named list,
panel-review sweep, or status/accepted on the PR). This
gate does not bypass status/accepted. Named list and
panel-review do not bypass this gate.
reviewRequests
(users and teams). If empty, use CODEOWNERS for the changed
paths. If still empty, skip this gate.CODEOWNERS last comment conditions unmet.CODEOWNERS last comment conditions unclear.Before any spawn, emit the keep-set and the drop-set in plan.md
and in the session report. Missing table, missing column, or blank
rationale -> stop. Do not spawn.
Keep-set (items this run will schedule). One row per item. Do not truncate to FANOUT_LIMIT:
| number | kind | labels | rationale | slot |
Drop-set (considered, then not scheduled). slot is -:
| number | kind | labels | rationale | slot |
kind: issue or prlabels: current GitHub labels, comma-separated; none if emptyrationale: why queued or dropped (helper rule and labels)slot: 1-based spawn order, or - when droppedEmpty keep-set is success. Still emit the drop-set, or none.
You are the sole table writer. Name missing panel-review,
missing status/accepted, or a CODEOWNERS last-comment drop
in rationale.
Load assets/fan-out-pool.md. Default
FANOUT_LIMIT=2 concurrent slots. Isolated to this run.
FANOUT_LIMIT is concurrency, not queue length. Drain the full
selected list; when a slot returns, fill it with the next item.
reviewRequests.
Pass panel-mode: full on the worker activation card (first
advisory). The worker may still lean or add ad-hoc personas.panel-review, status/accepted on
the PR, or a named list only.autopilot-pr-merge-worker.microsoft/apm
0495ced
Also appears in
since Oct 11, 2026
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.