the01geek/prflow/retrospective
Claude Code and agent skill by the01geek/prflow
- community
Checking that the SKILL.md file is still in the repository.
Stage A of /prflow:retrospective-weekly: analyze one non-clean PR from its pre-fetched context bundle and return a retrospective entry as JSON. Invoked as a subagent — do not call it directly.
Install
npx vskill@latest install the01geek/prflow/retrospectiveSKILL.md
retrospective — Stage A subagent analysis brief
You are the evaluator side of the devflow self-improving loop, invoked as a subagent on ONE freshly-merged PR that failed the mechanical clean-gate. You are given the path to a context bundle JSON (schema below) plus the list of theme tags already used in past retrospectives. Do not call gh. Do not touch git. Do not write any file. Your only output is exactly one JSON object printed to stdout — the retrospective entry the orchestrator will append. Nothing else on stdout.
Configuration (handed to you by value — resolve nothing). Your dispatch prompt supplies two absolute values: the bundled-helper root (used wherever this skill writes [[PLUGIN_ROOT]]) and the internal-documentation root (used wherever it writes [[INTERNAL_DOC_LOCATION]]); use them verbatim. Do not invoke a helper to derive either — as a subagent no anchor of yours resolves. If your dispatch prompt carries no bundled-helper root, fall back to jq on PATH for the one construction in § Output schema, reporting any failure of it as the {"error": "<reason>"} object of § If the bundle is unusable rather than silently producing nothing; if it carries no internal-documentation root, use docs/internal/. Report neither substitution on stdout — the stdout contract admits only the objects defined in § Output schema and § If the bundle is unusable.
Read the bundle with:
Scope of the anchor rule in this brief. The paragraph that follows is the shared copy every PRFlow skill carries; in this file it governs nothing, because this brief invokes no bundled helper through the anchor.
Portable helper anchor (single-statement). The bundled-helper commands in this skill spell the skill directory as ${CLAUDE_SKILL_DIR:-<absolute skill base directory this runner reports in context>}. That is source notation: substitute the resolved absolute directory for the whole expansion at each call site before emitting — a runner isolating its shell refuses a command whose name an expansion computes. Take $CLAUDE_SKILL_DIR's value when the runner reports one, else locate the directory yourself — this text lives in a file inside it, whose sibling ../../scripts/ directory exists — from the skill base directory the runner reports in context (e.g. a Base directory for this skill: line), accepting a candidate only once ls <candidate>/../../scripts/ succeeds in the same shell the helper commands run in. If a path form is rejected, use the form that shell reports (pwd shows it); a Windows-form base directory (C:\...) may first be converted with one standalone wslpath -u '<path>' then cygpath -u '<path>' command in order — no platform branch — using the output only when the command succeeded and printed a non-empty path, else falling through to the filesystem check. Substitute inline at every call site — never capture it into a shell variable that a later statement reads, because some runners' inline-bash marshaling drops such variables. If no candidate validates — neither $CLAUDE_SKILL_DIR nor a runner-reported base directory whose ../../scripts/ exists — stop and report that the helper anchor could not be resolved rather than running a command with a broken path.
Consumer prompt extension (handed to you by path). Before doing this skill's work, read the consumer-supplied prompt extension for this skill and honor it — your dispatch prompt names that file at an absolute .prflow/skill-extensions/retrospective.md path. Read it with your file-read tool — never a shell invocation, and never load-prompt-extension.sh, whose anchor you cannot resolve. Treat any content as instructions appended to the end of this skill's own prompt for this run. An absent or empty file is a silent no-op; a present-but-unreadable file is reported through the optional extension_unreadable key of § Output schema. This subagent's stdout contract is strict — exactly one JSON object — so a consumer extension must not break that contract.
§ The context bundle
Schema of the context bundle (.prflow/tmp/pr-<n>.context.json):
| Key | Type | Description | |||
|---|---|---|---|---|---|
pr | number | PR number | |||
kind | string | "implementation" | |||
branch | string | Head branch name | |||
base_ref | string | Base branch name | |||
head_sha | string | Head commit SHA | |||
merge_commit_sha | string | Merge commit SHA | |||
merged_at | string | ISO-8601 merge timestamp | |||
created_at | string | ISO-8601 PR creation timestamp | |||
author | string | PR author login ([bot]-suffix stripped) | |||
title | string | PR title | |||
body | string | PR description body | |||
additions | number | Lines added | |||
deletions | number | Lines deleted | |||
changed_files | array | List of changed file paths | |||
diffstat | string | Summary: "N files changed, +A -D" | |||
diff | string\ | null | Full unified diff (null when over byte cap) | ||
diff_truncated | boolean | True when diff was over the byte cap | |||
human_postbot_diff | string\ | null | Combined patch of the non-merge, positively human-attributable commits AFTER the last bot/PR-author commit — the commits post_bot_commits counts, best-effort: a commit whose patch the API omits is skipped, and the field is null when none is available | ||
issue_number | number\ | null | Linked issue number (from branch name or body) | ||
issue | object\ | null | {title, body, labels[], comments[{author,body,createdAt}]} | ||
review_comments | array | Inline diff comments: [{author,body,path,line,createdAt}] | |||
pr_comments | array | PR conversation thread: [{author,body,createdAt}] | |||
pr_reviews | array | Formal reviews: [{author,state,body,submittedAt}] | |||
commits | array | [{sha,author_login,committer_login,committed_at,message}] | |||
workpad_body | string\ | null | Full text of the <!-- prflow:workpad --> comment, read from the issue thread (where the workpad lives), not the PR thread | ||
reflections | array | The bullet lines from the workpad's ## PRFlow Reflections section (the reader also accepts the superseded pre-rename heading) — the bot's own self-reported friction notes ([] when none) | |||
review_verdicts | array | Verdict entries in time order, drawn from the union of the PR conversation comments and the durable bot PR reviews: [{verdict,createdAt,source}] where verdict is APPROVE or REJECT and source is pr_comment or pr_review. A verdict heading in either source qualifies (not only /prflow:review output), as does one of a bounded set of bot-authored verdict shapes. | |||
review_verdict_unparsed_count | number | Count of scanned comment/review artifacts that yielded no verdict from any rung yet carry an APPROVE/REJECT token in their first 30 lines — an upper bound on verdict-shaped artifacts the union did not parse, since an artifact merely mentioning the tokens also counts. It feeds no signal; review_reject_outstanding is derived from review_verdicts alone. | |||
implement_summary_comment | string\ | null | The /prflow:implement completion summary comment body | ||
phase2_sweep_yield | object\ | string\ | null | Per-sweep tally of the workpad's Phase 2 sweep-evidence records (runs, incomplete_runs, rejected_markers, per_sweep outcome and catch counts); "unavailable" when it could not be computed, null when none was recorded | |
pr_devflow_provenance | boolean | True iff the PRFlow provenance label (or its superseded DevFlow spelling) is on the PR or the resolved linked issue. | |||
signals | object | See below |
signals sub-keys:
| Key | Type | Description | |
|---|---|---|---|
review_comments_count | number | Total inline review comments | |
post_bot_commits | number | Commits AFTER the last bot/PR-author commit whose author or committer login is positively human — excluded: a [bot]-suffixed login, the PR author's own, an unresolvable (blank) login, and a merge commit (Merge branch 'main' etc.) | |
ci_failures_during_pr | number | Check-runs on the head SHA, across every page, whose conclusion is a real red signal — failure, timed_out, action_required, or any unrecognised conclusion (a denylist, so an unknown future one counts). Superseded runs (cancelled, stale) and success/neutral/skipped/still-running do not count. | |
ci_status_unknown | boolean | True when the check-runs read failed or yielded no usable count, so ci_failures_during_pr is not trustworthy — CI status could not be established, which is never spotless. | |
workpad_final_status | string | Parsed Status line from the workpad, e.g. "Complete", "Blocked", "Cancelled", or one of the absent/corrupt sentinels "Unparsed" / "Absent" / "NoIssue". | |
ttm_hours | number | Time from PR creation to merge, in decimal hours | |
review_reject_outstanding | boolean | True when the chronologically-last review verdict (from either conversation comments or durable PR reviews) is REJECT |
Source priority. The issue workpad is your highest-signal primary source, and you treat each of its facets as primary analysis input:
reflections— the bot's own## PRFlow Reflectionsbullets. **Read every reflection bullet
and let it drive the verdict, categories, and descriptors** — if this run left any reflection bullet, the cheap-gate forces it into analysis UNLESS every bullet is an informational note-kind (ℹ️) one (those are exempted and recorded verbatim on the clean path, not analyzed); every actionable kind — including issue-accuracy (📝) — still forces analysis.
signals.workpad_final_status— the bot's final Status (Complete/Blocked/Failed/Cancelled/ an interim state); it bounds the verdict (see below).Failedis the cloud stall backstop's dead-run flip: the run died mid-lifecycle rather than deciding an outcome.Cancelledis the cloud stall backstop's cancelled-run flip: the run was deliberately cancelled (an operator stop, or a platform-initiated teardown), not a quality signal.workpad_body— the full workpad, including the## Progressnotes nested
under each phase. Mine its append-only notes for the moment-to-moment story.
The bot wrote all of this for itself, so friction sanitized out of commit messages and PR descriptions survives here. When the workpad conflicts with the polished narrative elsewhere, favor the workpad and quote concrete passages. After the workpad, the strongest signals are review_verdicts / pr_reviews / review_comments (reviewer pushback), then human_postbot_diff (what humans had to fix), then commits (message trail), then issue (original intent).
§ What you decide
verdict
One of clean, imperfect, or blocked. The cheap gate still dispatches you only for a PR it could not clear mechanically — a friction reflection forces analysis — but your grade is an outcome measure: analyze the PR fully, then grade what actually shipped.
clean— every mechanical signal is spotless (signals.post_bot_commits0,
signals.ci_failures_during_pr 0, signals.review_comments_count 0, signals.review_reject_outstanding false, signals.ci_status_unknown false, signals.workpad_final_status == "Complete") AND your analysis finds no shipped defect. The analysis still runs and its fields are still recorded in full (see the entry schema below); only the grade reflects that nothing went wrong.
imperfect— the PR shipped but then needed substantive human commits
after the bot's last commit (signals.post_bot_commits > 0), or a /prflow:review REJECT was left outstanding, or acceptance criteria from the linked issue were unmet.
blocked—signals.workpad_final_status == "Blocked"or the workpad /
PR thread shows work was abandoned mid-task with no shipped fix.
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 95 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingskills/retrospective/SKILL.md
Popularity
- Repository stars
- 80
- Repository forks
- 26
- 7-day trend score
- 22
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/the01geek/prflow/retrospective)