create-delivery-postmortem

star 33

Use when a release delay, missed deadline, or delivery incident needs a structured post-mortem. Facilitates context gathering, timeline synthesis, and interactive Five Whys root cause analysis. Produces an executive-ready document in HTML or Markdown.

opendatahub-io By opendatahub-io schedule Updated 6/11/2026

name: create-delivery-postmortem description: >- Use when a release delay, missed deadline, or delivery incident needs a structured post-mortem. Facilitates context gathering, timeline synthesis, and interactive Five Whys root cause analysis. Produces an executive-ready document in HTML or Markdown. allowed-tools: Read Write Bash(git config:) Bash(open:) Bash(xdg-open:*) AskUserQuestion user-invocable: true argument-hint: title= release=<release> priority=<priority> format=<html|markdown> metadata: author: AIPCC version: "1.0" tags: - postmortem - release - root-cause-analysis - five-whys</p> <hr> <h2>Post-Mortem Create Skill</h2> <p>Facilitate writing a structured post-mortem document for release delays and delivery incidents. The skill gathers context from the user, synthesizes narrative sections, facilitates an interactive Five Whys root cause analysis, and produces an executive-ready document.</p> <h2>Arguments</h2> <ul> <li><strong>title</strong> (required): Short incident name (e.g., "ROCm RPM Delay")</li> <li><strong>release</strong> (optional): Target release milestone (e.g., "3.5 EA2", "4.0 GA")</li> <li><strong>priority</strong> (optional): critical / high / medium / low</li> <li><strong>format</strong> (optional, default: html): Output format — <code>html</code> or <code>markdown</code></li> </ul> <p>Example: <code>/create-delivery-postmortem title="ROCm RPM Delay" release="3.5 EA2" priority="high"</code></p> <h2>Steps</h2> <p>When invoked:</p> <h3>Phase 1: Context Gathering</h3> <ol> <li><p><strong>Prompt for context.</strong> Tell the user what input is most valuable, in this order of usefulness:</p> <ol> <li><strong>Slack threads or conversations</strong> — paste directly. These are the richest source for building timelines and identifying who knew what and when.</li> <li><strong>JIRA ticket IDs</strong> — look these up for context (committed dates, status changes, comments).</li> <li><strong>Committed delivery dates</strong> — when was something promised, and by whom?</li> <li><strong>Key people involved</strong> — who owned the deliverable, who raised the risk, who responded.</li> <li><strong>Meeting notes or email excerpts</strong> — especially anything documenting commitments or escalations.</li> <li><strong>Free-form narrative</strong> — the user's own understanding of what happened.</li> </ol> <p>Say: "Paste whatever you have — Slack threads, JIRA ticket IDs, notes, narrative. The most useful things are conversations that show when risks were raised and committed delivery dates. Send as many messages as you need. Say 'done' when you've shared everything."</p> <p>Accept input across multiple messages until the user signals completion.</p> </li> <li><p><strong>Synthesize narrative sections.</strong> From the gathered context, draft:</p> <ul> <li><strong>Postmortem Summary</strong>: Incident name, author (from <code>git config user.name</code>, confirm with user), priority, target release.</li> <li><strong>Executive Summary</strong>: One paragraph — what happened, what the impact was, what was learned. Written for a Director-level audience who needs the picture in 30 seconds.</li> <li><strong>Leadup</strong>: Sequence of events leading to the incident. Use specific dates and actors.</li> <li><strong>Impact</strong>: Potential or observed delivery impact. Be specific about what was delayed, by how long, and what downstream was affected.</li> <li><strong>Detection and Timeline</strong>: When the team detected or raised the risk. Name people, communication channels (Slack, email, meeting), and timestamps.</li> <li><strong>Response</strong>: Who responded and what was done at each stage. Include delays or obstacles to responding. Be specific about handoffs.</li> <li><strong>Recovery</strong>: When the incident was resolved. Describe how time-to-mitigation could have been improved.</li> </ul> </li> <li><p><strong>Present for review.</strong> Show the drafted sections to the user. Ask them to correct facts, fill gaps, and adjust framing. Iterate until the user approves all narrative sections before moving to Phase 2.</p> </li> </ol> <h3>Phase 2: Root Cause Analysis — Interactive Five Whys</h3> <ol start="4"> <li><p><strong>Draft the Five Whys chain.</strong> Analyze the approved narrative and propose an initial Five Whys chain. Start from the surface-level problem statement and work down. For each "why":</p> <ul> <li>State the question ("Why did X happen?")</li> <li>Propose the answer</li> <li>Cite evidence from the context (Slack message, date, committed delivery)</li> </ul> </li> <li><p><strong>Facilitate interactive refinement.</strong> Present the chain and walk through it with the user. At each level, actively push back when:</p> <ul> <li>A "why" <strong>restates the symptom</strong> rather than identifying a cause. ("The RPMs were late" → "The RPMs were delayed" is restating. "The RPMs were late" → "The upstream rebuild took longer than the compressed timeline allowed" is a cause.)</li> <li>The chain <strong>stops at human error</strong> ("someone forgot") instead of a systemic gap ("there was no process to ensure..."). Always ask: "Why was it possible for this to be forgotten? What system or process should have caught this?"</li> <li>A <strong>causal link lacks evidence</strong>. If the user asserts a cause, ask for specifics: "Was the code freeze communicated somewhere the team should have seen it? Can you point to where?"</li> <li>The chain <strong>branches</strong> and one branch is being ignored. If there are multiple contributing causes, note all branches and explore each.</li> </ul> <p>Prompt for additional context where the chain is thin. Ask specific questions, not generic ones.</p> </li> <li><p><strong>Converge on root cause.</strong> The Five Whys must land on something <strong>systemic and actionable</strong> — a process gap, communication breakdown, or missing feedback loop. If the proposed root cause is not actionable (e.g., "vendors are slow"), push deeper: "What could we have done earlier to detect or mitigate the vendor delay?"</p> <p><strong>Five Whys principles to enforce:</strong></p> <ul> <li>Start from a clear, specific problem statement — not a vague complaint.</li> <li>Each "why" must be a direct cause — not a restatement, correlation, or blame assignment.</li> <li>Don't stop at human error — dig into why the system allowed or failed to prevent the error.</li> <li>Follow all significant branches — if there are multiple contributing causes, explore each.</li> <li>Stop when you reach something systemic and actionable — a process, communication, or structural gap that can be fixed.</li> <li>Cite evidence — each causal link should reference specific events, dates, or communications.</li> <li>Five is a guideline, not a rule — stop when you hit root cause, whether at 3 or 7.</li> </ul> </li> <li><p><strong>Related incidents (optional, but prompt for it).</strong> Ask the user: "Has anything like this happened before? If so, what was done about it, and why did it happen again despite that mitigation?"</p> </li> <li><p><strong>Backlog check (optional, but prompt for it).</strong> Ask the user: "Is there anything sitting in your backlog — a tool, a process improvement, an automation — that could have prevented this or reduced the impact?"</p> </li> <li><p><strong>Lessons learned.</strong> Draft structured lessons based on the Five Whys outcome:</p> <ul> <li><strong>What we learned</strong>: Key insights from the analysis.</li> <li><strong>What went well</strong>: Anything the team did right during the incident — fast escalation, good communication, effective workarounds. Don't skip this section.</li> <li><strong>What to improve</strong>: Concrete, actionable recommendations. Each recommendation should be specific enough to become a JIRA ticket or process change. Avoid vague suggestions like "communicate better."</li> </ul> <p>Present to the user for review. Iterate until approved.</p> </li> </ol> <h3>Phase 3: Output Generation</h3> <ol start="10"> <li><p><strong>Read the HTML template.</strong> Read <code>template.html</code> from the skill directory (same directory as this SKILL.md file).</p> </li> <li><p><strong>Generate the document.</strong> Replace each <code>{{PLACEHOLDER}}</code> in the template with the approved content. Follow these rules:</p> <ul> <li>All content sections must use proper HTML tags (<code><p></code>, <code><ul></code>, <code><li></code>, <code><ol></code>, etc.).</li> <li><strong>{{TITLE}}</strong>: The incident title from the <code>title</code> argument.</li> <li><strong>{{AUTHOR}}</strong>: The author name confirmed with the user.</li> <li><strong>{{DATE}}</strong>: Today's date in YYYY-MM-DD format.</li> <li><strong>{{RELEASE_META}}</strong>: If <code>release</code> was provided: <code><span><span class="label">Release:</span> {release}</span></code>. Otherwise, empty string.</li> <li><strong>{{PRIORITY_META}}</strong>: If <code>priority</code> was provided: <code><span><span class="label">Priority:</span> <span class="priority-badge priority-{priority}">{priority}</span></span></code>. Otherwise, empty string.</li> <li><strong>{{EXECUTIVE_SUMMARY}}</strong>: The executive summary paragraph wrapped in <code><p></code> tags.</li> <li><strong>{{LEADUP}}</strong>, <strong>{{IMPACT}}</strong>, <strong>{{DETECTION_TIMELINE}}</strong>, <strong>{{RESPONSE}}</strong>, <strong>{{RECOVERY}}</strong>: Each section's content using appropriate HTML. Use <code><p></code> for paragraphs, <code><ul></code>/<code><li></code> for lists, <code><ol></code>/<code><li></code> for ordered sequences.</li> <li><strong>{{FIVE_WHYS}}</strong>: Render each why as a <code><div class="why-step"></code> containing:<ul> <li><code><div class="why-number"></code> with "W1", "W2", etc.</li> <li><code><div class="why-content"></code> containing:<ul> <li><code><div class="why-question"></code> with the "Why?" question</li> <li><code><div class="why-answer"></code> with the answer</li> <li><code><div class="why-evidence"></code> with the supporting evidence (if any) The last why-step is styled differently (red border) automatically by the CSS to highlight the root cause level.</li> </ul> </li> </ul> </li> <li><strong>{{ROOT_CAUSE}}</strong>: The final root cause statement wrapped in <code><p></code> tags.</li> <li><strong>{{RELATED_INCIDENTS}}</strong>: If provided, render as: <code><h2>Related Incidents</h2></code> followed by content. Otherwise, empty string.</li> <li><strong>{{BACKLOG_CHECK}}</strong>: If provided, render as: <code><h2>Backlog Check</h2></code> followed by content. Otherwise, empty string.</li> <li><strong>{{LESSONS_LEARNED}}</strong>: Render with three <code><h3></code> subsections: "What We Learned", "What Went Well", "What to Improve", each followed by their content.</li> <li><strong>{{GENERATED_DATE}}</strong>: Current date and time in YYYY-MM-DD HH:MM format.</li> </ul> <p>If <code>format=markdown</code> was specified, skip the HTML template entirely and generate a standard Markdown document with the same section structure using headings, paragraphs, and lists.</p> </li> <li><p><strong>Write the output file.</strong> Write to the current working directory:</p> <ul> <li>HTML: <code>postmortem-{slugified-title}.html</code></li> <li>Markdown: <code>postmortem-{slugified-title}.md</code></li> </ul> <p>Slugify the title: lowercase, replace spaces with hyphens, remove non-alphanumeric characters except hyphens, collapse multiple hyphens.</p> </li> <li><p><strong>Open for review.</strong> Ask the user: "Post-mortem written to <code>{filename}</code>. Want me to open it in your browser for review?"</p> <p>If yes, detect the platform and open:</p> <pre><code class="language-bash">if [[ "$(uname)" == "Darwin" ]]; then open "{filename}" else xdg-open "{filename}" fi </code></pre> </li> <li><p><strong>Final changes.</strong> Ask: "Want me to make any changes before you share this?" Iterate on feedback until the user is satisfied.</p> </li> </ol> <h2>Output</h2> <p>After generating the post-mortem:</p> <ul> <li>Report the output file path</li> <li>Offer to open in browser</li> <li>Offer to make final changes</li> <li>Do NOT commit to git, create branches, or assume any repo workflow</li> </ul> </article> </div> <!-- Right: Metadata & Command Sidebar --> <div class="w-full lg:w-80 shrink-0 flex flex-col gap-6" data-astro-cid-7zzsworf> <!-- Install Card --> <div class="p-6 rounded-xl bg-surface-container border border-border/80 flex flex-col gap-4 shadow-sm" data-astro-cid-7zzsworf> <span class="text-xs font-bold uppercase tracking-widest text-on-surface-variant/60 font-mono" data-astro-cid-7zzsworf>Install via CLI</span> <div class="flex flex-col gap-2" data-astro-cid-7zzsworf> <div id="detail-install-cmd" class="font-mono text-[11px] p-3 rounded-lg bg-black/40 border border-border select-all break-all text-primary font-bold leading-relaxed" data-astro-cid-7zzsworf> npx skills add https://github.com/opendatahub-io/ai-helpers --skill create-delivery-postmortem </div> <button id="detail-copy-btn" class="w-full py-2.5 rounded-lg bg-primary hover:bg-primary-hover text-on-primary font-sans font-bold text-sm shadow transition-all active:scale-95 flex items-center justify-center gap-1.5" data-astro-cid-7zzsworf> <span class="material-symbols-outlined text-[16px]" data-astro-cid-7zzsworf>content_copy</span> <span data-astro-cid-7zzsworf>Copy Command</span> </button> </div> </div> <!-- Details & Stats Card --> <div class="p-6 rounded-xl bg-surface-container border border-border/80 flex flex-col gap-4 shadow-sm text-on-surface" data-astro-cid-7zzsworf> <span class="text-xs font-bold uppercase tracking-widest text-on-surface-variant/60 font-sans" data-astro-cid-7zzsworf>Repository Details</span> <div class="flex flex-col gap-3.5" data-astro-cid-7zzsworf> <div class="flex justify-between items-center text-sm" data-astro-cid-7zzsworf> <span class="text-on-surface-variant/70 flex items-center gap-1.5" data-astro-cid-7zzsworf> <span class="material-symbols-outlined text-[16px] text-on-surface-variant/60" data-astro-cid-7zzsworf>star</span> Stars </span> <span class="font-mono font-bold text-on-surface" data-astro-cid-7zzsworf>33</span> </div> <div class="flex justify-between items-center text-sm" data-astro-cid-7zzsworf> <span class="text-on-surface-variant/70 flex items-center gap-1.5" data-astro-cid-7zzsworf> <span class="material-symbols-outlined text-[16px] text-on-surface-variant/60" data-astro-cid-7zzsworf>call_split</span> Forks </span> <span class="font-mono font-bold text-on-surface" data-astro-cid-7zzsworf>68</span> </div> <div class="flex justify-between items-center text-sm" data-astro-cid-7zzsworf> <span class="text-on-surface-variant/70 flex items-center gap-1.5" data-astro-cid-7zzsworf> <span class="material-symbols-outlined text-[16px] text-on-surface-variant/60" data-astro-cid-7zzsworf>navigation</span> Branch </span> <span class="font-mono bg-surface border border-border px-2 py-0.5 rounded text-[11px] text-on-surface-variant" data-astro-cid-7zzsworf>main</span> </div> <div class="flex justify-between items-start text-sm" data-astro-cid-7zzsworf> <span class="text-on-surface-variant/70 flex items-center gap-1.5 mt-0.5" data-astro-cid-7zzsworf> <span class="material-symbols-outlined text-[16px] text-on-surface-variant/60" data-astro-cid-7zzsworf>article</span> Path </span> <span class="font-mono bg-surface border border-border px-2 py-0.5 rounded text-[11px] text-on-surface-variant truncate max-w-[150px]" title="SKILL.md" data-astro-cid-7zzsworf>SKILL.md</span> </div> </div> </div> <!-- Occupations Tag Card --> <!-- Related Creators Card --> <div class="p-6 rounded-xl bg-surface-container border border-border/80 flex flex-col gap-3 shadow-sm" data-astro-cid-7zzsworf> <span class="text-xs font-bold uppercase tracking-widest text-on-surface-variant/60 font-sans" data-astro-cid-7zzsworf>More from Creator</span> <div class="flex items-center gap-2" data-astro-cid-7zzsworf> <img class="w-8 h-8 rounded-full border border-border" src="https://avatars.githubusercontent.com/u/57720972?v=4" alt="opendatahub-io" onerror="this.src='https://avatars.githubusercontent.com/u/9919?v=4'" data-astro-cid-7zzsworf> <div class="flex flex-col min-w-0" data-astro-cid-7zzsworf> <span class="font-bold text-sm truncate text-on-surface" data-astro-cid-7zzsworf>opendatahub-io</span> <a href="/?creator=opendatahub-io" class="text-xs text-primary hover:underline font-semibold transition-all" data-astro-cid-7zzsworf>Explore all skills →</a> </div> </div> </div> </div> </div> </div> </div> <script> const copyBtn = document.getElementById("detail-copy-btn"); const installCmd = document.getElementById("detail-install-cmd"); if (copyBtn && installCmd) { copyBtn.addEventListener("click", () => { const cmd = installCmd.textContent.trim(); navigator.clipboard.writeText(cmd).then(() => { const originalText = copyBtn.innerHTML; copyBtn.innerHTML = ` <span class="material-symbols-outlined text-[16px]">check</span> <span>Copied!</span> `; copyBtn.style.background = "#10b981"; copyBtn.style.borderColor = "#10b981"; setTimeout(() => { copyBtn.innerHTML = originalText; copyBtn.style.background = ""; copyBtn.style.borderColor = ""; }, 1500); }); }); } </script> </div> <!-- Footer --> <footer class="border-t border-border bg-surface-container-low text-on-surface-variant py-8 px-gutter mt-16 rounded-xl"> <div class="max-w-container-max mx-auto flex flex-col md:flex-row justify-between items-center gap-6"> <div class="flex items-center gap-2"> <div class="w-6 h-6 rounded bg-primary bg-opacity-20 flex items-center justify-center"> <span class="material-symbols-outlined text-primary text-sm">code_blocks</span> </div> <span class="font-bold text-on-surface text-sm">SkillMD</span> </div> <div class="flex flex-wrap justify-center gap-6 text-sm"> <a href="/about" class="hover:text-primary transition-colors">About Us</a> <a href="/contact" class="hover:text-primary transition-colors">Contact Us</a> <a href="/privacy" class="hover:text-primary transition-colors">Privacy Policy</a> <a href="/terms" class="hover:text-primary transition-colors">Terms of Service</a> <a href="/support" class="hover:text-primary transition-colors">Support</a> </div> <div class="text-xs text-on-surface-variant/80"> © 2026 SkillMD. All rights reserved. </div> </div> </footer> </main> <!-- Script for Theme Toggle, Mobile Menu, and Sidebar Filter Redirection --> <script> // Theme setup const savedTheme = localStorage.getItem("theme") || "dark"; function applyTheme(theme) { document.documentElement.classList.remove("dark", "green", "dracula", "nord"); if (theme === "dark") { document.documentElement.classList.add("dark"); } else if (theme === "green") { document.documentElement.classList.add("dark", "green"); } else if (theme === "dracula") { document.documentElement.classList.add("dark", "dracula"); } else if (theme === "nord") { document.documentElement.classList.add("dark", "nord"); } document.documentElement.setAttribute("data-theme", theme); const themeMoon = document.getElementById("theme-moon"); const themeSun = document.getElementById("theme-sun"); const themeLeaf = document.getElementById("theme-leaf"); const themeDracula = document.getElementById("theme-dracula"); const themeNord = document.getElementById("theme-nord"); if (themeMoon && themeSun && themeLeaf && themeDracula && themeNord) { themeMoon.style.display = theme === "dark" ? "inline" : "none"; themeSun.style.display = theme === "light" ? "inline" : "none"; themeLeaf.style.display = theme === "green" ? "inline" : "none"; themeDracula.style.display = theme === "dracula" ? "inline" : "none"; themeNord.style.display = theme === "nord" ? "inline" : "none"; } } applyTheme(savedTheme); const themeToggleBtn = document.getElementById("theme-toggle-btn"); if (themeToggleBtn) { themeToggleBtn.addEventListener("click", () => { const currentTheme = document.documentElement.getAttribute("data-theme") || "dark"; let newTheme = "dark"; if (currentTheme === "dark") { newTheme = "light"; } else if (currentTheme === "light") { newTheme = "green"; } else if (currentTheme === "green") { newTheme = "dracula"; } else if (currentTheme === "dracula") { newTheme = "nord"; } else { newTheme = "dark"; } applyTheme(newTheme); localStorage.setItem("theme", newTheme); }); } // Mobile menu toggle and sidebar logic const mobileMenuToggle = document.getElementById("mobile-menu-toggle"); const sidebarMenu = document.getElementById("sidebar-menu"); const sidebarOverlay = document.getElementById("sidebar-overlay"); function isMobile() { return window.innerWidth < 768; // 768px is the 'md' breakpoint in Tailwind } function openSidebar() { if (sidebarMenu) { sidebarMenu.classList.remove("-translate-x-full"); } if (sidebarOverlay) { sidebarOverlay.classList.remove("hidden"); } } function closeSidebar() { if (sidebarMenu && isMobile()) { sidebarMenu.classList.add("-translate-x-full"); } if (sidebarOverlay) { sidebarOverlay.classList.add("hidden"); } } if (mobileMenuToggle && sidebarMenu) { mobileMenuToggle.addEventListener("click", (e) => { e.stopPropagation(); if (isMobile()) { const isClosed = sidebarMenu.classList.contains("-translate-x-full"); if (isClosed) { openSidebar(); } else { closeSidebar(); } } }); document.addEventListener("click", (e) => { if (isMobile()) { if (!sidebarMenu.contains(e.target) && !mobileMenuToggle.contains(e.target)) { closeSidebar(); } } }); if (sidebarOverlay) { sidebarOverlay.addEventListener("click", () => { if (isMobile()) { closeSidebar(); } }); } // Collapse sidebar when clicking a filter button, creator button, or nav item inside it sidebarMenu.addEventListener("click", (e) => { if (isMobile()) { const clickTarget = e.target.closest("button, a"); if (clickTarget) { closeSidebar(); } } }); // Sync sidebar state on window resize window.addEventListener("resize", () => { if (!isMobile()) { // Desktop: sidebar should be visible, no overlay if (sidebarMenu) { sidebarMenu.classList.remove("-translate-x-full"); } if (sidebarOverlay) { sidebarOverlay.classList.add("hidden"); } } else { // Mobile: start collapsed if (sidebarMenu) { sidebarMenu.classList.add("-translate-x-full"); } if (sidebarOverlay) { sidebarOverlay.classList.add("hidden"); } } }); } // If not on homepage, redirect on sidebar filter click const isHomepage = window.location.pathname === "/"; document.querySelectorAll("#occupation-filters .filter-btn").forEach(btn => { btn.addEventListener("click", (e) => { const occ = e.currentTarget.getAttribute("data-occupation"); if (!isHomepage) { window.location.href = occ ? `/?occupation=${encodeURIComponent(occ)}` : "/"; } }); }); document.querySelectorAll("#creator-filters .creator-btn").forEach(btn => { btn.addEventListener("click", (e) => { const creator = e.currentTarget.getAttribute("data-creator"); if (!isHomepage) { window.location.href = `/?creator=${encodeURIComponent(creator)}`; } }); }); </script> </body> </html>