Citadel postmortem
git clone https://github.com/SethGammon/Citadel
T=$(mktemp -d) && git clone --depth=1 https://github.com/SethGammon/Citadel "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/postmortem" ~/.claude/skills/sethgammon-citadel-postmortem && rm -rf "$T"
skills/postmortem/SKILL.md/postmortem — Campaign Postmortem Generator
Identity
/postmortem reads the artifacts a campaign produced and generates a structured postmortem. It doesn't require the user to remember what happened. The data is already in the campaign file, telemetry, and git history.
When to Use
- After any Archon campaign completes (Archon should suggest it)
- After a difficult debugging session
- When the user says "what just happened" or "what broke"
- When /do routes "postmortem", "retro", "what broke", "what happened"
Inputs
One of:
- A campaign file path (.planning/campaigns/*.md)
- A time range ("last session", "today", "this week")
- Nothing (reads the most recent completed campaign)
Protocol
Step 1: GATHER
Collect data from all available sources:
From the campaign file (if it exists):
- Direction vs what was actually built (scope drift?)
- Phase completion timeline (which phases needed rework?)
- Decision log entries (what architectural choices were made?)
- Review queue items (what needed human eyes?)
- Circuit breaker activations (what hit the limit?)
- Feature ledger (what shipped?)
From telemetry (.planning/telemetry/):
- hook-timing.jsonl: which hooks fired most, any patterns
- hook-errors.log: what was blocked, what failed, what had parse errors
- Circuit breaker trips
- Quality gate violations
From git history:
- Commits during the campaign period
- Files changed (which areas got the most churn?)
- Any reverts (what was undone?)
- Commit message patterns (fix: commits indicate bugs found)
From the session itself (if no campaign):
- Recent tool calls and their outcomes
- Files edited and errors encountered
Step 2: ANALYZE
Identify patterns across the data:
-
What broke: List every failure, error, or unexpected outcome. For each: what happened, what caught it (hook/gate/human/nothing), what it cost (time, rework, tokens).
-
What the safety systems caught: Circuit breaker activations, quality gate blocks, anti-pattern warnings, typecheck failures. This is the "invisible value" section — problems prevented.
-
What drifted: Compare the campaign direction to what was built. Did scope expand? Did phases get skipped or reordered? Did the architecture change mid-build?
-
What patterns emerged: Recurring error types, files that kept needing fixes, phases that took longest, common anti-patterns.
Step 3: PRODUCE
Write to
.planning/postmortems/postmortem-{slug}-{date}.md:
# Postmortem: {Campaign Name or Session Description} > Date: {ISO date} > Campaign: {path to campaign file, or "ad-hoc session"} > Duration: {time from first to last commit} > Outcome: {completed | partial | parked} ## Summary {2-3 sentences: what was attempted, what happened, what the result was} ## What Broke {Numbered list. For each:} ### {N}. {Short description} - **What happened:** {the failure} - **Caught by:** {hook name / quality gate / human / nothing} - **Cost:** {rework time, files affected, phases repeated} - **Fix:** {what resolved it} - **Infrastructure created:** {new hook rule, new anti-pattern, new end condition — or "none needed"} ## What Safety Systems Caught {Things that WOULD have been problems without the hooks/gates} | System | What It Caught | Times | Impact Prevented | |--------|---------------|-------|-----------------| | {hook/gate name} | {description} | {count} | {what would have happened} | ## Scope Analysis - **Planned:** {what the campaign direction said} - **Built:** {what the feature ledger shows} - **Drift:** {none | minor | significant — with specifics} ## Patterns {Recurring themes worth watching:} - {pattern 1} - {pattern 2} ## Recommendations {Concrete next actions:} 1. {recommendation — e.g., "Add anti-pattern rule for X"} 2. {recommendation — e.g., "Phase Y needs tighter end conditions"} ## Numbers | Metric | Value | |--------|-------| | Phases planned | {N} | | Phases completed | {N} | | Commits | {N} | | Files changed | {N} | | Circuit breaker trips | {N} | | Quality gate blocks | {N} | | Anti-pattern warnings | {N} | | Rework cycles | {N} |
Step 4: HANDOFF
---HANDOFF--- - Postmortem: {name} - Document: .planning/postmortems/postmortem-{slug}-{date}.md - Failures documented: {count} - Safety catches: {count} - Recommendations: {count} ---
After displaying the HANDOFF block, output the following prompt to the user:
Run /learn after reviewing this postmortem to extract patterns into the knowledge base: /learn {campaign-slug}
What /postmortem Does NOT Do
- Invent failures that didn't happen (real data only)
- Blame the user or the model (document what happened, not whose fault)
- Recommend changes to skill files (that's for the user to decide)
- Run during a campaign (only after completion or on demand)
Quality Gates
- Every "What Broke" entry has all 5 fields filled
- Numbers section has real data (not estimates)
- Recommendations are concrete actions (not "be more careful")
- If no failures occurred, say so honestly (don't manufacture drama)
Fringe Cases
Campaign not found: If the specified campaign file doesn't exist, check
.planning/campaigns/ for the most recently modified campaign. If no campaigns exist, run in ad-hoc mode using recent git history and session context.
No telemetry data: Proceed without telemetry. Mark the "What Safety Systems Caught" table as "No telemetry available" and the Numbers section fields as "N/A". Don't manufacture data.
Partial campaign (parked or in-progress): Generate the postmortem with
Outcome: partial. Document what was completed and what was parked. Include a "Remaining Work" section listing incomplete phases.
If .planning/postmortems/ does not exist: Create it before writing. If
.planning/ itself doesn't exist, output the postmortem inline and note: "Run /do setup to initialize .planning/ for future storage."
Exit Protocol
---HANDOFF--- - Postmortem: {name} - Document: .planning/postmortems/postmortem-{slug}-{date}.md - Failures documented: {count} - Safety catches: {count} - Recommendations: {count} ---
After displaying the HANDOFF block, suggest:
Run /learn {campaign-slug} to extract patterns into the knowledge base.