{"id":"c851a133-4689-4e75-8b7e-3c2b360536dc","shortId":"qyyGyZ","kind":"skill","title":"Incident Postmortem Writer","tagline":"Writes a blameless incident postmortem document from an incident timeline or Slack thread.","description":"# Incident Postmortem Writer\n\n## What this skill does\n\nThis skill turns a raw incident timeline, Slack thread dump, or bullet-point notes into a polished, blameless postmortem document. It structures the narrative, extracts action items, identifies contributing factors (not culprits), and formats everything into a document that can be shared with the team and used to prevent future recurrences. The output follows SRE best practices for blameless postmortems.\n\nUse this immediately after an incident is resolved, while details are fresh, to produce the postmortem document without spending hours writing it from scratch.\n\n## How to use\n\n### Claude Code / Cline\n\nCopy this file to `.agents/skills/incident-postmortem-writer/SKILL.md` in your project root.\n\nThen ask:\n- *\"Use the Incident Postmortem Writer skill. Here's the Slack thread from last night's outage: [paste thread].\"*\n- *\"Write a postmortem for the database incident on March 14 using the Incident Postmortem Writer skill.\"*\n\nProvide:\n- An incident timeline, Slack thread, or bullet-point notes describing what happened\n- The approximate start and end time of the incident\n- The user impact (how many users affected, what they experienced)\n- Any action items already identified\n\n### Cursor\n\nAdd the instructions below to your `.cursorrules` or paste them into the Cursor AI pane. Paste the incident notes.\n\n### Codex\n\nPaste the incident notes and ask Codex to follow the instructions below to produce the postmortem.\n\n## The Prompt / Instructions for the Agent\n\nWhen asked to write a postmortem, follow these steps:\n\n### Principles to follow throughout\n\n1. **Blameless** — The postmortem must never assign blame to individuals. Systems and processes fail, not people. Use passive voice or process language: \"the alert was not triggered\" not \"John missed the alert.\"\n2. **Accurate** — Represent the facts as given. Do not speculate beyond what the evidence supports.\n3. **Actionable** — Every section should lead toward specific improvements. Vague observations (\"we should improve monitoring\") must be turned into specific action items.\n4. **Complete** — Cover the full timeline from first symptom to full resolution, including any partial mitigations that were tried.\n\n### Step 1 — Parse the input\n\nExtract from the raw notes:\n- Incident start time (when did something first go wrong, or when was it first detected?)\n- Detection time (when did the team become aware?)\n- Response start time (when did someone start actively working on it?)\n- Resolution time (when was the system fully restored?)\n- Total duration of user impact\n- Number of users or systems affected\n- What users experienced during the incident\n- The root cause (if identified)\n- Contributing factors (what made it worse or harder to detect/fix)\n- What actions were taken and in what order\n- Action items already identified\n\n### Step 2 — Build the timeline\n\nConstruct a clean, chronological timeline. Format each entry as:\n```\nHH:MM UTC — [What happened / what was observed / what action was taken]\n```\n\nDon't editorialize in the timeline — just facts. Reserve analysis for the \"Root Cause Analysis\" section.\n\n### Step 3 — Write the root cause analysis\n\nIdentify:\n- **Immediate cause**: The proximate technical failure (e.g., \"a database index was dropped during a migration\")\n- **Contributing factors**: Conditions that made the incident worse, harder to detect, or slower to fix (e.g., \"alerts had not been updated to cover the new service\", \"runbook did not include steps for this failure mode\")\n- **What went well**: Honest acknowledgment of things that helped (fast detection, good team communication, effective rollback)\n\nUse the 5-Why technique to go beyond the surface cause. The immediate cause is rarely the real root cause.\n\n### Step 4 — Identify action items\n\nAction items must be:\n- **Specific** — \"Add a PagerDuty alert for database connection pool exhaustion\" not \"improve monitoring\"\n- **Assigned or assignable** — A team or function should be identified even if a specific person isn't\n- **Prioritized** — Mark as P1 (prevent recurrence), P2 (detect faster next time), P3 (respond better)\n\n### Step 5 — Format the postmortem\n\n```markdown\n# Incident Postmortem — [Short title]\n\n**Date**: [Date of incident]\n**Severity**: [SEV1 / SEV2 / SEV3 or equivalent]\n**Duration**: [HH:MM] (from first impact to full resolution)\n**Status**: [Draft / Under Review / Final]\n**Authors**: [Optional: team name or individuals who wrote the postmortem]\n\n---\n\n## Summary\n\n[2–4 sentences. What happened, who was affected, for how long, and what the root cause was. Should be understandable by someone who wasn't involved.]\n\n## Impact\n\n| Metric | Value |\n|--------|-------|\n| Duration of impact | [e.g., 47 minutes] |\n| Users affected | [e.g., ~12,000 active users, 100% of EU region] |\n| Requests failed | [e.g., ~8,400 failed API requests] |\n| Revenue impact | [if known] |\n| Services affected | [list] |\n\n## Timeline\n\n| Time (UTC) | Event |\n|------------|-------|\n| HH:MM | [Event] |\n| HH:MM | [Event] |\n...\n\n## Root Cause Analysis\n\n### Immediate Cause\n[What technically failed]\n\n### Contributing Factors\n- [Factor 1]\n- [Factor 2]\n\n### 5-Why Analysis\n- Why did X fail? → [Because Y]\n- Why did Y happen? → [Because Z]\n...\n\n## What Went Well\n- [Thing 1]\n- [Thing 2]\n\n## What Went Poorly\n- [Thing 1]\n- [Thing 2]\n\n## Action Items\n\n| Priority | Action | Owner | Due Date |\n|----------|--------|-------|----------|\n| P1 | [Specific action to prevent recurrence] | [Team] | [Date] |\n| P2 | [Specific action to detect faster] | [Team] | [Date] |\n| P3 | [Specific action to respond better] | [Team] | [Date] |\n\n## Lessons Learned\n[2–3 sentences on the key takeaways from this incident for the organization]\n```\n\n## Example\n\n**Input to Agent:**\n> \"Use the Incident Postmortem Writer skill.\n>\n> Incident: March 14 2026. Around 2:30am UTC, users started reporting that they couldn't log in. At 2:47am our on-call got paged (from a user report, not our own monitoring). Turned out a deploy at 2:28am had introduced a bug in the JWT validation middleware that rejected all valid tokens. We rolled back at 3:15am and everything recovered by 3:18am. About 15,000 users were affected. The deploy wasn't tested with real JWTs in staging — staging uses mock auth. Action items we know about: fix staging auth to use real JWTs, add a synthetic login monitor.\"\n\n**Output from Agent:**\n\n> # Incident Postmortem — Login Outage (JWT Validation Bug)\n>\n> **Date**: 2026-03-14\n> **Severity**: SEV1\n> **Duration**: 50 minutes (02:28 UTC → 03:18 UTC)\n> **Status**: Draft\n>\n> ## Summary\n> A deployment at 02:28 UTC introduced a regression in the JWT validation middleware that caused all authenticated requests to be rejected. Users were unable to log in for approximately 50 minutes. The issue was detected via a user report (not automated monitoring) and resolved by rolling back the deployment. Approximately 15,000 active users were affected.\n>\n> ## Impact\n>\n> | Metric | Value |\n> |--------|-------|\n> | Duration of impact | 50 minutes |\n> | Users affected | ~15,000 active users |\n> | Services affected | Authentication service, all authenticated API endpoints |\n>\n> ## Timeline\n>\n> | Time (UTC) | Event |\n> |------------|-------|\n> | 02:28 | Deployment of auth service v2.4.1 completed |\n> | 02:28 | JWT validation bug introduced; all authenticated requests begin failing |\n> | 02:30 | First user reports of login failure (via support chat) |\n> | 02:47 | On-call engineer paged via user escalation |\n> | 02:53 | Root cause identified as JWT middleware regression |\n> | 03:15 | Rollback to v2.4.0 initiated |\n> | 03:18 | Service fully restored |\n>\n> ## Root Cause Analysis\n>\n> ### Immediate Cause\n> A code change in the JWT validation middleware in v2.4.1 incorrectly invalidated tokens with a valid `iat` (issued-at) claim by comparing it against the wrong reference time.\n>\n> ### Contributing Factors\n> - Staging environment uses mock authentication; real JWT validation was not exercised before deployment\n> - No synthetic login monitor existed to detect authentication failures automatically\n> - On-call was not alerted until 19 minutes after the incident began, relying on a user report\n>\n> ## What Went Well\n> - Root cause was identified quickly once investigation began (6 minutes)\n> - Rollback was clean and full recovery occurred within 3 minutes of rollback\n>\n> ## Action Items\n>\n> | Priority | Action | Owner | Due Date |\n> |----------|--------|-------|----------|\n> | P1 | Update staging environment to use real JWT validation instead of mock auth | Auth team | 2026-03-21 |\n> | P2 | Create synthetic login monitor that alerts if authentication fails | Observability team | 2026-03-21 |\n> | P3 | Add automated test that validates JWT acceptance/rejection behavior on every deploy | Auth team | 2026-03-28 |\n\n## Notes\n\n- Write the postmortem within 24–48 hours of the incident while details are fresh. The longer you wait, the less accurate the timeline becomes.\n- \"Blameless\" doesn't mean \"without accountability.\" Action items assign ownership to teams. The difference is: we fix systems, not people.\n- Share the postmortem with the full team even when the incident seems minor — the learning compounds over time.","tags":["incident","postmortem","writer","openagentskills","notysoty","agent-skills","claude","claude-code","claude-skills","cline","cursor","llm"],"capabilities":["skill","source-notysoty","skill-incident-postmortem-writer","topic-agent-skills","topic-claude","topic-claude-code","topic-claude-skills","topic-cline","topic-cursor","topic-llm","topic-llm-skills","topic-skills"],"categories":["openagentskills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/Notysoty/openagentskills/incident-postmortem-writer","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add Notysoty/openagentskills","source_repo":"https://github.com/Notysoty/openagentskills","install_from":"skills.sh"}},"qualityScore":"0.454","qualityRationale":"deterministic score 0.45 from registry signals: · indexed on github topic:agent-skills · 8 github stars · SKILL.md body (9,231 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T19:13:22.189Z","embedding":null,"createdAt":"2026-05-18T13:20:43.249Z","updatedAt":"2026-05-18T19:13:22.189Z","lastSeenAt":"2026-05-18T19:13:22.189Z","tsv":"'-03':958,1242,1257,1274 '-14':959 '-21':1243,1258 '-28':1275 '000':711,911,1026,1042 '02':965,977,1057,1065,1076,1087,1097 '03':968,1106,1112 '1':254,343,754,776,783 '100':714 '12':710 '14':153,844 '15':910,1025,1041,1107 '15am':902 '18':969,1113 '18am':908 '19':1183 '2':286,439,672,756,778,785,819,847,860,881 '2026':845,957,1241,1256,1273 '24':1281 '28':966,978,1058,1066 '28am':882 '3':301,481,820,901,907,1215 '30':1077 '30am':848 '4':323,575,673 '400':722 '47':705,1088 '47am':861 '48':1282 '5':556,628,757 '50':963,1004,1037 '53':1098 '6':1205 '8':721 'acceptance/rejection':1266 'account':1306 'accur':287,1297 'acknowledg':542 'action':50,194,302,321,427,434,461,577,579,786,789,795,803,811,929,1219,1222,1307 'activ':382,712,1027,1043 'add':199,584,941,1260 'affect':189,404,679,708,731,914,1030,1040,1046 'agent':240,835,948 'agents/skills/incident-postmortem-writer/skill.md':119 'ai':212 'alert':277,285,519,587,1181,1250 'alreadi':196,436 'analysi':473,478,486,745,759,1119 'api':724,1051 'approxim':175,1003,1024 'around':846 'ask':125,224,242 'assign':260,596,598,1309 'auth':928,936,1061,1238,1239,1271 'authent':991,1047,1050,1072,1157,1173,1252 'author':661 'autom':1015,1261 'automat':1175 'awar':374 'back':899,1021 'becom':373,1300 'began':1188,1204 'begin':1074 'behavior':1267 'best':80 'better':626,814 'beyond':296,561 'blame':261 'blameless':6,42,83,255,1301 'bug':886,955,1069 'build':440 'bullet':36,168 'bullet-point':35,167 'call':865,1091,1178 'caus':413,477,485,489,564,567,573,687,744,747,989,1100,1118,1121,1198 'chang':1124 'chat':1086 'chronolog':446 'claim':1142 'claud':112 'clean':445,1209 'cline':114 'code':113,1123 'codex':218,225 'communic':551 'compar':1144 'complet':324,1064 'compound':1336 'condit':505 'connect':590 'construct':443 'contribut':53,416,503,751,1151 'copi':115 'couldn':855 'cover':325,525 'creat':1245 'culprit':56 'cursor':198,211 'cursorrul':205 'databas':149,496,589 'date':637,638,792,800,808,816,956,1225 'deploy':879,916,975,1023,1059,1165,1270 'describ':171 'detail':94,1288 'detect':366,367,513,548,620,805,1009,1172 'detect/fix':425 'differ':1314 'document':9,44,62,101 'doesn':1302 'draft':657,972 'drop':499 'due':791,1224 'dump':33 'durat':395,647,701,962,1034 'e.g':494,518,704,709,720 'editori':466 'effect':552 'end':178 'endpoint':1052 'engin':1092 'entri':450 'environ':1154,1229 'equival':646 'escal':1096 'eu':716 'even':606,1328 'event':736,739,742,1056 'everi':303,1269 'everyth':59,904 'evid':299 'exampl':832 'exercis':1163 'exhaust':592 'exist':1170 'experienc':192,407 'extract':49,347 'fact':290,471 'factor':54,417,504,752,753,755,1152 'fail':267,719,723,750,763,1075,1253 'failur':493,536,1083,1174 'fast':547 'faster':621,806 'file':117 'final':660 'first':330,358,365,651,1078 'fix':517,934,1317 'follow':78,227,247,252 'format':58,448,629 'fresh':96,1290 'full':327,333,654,1211,1326 'fulli':392,1115 'function':602 'futur':74 'given':292 'go':359,560 'good':549 'got':866 'happen':173,456,676,769 'harder':423,511 'help':546 'hh':452,648,737,740 'honest':541 'hour':104,1283 'iat':1138 'identifi':52,197,415,437,487,576,605,1101,1200 'immedi':87,488,566,746,1120 'impact':185,398,652,698,703,727,1031,1036 'improv':309,314,594 'incid':1,7,12,17,29,90,128,150,156,162,182,216,221,352,410,509,633,640,828,838,842,949,1187,1286,1331 'includ':335,532 'incorrect':1132 'index':497 'individu':263,666 'initi':1111 'input':346,833 'instead':1235 'instruct':201,229,237 'introduc':884,980,1070 'invalid':1133 'investig':1203 'involv':697 'isn':611 'issu':1007,1140 'issued-at':1139 'item':51,195,322,435,578,580,787,930,1220,1308 'john':282 'jwt':889,953,985,1067,1103,1127,1159,1233,1265 'jwts':922,940 'key':824 'know':932 'known':729 'languag':275 'last':138 'lead':306 'learn':818,1335 'less':1296 'lesson':817 'list':732 'log':857,1000 'login':944,951,1082,1168,1247 'long':682 'longer':1292 'made':419,507 'mani':187 'march':152,843 'mark':614 'markdown':632 'mean':1304 'metric':699,1032 'middlewar':891,987,1104,1129 'migrat':502 'minor':1333 'minut':706,964,1005,1038,1184,1206,1216 'miss':283 'mitig':338 'mm':453,649,738,741 'mock':927,1156,1237 'mode':537 'monitor':315,595,875,945,1016,1169,1248 'must':258,316,581 'name':664 'narrat':48 'never':259 'new':527 'next':622 'night':139 'note':38,170,217,222,351,1276 'number':399 'observ':311,459,1254 'occur':1213 'on-cal':863,1089,1176 'option':662 'order':433 'organ':831 'outag':141,952 'output':77,946 'owner':790,1223 'ownership':1310 'p1':616,793,1226 'p2':619,801,1244 'p3':624,809,1259 'page':867,1093 'pagerduti':586 'pane':213 'pars':344 'partial':337 'passiv':271 'past':142,207,214,219 'peopl':269,1320 'person':610 'point':37,169 'polish':41 'pool':591 'poor':781 'postmortem':2,8,18,43,84,100,129,146,157,234,246,257,631,634,670,839,950,1279,1323 'practic':81 'prevent':73,617,797 'principl':250 'priorit':613 'prioriti':788,1221 'process':266,274 'produc':98,232 'project':122 'prompt':236 'provid':160 'proxim':491 'quick':1201 'rare':569 'raw':28,350 'real':571,921,939,1158,1232 'recov':905 'recoveri':1212 'recurr':75,618,798 'refer':1149 'region':717 'regress':982,1105 'reject':893,995 'reli':1189 'report':852,871,1013,1080,1193 'repres':288 'request':718,725,992,1073 'reserv':472 'resolut':334,386,655 'resolv':92,1018 'respond':625,813 'respons':375 'restor':393,1116 'revenu':726 'review':659 'roll':898,1020 'rollback':553,1108,1207,1218 'root':123,412,476,484,572,686,743,1099,1117,1197 'runbook':529 'scratch':108 'section':304,479 'seem':1332 'sentenc':674,821 'servic':528,730,1045,1048,1062,1114 'sev1':642,961 'sev2':643 'sev3':644 'sever':641,960 'share':66,1321 'short':635 'skill':22,25,131,159,841 'skill-incident-postmortem-writer' 'slack':15,31,135,164 'slower':515 'someon':380,693 'someth':357 'source-notysoty' 'specif':308,320,583,609,794,802,810 'specul':295 'spend':103 'sre':79 'stage':924,925,935,1153,1228 'start':176,353,376,381,851 'status':656,971 'step':249,342,438,480,533,574,627 'structur':46 'summari':671,973 'support':300,1085 'surfac':563 'symptom':331 'synthet':943,1167,1246 'system':264,391,403,1318 'takeaway':825 'taken':429,463 'team':69,372,550,600,663,799,807,815,1240,1255,1272,1312,1327 'technic':492,749 'techniqu':558 'test':919,1262 'thing':544,775,777,782,784 'thread':16,32,136,143,165 'throughout':253 'time':179,354,368,377,387,623,734,1054,1150,1338 'timelin':13,30,163,328,442,447,469,733,1053,1299 'titl':636 'token':896,1134 'topic-agent-skills' 'topic-claude' 'topic-claude-code' 'topic-claude-skills' 'topic-cline' 'topic-cursor' 'topic-llm' 'topic-llm-skills' 'topic-skills' 'total':394 'toward':307 'tri':341 'trigger':280 'turn':26,318,876 'unabl':998 'understand':691 'updat':523,1227 'use':71,85,111,126,154,270,554,836,926,938,1155,1231 'user':184,188,397,401,406,707,713,850,870,912,996,1012,1028,1039,1044,1079,1095,1192 'utc':454,735,849,967,970,979,1055 'v2.4.0':1110 'v2.4.1':1063,1131 'vagu':310 'valid':890,895,954,986,1068,1128,1137,1160,1234,1264 'valu':700,1033 'via':1010,1084,1094 'voic':272 'wait':1294 'wasn':695,917 'well':540,774,1196 'went':539,773,780,1195 'within':1214,1280 'without':102,1305 'work':383 'wors':421,510 'write':4,105,144,244,482,1277 'writer':3,19,130,158,840 'wrong':360,1148 'wrote':668 'x':762 'y':765,768 'z':771","prices":[{"id":"a4baab55-a747-4f82-8ef7-d16c6caa5ddc","listingId":"c851a133-4689-4e75-8b7e-3c2b360536dc","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"Notysoty","category":"openagentskills","install_from":"skills.sh"},"createdAt":"2026-05-18T13:20:43.249Z"}],"sources":[{"listingId":"c851a133-4689-4e75-8b7e-3c2b360536dc","source":"github","sourceId":"Notysoty/openagentskills/incident-postmortem-writer","sourceUrl":"https://github.com/Notysoty/openagentskills/tree/main/skills/incident-postmortem-writer","isPrimary":false,"firstSeenAt":"2026-05-18T13:20:43.249Z","lastSeenAt":"2026-05-18T19:13:22.189Z"}],"details":{"listingId":"c851a133-4689-4e75-8b7e-3c2b360536dc","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"Notysoty","slug":"incident-postmortem-writer","github":{"repo":"Notysoty/openagentskills","stars":8,"topics":["agent-skills","claude","claude-code","claude-skills","cline","cursor","llm","llm-skills","skills"],"license":"mit","html_url":"https://github.com/Notysoty/openagentskills","pushed_at":"2026-03-28T06:50:19Z","description":"A  community-driven library of reusable AI agent skills for Claude Code, Cursor, Codex, Cline, and more.","skill_md_sha":"6e0d98b9934dd08e9e3097fab1506d97ea2ba865","skill_md_path":"skills/incident-postmortem-writer/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/Notysoty/openagentskills/tree/main/skills/incident-postmortem-writer"},"layout":"multi","source":"github","category":"openagentskills","frontmatter":{"name":"Incident Postmortem Writer","description":"Writes a blameless incident postmortem document from an incident timeline or Slack thread."},"skills_sh_url":"https://skills.sh/Notysoty/openagentskills/incident-postmortem-writer"},"updatedAt":"2026-05-18T19:13:22.189Z"}}