Where session 6 sits
Sessions 1 to 5 built the contract: indicators, a target, a budget with burn-rate alerts, a runbook a tired person can follow, and a backfill that does not break the settlement report. Session 6 is what happens after each incident, and it is written for two readers: the on-call who was there and needs the actions, and the leader who was not and needs to decide what to fund. Session 7 adds toil and session 8 replays the whole month on the bench.
★ What you walk out with tonight. A query that produces an incident timeline from the logs you already keep, so every package has the same six timestamps in the same order. Impact as a number the budget conversation can use: night 9 was 14 partitions, two thirds of 21.6. A test that separates an action from a wish. And an incidents table that lets five packages be read as one, which is where the finding about nights 21 and 27 comes from.
LiveWhy the package is generated, not remembered3 min▶
A postmortem written from memory has three problems that no amount of good intent fixes. The times are wrong, because nobody at 02:00 was writing them down. The shape is different every time, because each author decides what matters. And it can be argued with, because a recollection is an opinion about what happened. A timeline produced by a query has none of those problems: the timestamps were recorded by machines at the moment, the six fields are the same for every incident, and the only argument available is about the query, which is a better argument to have.
The partition log from session 1 and the alert log from session 3 already hold everything the timeline needs. The package is a view over two tables plus three lines a human writes: conditions, actions, and who reads the stale data.
Harborlight's first postmortem for night 9 said the outage "lasted about six hours" and that the on-call "responded promptly". The partition log says 14 bad partitions from 01:00 to 14:00 and the alert log says seven minutes from page to acknowledgement. Both facts are kinder to the on-call than the memory was, and neither needed anyone to remember anything.
Self-studyThe six timestamps, and where each one lives3 min▶
- First bad partition - the earliest partition hour in the incident that fails any of freshness, correctness or coverage. Partition log.
- Page time - when the alert fired. Alert log. Under burn-rate alerting this is the first bad hour of the incident; under threshold paging it is the same moment, followed by thirteen more on night 9.
- Acknowledgement - when a human took the page. Alert log. Page to acknowledgement is the number the rota design in leader session 3 is judged on.
- Safe state reached - when the runbook's safe-state step completed: downstream refresh paused, partitions marked stale, readers told. Alert log, written by the runbook step itself.
- Last bad partition - the latest partition hour in the incident that failed. Partition log.
- Backfill complete - when the last bad partition was replaced by a good one. Partition log, the
backfilled_atcolumn session 5's idempotent job writes.
Three sections, generated not remembered
9 min liveA package has three sections and a fixed order: what happened and when, what it cost, what changes. The first is a query. The second is arithmetic on the budget from session 3. Only the third needs judgement, and the judgement is checked by a test.
LiveThe timeline: six timestamps, two tables, one query3 min▶
The partition log gives the first bad partition, the last bad partition and the backfill completion. The alert log gives the page, the acknowledgement and the safe state. Join them on the incident window and the timeline is a single row. Because it is a query, night 4's timeline has the same six columns as night 9's, and the leader reading five packages can compare page-to-acknowledgement across all of them without translating five different prose styles.
The elapsed times fall out by subtraction: an hour and four minutes from the first bad partition to the page, because the partition's deadline is the hour plus sixty minutes of grace and the detector ran four minutes after; seven minutes to acknowledgement; twenty-nine minutes to a safe state. Those three intervals are what the rota and the runbook are for, and the timeline is the only place they are measured.
LiveImpact in budget terms, not adjectives3 min▶
"Severe" and "major" are not numbers, and a budget conversation needs a number. The impact section states how many partitions went bad and what share of the error budget that was at the current target. Night 9 was 14 partitions. At a 97 percent target the month's budget is 21.6 partitions, so night 9 alone spent two thirds of it, and with night 4's three already gone the budget was exhausted six nights later on night 15. Stated that way, the outage is not a story; it is the reason the settlement team was promised something the pipeline could not keep.
The second half of impact is who read the stale data. The lineage table lists which downstream jobs read which partitions, so the package can say "the settlement report read all 14 stale partitions; the seller payouts batch read 6 before the backfill landed" instead of "downstream reports were affected".
The service-reliability workbook's worked example is an incident that consumed 13 percent of a budget, and the point of the example is that 13 percent is a number the business can weigh against a launch. Night 9 at Harborlight consumed two thirds. Once that was on a slide, the dependency SLO with the source team stopped being a nice idea and became a funded action.
Self-studyActions with an owner and a date3 min▶
An action is a change to the system, the runbook or the contract that would have made the incident shorter, smaller or impossible. It carries three fields and is rejected without any one of them:
- Owner - one named person, not a team. A team owning an action is the same as nobody owning it, because everybody on the team assumes somebody else is on it.
- Date - a day, not a sprint or a quarter. The set review in a month checks the date against the calendar.
- Verifiable when done - a check that returns true or false: a row exists in the contracts table, a runbook step exists and was dry-run, a query returns a count. If nobody can tell whether it is done, it is not an action.
Two or three actions per package is normal. Eight is a sign the package is listing everything that could be better rather than what would have changed this night.
Contributing conditions, not a root cause, and the action that is a wish
8 min liveA single root cause is a comfortable story: find the one thing, fix the one thing, close the ticket. Real incidents in real pipelines are a coincidence of conditions, each of which was true for months without an incident. Night 9 had three, and removing any one of them would have changed the night.
LiveThree conditions, all true, none alone the cause3 min▶
Night 9's upstream feed went down for twelve hours. That is a fact, and it is where a root-cause postmortem stops: the cause was upstream, the fix is theirs, closed. But the same feed had been flaky for a year without a 14-partition incident, so the outage alone does not explain the night. Two more conditions were true. There was no dependency SLO with the source team, so nobody at Harborlight had a number for how late the feed was allowed to be, and nobody at the source knew a settlement report depended on it. And the runbook stopped at diagnosis: it told the on-call how to confirm the feed was down and nothing about what to do next, so the safe state took twenty-nine minutes of improvisation.
Each condition maps to an action Harborlight can own. The outage maps to a fix another team owns and may never make. Contributing conditions are not a softer way of saying root cause; they are the list of things you can actually change.
LiveThe action test, and the action that is a wish3 min▶
Run every proposed action through three questions: who, by when, and how will anyone know. "Add a coverage check on shard count, owner Mara, by the 20th, verified by a row in the indicators table" passes all three. "Be more careful with upstream changes" fails all three, and it is the most common action in postmortems everywhere, because it feels like accountability and costs nothing.
A wish in an actions list is worse than an empty list, because it lets the package close. The set review a month later finds it unverifiable and the same conditions still true.
Self-studyWritten for a reader who was not there3 min▶
The package is the input to the postmortem review on the leader track, and the reader there was asleep on night 9. Everything they need has to be on the page, which changes how it is written:
- No pronouns without names. "We paused the refresh" becomes "the on-call (Tomas) paused the settlement refresh at 02:40".
- No system nicknames. The feed has a table name and an owning team; the package uses both.
- Impact before narrative. The leader reads the budget share first and decides whether to read the rest. Fourteen partitions and two thirds of the budget earns the rest.
- Blameless by construction. The timeline is a query and the conditions are properties of the system, so there is no sentence in the package that is about a person's judgement. That is what makes people willing to write the honest version.
Self-studyThe set review: what five packages say that one cannot3 min▶
Because the packages land in a table with the same columns, the five incidents of the month can be queried together. Night 21's flapping connector and night 27's partial load look unrelated in their own packages: one is a network problem, the other a source that shipped two shards of three. Read together, both list the same contributing condition: no coverage check on shard count, so partitions landed on time, reconciled, and missing a third of their rows, and nothing noticed for hours. One action, owned once, closes a condition that two separate packages would each have asked for separately or not at all.
The set review is also where actions are checked against their dates. An action past due with no verification is a wish that was well dressed.
Package night 9
★ 20 min · everyone buildsBring the partition log from session 1 and the alert log from session 3. If you are working from Harborlight's data, night 9 is the upstream outage: 14 bad partitions, and the package should come out at two thirds of the budget at 97 percent without anyone typing 14.
Generate the timeline. Select night 9's bad partitions from the partition log, find the alerts inside that window in the alert log, and produce one row with six timestamps. Do not edit the result; if it looks wrong, the log is wrong and that is a finding.
Compute impact. Count the bad partitions and divide by the budget at the current target: 720 times one minus the target. At 97 percent, 14 over 21.6.
List the downstream readers. Join the bad partitions to the lineage table and count, per consumer, how many stale partitions were read before the backfill landed.
Write the contributing conditions as three lines. Each is a property of the system that was true before the night began. If a line names a person, rewrite it until it names a system.
Write two actions and reject one wish. Owner, date, verification for each. Read your list aloud and strike anything that does not answer all three.
Write the package to the incidents table. One row for the incident, one row per condition, one row per action. Then run the set review across all five nights and see what surfaces.
If your timeline query returns nulls, the runbook is not writing its safe-state timestamp, or the backfill job is not stamping backfilled_at. Either is a finding worth more than the package: an incident you cannot time is an incident you cannot shorten.
Before session 7
40 min- Generate the timeline for each of the other four Harborlight incidents: nights 4, 15, 21 and 27. Note which timestamps come back null and what would have to be logged to fill them.
- Compute impact for all five in budget terms at 97 percent. Check that the five shares sum to 35 over 21.6, which is why the budget ran out on night 15.
- Write contributing conditions for night 27's partial load, then run the set review and confirm it pairs with night 21.
- Take the last postmortem your own team wrote and test each action for owner, date and verification. Count the wishes. Bring the count, not the document.
Three questions
Which of these belongs in the actions section of an incident package?
An action has an owner, a date and a check that returns true or false. A and C have none of the three; they are wishes, and a wish lets the package close with the conditions still true.
Why generate the timeline from the partition log and the alert log instead of writing it from memory?
The value is comparability and truth. Page-to-acknowledgement across five incidents is only a number if all five timelines came from the same query over the same logs.
What does reading the month's five packages together produce that no single package can?
A flapping connector and a partial load look unrelated on their own. The set review finds the property of the system they share, which is the action worth funding first.