---
name: workflow-retro
description: >
  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 judgment section. Writes
  one fixed-schema file per feature branch to .workflow-log/ (gitignored),
  including the session IDs the companion /workflow-inspect skill needs to
  append the cost half later. Run manually, optionally, at the end of a
  feature session.
---

# /workflow-retro — Record the Feature's Workflow Outcome

Run this skill at the end of a feature session — typically after the PR is
opened (Step 9 of `/feature`), or when the feature is abandoned. It records
what the workflow actually did for this feature: which steps ran, what each
one caught, and what that changed. Over several features, these records are
the evidence base for tuning the workflow — which steps earn their cost,
which are candidates for skip rules.

This is the **outcome half** of the record. The **cost half** (tokens per
step, wall-clock, file-read overlap) is computed from the session transcripts
by the companion `/workflow-inspect` skill and appended to the same file
later. If that skill is not installed yet, the Cost section simply stays
pending — nothing here depends on it.

**Ground rules:**

- **Facts come from artifacts.** Fill each field from the PR body, `git log`,
  and the plan/critique/review/QA outputs in this session — not from memory
  alone when an artifact exists. Anything not established is recorded as
  `unknown`, never guessed.
- **The log is local evaluation data.** `.workflow-log/` is gitignored —
  never commit it or its contents, and never move it into the repo history.
- **One file per feature branch.** If a file for the current branch already
  exists (a previous retro, or the feature spans multiple sessions), update
  it — fill gaps, correct facts, append the new session ID — instead of
  creating a duplicate. Exception: if the existing 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 whether to replace
  it or pick another filename — do not merge two features into one record.
- Writing the log file (and creating its directory) is the **only** mutation
  this skill performs.
- The skill assumes a `/feature` session. In a session that ran only part of
  the workflow (an ad-hoc `/plan-draft`, a review-only pass), record what
  applies and mark the rest `n/a`.

## Step 1 — Locate the log target

The log lives at `.workflow-log/<branch>.md` under the repository's **main
worktree** — which is not necessarily the current directory: feature work
often runs in a per-feature `git worktree` that is deleted once the PR
merges, and the log must outlive it. Resolve the location with a single
`git rev-parse --path-format=absolute --git-common-dir`: that prints the
shared `.git` directory, whose **parent** is the main worktree root, and the
log directory is `.workflow-log/` there (covered by the `.gitignore` entry
`/init-workflow` adds). In a plain single-checkout clone this resolves to the
repository root itself. Sanity-check the result: if the resolved parent path
still contains a `.git` segment (e.g. the project is a git *submodule*, where
the common dir lives under the outer repo's `.git/modules/`), the layout is
unusual — ask the user where the log should live rather than writing there.

`<branch>` is the branch name with `/` replaced by `-` (e.g. branch
`feat/login-form` → `.workflow-log/feat-login-form.md`). Create the
directory if missing. If the file already exists, this run updates it (see
ground rules).

## Step 2 — Capture the session pointers

`/workflow-inspect` runs in a later, different session that has no way to
know which transcript was the feature session — recording the pointer now,
while only this session knows it, is the point of this step. Transcripts are
pruned after a retention window (Claude Code's `cleanupPeriodDays`, ~30 days
by default), so the join must happen within it.

Get the current session ID, in this order:

1. The `CLAUDE_CODE_SESSION_ID` environment variable (check with a single
   `printenv CLAUDE_CODE_SESSION_ID`). Its value is the session ID — the
   transcript is `<session-id>.jsonl` somewhere under `~/.claude/projects/`.
2. If the variable is unset, fall back to a heuristic: the most recently
   modified `.jsonl` anywhere under `~/.claude/projects/` (a single `find`)
   is *probably* the current session — transcripts are filed under the
   session's *launch* directory, which is not necessarily the current
   worktree's, so search globally rather than deriving a directory from a
   path. If more than one transcript was modified in the last few minutes
   (concurrent sessions), ask the user which one is this session rather
   than picking silently.
3. If neither works — the variable is unset and the directory is missing or
   ambiguous — record `Sessions: unknown` rather than guessing. Both the
   variable and the on-disk layout are current, undocumented Claude Code
   behavior, not a stable interface; a wrong-but-plausible session ID
   silently corrupts the later cost-join, while an honest `unknown` merely
   skips it.

If the feature spanned earlier sessions, record their session IDs too — ask
the user if they can identify them (e.g. by date); otherwise record
`earlier sessions: unknown`.

Also record the **current worktree's absolute path** (the schema's
`Project path` field) — context tying the record to the checkout the work
ran in. The session ID is the load-bearing pointer: `/workflow-inspect`
locates transcripts by a global search for `<session-id>.jsonl`, never by
deriving a directory from the recorded path.

## Step 3 — Fill the record

Draft the file with exactly this structure (fixed schema — later tooling
aggregates across files, so keep the headings and field labels verbatim):

```markdown
# 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> |
| 7–8 QA | yes / skipped / n/a | <why skipped>; findings: <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>
- NEEDS_DECISION items, one line each: <what, and the user's decision>
- QA findings, one line each: <what, and its disposition (fixed / deferred
  #issue / ignored)>

## 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
```

The Steps and Findings sections are factual — fill them from the artifacts.
The Judgment section is the implementer's honest assessment — answer from
what actually happened this session, in a sentence each; `unknown` is an
acceptable answer.

## Step 4 — Confirm and write

Present the drafted record in one block for the user to confirm or correct —
the Judgment answers especially are theirs to override. Then write the file
and report its path. Do not commit anything.
