workflow-retro
Records the outcome half of a feature's workflow evaluation at the end of a /feature session: which steps ran or were skipped, cycle counts, what each critic caught and what was adopted, plus a short
Files1
View on GitHubSKILL.mdplugins/ai-workflow/skills/workflow-retro/SKILL.md
GitHub/workflow-retro
Record what the workflow did for this feature: which steps ran, what each
caught, what that changed. Run at the end of a feature session (after the PR
is opened, Step 9 of /feature) or when the feature is abandoned.
This is the outcome half of the record. The cost half is appended
later by /workflow-inspect; until then (or if it isn't installed), the Cost
section stays pending.
Input
- This session's artifacts: PR description and comments,
git log, plan / critique / review / QA outputs - Current branch
Ground rules
- Facts come from artifacts, not memory alone, when an artifact exists.
Anything not established →
unknown, never a guess - The log is local evaluation data.
.workflow-log/is gitignored; never commit it or move it into repo history - One file per feature branch. File exists for the current branch (a
previous retro, or a multi-session feature) → update it (fill gaps, correct
facts, append the new session ID), no duplicate. Never overwrite a
## Costsection that/workflow-inspectalready filled: the Step 3 template'spendingtext is for new records only- Appending a session ID to a record whose Cost is already filled → keep
the numbers and add
pending re-inspection — sessions added since the last inspectas the first line of the section, so/workflow-inspectpicks the record up again - Exception: the file evidently records a different feature that reused the branch name (its PR is already merged, or its dates are far from this session's) → ask the user: replace it, or pick another filename. Never merge two features into one record
- Appending a session ID to a record whose Cost is already filled → keep
the numbers and add
- The only mutation is writing the log file (and creating its directory)
- Assumes a
/featuresession. Partial workflow (ad-hoc/plan-draft, review-only pass) → record what applies, mark the restn/a
Steps
Step 1 — Locate the log target
- Path:
.workflow-log/<branch>.mdunder the repository's main worktree (feature worktrees get deleted after merge; the log must outlive them) - Resolve with a single
git rev-parse --path-format=absolute --git-common-dir: the parent of the printed shared.gitdir is the main worktree root (in a plain clone, the repo root) - Sanity check: the resolved parent path still contains a
.gitsegment (e.g. a submodule, whose common dir is under the outer repo's.git/modules/) → unusual layout; ask the user where the log should live instead of writing there <branch>= branch name with/replaced by-(feat/login-form→.workflow-log/feat-login-form.md)- Create the directory if missing. File exists → this run updates it
Step 2 — Capture the session pointers
Record the pointer now: /workflow-inspect runs in a later session that
can't know which transcript was the feature session. Transcripts are pruned
after Claude Code's cleanupPeriodDays (~30 days by default); the join must
happen within it.
Get the current session ID, in order:
printenv CLAUDE_CODE_SESSION_ID(single command). Its value is the session ID; the transcript is<session-id>.jsonlsomewhere under~/.claude/projects/- Unset → heuristic: the most recently modified
.jsonlanywhere under~/.claude/projects/(a singlefind), searched globally since transcripts are filed under the session's launch directory, not necessarily the current worktree's- More than one transcript modified in the last few minutes (concurrent sessions) → ask the user which one; never pick silently
- Neither works (variable unset, directory missing or ambiguous) → record
Sessions: unknown. Both the variable and the on-disk layout are undocumented Claude Code behavior; a wrong-but-plausible ID silently corrupts the later cost-join, an honestunknownmerely skips it
Also:
- Feature spanned earlier sessions → record their IDs too (ask the user if
they can identify them, e.g. by date); otherwise
earlier sessions: unknown - Record the current worktree's absolute path (
Project pathfield). The session ID is the load-bearing pointer:/workflow-inspectfinds transcripts by global search for<session-id>.jsonl, never by deriving a directory from this path
Step 3 — Fill the record
Draft the file with exactly this structure (fixed schema; later tooling aggregates across files, so keep headings and field labels verbatim):
# Workflow retro — <branch>
- Date: <YYYY-MM-DD of this retro>
- Branch: <branch>
- PR: <url | not opened | abandoned>
- Plugin version: <installed workflow plugin version, if discoverable | unknown>
- Sessions: <session ID(s), oldest first | unknown>
- Project path: <absolute path(s) of the worktree(s) the sessions ran in | unknown>
## Steps
| Step | Ran? | Notes |
|------|------|-------|
| 1a planner | yes / skipped / n/a | <why skipped, if skipped> |
| 1b plan-critic | yes / skipped / n/a | <why skipped, if skipped> |
| 1c approval | yes / n/a | plan revisions before approval: <N> |
| 2 implement | yes / n/a | deviations: <N> minor, <N> material |
| 3 tests | yes / n/a | final full run: <N> tests, <pass/fail> |
| 4–6 code review | yes / n/a | rounds: <N>; FAIL items: <N>; NEEDS_DECISION: <N>; Open Questions: <N> |
| 7–8 QA | yes / skipped / n/a | <why skipped>; findings: <N>; blockers: <N> |
| 9 PR | yes / n/a | |
## Findings
- plan-critic: <N> findings; adopted into plan: <N>; discarded: <N>
- code-critic FAIL items, one line each: <what, and the fix or the user's override>
- NEEDS_DECISION items, one line each: <what, and the user's decision>
- Open Questions, one line each: <what, and the user's decision>
- QA findings, one line each: <what, and its disposition (fixed / deferred
<task id> / ignored)>
- QA blockers, one line each: <what, and the user's decision>
## Judgment
- Did the planner's plan contain anything the implementer would not have
found alone? <answer>
- Which plan-critic findings changed the plan? <answer | none>
- Did implementation re-read files the planner had already read?
(best-effort — /workflow-inspect computes this exactly) <answer>
- Did any step produce nothing of value this feature? <answer | none>
## Cost
pending — run /workflow-inspect before the session transcripts are pruned
- Steps and Findings: factual, from the artifacts
- Judgment: the implementer's honest assessment from what happened this
session, one sentence each;
unknownis acceptable
Step 4 — Confirm and write
- Present the drafted record in one block for the user to confirm or correct (the Judgment answers are theirs to override)
- Write the file; report its path
- Do not commit anything
Output
.workflow-log/<branch>.md(new or updated); Cost left as it is (markedpending re-inspectionif sessions were added), orpendingif the record is new