<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Value Driven Engineer]]></title><description><![CDATA[A newsletter about engineering with purpose. No hype, no silver bullets. Just clear ways to turn technical work into real value for organizations, for teams, and for you as an engineer.]]></description><link>https://newsletter.valuedrivenengineer.com</link><image><url>https://substackcdn.com/image/fetch/$s_!oi28!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f335ac2-5f3b-4ffa-8ac9-7c3063485f88_94x94.png</url><title>Value Driven Engineer</title><link>https://newsletter.valuedrivenengineer.com</link></image><generator>Substack</generator><lastBuildDate>Sat, 18 Apr 2026 13:22:47 GMT</lastBuildDate><atom:link href="https://newsletter.valuedrivenengineer.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Milan Latinovic]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[valuedrivenengineer@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[valuedrivenengineer@substack.com]]></itunes:email><itunes:name><![CDATA[Milan Latinovic]]></itunes:name></itunes:owner><itunes:author><![CDATA[Milan Latinovic]]></itunes:author><googleplay:owner><![CDATA[valuedrivenengineer@substack.com]]></googleplay:owner><googleplay:email><![CDATA[valuedrivenengineer@substack.com]]></googleplay:email><googleplay:author><![CDATA[Milan Latinovic]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[The One-Page Document To End Repeating Debates]]></title><description><![CDATA[Stop reiterating. Start deciding. A practical guide to Architecture Decision Records.]]></description><link>https://newsletter.valuedrivenengineer.com/p/the-one-page-document-to-end-repeating</link><guid isPermaLink="false">https://newsletter.valuedrivenengineer.com/p/the-one-page-document-to-end-repeating</guid><dc:creator><![CDATA[Milan Latinovic]]></dc:creator><pubDate>Wed, 18 Feb 2026 11:30:26 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!dZnX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3af31f30-47ef-44ef-8600-5fe3e6b65ef2_642x362.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The most expensive meetings are the ones where you repeat the same topics all over again. You walk out of a heated discussion about a technical approach&#8212;database choice, service boundary, caching strategy&#8212;without writing down the positions, the trade-offs, or even what you decided. Two weeks later, someone raises the same question. Same arguments. Same people. Same inconclusive ending. Not because the team is bad at decisions, but because decisions without artifacts aren&#8217;t really decisions. They&#8217;re conversations that dissolved into a void.</p><p>Remote and async work makes this worse. Decisions happen in meetings half the team misses, or in Slack threads that scroll into oblivion. The pain isn&#8217;t about &#8220;we need more documentation&#8221;. The pain is wasted time, unclear ownership, and a team that can&#8217;t move forward because no one&#8217;s sure what was already agreed.</p><p>Architecture Decision Records (ADRs) fixed this for my projects. Not as documentation overhead, but as a structured approach to conversations we were already having in an unstructured way.</p><p></p><h2>The Real Cost of Undocumented Decisions</h2><p>Decisions made in Slack threads or meetings leave no artifact. No traceability. Someone asks &#8220;how do we plan to fix this?&#8221; or &#8220;why did we choose X?&#8221; and the answer becomes an archaeological dig through chat history, meeting recordings, or the memory of whoever happened to be in the room.</p><p>Without a clear decision record, anyone can reopen the debate. And they will. Not out of ill intent. They genuinely don&#8217;t know it was already settled, or they weren&#8217;t there when it happened. Management can&#8217;t track blockers when decisions are stuck in someone&#8217;s head. Work stalls quietly.</p><p>In startups, the response is often &#8220;we&#8217;re too small for process&#8221;, which is ironic. You&#8217;re already paying the cost: repeated debates, context that lives in one person&#8217;s brain, in onboarding that requires a verbal history lesson. Not documenting decisions is a shortcut, and like <a href="https://valuedrivenengineer.com/principles#every-shortcut-is-a-bet">every shortcut, it&#8217;s a bet</a>. You&#8217;re betting you won&#8217;t need to revisit them. I&#8217;ve seen it firsthand: in some of my previous teams there was no single source of truth for architectural decisions. Every onboarding became a tribal knowledge transfer. A good number of refactor proposals started with &#8220;check the code&#8221; commonly followed by &#8220;why did we build it this way?&#8221;</p><p>At scaleups, the coordination overhead multiplies. Fifty engineers means fifty people who might reasonably ask &#8220;why?&#8221;. Without a record, that could mean fifty separate conversations to answer them.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!dZnX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3af31f30-47ef-44ef-8600-5fe3e6b65ef2_642x362.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dZnX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3af31f30-47ef-44ef-8600-5fe3e6b65ef2_642x362.png 424w, https://substackcdn.com/image/fetch/$s_!dZnX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3af31f30-47ef-44ef-8600-5fe3e6b65ef2_642x362.png 848w, https://substackcdn.com/image/fetch/$s_!dZnX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3af31f30-47ef-44ef-8600-5fe3e6b65ef2_642x362.png 1272w, https://substackcdn.com/image/fetch/$s_!dZnX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3af31f30-47ef-44ef-8600-5fe3e6b65ef2_642x362.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!dZnX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3af31f30-47ef-44ef-8600-5fe3e6b65ef2_642x362.png" width="642" height="362" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3af31f30-47ef-44ef-8600-5fe3e6b65ef2_642x362.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:362,&quot;width&quot;:642,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:48902,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.valuedrivenengineer.com/i/188367116?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3af31f30-47ef-44ef-8600-5fe3e6b65ef2_642x362.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!dZnX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3af31f30-47ef-44ef-8600-5fe3e6b65ef2_642x362.png 424w, https://substackcdn.com/image/fetch/$s_!dZnX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3af31f30-47ef-44ef-8600-5fe3e6b65ef2_642x362.png 848w, https://substackcdn.com/image/fetch/$s_!dZnX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3af31f30-47ef-44ef-8600-5fe3e6b65ef2_642x362.png 1272w, https://substackcdn.com/image/fetch/$s_!dZnX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3af31f30-47ef-44ef-8600-5fe3e6b65ef2_642x362.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>What ADRs Actually Are (And Aren&#8217;t)</h2><p>An Architecture Decision Record (ADR) is, at its core, <strong>a record of </strong><em><strong>why</strong></em><strong> a decision was made</strong>, not just <em>what</em> was decided. That distinction matters. The &#8220;what&#8221; is usually visible in the code. The &#8220;why&#8221; disappears the moment the meeting ends.</p><p>Think of ADRs as requirements engineering disguised as documentation. The artifact, the written record, is a byproduct. <strong>The real value is the structured decision-making process that produces it.</strong> Writing an ADR forces you to articulate the problem before jumping to solutions. <a href="https://valuedrivenengineer.com/principles#why-before-what">Why before what principle.</a></p><p>ADRs can be a tool for async decision-making in remote teams. They&#8217;re the reference that ends &#8220;why did we...&#8221; conversations in thirty seconds. They are <em>not</em> bureaucratic overhead&#8212;a useful ADR can be a ten-line markdown file in your repo. They&#8217;re not only for &#8220;big&#8221; decisions; anything worth debating twice is worth an ADR. And they don&#8217;t replace discussion, they structure it.</p><p><strong>The Minimum Viable ADR needs just four fields:</strong></p><ol><li><p><strong>Context:</strong> What&#8217;s the situation? What problem are we solving?</p></li><li><p><strong>Decision:</strong> What did we decide?</p></li><li><p><strong>Consequences:</strong> What are the trade-offs? What did we accept or reject?</p></li><li><p><strong>Status:</strong> Draft / Proposed / Accepted / Superseded</p></li></ol><p>A more extended version adds:</p><ul><li><p><strong>Positions:</strong> All approaches considered before the decision was taken. Typically two to four options, each with pros and cons, with the decision stating which approach won (or a combination, if the approaches were complementary).</p></li><li><p><strong>Stakeholders:</strong> Who needs to be consulted or informed? Who has the final call?</p></li><li><p><strong>Related ADRs:</strong> Links to previous decisions this one builds on or supersedes.</p></li><li><p><strong>Date:</strong> When the decision was proposed and when it was accepted.</p></li><li><p><strong>Artifacts:</strong> Freestyle :) Various proofs or even raw data related to positions and the final decision.</p></li></ul><p>ADRs can live anywhere: a markdown file in your repo, a Confluence page with tags and mentions, a Notion database. The format matters far less than the habit.</p><p>As AI-powered search becomes standard, structured records like ADRs become even more valuable. They&#8217;re exactly the kind of knowledge that LLMs and search tools can surface instantly.</p><h2>How ADRs Changed Dynamics Inside My Team</h2><p>At one of my teams, I introduced a full Architecture Repository. ADRs were one piece alongside Architecture Migrations, Procedures, Post Mortems and a Risk Registry. But ADRs had the most immediate impact.</p><p>Before ADRs, the same debates resurfaced every few weeks. Decisions stalled because no one knew who owned them. Remote team members felt excluded from decisions made in meetings they couldn&#8217;t attend. Management couldn&#8217;t see what was blocked or why.</p><p>After we adopted ADRs, these things changed:</p><ul><li><p><strong>Fewer &#8220;why did we do this?&#8221; conversations.</strong> New project members (e.g. engineers or project owners from different teams) onboarded faster. They read the ADRs instead of hunting down so-called tribal knowledge. We use ADR references instead of re-explaining context in every PR and discussion thread.</p></li><li><p><strong>Clearer blockers.</strong> &#8220;We need a decision on ADR-XYZ-042&#8221; became a trackable, actionable item. Management got more responsive when decisions were formalized. It&#8217;s harder to ignore an official ADR than a chat thread buried under emoji reactions.</p></li><li><p><strong>Async work, unlocked.</strong> Remote-first teams could propose, debate, and decide without synchronous meetings. Comments on the ADR replaced circular threads that went nowhere.</p></li><li><p><strong>Faster decision velocity.</strong> Structured options forced focus. Instead of endless open-ended debate, we evaluated concrete trade-offs side by side. Decisions that used to take weeks took days.</p></li><li><p><strong>(the unexpected benefit) Mental clarity.</strong> Writing an ADR forces <em>you</em> to clarify your own thinking. You take all the feedback, all the competing concerns, and put them into structured form. More than once I heard engineers say some version of: &#8220;I thought I knew what I wanted until I tried to write down why.&#8221; The act of writing is the act of thinking.</p></li></ul><p>Notice these benefits cut across <a href="https://valuedrivenengineer.com/principles#four-layers-of-value">all four layers of value</a>: faster decisions help the <em>company</em>, async unlocking helps the <em>team</em>, clearer blockers help <em>customers</em> get features sooner, and the mental clarity is deeply <em>personal</em>. ADRs might feel like overhead, but the decision <em>is</em> the deliverable. <a href="https://valuedrivenengineer.com/principles#ship-value-not-activity">Shipping the ADR is shipping value, not activity.</a></p><h2>The 5-Minute ADR Test</h2><p>Not every decision needs an ADR. But more decisions deserve one than most teams think. Here&#8217;s a quick test: ask these five questions. If you answer &#8220;yes&#8221; to two or more, write an ADR.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-L2t!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e646ae6-d32a-4d13-9f3a-978ac0beca74_486x353.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-L2t!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e646ae6-d32a-4d13-9f3a-978ac0beca74_486x353.png 424w, https://substackcdn.com/image/fetch/$s_!-L2t!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e646ae6-d32a-4d13-9f3a-978ac0beca74_486x353.png 848w, https://substackcdn.com/image/fetch/$s_!-L2t!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e646ae6-d32a-4d13-9f3a-978ac0beca74_486x353.png 1272w, https://substackcdn.com/image/fetch/$s_!-L2t!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e646ae6-d32a-4d13-9f3a-978ac0beca74_486x353.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-L2t!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e646ae6-d32a-4d13-9f3a-978ac0beca74_486x353.png" width="486" height="353" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4e646ae6-d32a-4d13-9f3a-978ac0beca74_486x353.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:353,&quot;width&quot;:486,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:57527,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://valuedrivenengineer.substack.com/i/188367116?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e646ae6-d32a-4d13-9f3a-978ac0beca74_486x353.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!-L2t!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e646ae6-d32a-4d13-9f3a-978ac0beca74_486x353.png 424w, https://substackcdn.com/image/fetch/$s_!-L2t!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e646ae6-d32a-4d13-9f3a-978ac0beca74_486x353.png 848w, https://substackcdn.com/image/fetch/$s_!-L2t!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e646ae6-d32a-4d13-9f3a-978ac0beca74_486x353.png 1272w, https://substackcdn.com/image/fetch/$s_!-L2t!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e646ae6-d32a-4d13-9f3a-978ac0beca74_486x353.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong>Try this:</strong> Think about the last three technical debates your team had. Run them through this test. I&#8217;d bet at least one deserved an ADR.</p><h2>ADR Lifecycle: From Draft to Superseded</h2><p>ADRs aren&#8217;t static documents. They move through stages:</p><ul><li><p><strong>Draft.</strong> You&#8217;re still forming the proposal. Not ready for formal review, but visible to the team.</p></li><li><p><strong>Proposed.</strong> Ready for team input. This is where async discussion happens&#8212;comments, counter-proposals, refinements.</p></li><li><p><strong>Accepted.</strong> Decision made. This is now the canonical record. The team aligns on this.</p></li><li><p><strong>Superseded.</strong> A newer ADR replaces this one. Link to the new ADR so the decision trail stays clear.</p></li><li><p><strong>Deprecated.</strong> No longer relevant. The system was removed, the context changed, the decision no longer applies.</p></li></ul><p>The key rule: ADRs are append-only. You don&#8217;t edit an accepted ADR. You supersede it with a new one that references the old. This preserves the full decision trail, including <em>why</em> you changed course.</p><p>One process tip that makes the whole system work: assign a clear owner to every ADR. Someone needs to shepherd it from Proposed to Accepted, gather input, and make the call or escalate if needed. <a href="https://valuedrivenengineer.com/principles#own-the-outcome">Ownership applies here</a> just as much as it does in code.</p><h2>Maintaining Your ADR Repository</h2><p>ADRs only work if people can find them. The fastest way to kill adoption is a repo of decisions nobody can navigate.</p><p>Discoverability is everything. Use consistent naming: ADR-XYZ-001, ADR-XYZ-002 or a tagging system. A simple index file that lists all ADRs with their status and a one-line summary goes a long way.</p><p>Link ADRs to code. Reference them in comments, commit messages, and PR descriptions. &#8220;See ADR-017 for context&#8221; turns a confusing code decision into an understandable one. Consider making ADRs part of your acceptance criteria or definition of done for decisions that affect architecture.</p><p>Review quarterly. Are there Proposed ADRs stuck in limbo? Superseded ADRs that need cleanup? A thirty-minute quarterly review keeps the repository healthy and signals that the team takes decisions seriously. Think of it as <a href="https://valuedrivenengineer.com/principles#keep-evolving">keeping your decision-making process evolving</a> alongside your codebase.</p><p>Keep ADRs close to the work. Markdown files in <code>/docs/adr/</code> in the code repo get seen. ADRs buried deep in Confluence get forgotten. On the other hand, for broader architectural choices that span teams, a shared Confluence or Notion space with proper tagging works well.</p><p>Maybe a hybrid approach: code-level ADRs for implementation decisions, a shared wiki for cross-team choices covers most of your needs.</p><p>The format and tooling will depend on your team. Start simple, one ADR for a decision that keeps coming up, and evolve from there.</p><div><hr></div><p><strong>As for my own projects:</strong> We stopped having the same debates. Not because everyone agreed but because we finally wrote down <em>why</em> we disagreed, what we chose, and what we accepted as trade-offs. The next time someone asked, there was a link.</p><p>You&#8217;re already making decisions. ADRs just make sure you only make them once.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.valuedrivenengineer.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">ADRs are one tool. The bigger question is how your team makes decisions under pressure, with incomplete information, and without a playbook. That&#8217;s what <strong>Value Driven Engineer</strong> is about. Subscribe for practical frameworks on engineering judgment.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[Every ‘Quick Task’ Has a Hidden Price Tag — How to Say Yes Without Falling Behind]]></title><description><![CDATA[Every &#8216;yes&#8217; has a hidden price tag. That 90-minute interview actually takes half a day. Here's the math nobody does.]]></description><link>https://newsletter.valuedrivenengineer.com/p/every-quick-task-has-a-hidden-price</link><guid isPermaLink="false">https://newsletter.valuedrivenengineer.com/p/every-quick-task-has-a-hidden-price</guid><dc:creator><![CDATA[Milan Latinovic]]></dc:creator><pubDate>Mon, 16 Feb 2026 15:23:40 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!OYX8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf970b6c-f9a7-435c-84eb-b267417c50ba_642x362.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Here&#8217;s a problem that doesn&#8217;t show up in sprint planning: the invisible tax on senior engineers.</p><p>You get asked to help. Interviews. Code reviews. &#8220;Quick&#8221; syncs. Onboarding. Each request sounds small. Each one feels impossible to refuse.</p><p>But say yes to everything without accounting for the real cost, and suddenly you&#8217;re behind on your actual commitments. Not because you&#8217;re slow. Because nobody, including you, counted the hours.</p><p>This isn&#8217;t about learning to say no. It&#8217;s about learning to say yes sustainably. There&#8217;s a difference.</p><p>As a senior+ engineer, I&#8217;ve often been asked to help with interviews&#8212;sometimes for other teams that didn&#8217;t have the capacity or were being built from scratch. The kind of request that feels impossible to refuse. Of course you help. Hiring matters. You&#8217;re a team player.</p><div><hr></div><h2>The Math Nobody Does</h2><p>When someone asks you to &#8220;help with an interview,&#8221; what they&#8217;re picturing is the interview itself. Ninety minutes, maybe two hours. A calendar block. Done.</p><p>Here&#8217;s what actually happens:</p><p><strong>Before the interview you have to:</strong></p><ul><li><p>Read the candidate&#8217;s CV and any prior feedback (20-30 minutes)</p></li><li><p>Review the role requirements, refresh on what we&#8217;re looking for (15-20 minutes)</p></li><li><p>Prepare questions tailored to this candidate&#8217;s background (20-30 minutes)</p></li></ul><p><strong>The interview itself:</strong></p><ul><li><p>The actual conversation (60-90 minutes)</p></li><li><p>Buffer time for overruns and transitions (15-30 minutes)</p></li></ul><p><strong>After the interview:</strong></p><ul><li><p>Document detailed feedback while it&#8217;s fresh (30-45 minutes)</p></li><li><p>Sync with the hiring manager or director (15-30 minutes)</p></li><li><p>Possible follow-up discussions with other interviewers (15-30 minutes)</p></li></ul><p>Add it up: <strong>2 to 4 hours per candidate.</strong> Not 60-90 minutes. Half a day.</p><p>And if there are multiple interviews in your sprint? If you&#8217;re doing panel interviews with another engineer? Double it.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!OYX8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf970b6c-f9a7-435c-84eb-b267417c50ba_642x362.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!OYX8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf970b6c-f9a7-435c-84eb-b267417c50ba_642x362.png 424w, https://substackcdn.com/image/fetch/$s_!OYX8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf970b6c-f9a7-435c-84eb-b267417c50ba_642x362.png 848w, https://substackcdn.com/image/fetch/$s_!OYX8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf970b6c-f9a7-435c-84eb-b267417c50ba_642x362.png 1272w, https://substackcdn.com/image/fetch/$s_!OYX8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf970b6c-f9a7-435c-84eb-b267417c50ba_642x362.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!OYX8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf970b6c-f9a7-435c-84eb-b267417c50ba_642x362.png" width="642" height="362" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/af970b6c-f9a7-435c-84eb-b267417c50ba_642x362.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:362,&quot;width&quot;:642,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:26585,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.valuedrivenengineer.com/i/188045712?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf970b6c-f9a7-435c-84eb-b267417c50ba_642x362.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!OYX8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf970b6c-f9a7-435c-84eb-b267417c50ba_642x362.png 424w, https://substackcdn.com/image/fetch/$s_!OYX8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf970b6c-f9a7-435c-84eb-b267417c50ba_642x362.png 848w, https://substackcdn.com/image/fetch/$s_!OYX8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf970b6c-f9a7-435c-84eb-b267417c50ba_642x362.png 1272w, https://substackcdn.com/image/fetch/$s_!OYX8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf970b6c-f9a7-435c-84eb-b267417c50ba_642x362.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><div><hr></div><h2>Say Yes, Then Make It Visible</h2><p>Aligning on expectations, estimates, and prioritization matters most. At startups and scaleups, where sprint capacity is already tight, this alignment prevents the slow bleed of unplanned work.</p><p>For example, consider this message:</p><blockquote><p>&#8220;Hey team, happy to help with interviews. Quick note for planning: please account for 2-4 hours of capacity per interview. That covers prep, the interview itself, documentation, and syncing results. Just want to make sure we&#8217;re all on the same page.&#8221;</p></blockquote><p>That&#8217;s it. No pushback. No refusal. Just visibility.</p><p>This single message did three things:</p><ol><li><p>It <strong>set expectations.</strong> Now everyone knows what the commitment actually is.</p></li><li><p>It <strong>protected your sprint.</strong> Your manager can see the real capacity impact.</p></li><li><p>It <strong>helped others.</strong> Other engineers in the channel now have language to use themselves.</p></li></ol><p>Making invisible work visible is being professional.</p><p><em>This is <a href="https://valuedrivenengineer.com/principles#reduce-friction">VDE Principle #6</a> in action: reduce friction, eliminate empty rituals. If nobody&#8217;s tracking the real cost of these requests, that&#8217;s friction. Make it visible.</em></p><div><hr></div><h2>The Process Questions Nobody Asked</h2><p>Let&#8217;s take this a step further. Assuming you accepted an emerging task such as an interview. You clarified timeframes and everyone is aligned. Great!</p><p>At this point, you might start thinking: &#8220;How will this play out? What should this process look like?&#8221;</p><p>If you are uncertain about how to tackle the interview, you should ask follow-up questions:</p><ul><li><p>Do we have a formal interview process documented?</p></li><li><p>How many people should interview each candidate?</p></li><li><p>Are we calibrated? Is one interviewer consistently harsher than another?</p></li><li><p>Who owns the interview scorecard (and evaluation guide, maybe), and when was it last updated?</p></li></ul><p>In most cases you should get enough context to keep pushing your task. Feedback doesn&#8217;t have to be ideal; it just has to be good enough.</p><p>If the answers are vague, that might tell you: <strong>there is no process.</strong></p><p>And if there&#8217;s no process, someone needs to create one. That someone is usually whoever asks the question &#8212; which is why most people don&#8217;t ask.</p><p>But creating a process is also work. It needs to be scoped, scheduled, and owned. You can&#8217;t just absorb it into your existing commitments and hope nobody notices.</p><p>So in this case you might decide on something like this:</p><blockquote><p>&#8220;If we need to formalize the interview process, that&#8217;s probably a dedicated task. Should we create a ticket for it and assign an owner?&#8221;</p></blockquote><p>Now it&#8217;s visible. Now it&#8217;s trackable. Now someone has to make a decision about whether it matters enough to prioritize.</p><div><hr></div><h2>The Four Layers of Value</h2><p>This situation is a perfect example of <a href="https://valuedrivenengineer.com/principles#four-layers-of-value">VDE Principle #3</a>: evaluate decisions through four layers of value. Every engineering decision affects customers, company, team, and yourself. Here&#8217;s how it plays out.</p><ul><li><p><strong>Customer value:</strong> If I&#8217;m behind schedule because I absorbed unplanned work, my team ships late. That means customers wait for features, or bugs take longer to fix. The impact is indirect but real.</p></li><li><p><strong>Company value:</strong> Hiring is critical. Bad hires can cost six figures when you factor in recruiting, onboarding, lost productivity, and eventual replacement. Helping with interviews is genuinely valuable to the organization.</p></li><li><p><strong>Team value:</strong> As software engineers, our primary commitment is to our team&#8217;s sprint, iteration, or whatever floats your boat. If we disappear for half a day every time there&#8217;s an ad-hoc task, our team&#8217;s commitments slip. That&#8217;s a real cost &#8212; it just happens to be invisible unless someone makes it visible.</p></li><li><p><strong>Personal value:</strong> If we keep absorbing unplanned work without speaking up, we become engineers who are always behind schedule. Not because we&#8217;re slow, but because we said yes to everything without accounting for the true cost. That&#8217;s a career problem.</p></li></ul><p><strong>Saying yes to everything feels like being a good team player. But if your yes comes at the cost of your actual commitments, you&#8217;re creating problems at all four layers.</strong></p><p>At a startup, unplanned work can sink a sprint because you&#8217;re already running lean. At a scaleup, it creates coordination chaos across teams and suddenly you&#8217;re blocking others. Either way, the cost is real.</p><div><hr></div><h2>The Principle: Sustainable Yes</h2><p>The skill here isn&#8217;t saying no. Saying no is easy, but it burns bridges and makes you look unhelpful.</p><p>The skill is <strong>saying yes sustainably.</strong> Which means:</p><p>Say yes, because the work usually does matter. But make the cost visible <em>before</em> you&#8217;re underwater, not after. Ask the process questions, because if there&#8217;s no process, you&#8217;re not the only one struggling. Then let others make the tradeoff with full information, not assumptions.</p><p>When you name the cost publicly, you&#8217;re being the kind of senior engineer who thinks about systems, not just tasks.</p><p>Next time someone asks you for &#8220;a quick favor&#8221; that isn&#8217;t quick, try this:</p><blockquote><p>&#8220;Happy to help with [X]. For planning purposes, this typically takes [realistic time estimate] when you include [list the hidden work]. Can we make sure that&#8217;s accounted for in this sprint?&#8221;</p></blockquote><p>You&#8217;re not refusing. You&#8217;re being honest about what help actually costs.</p><p>That&#8217;s how senior engineers protect their capacity without burning bridges.</p><div><hr></div><h2>The Cheat Sheet: What &#8220;Quick&#8221; Requests Actually Cost</h2><blockquote><p><strong>&#8220;Help with an interview&#8221;</strong></p></blockquote><p>You assume it takes 90 minutes.</p><p>It actually takes 2-4 hours:</p><ul><li><p>CV review and prior feedback (20-30 min)</p></li><li><p>Role requirements and prep (15-20 min)</p></li><li><p>Tailored question preparation (20-30 min)</p></li><li><p>The interview itself (60-90 min)</p></li><li><p>Buffer for overruns and transitions (15-30 min)</p></li><li><p>Detailed feedback documentation (30-45 min)</p></li><li><p>Sync with hiring manager (15-30 min)</p></li><li><p>Follow-up discussions with other interviewers (15-30 min)</p></li></ul><blockquote><p><strong>&#8220;Onboard the new person&#8221;</strong></p></blockquote><p>You assume it takes a few pairing sessions.</p><p>It actually takes 8-15 hours over 2 weeks:</p><ul><li><p>Environment setup troubleshooting (1-2 hours)</p></li><li><p>Codebase walkthrough (2-3 hours)</p></li><li><p>Pairing on first tasks (3-5 hours)</p></li><li><p>Code review with teaching (2-3 hours)</p></li><li><p>Answering questions throughout (1-2 hours)</p></li></ul><blockquote><p><strong>&#8220;Quick code review&#8221;</strong></p></blockquote><p>You assume it takes 30 minutes.</p><p>It actually takes 1-2 hours:</p><ul><li><p>Pull branch and run locally (10-15 min)</p></li><li><p>Understand context and requirements (15-20 min)</p></li><li><p>Actual review (20-30 min)</p></li><li><p>Write constructive feedback (15-20 min)</p></li><li><p>Follow-up discussion (10-20 min)</p></li><li><p>Re-review after changes (15-30 min)</p></li></ul><blockquote><p><strong>&#8220;Join this sync meeting&#8221;</strong></p></blockquote><p>You assume it takes 30 minutes.</p><p>It actually takes 1-1.5 hours:</p><ul><li><p>Pre-read materials (15-20 min)</p></li><li><p>Actual meeting (30 min)</p></li><li><p>Context switching overhead (10-15 min)</p></li><li><p>Action items and follow-up (15-20 min)</p></li></ul><blockquote><p><strong>&#8220;Can you document this?&#8221;</strong></p></blockquote><p>You assume it takes an hour.</p><p>It actually takes 3-5 hours:</p><ul><li><p>Understand what needs documenting (30-45 min)</p></li><li><p>Write first draft (1-2 hours)</p></li><li><p>Add diagrams or examples (30-60 min)</p></li><li><p>Review and revise for clarity (45-60 min)</p></li><li><p>Get feedback and update (30-45 min)</p></li></ul><blockquote><p><strong>&#8220;Debug this production issue&#8221;</strong></p></blockquote><p>You assume it takes a few minutes.</p><p>It actually takes 2-6 hours:</p><ul><li><p>Get access to logs and metrics (15-30 min)</p></li><li><p>Reproduce the issue (30-60 min)</p></li><li><p>Trace through the code (45-90 min)</p></li><li><p>Identify root cause (30-90 min)</p></li><li><p>Test the fix (30-60 min)</p></li><li><p>Document for postmortem (30-45 min)</p></li></ul><blockquote><p><strong>&#8220;Spike out this approach&#8221;</strong></p></blockquote><p>You assume it takes a couple hours.</p><p>It actually takes 1-3 days:</p><ul><li><p>Research existing solutions (1-2 hours)</p></li><li><p>Prototype implementation (5-10 hours)</p></li><li><p>Test edge cases (1-2 hours)</p></li><li><p>Document findings and trade-offs (1 hour)</p></li></ul><blockquote><p><strong>&#8220;Present at the team meeting&#8221;</strong></p></blockquote><p>You assume it takes the meeting length.</p><p>It actually takes 2-3 hours:</p><ul><li><p>Prepare slides or talking points (45-60 min)</p></li><li><p>Rehearse if needed (15-30 min)</p></li><li><p>Actual presentation (30 min)</p></li><li><p>Q&amp;A and discussion (20-30 min)</p></li><li><p>Follow-up questions after (15-30 min)</p></li></ul><p>Every &#8220;quick&#8221; request has hidden work attached. The senior move is knowing what that work is and saying it out loud before you&#8217;re buried.</p><div><hr></div><p><em>Have you ever counted the real hours on a &#8220;quick&#8221; request and been surprised? What&#8217;s the biggest gap you&#8217;ve found between perceived vs. actual time? I&#8217;m curious what&#8217;s missing from this list.</em></p><div><hr></div><p><em>If this resonated, share it with a fellow engineer who&#8217;s drowning in &#8220;quick&#8221; requests. They&#8217;ll thank you. And if you&#8217;re not subscribed yet, <a href="https://valuedrivenengineer.substack.com/subscribe">subscribe now</a> so you don&#8217;t miss the next one.</em></p><p></p>]]></content:encoded></item><item><title><![CDATA[How to Run an Incident Review That Counts]]></title><description><![CDATA[A practical guide to incident reviews that actually prevent the next outage.]]></description><link>https://newsletter.valuedrivenengineer.com/p/the-anatomy-of-a-postmortem-in-saas</link><guid isPermaLink="false">https://newsletter.valuedrivenengineer.com/p/the-anatomy-of-a-postmortem-in-saas</guid><dc:creator><![CDATA[Milan Latinovic]]></dc:creator><pubDate>Sun, 23 Nov 2025 12:20:19 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!lvFW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb332da0c-769b-4090-a57e-0795e7604ed9_642x362.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Imagine this: it&#8217;s a regular workday when suddenly alerts start flooding in. Your login system is down, customers cannot use the service, and customer support is drowning in hundreds of complaints. Your team now juggles 20 open Slack threads. After a few hours of high pressure work, the incident is resolved with a hotfix. The real work is just beginning.</p><p>Why did this happen in the first place?</p><p>More importantly, how do you stop it from happening again?</p><p>The hotfix is only temporary. It needs to be replaced with a proper solution. Priorities have to shift.</p><p>The incident must be clearly communicated across development, sales, customer support, compliance, security, and product teams.</p><p><strong>How do you manage all of this?</strong></p><p>A well-crafted postmortem will become your best friend.</p><h2>Why Postmortems Matter</h2><p>Software systems are complex, interconnected, and constantly evolving. Especially in SaaS products, no matter how experienced your team is, incidents will happen. Downtime, data corruption, misconfigurations, regressions, customer complaints, and even full-scale outages are all part of a software team&#8217;s experience.</p><p>During an incident, the top priority is to contain it and resolve the issue as quickly as possible. Patching, hotfixing, and restoring service come first. <em>How to manage incidents effectively is a topic for another day&#8230;</em></p><p>But once the dust settles, we have a responsibility to look back, blamelessly, and understand what actually happened. That is where the postmortem comes in. A good one summarizes the incident, traces the sequence of events, and identifies the root cause. It shows us where we can improve: in our code, our processes, our testing, or our monitoring. It also helps us reflect on the incident response itself, revealing ways to strengthen our resilience and readiness.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!lvFW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb332da0c-769b-4090-a57e-0795e7604ed9_642x362.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lvFW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb332da0c-769b-4090-a57e-0795e7604ed9_642x362.png 424w, https://substackcdn.com/image/fetch/$s_!lvFW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb332da0c-769b-4090-a57e-0795e7604ed9_642x362.png 848w, https://substackcdn.com/image/fetch/$s_!lvFW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb332da0c-769b-4090-a57e-0795e7604ed9_642x362.png 1272w, https://substackcdn.com/image/fetch/$s_!lvFW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb332da0c-769b-4090-a57e-0795e7604ed9_642x362.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lvFW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb332da0c-769b-4090-a57e-0795e7604ed9_642x362.png" width="642" height="362" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b332da0c-769b-4090-a57e-0795e7604ed9_642x362.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:362,&quot;width&quot;:642,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:36208,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.valuedrivenengineer.com/i/179718297?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb332da0c-769b-4090-a57e-0795e7604ed9_642x362.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!lvFW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb332da0c-769b-4090-a57e-0795e7604ed9_642x362.png 424w, https://substackcdn.com/image/fetch/$s_!lvFW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb332da0c-769b-4090-a57e-0795e7604ed9_642x362.png 848w, https://substackcdn.com/image/fetch/$s_!lvFW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb332da0c-769b-4090-a57e-0795e7604ed9_642x362.png 1272w, https://substackcdn.com/image/fetch/$s_!lvFW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb332da0c-769b-4090-a57e-0795e7604ed9_642x362.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong>A postmortem gives us a chance to move beyond &#8220;what broke?&#8221; and ask &#8220;why?&#8221;. A well-analyzed and clearly communicated postmortem helps ensure we do not make the same mistake twice.</strong></p><h2>Common Pitfalls</h2><p>In my experience, most postmortems I have seen were thoughtful and well written. But occasionally, I have come across several that just felt off. In one case, the author directly pointed to an individual as the cause of the incident. This set off a long, uncomfortable discussion where the conversation quickly turned into finger-pointing. It escalated unnecessarily, with middle management stepping in and starting to dig into who did what, instead of helping the team move forward.</p><p>To be fair, the person did make an honest mistake. But it was the kind of issue that a properly set up CI/CD pipeline could have caught. At first, the discussion focused too much on personal accountability, rather than looking at how the process could be improved or what safety nets were missing. Fortunately, as more people joined the conversation, the tone shifted and the focus turned back to how to prevent similar issues in the future.</p><p>Blame is one of the most common and damaging pitfalls in postmortems. When people feel they are being singled out, they stop sharing openly, which undermines the whole point of reflection and improvement. Another common mistake is writing vague or non-actionable takeaways. Phrases like &#8220;engineers should be more careful&#8221; or &#8220;we&#8217;ll try harder next time&#8221; do not lead to real change. Some teams also treat postmortems as a checkbox activity&#8212;something to complete quickly and file away, without follow-up or accountability. Others write overly technical postmortems that are hard to understand or so high-level they fail to capture the complexity of what actually happened. In all these cases, the result is the same: the team misses a chance to learn.</p><h2>Best Practices</h2><p>A good postmortem is clear, written in a calm tone, and focused on learning. It&#8217;s not a blame report but a tool for continuous improvement.</p><p>Here are some practices that I use when writing or reviewing postmortems:</p><h3>Capture everything as it happens</h3><p>I cannot highlight this enough. Turn it into a habit to screenshot anything that might seem relevant during the incident and keep it in a personal notes file. Copy and paste links from Slack threads, stack traces, reports from your monitoring platform or links to your customer tickets. Include names of people involved or consulted. This will save time and help you reconstruct the timeline later.</p><h3>Write the postmortem soon after the incident</h3><p>Details fade quickly. The sooner you write it, the more accurate and useful it will be.</p><p>Start with the timeline. Walk through the sequence of events as they unfolded. Include timestamps, actions taken, and observations.</p><p>Hint: Be mindful and specific about timezones, distributed systems and worldwide users do not &#8220;run on the same time&#8221;.</p><p>For example, a clear timeline might look like this:</p><blockquote><p><strong>Incident Timeline &#8212; 12 March 2025 (all times in UTC)</strong></p><p>09:15 &#8212; Alert triggered: Payment service response time exceeds 5s threshold</p><p>09:18 &#8212; Engineering team notified via team channel</p><p>09:25 &#8212; Initial investigation begins. Logs indicate database queries timing out</p><p>09:35 &#8212; Customer support reports increase in payment failure complaints</p><p>09:40 &#8212; DevOps/Backend checks database server metrics: CPU and I/O utilization spiked at 95%</p><p>09:45 &#8212; Hotfix deployed: temporarily increase database instance size to relieve load (in reality DB instance size change could involve additional downtime)</p><p>09:50 &#8212; Response time improves; service partially restored</p><p>10:05 &#8212; Team continues root cause analysis; identifies recent schema migration as possible cause</p><p>10:20 &#8212; Communication sent to all stakeholders (sales, support, product) explaining the incident and temporary fix</p><p>10:30 &#8212; Database migration rollback plan drafted in case issues persist</p><p>11:00 &#8212; Monitoring confirms system stable; customer complaints drop</p><p>11:15 &#8212; Postmortem assigned and kickoff scheduled for next day</p></blockquote><h3>Be blameless, but transparent</h3><p>Avoid finger-pointing, but don&#8217;t hide oversights either.</p><h3>Don&#8217;t criticize, suggest better ways</h3><p>Focus on proposing improvements, not pointing out flaws. If something was missed or could have been handled better, call it out constructively. That&#8217;s the only way to prevent it from repeating. For example, anytime I call out a mistake, oversight or a bad process I try to come up with a proposal on how to improve it.</p><h3>Involve everyone who made an important contribution</h3><p>Customer support member who recognized the outage; sales team member who hinted you that something is broken for a large integration customer. Someone saw a strange CPU spike and contributed to your investigation.</p><h3>Ask &#8220;why?&#8221; until you get clarity</h3><p>I love &#8220;5 whys&#8221; technique. The idea is simple, you start by writing why something happened. Whatever you write as an answer you ask a follow-up why. You repeat this process up to 5 times until you hit the core issue.</p><p>Let&#8217;s imagine a situation here.</p><p>The team had a production outage... Why?</p><p>Because team deployed new feature relying on a non-existing environment variable... Why?</p><p>Because it was not recognized during the code review or within our automated deployment pipelines... Why?</p><p>Because in our code reviews it is unclear who has the ownership of quality assurance when it comes to the infrastructure and integrations. Also, we never planned and don&#8217;t have a task to improve our automated pipelines...</p><p>See, as we ask why the ambiguity is turning into clarity. Clarity will hopefully turn into actionable items.</p><p>Here is a &#8220;5 Whys Root Cause Analysis&#8221; example.</p><p><strong>Problem:</strong> Payments were failing during peak hours.</p><blockquote><p><strong>Why 1:</strong> Why were payments failing? Because our payment gateway kept timing out.</p><p><strong>Why 2:</strong> Why was the gateway timing out? Because the database was slammed and slow to respond.</p><p><strong>Why 3:</strong> Why was the database overloaded? Because a slow query was running without proper indexing.</p><p><strong>Why 4:</strong> Why was the query unindexed? Because it was added as part of a new report without a performance review.</p><p><strong>Why 5:</strong> Why wasn&#8217;t there a performance review? This is where it gets interesting. The same question can lead to different root causes depending on which thread you pull:</p><p><strong>Branch A:</strong> Because our code review checklist didn&#8217;t include database impact checks. &#8594; <em>Root cause: Missing a formal process for database performance reviews before deployment.</em></p><p><strong>Branch B:</strong> Because the team was under tight deadlines and skipped parts of the review process to ship faster. &#8594; <em>Root cause: Pressure to deliver quickly led to skipping critical quality checks.</em></p><p><strong>Branch C:</strong> Because the team lacked clear ownership and accountability for reviewing database changes. &#8594; <em>Root cause: Undefined roles and responsibilities caused gaps in the review process.</em></p></blockquote><p>All three branches are valid. In practice, you might find that more than one root cause contributed to the incident. The point is to keep asking until you reach something structural that you can actually fix.</p><h3>Always end with follow-up tasks</h3><p>Lessons that you learned should show you where your team or processes are lacking. Use this to your advantage. For example, your software had partial outage because DB CPU was overloaded, you hot-fixed it by increasing instance size. Create follow-up task to investigate indexes if you haven&#8217;t done this already. Write a follow-up task to investigate if it makes sense to introduce additional caching layer.</p><h3>Use the opportunity to revisit your processes</h3><p>Let&#8217;s say your response time was 1 hour during &#8220;work time&#8221;. With 20 developers available you expected someone to react in 5 minutes. What happened? Are you lacking visibility, alerts? You might be lacking clear described processes or monitoring alerts ownership. If needed, reflect on this, also on your team&#8217;s &#8220;definition of done,&#8221; quality and security practices, or release criteria. Postmortems can uncover deep gaps worth fixing.</p><h2>Your Postmortem Cheat Sheet (Free PDF)</h2><p>Incidents suck. But postmortems? They don&#8217;t have to.</p><p>They&#8217;re your chance to pause, rewind, and learn something that actually makes your system and your team better. A good postmortem turns &#8220;what just happened?&#8221; into &#8220;we will do better, here&#8217;s how we avoid this next time&#8221;.</p><p>I&#8217;ve put together a Postmortem Guidebook. A simple, practical PDF you can keep on hand for the next time something breaks in production.</p><p>Inside, you&#8217;ll find:</p><ul><li><p>A clean, blameless postmortem template</p></li><li><p>A checklist of what to capture during and after the incident</p></li><li><p>A step-by-step &#8220;5 Whys&#8221; worksheet for uncovering root causes</p></li><li><p>Sample of what follow-up tasks might look like (with clear acceptance criteria)</p></li><li><p>Tips for getting buy-in from leadership and cross-functional teams</p></li></ul><div class="file-embed-wrapper" data-component-name="FileToDOM"><div class="file-embed-container-reader"><div class="file-embed-container-top"><image class="file-embed-thumbnail-default" src="https://substackcdn.com/image/fetch/$s_!0Cy0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack.com%2Fimg%2Fattachment_icon.svg"></image><div class="file-embed-details"><div class="file-embed-details-h1">Vde Postmortem Cheat Sheet v.1.0</div><div class="file-embed-details-h2">156KB &#8729; PDF file</div></div><a class="file-embed-button wide" href="https://valuedrivenengineer.substack.com/api/v1/file/e1960c9e-9799-4197-a349-8d3777657d43.pdf"><span class="file-embed-button-text">Download</span></a></div><div class="file-embed-description">Download the cheat sheet to run better postmortems: why they matter, pitfalls to avoid, what to do during the incident, best practices, a sample timeline, 5 Whys, root-cause branches, and a reusable postmortem template outline.</div><a class="file-embed-button narrow" href="https://valuedrivenengineer.substack.com/api/v1/file/e1960c9e-9799-4197-a349-8d3777657d43.pdf"><span class="file-embed-button-text">Download</span></a></div></div><p>This is the kind of thing I wish I had earlier in my career, a concrete resource built from real-world experience.</p><p>If you liked this post, hit subscribe. I write about engineering practices, postmortems, SaaS delivery, and lessons learned from the messy parts of building software.</p>]]></content:encoded></item></channel></rss>