source/skills/postmortem/SKILL.md
Session-end review of recent chiron activity. Scores across 5 axes (design thinking, code quality, idioms, testing, engineering maturity) and names one concrete thing to practice next time. Read-only in v0.3.0 — does not persist scores.
npx skillsauth add xDido/chiron postmortemInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Check if .chiron-context.md exists in the project root. If it exists: read it. DO NOT scan the codebase or read additional files. If not: tell the user: "No project context found. Run {{command_prefix}}teach-chiron first." Then stop.
Optional user-supplied session summary (or blank):
$ARGUMENTS
If the current project's {{config_files}} says to skip session reviews or use different scoring, follow those instructions instead. This command is opt-in.
Apply the voice level from .chiron-context.md. If missing or unrecognized, use default.
Reviews the current {{product_name}} conversation's recent chiron activity and presents a session-end report. Based on chiron's "After each session" pattern:
/10 across 5 axesRead-only in v0.3.0. Does NOT write to ~/.chiron/profile.json. Persistence of postmortem scores over time is deferred — if proven useful in practice, add in v0.3.x.
If you re-read the recent conversation and find NO recent chiron activity (no {{command_prefix}}chiron, no {{command_prefix}}challenge, no {{command_prefix}}hint, no pervasive-mode chiron behavior signals), respond:
No recent chiron session to review. Run
{{command_prefix}}postmortemafter a{{command_prefix}}chironor{{command_prefix}}challengesession, or after working on a coding task with pervasive chiron mode active.
Stop there. Do not invent a session to review. If the user is new to chiron or just started the conversation, {{command_prefix}}postmortem correctly reports nothing to review.
If $ARGUMENTS contains a user-supplied summary (e.g., {{command_prefix}}postmortem fan-out worker pool implementation), use that as context but still look at the recent conversation for the actual scoring evidence. The arguments are a hint about what the user cared about — not a substitute for evidence.
| Axis | What you're scoring |
|------|---------------------|
| Design thinking | Did the user propose a design before coding? Consider trade-offs? Identify the right abstractions? |
| Code quality | Correctness, readability, handling of edge cases, appropriate error handling. |
| Idioms | Idiomatic use of the language's patterns (e.g., Go errgroup, defer mu.Unlock, early-return, table-driven tests). Language-specific. |
| Testing | Was test design discussed or written? Were edge cases considered? Table-driven tests? |
| Engineering maturity | How did the user respond to feedback? Did they acknowledge mistakes, push back appropriately, or dig in defensively? |
Each axis is scored /10. Be honest and specific. Never cruel.
After generating initial scores, verify each one before delivering (silent — the user sees only verified scores):
For each axis score, ask yourself one specific verification question:
If you cannot answer the verification question with a specific, concrete example from the conversation: revise the score. A score without evidence is wrong by definition.
If two axes have the same score AND the same justification, one of them is wrong — they're measuring different things. Two axes with the same score for different reasons is fine.
This loop improves accuracy without adding output length.
Read ~/.chiron/profile.json if it exists. This is a read-only operation — {{command_prefix}}postmortem never writes to the profile. The file is owned by {{command_prefix}}challenge's Step 8.
When profile data is available, use it to ground scoring in longitudinal evidence rather than only the current conversation:
1. Filter recent history. Last 30 days of entries, grouped by tag.
2. Identify trend signals:
drill_attempted or drill_gaveup in the windowdrill_solved in the window and no recent failures3. Integrate into scoring. Use trend signals to refine the 5 axis scores where relevant:
errgroup.WithContext correctly, but profile history shows 3 missed attempts on this pattern over the last 2 weeks, so the grasp is still developing."4. Surface a trend callout in the session summary (at most one per session).
If a profile-backed trend is genuinely relevant to the current session, mention it in the Session line:
Session: Implemented fan-out worker pool with errgroup. Profile note: this is your third session touching
go:errgroup-with-contextand your first clean solve.
Rules for trend callouts:
Schema-aware reading (v0.16.0+):
schema_version === 1 or schema_version === 2 → supported. Read entries[] and compute trend data normally. In v1 profiles, ignore any top-level install_id field (it's unused legacy). Entry shape is identical across v1 and v2.schema_version is an integer > 2 → unknown future version. The file was produced by a newer chiron than this one; the entries may have a shape this skill doesn't recognize. Skip trend analysis entirely and surface ONE terse line in the Session summary: "Profile note: ~/.chiron/profile.json is schema_version <N>, newer than this chiron understands (max 2) — scoring on current conversation only." Fall through to conversation-only scoring.schema_version missing but entries is a valid array → assume v1. Same behavior as v1 above.schema_version is a non-integer, negative, or otherwise invalid type → treat as corrupt (see below).Error handling (silent fallback — never crash):
/postmortem is strictly read-only; repair is /challenge Step 8's responsibility.Read-only invariant: Never write to ~/.chiron/profile.json from {{command_prefix}}postmortem. This preserves the v0.3.0 read-only contract — {{command_prefix}}postmortem never persists scores, renames the file, or modifies any chiron state file. The file is owned exclusively by {{command_prefix}}challenge's Step 8, which is the only writer and the only component allowed to perform migrations or backups.
Compact 3-section format. ~10 lines total instead of decorative ## headers:
Session: <1–2 sentence summary, not 2–3. Be specific about what was worked on.>
Scores:
- Design 7/10: <one-line justification>
- Code 8/10: <one-line justification>
- Idioms 6/10: <one-line justification>
- Testing 5/10: <one-line justification>
- Maturity 7/10: <one-line justification>
Practice: <concrete, bounded next step — specific exercise, not vague advice>
Example (shape reference, not content to copy):
Session: Implemented fan-out worker pool with errgroup, iterated through L0–L3 before landing on bounded concurrency.
Scores:
- Design 7/10: considered cancel-on-error; missed backpressure discussion
- Code 8/10: correct errgroup usage, clean goroutine lifecycle
- Idioms 6/10: shadowed ctx inside goroutine, unbuffered channel with known capacity
- Testing 4/10: no tests written, no edge cases discussed
- Maturity 8/10: accepted feedback on ctx shadowing immediately, pushed back on channel sizing with valid reasoning
Practice: Write a table-driven test for the fan-out function covering cancel-on-error and zero-input edge cases — `{{command_prefix}}challenge src/worker/pool.go`
Style rules:
Session: one line, not a ## Session summary header block**bold labels**Practice: one line, not a ## One thing to practice headerMaturity instead of Engineering maturity) if it saves spaceJustification rules:
"One thing to practice" rules:
t.Run subtests" — good. "Work on your testing" — bad.{{command_prefix}}challenge.{{command_prefix}}challenge on a specific file or {{command_prefix}}chiron on a specific topic.{{command_prefix}}challenge on a file with errgroup.WithContext — profile shows 3 past attempts still unsolved."Profile trend integration (when applicable): When profile data exists and contains relevant trends, the Session line may include a one-sentence trend note (see "Profile-informed trends" section above). Score justifications may cite longitudinal evidence alongside current-session evidence. This enhances accuracy without adding output length. When no profile data exists or no trends are relevant, the response format is unchanged from the profile-less case.
~/.chiron/profile.json. Read-only in v0.3.0.The 5 axes and /10 rubric are the same at every level. Only the phrasing of the justifications and the "one thing to practice" note changes.
gentledefaultstrict~/.chiron/config.json for voice level.{{command_prefix}}challenge <file> targeting the weakest-scoring axis, or {{command_prefix}}tour <topic> if the user needs conceptual grounding before drilling.~/.chiron/profile.json. This command is read-only in v0.3.0.development
Structured "before each task" preamble for a coding topic. Presents read-this-first doc pointers, key concepts, and common junior mistakes. From chiron's session preamble pattern — gives you the mental model before you start writing code. For topic overviews, NOT tutorials.
development
One-time comprehensive project scan. Reads every important file in the codebase and writes .chiron-context.md — the persistent context file that all other chiron skills reference instead of re-scanning.
development
Guided refactoring with named patterns. Identifies code smells, names the refactoring, and guides the transformation via a domain-adapted hint ladder. Defers to {{config_files_plain}}.
testing
Set or show chiron's voice level (gentle, default, or strict). Zero-arg invocation prints the full config snapshot — voice level plus drill sizing and teaching dials — doubling as a health check. Persists to ~/.chiron/config.json across sessions.