Post-Incident Reviews¶
What broke on the pvek8s homelab cluster, why it broke, and how it was fixed. Every incident here is a real outage with a real recovery — written up so the next person hitting it, usually future-me, does not have to rediscover it.
Recent incidents¶
- 2026-09-15P2vzdump fs-freeze Jiva triple fault
- 2026-09-02P1systemd segfault & jiva RO cascade
- 2026-08-15P2hal NFS handle invalidation
- 2026-08-06P2Read-only volume cascade
- 2026-08-01P2hal NFS export failure
About this site¶
Incidents are discovered and communicated through my
Nagios status page; these documents are the
detail behind those alerts. Live incidents are worked with the /start-incident
skill, which opens a tracking issue the moment triage starts so the timeline
below is captured as it happens rather than reconstructed afterward.
A post-incident review is not a blame document. Each one exists to extract the maximum learning from a failure: what the causal chain actually was, which monitoring gap let it run undetected, and what concrete work came out of it. Every PIR ends with trackable action items. If an incident produced none, it was either trivial or not investigated deeply enough.
Severity is graded P1 (cluster-wide outage) through P4 (minor, contained).
Contributing — writing a PIR
- Name the file
YYYY-MM-DD-brief-description.md - Put it in
src/incidents/— the nav discovers it automatically, newest first - Add a row to the top of the incidents index
- Follow the PIR structure template, which explains what belongs in each section and why
- Frontmatter must carry
title,date,severity,resolution,durationandimpact— the build fails on a missing or invalid severity
The /create-pir skill from
pgmac-net/claude-plugins automates the
whole flow: root cause analysis, runbook evaluation, GitHub Issues, commit and PR. If
the incident was worked with /start-incident, its tracking issue is read as the
primary source instead of reconstructing the timeline from conversation alone.
Contributing — writing a runbook
Write a runbook once a failure is understood well enough that someone could follow the recovery cold.
- Name it
<service>-<failure-description>.md, e.g.calico-cni-unauthorized.md - Put it in
src/runbooks/ - Add a row to the runbooks index
- Follow the runbook template — it covers both the simple pattern and the multi-mode pattern for one symptom with several root causes
- Cross-link the PIR that documented the failure
Prefer extending an existing runbook with a new failure mode over creating a new file when the observable symptom is the same.