원클릭으로
ppt-next-plan
Pick the next plan to ship from .research/backlog.json — highest-score ready row, deterministic tiebreak.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Pick the next plan to ship from .research/backlog.json — highest-score ready row, deterministic tiebreak.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Implement one task end-to-end for the PPT project — pick the right per-stack specialist, code, verify per-stack, push a draft PR against `dev`.
Project-management & delivery analysis for the PPT research routine (Phase 1.6). Runs an always-on Scrum Master synthesis plus role-based deep analysis (rotating one role/day by default; all 8 on `full`; a specific role on `pm:<role>`). Reads sprint-status + repo activity + research backlog, spawns role subagents, and writes delivery artifacts under .research/management/. Use from routine Phase 1.6, or standalone for a delivery snapshot.
Post-merge code review with issue creation. Reviews merged PRs in a time window, spots better approaches / missed edge cases / security holes / perf issues / test gaps, and opens GitHub issues with concrete improvement proposals.
Deterministic goal/convergence checks for the PPT dispatcher — coverage referential integrity, coverage-progress monotonicity, and buffer bounds. Run in dispatcher Phase 6 and CI. Use when adding/auditing the dispatcher's goal-verification layer.
Open a PR in this project's style — title, body template, IG3 evidence, CI surface, draft handling.
Land a green, approved PR. Verify preconditions (CI green, approved, no unresolved threads, not draft), auto-resolve mechanical merge conflicts against the base branch (sqlx offline data, Cargo.lock, generated openapi/api-client, lockfiles), then `gh pr merge --squash --auto`. Stops and surfaces if real code conflicts or stale CI.
| name | ppt-next-plan |
| description | Pick the next plan to ship from .research/backlog.json — highest-score ready row, deterministic tiebreak. |
| when_to_use | The user is about to start an implementer session and asks "what's next?" or otherwise wants a one-shot lookup of the top ready plan. |
| mode | both |
| capabilities | ["C6"] |
| tags | ["workflow"] |
Today the README documents the manual flow ("look at backlog.md, find a row with status: ready, load that plan"). This skill turns that into a one-liner: parse backlog.json for status: "ready" items, sort by score desc + updated_at desc, print the top one's plan path.
You're starting an implementer session and want the next thing to ship. The routine has already promoted ≥1 plan today (or in recent runs), and you don't want to read the whole table.
Skip this skill when:
backlog.json is empty or has no status: "ready" rows — there's nothing for the implementer agent to do; either wait for the next routine run or fire text: "deep" (see ppt-research-trigger).jq one-liner that returns the top-ranked ready plan's pathupdated_at desc) so two runs in a row pick the same plancat .research/plans/<slug>.md that primes you for the implementer flow.research/backlog.json — must parse as valid JSON (the routine's Quality Gate 3 guarantees this on main)Find the top ready row. Single jq pipeline (sort by score desc, then updated_at desc; pick .plan):
jq -r '
[.items[] | select(.status == "ready" and .plan != null)]
| sort_by([.score // 0, .updated_at])
| reverse
| .[0].plan // "NONE"
' .research/backlog.json
plans/<slug>.md (relative to .research/), or the literal NONE if nothing's ready.sort_by([.score, .updated_at]) sorts ASC by both keys; the trailing reverse flips the array so both keys end up DESC — the same order backlog.md renders. A simpler sort_by(.score) won't tiebreak deterministically.Open the plan:
PLAN=$(jq -r '
[.items[] | select(.status == "ready" and .plan != null)]
| sort_by([.score // 0, .updated_at]) | reverse | .[0].plan // "NONE"
' .research/backlog.json)
[ "$PLAN" = "NONE" ] && { echo "no ready plans"; exit 1; }
cat ".research/$PLAN"
Hand off to the implementer agent. From here, follow ppt-research-flow — SLUG=$(basename "$PLAN" .md), git switch -c "impl/$SLUG" main, etc.
If jq isn't available, the same picker in awk against backlog.md:
awk -F'|' '/^\|[[:space:]]*[0-9]/ && $7 ~ /ready/ { gsub(/^ +| +$/, "", $2); print $2 }' \
.research/backlog.md | head -1
backlog.md is sorted by score desc already (per the routine), so head -1 is the top row. Less robust than jq because it depends on the rendered column layout — prefer jq when available.
# 1. backlog.json parses
jq '.items | length' .research/backlog.json >/dev/null && echo OK
# expected: OK
# 2. the picker either returns a real plan path or NONE — never errors mid-pipeline
jq -re '
[.items[] | select(.status == "ready" and .plan != null)]
| sort_by([.score // 0, .updated_at]) | reverse | .[0].plan // "NONE"
' .research/backlog.json >/dev/null && echo OK
# expected: OK
# 3. if a path is returned, it exists on disk
PLAN=$(jq -r '
[.items[] | select(.status == "ready" and .plan != null)]
| sort_by([.score // 0, .updated_at]) | reverse | .[0].plan // "NONE"
' .research/backlog.json)
if [ "$PLAN" != "NONE" ]; then
test -f ".research/$PLAN" && echo "OK: $PLAN"
fi
# expected: OK: plans/<slug>.md OR (silent — nothing ready)
test -f .research/backlog.json && jq -e '.items' .research/backlog.json >/dev/null
# After opening the picked plan, confirm the implementer hand-off worked:
[ -n "$PLAN" ] && [ -f ".research/$PLAN" ] && echo "ready to: SLUG=$(basename "$PLAN" .md)"
.research/README.md § Picking a plan to ship — two execution modes — manual flow this skill automates.research/implementer-prompt.md § Pre-flight — what the implementer does once given a plan pathppt-research-flow — end-to-end choreography from plan → PR → archiveppt-research-trigger — what to do when nothing's ready