Plan-Review Approval Shortlist Audit
Use when the user asks which status:plan-review issues are actually ready, closest to ready, or should be surfaced for approval next.
Why this exists
A naive queue sweep will misclassify issues if it relies only on:
- the presence of a
status:plan-reviewlabel - the newest review artifact filename
- a single overnight
MINORorapproval-ready (conditional)summary
In practice, the real blocker state often lives across several surfaces at once.
Required audit surfaces
For each candidate issue, check all of these:
- Live GitHub issue state
- current
status:*labels - issue still open
- recent comments for rollback notes, blocker updates, or recommendation caveats
- Canonical local plan state
docs/plans/YYYY-MM-DD-issue-NNN-*.mddocs/plans/README.mdrow status
- Review evidence
- latest canonical artifact under
scripts/review/results/*-plan-NNN-*.md - whether the artifact is real provider review vs placeholder/fallback
- whether a newer GitHub comment sharpens or contradicts the artifact conclusion
- Approval evidence
.planning/plan-approved/NNN.md- absence of this marker means the item is still only a recommendation candidate, not approved
- First verify that the checkout used for marker inspection is not stale or behind the target branch. If the active worktree is behind
origin/main, either fast-forward/use a fresh worktree or inspect the committed remote tree directly (for examplegit ls-tree -r --name-only origin/main -- .planning/plan-approved/NNN.md) before reporting the marker as missing. Stale governance worktrees can otherwise misclassify truly committed approval markers.
- Explicit prerequisites
- machine constraints (
machine:*labels) - blocked-on-other-issue or blocked-on-artifact conditions
- prerequisites documented in comments or review artifacts (e.g. unreadable source PDFs, missing summaries, provider rerun still required)
Classification buckets
A. Clean approval candidate
Use only when:
- canonical plan exists
- review coverage is present and recent
- no fresher comment says
needs-revision/not ready for user approval - no unresolved prerequisite blocker is still active
- issue is still in
status:plan-review - no local approval marker yet
B. Best available approval candidate with caveat
Use when:
- item is stronger than the rest of the queue
- latest review is
MINORorapproval-ready (conditional) - but a residual condition still exists (for example specific machine requirement)
State the caveat explicitly. Do not silently upgrade to “cleanly approval-ready.”
C. Needs revision
Use when:
- latest or recent review/comments still record
MAJOR,needs-revision, or unresolved review findings - approval-readiness depends on provider reruns that have not happened yet
- plan quality may be high, but the review/governance standard has not yet been met
D. Governance drift / not actually in plan review
Use when:
- live
status:plan-reviewexists but there is no canonical plan file - or there are no review artifacts yet
- or the queue state implies a maturity level the artifacts do not support
Decision rules
MINORorapproval-ready (conditional)is not enough by itself.- Recent issue comments can overrule simplistic artifact parsing if they document fresher blocker state.
- A best-in-queue recommendation is not the same as certifying all blockers are gone.
- Never describe an item as already approved unless both live state and local approval evidence support that claim.
Output format
For a shortlist, return:
- Approve now
- issue number + title
- why it is the strongest candidate
- residual caveat, if any
- Keep in revision lane
- issue number + title
- 3-6 bullet punch-list of remaining blockers
- Optional queue note
- whether the queue still contains governance drift items that should be cleaned before more approval triage
Practical pattern
If you need a fast but trustworthy pass:
- enumerate live
status:plan-reviewissues - separate missing-plan / missing-review drift first
- inspect latest review artifacts for the remaining set
- inspect recent GitHub comments for contradiction or conditionality
- verify no local approval marker exists
- produce a small shortlist with caveats instead of overclaiming certainty