<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title>Analify - field notes</title>
<link>https://analify.com/blog</link>
<description>How business analysis is actually done: one artifact at a time, with the decisions behind it and what a reviewer would object to.</description>
<language>en</language>
<atom:link href="https://analify.com/rss.xml" rel="self" type="application/rss+xml"/>
<item>
<title>How Long Will the Analysis Take? An Estimate You Can Defend</title>
<link>https://analify.com/blog/how-long-will-the-analysis-take</link>
<guid isPermaLink="true">https://analify.com/blog/how-long-will-the-analysis-take</guid>
<pubDate>Tue, 22 Sep 2026 00:00:00 +0000</pubDate>
<dc:creator>Sebastian Koczyk</dc:creator>
<category>estimating</category>
<category>planning</category>
<category>case-file</category>
<category>review</category>
<category>craft</category>
<description>Three clocks on one published case: thirteen hours of work, seven to nine hours a plan could name in advance, and twenty-eight days of calendar.</description>
<content:encoded><![CDATA[<p>This piece stands on the returns case published on this site: damaged-delivery refunds at a mid-size online retailer, built from a published returns policy <code>[POLICY]</code>, help centre articles <code>[HELP]</code>, ten public complaint threads I selected myself <code>[THREADS n=10]</code>, consumer law <code>[LAW]</code> and a walk through the published customer journey <code>[WALKTHROUGH]</code>. No client, no engagement, no interview, and nobody inside that company was asked anything at any point. What the case does have is a published timeline: every version dated, both review sessions dated, the hours written down beside them. The estimate below is derived backwards from that record, not from a feeling about how long this sort of thing takes.</p>
<p>An estimate for analysis work answers three separate questions with three separate numbers: how many hours the work costs, how many of those hours a plan can name before the work starts, and how many days pass before anyone can decide. Quoting one number for all three is how the date gets missed.</p>
<h2 id="in-short">In short</h2>
<ul>
<li>The case cost about thirteen hours. A step plan for the same case names seven to nine of them plus an evening. The gap is the work that happens after the document already looks finished.</li>
<li>The same case took twenty-eight calendar days. Six of them sit between a finished draft and the end of the second review session, on dates two other people set. Effort does not shorten that stretch.</li>
<li>Three of the five requirements in that register did not exist in v1.0. Cutting a review pass to hit a date does not cut polish, it cuts more than half the register.</li>
<li>The document was reviewed on 9 April and the decision it asks for was due on 30 April. Quoting the date the analysis ends answers a question nobody asked.</li>
</ul>
<h2 id="what-did-the-work-actually-cost">What did the work actually cost?</h2>
<p>About thirteen hours, spread over four evenings and one Saturday. The largest single block was the process model, and most of that block was one full redraw.</p>
<p>That figure is on the case sheet, so it can be checked against what it produced: a brief and six artifacts, namely a stakeholder map, an as-is and to-be model, a requirements register holding five requirements, a rules register, a review log and a one-page summary. It was noted rather than timed, and the word in the case is "about".</p>
<p>It holds no time for arranging interviews, chasing a data export or rescheduling a workshop, because there was no access to arrange. The thirteen hours are mine; the two reviewers read the document as a favour.</p>
<h2 id="which-hours-could-a-plan-have-named-in-advance">Which hours could a plan have named in advance?</h2>
<p>The same case is published with a five-step method, and each step carries a time. Reading those numbers as a forecast, then holding them against what the work cost, is the useful part.</p>
<table>
<thead>
<tr>
<th>Step</th>
<th>What it is</th>
<th>Time named in the method</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>Pick a process you can watch from the outside</td>
<td>Thirty minutes, most of it rejecting candidates</td>
</tr>
<tr>
<td>2</td>
<td>Collect facts, and tag every one</td>
<td>One evening, two if the policy is long</td>
</tr>
<tr>
<td>3</td>
<td>Draw the as-is until you find where work stops</td>
<td>Three to four hours, including one full redraw</td>
</tr>
<tr>
<td>4</td>
<td>Write five requirements and the rules behind them</td>
<td>Three to four hours, most of it not spent writing</td>
</tr>
<tr>
<td>5</td>
<td>Get it broken, and keep the log</td>
<td>Thirty minutes after the review, plus one favour</td>
</tr>
</tbody>
</table>
<p>Add the hours actually stated and you get seven to nine, plus an evening not expressed in hours at all. The recorded cost was about thirteen.</p>
<p>The difference is not a rounding error and not sloppiness in either number. It is the work the step list does not name: the self-review against the scorecard, the redraft after each review session, and writing up the review log. All three happen after the document already looks finished, which is exactly why a plan skips them.</p>
<p>So an honest planning number has two lines: the hours you can name, and what the passes after the first draft cost. Here the second line is about four hours on top of nine.</p>
<h2 id="the-calendar-clock-twenty-eight-days">The calendar clock: twenty-eight days</h2>
<p>Hours answer what it costs. Days answer when it lands.</p>
<table>
<thead>
<tr>
<th>Segment</th>
<th>Dates</th>
<th>Days</th>
<th>Whose diary set the date</th>
</tr>
</thead>
<tbody>
<tr>
<td>Reading sources, first to last</td>
<td>12 to 21 March 2026</td>
<td>9</td>
<td>Mine</td>
</tr>
<tr>
<td>Last source to v1.0 drafted</td>
<td>21 to 24 March 2026</td>
<td>3</td>
<td>Mine</td>
</tr>
<tr>
<td>v1.0 to v1.1, self-review against the scorecard</td>
<td>24 to 31 March 2026</td>
<td>7</td>
<td>Mine</td>
</tr>
<tr>
<td>v1.1 to the first review session</td>
<td>31 March to 2 April 2026</td>
<td>2</td>
<td>A reviewer's</td>
</tr>
<tr>
<td>First session to the second</td>
<td>2 to 6 April 2026</td>
<td>4</td>
<td>A reviewer's</td>
</tr>
<tr>
<td>Second session to v1.2, reviewed</td>
<td>6 to 9 April 2026</td>
<td>3</td>
<td>Mine, after five objections</td>
</tr>
</tbody>
</table>
<p>Twelve March to 9 April is twenty-eight days. Thirteen hours of work, spread across four weeks.</p>
<p>Look at rows four and five. Six of the twenty-eight days sit between a draft being finished and the second session ending, on dates set by when other people could read. That stretch does not shorten if you work harder. It shortens if you ask earlier or ask more people, and both are decisions made at the start rather than rescues at the end.</p>
<p>This is the number to quote when somebody asks when it will be ready, and the reason to quote it with the waiting on its own line. An estimate that hides the waiting inside the work looks smaller and is wrong in the one direction that gets noticed.</p>
<h2 id="what-did-the-extra-passes-actually-produce">What did the extra passes actually produce?</h2>
<p>This is where cutting a review round stops looking like a saving. Of the five requirements in that register, three did not exist in the first draft. REQ-018, the guard rail stopping an automated pre-check from refusing anybody, came out of the self-review against the scorecard, and so did the fallback on REQ-016. REQ-015, escalation ownership, and REQ-017, the condition dispute that moves after the money, both came out of the external sessions, along with a rewritten start event on REQ-014, a rule BR-12 nobody had written down, a page of rationale for BR-11, and one scope exclusion nobody had noticed.</p>
<p>Five objections across two sessions: four accepted, one held with the reason written down beside it.</p>
<p>So the passes a plan does not name, and a deadline squeezes first, produced more than half the register. The first draft was the input to the part that found the missing pieces, not a nearly-finished document waiting for corrections.</p>
<h2 id="the-estimate-card-filled-in-from-that-case">The estimate card, filled in from that case</h2>
<p>Copy the columns, not the content. Anything on this card that I chose rather than measured says so.</p>
<table>
<thead>
<tr>
<th>Field</th>
<th>This case</th>
</tr>
</thead>
<tbody>
<tr>
<td>Work, in hours</td>
<td>About 13, noted rather than timed. Four evenings and one Saturday</td>
</tr>
<tr>
<td>Largest single block</td>
<td>The process model, including one full redraw</td>
</tr>
<tr>
<td>Hours a plan named in advance</td>
<td>7 to 9, plus an evening not expressed in hours</td>
</tr>
<tr>
<td>What the plan did not name</td>
<td>Self-review, redraft after each session, the review log. About 4 hours on a 13 hour job</td>
</tr>
<tr>
<td>Calendar, first source to reviewed version</td>
<td>28 days, 12 March to 9 April 2026</td>
</tr>
<tr>
<td>Days on somebody else's diary</td>
<td>6, in two blocks, both ending at a review session</td>
</tr>
<tr>
<td>Passes</td>
<td>Draft, self-review against 25 checks, two external sessions, one redraft</td>
</tr>
<tr>
<td>What each pass produced</td>
<td>v1.1: one requirement, one fallback. v1.2: two requirements, a rewritten criterion, a new rule, a rule rationale, a scope exclusion</td>
</tr>
<tr>
<td>Access assumed</td>
<td>None. Public sources only, so no interviews and no data export in this timeline</td>
</tr>
<tr>
<td>Measured to</td>
<td>The decision, 30 April 2026, not the document, 9 April 2026</td>
</tr>
<tr>
<td>Trigger to re-estimate</td>
<td>Any new access, and any session that slips the week it was asked for. My rule, not something the record contains</td>
</tr>
</tbody>
</table>
<h2 id="the-blank-card">The blank card</h2>
<p>One card per piece of work. If a row has no number, write what would have to happen for it to get one.</p>
<table>
<thead>
<tr>
<th>Field</th>
<th>What goes in it</th>
</tr>
</thead>
<tbody>
<tr>
<td>Work, in hours</td>
<td>[Your figure, and how you got it: timed, noted afterwards, or compared to a finished job]</td>
</tr>
<tr>
<td>Largest single block</td>
<td>[Name it. It is the row most likely to double]</td>
</tr>
<tr>
<td>Hours a plan names in advance</td>
<td>[Sum only the steps you can describe. Leave the rest as words, not as zero]</td>
</tr>
<tr>
<td>What the plan does not name</td>
<td>[Review passes, redrafts, the log. Empty cell means no review is planned]</td>
</tr>
<tr>
<td>Calendar, start to reviewed version</td>
<td>[A date range, not a duration. Durations lose weekends and holidays]</td>
</tr>
<tr>
<td>Days on somebody else's diary</td>
<td>[Every wait, with who you are waiting for. Show the sum]</td>
</tr>
<tr>
<td>Passes</td>
<td>[How many times the document goes through somebody, including you at a distance]</td>
</tr>
<tr>
<td>What each pass is expected to produce</td>
<td>[If the answer is "corrections", you are planning a proofread]</td>
</tr>
<tr>
<td>Access assumed</td>
<td>[Interviews, exports, systems. Each is a wait you have not yet counted]</td>
</tr>
<tr>
<td>Measured to</td>
<td>[The decision, the release, the sign-off. Name it, and say who makes it]</td>
</tr>
<tr>
<td>Trigger to re-estimate</td>
<td>[The observable event that says this estimate is now wrong]</td>
</tr>
</tbody>
</table>
<p><strong>Three rules for using it.</strong> Give the waiting its own line, because it moves the date and a single number hides it. Never quote the hours and the calendar as if one implied the other: thirteen hours landed on day twenty-eight here and could as easily have landed on day nine. And when asked to cut the estimate, cut scope or access assumptions out loud rather than quietly cutting a pass, because a pass is where three of those five requirements came from.</p>
<h2 id="why-is-analysis-finished-the-wrong-date-to-quote">Why is "analysis finished" the wrong date to quote?</h2>
<p>Because the work exists to produce a decision, and the decision has its own calendar.</p>
<p>The reviewed version of that case is dated 9 April 2026. The one-page summary it ends with asks for a decision by 30 April 2026 and names the three things it needs answered: whether five working days is a commitment or a target, whether partial refunds ship in release one, and who owns the weekend rota. Twenty-one days sit between the document being finished and the question being settled, and none of them belong to the analyst.</p>
<p>The open questions register makes the same point twice over. Six questions, each with a due date and a fallback, and one of them still carrying an open owner slot. OQ-06 asks how many cases actually stall today, and the case says plainly that if parked cases turn out to be rare and short, this work is not worth a release slot. That question is dated to the first week of access, a week that had not started when the document was finished.</p>
<p>An estimate measured to the document answers a question nobody in the room asked. Measure it to the decision, and say which part of that span is yours.</p>
<h2 id="what-do-the-standards-put-a-number-on">What do the standards put a number on?</h2>
<p>Less than people expect, and never on the thinking.</p>
<p>The <a href="https://scrumguides.org/scrum-guide.html">Scrum Guide</a> is the document most often reached for when somebody wants a norm here. It puts a length on the Sprint and time boxes on the events, and it gives no figure for preparing a backlog item or for analysis of any kind. Sizing there sits with the people who will do the work, not with a standard. Teams quoting a number for refinement got it from their own history, which is the right place to get it and not a place anybody else can borrow from.</p>
<p>HM Treasury's <a href="https://www.gov.uk/government/publications/orange-book">Orange Book</a>, the free risk management guidance for UK government organisations, asks for something a schedule can use: "clear processes for bringing significant issues to its attention more rapidly when required, with agreed triggers for doing so". That is written about risk, not estimates, and the transfer is mine. It is still the most useful sentence I know here, because the weakness in most estimates is not the number, it is that nothing is agreed in advance about what makes it wrong. Hence the trigger row above.</p>
<h2 id="what-this-estimate-does-not-cover">What this estimate does not cover</h2>
<p>One case, one person, public sources, no client waiting. Treat the figures as mine and the shape as transferable: hours, the subset a plan can name, calendar days, waiting shown separately.</p>
<p>A real engagement adds a class of waiting absent here entirely. Interviews get scheduled and moved, access gets requested and granted late, a workshop needs a room full of diaries rather than two. Each of those lands in the calendar column and none of them in the hours column, which is why the two numbers have to travel separately.</p>
<p>And the thirteen hours were noted, not timed. If you want a figure you can defend to somebody paying for it, time your next two jobs. Two measured ones beat any number of remembered ones.</p>
<h2 id="where-to-start">Where to start</h2>
<p>Take the last piece of analysis you finished and write down two dates: when you started reading, and when the decision it supported was actually made. The span between them is the estimate your stakeholders experienced, whatever number you gave them at the start.</p>
<p>Three pieces on this site pick up where this one stops. <a href="https://analify.com/blog/definition-of-ready-for-a-requirement">Definition of ready for a requirement</a> is the gate deciding whether a pass is finished, run over the same register. <a href="https://analify.com/blog/risk-register-owners-dates-trigger">A risk register with owners, dates and a trigger</a> derives its rows from artifacts that already existed, the same move this piece makes with a timeline. <a href="https://analify.com/blog/questions-a-reviewer-asks">The questions a reviewer asks about your work sample</a> is what those two sessions looked like from the other side of the table.</p>
<p>The twenty-five checks behind the artifacts named here are on the <a href="https://analify.com/scorecard">scorecard</a>: yes or no, free, no email address asked for. The worked case this timeline comes from is at <a href="https://analify.com/case">the case</a>, and the six blank templates are on <a href="https://analify.com/templates">templates</a>.</p>
<p>Nobody can tell you how long business analysis takes, and a page answering that with one number would be worth less than this one. What can be published is a real timeline with the waiting left in, next to the artifacts it produced, so you can hold your own against it.</p>]]></content:encoded>
</item>
<item>
<title>A Risk Register With Owners, Dates and a Trigger</title>
<link>https://analify.com/blog/risk-register-owners-dates-trigger</link>
<guid isPermaLink="true">https://analify.com/blog/risk-register-owners-dates-trigger</guid>
<pubDate>Sat, 19 Sep 2026 00:00:00 +0000</pubDate>
<dc:creator>Sebastian Koczyk</dc:creator>
<category>risk</category>
<category>register</category>
<category>case-file</category>
<category>ownership</category>
<category>craft</category>
<description>A risk register derived from artifacts I already had: eight candidates pulled out of a published case, three thrown out for having no trigger, five rows kept.</description>
<content:encoded><![CDATA[<p>This piece stands on the returns case published on this site: damaged-delivery refunds at a mid-size online retailer, built from a published returns policy <code>[POLICY]</code>, help centre articles <code>[HELP]</code>, ten public complaint threads I selected myself <code>[THREADS n=10]</code>, consumer law <code>[LAW]</code> and a walk through the published customer journey <code>[WALKTHROUGH]</code>. No client, no engagement, nobody inside the company asked anything at any point. That matters more here than in most pieces, because a risk register is the artifact most easily filled with confident guesses.</p>
<p>A risk register is a list of events that have not happened yet, where every row names an owner who can act before it does, a date by which acting is still cheap, and a trigger: an observable event that says now rather than later. A row without those three is a worry with formatting.</p>
<p>The register below was not written at a workshop. It was derived from artifacts that already existed, and the derivation is the part worth copying.</p>
<h2 id="in-short">In short</h2>
<ul>
<li>Do not brainstorm risks. Derive them. A pack you have already written names most of them: the anti-goal, the section on what your change makes worse, the column saying what each stakeholder loses, and your own criteria worded as prohibitions.</li>
<li>A candidate stays only if it survives the trigger test: name the observable event that says act now, and the person other than you who would see it first. Three of my eight candidates did not survive.</li>
<li>If answering your open questions would delete the row, it was never a risk. It was an open question, and it belongs in the register that already has owners, dates and fallbacks.</li>
<li>There is no probability times impact column in my register, and the reason is that I have no baseline. A number I chose, multiplied by another number I chose, produces a third one that looks measured.</li>
</ul>
<h2 id="where-do-the-rows-actually-come-from">Where do the rows actually come from?</h2>
<p>Seven passes over sections of the case that already existed, each with a rule for what to read out of it.</p>
<table>
<thead>
<tr>
<th>Read this</th>
<th>Look for</th>
<th>What it gave me</th>
</tr>
</thead>
<tbody>
<tr>
<td>The anti-goal</td>
<td>The success that would be bad news</td>
<td>RSK-05, a metric that improves for the wrong reason</td>
</tr>
<tr>
<td>What the to-be makes worse</td>
<td>Consequences of my own change, stated by me</td>
<td>Three candidates. The section was written for this</td>
</tr>
<tr>
<td>The to-be branch the model admits it keeps</td>
<td>Where a case can still wait after the redesign</td>
<td>RSK-04</td>
</tr>
<tr>
<td>Stakeholder map, "what they lose" column</td>
<td>Anyone worse off when the project works</td>
<td>RSK-01, sharpened: the goods-in lead holds a decision the published policy never mentions. Legal on retention, later dropped</td>
</tr>
<tr>
<td>Requirements register, prohibition criteria</td>
<td>Any criterion worded as what must not happen</td>
<td>RSK-02 and RSK-03. A requirement can be satisfied in name only</td>
</tr>
<tr>
<td>Rules register, status column</td>
<td>Rules marked proposed rather than observed</td>
<td>The owner for RSK-02: BR-12 is a rule I proposed, not one the company has</td>
</tr>
<tr>
<td>Open questions register</td>
<td>Nothing. This is the boundary, see below</td>
<td>Two candidates removed</td>
</tr>
</tbody>
</table>
<p>The second row carries most of the weight. The case has a section naming what the to-be makes worse, written because a proposal that improves everything has not been costed. It is the only risk input in the pack guaranteed to be about your work rather than about projects in general.</p>
<p>The fifth row is the one people skip. A criterion phrased as a prohibition exists because the obvious implementation would break the requirement while appearing to satisfy it. REQ-015 says that assignment to a shared mailbox, a group or a queue does not satisfy it: a risk statement with the word risk missing.</p>
<h2 id="what-does-the-trigger-test-throw-out">What does the trigger test throw out?</h2>
<p>Eight candidates came out of that pass, and each had to answer two questions: what observable event says act now, and who other than me sees it first. Three failed, in two different ways.</p>
<p><strong>Two were open questions wearing a risk costume.</strong> A 48 hour window measured in clock hours escalates into a weekend rota that may not exist, and uploaded photographs need a retention period I could not confirm from outside the company. Both disappear the moment a named role answers a question, and both already sit in the case as OQ-04 and OQ-01 with an owner, a due point and a stated fallback. Copying them across creates a second place to track one thing, and the second place is the one that goes stale.</p>
<p>So the boundary is a test you can run in one sentence: <strong>if answering every open question on time would delete this row, it is not a risk.</strong> What survives is the set of things that can still go wrong when everybody answers you on time.</p>
<p><strong>One had already been converted into a decision.</strong> The self-service form is built around photographic evidence, and a customer whose parcel never arrived has nothing to photograph. That arrived through review rather than my own diligence, and the fix was to name non-delivery and lost parcels out of scope, with a reason and an owner. Putting a deliberate exclusion back into a risk register reopens something closed in writing.</p>
<p>Five rows survived, and each can still happen after the last open question is answered.</p>
<h2 id="the-register-filled-in">The register, filled in</h2>
<p>Copy the columns, not the content. Owners are roles, because public sources carry no staff list and a plausible name filled in to make a cell look complete is worse than a visible gap. Anything I chose carries <code>[MINE]</code>.</p>
<table>
<thead>
<tr>
<th>Id</th>
<th>Condition, then consequence</th>
<th>Derived from</th>
<th>Owner, and by when</th>
<th>Trigger: the observable event</th>
<th>Response when it fires</th>
</tr>
</thead>
<tbody>
<tr>
<td>RSK-01</td>
<td>Refunds are approved from photographs before the parcel arrives, so a dispute about the item's condition lands at the goods-in dock after the money has gone</td>
<td>To-be, item 1, plus stakeholder row 3</td>
<td>Returns goods-in lead, before change 1 ships</td>
<td>The first case reopened from the dock because the item received does not match the evidence</td>
<td>REQ-017 is the way back and ships with the change, never after it. The lead sees the design before release</td>
</tr>
<tr>
<td>RSK-02</td>
<td>Escalation is built as a queue, so every case is "assigned" and no case has a person</td>
<td>REQ-015, criterion worded as a prohibition</td>
<td>Head of Customer Care, owner of BR-12 if adopted, at the release review <code>[MINE]</code></td>
<td>The first assignment record whose assignee is a mailbox, a group or a queue rather than one individual</td>
<td>Fail the release on that record alone. The criterion is the test, not the intent behind it</td>
</tr>
<tr>
<td>RSK-03</td>
<td>The automated pre-check gains the ability to refuse, so a customer is turned down by a rule engine with nobody to argue with</td>
<td>REQ-018, a guardrail rather than a feature</td>
<td>Whoever signs off refund policy in Finance, unnamed, tracked as OQ-03. Reviewed before any release that changes BR-11 <code>[MINE]</code></td>
<td>Any automated outcome recorded as a refusal, or a BR-11 change released without REQ-018 retested</td>
<td>Stop the rule change, not the rule engine. Approval can be automated, a refusal goes to a person</td>
</tr>
<tr>
<td>RSK-04</td>
<td>Every case gets an owner and a clock, and cases are then reassigned repeatedly, so the parked state returns under a new name</td>
<td>The parked branch the to-be keeps, plus REQ-015 criterion 3</td>
<td>Head of Customer Care, at the first review after release <code>[MINE]</code></td>
<td>Any case whose due date is rewritten more than once <code>[MINE]</code></td>
<td>Count reassignments as a breach, not as activity. One reassignment sends a message, a second needs a reason</td>
</tr>
<tr>
<td>RSK-05</td>
<td>Refund volume falls after the change and is reported as a benefit, so the cheapest way to hit the number becomes making a claim harder</td>
<td>The anti-goal, stated in the brief before any requirement was written</td>
<td>Head of Customer Care, at the first report after release <code>[MINE]</code></td>
<td>The first report in which refund count falls below the level before the change</td>
<td>The fall is explained before it is published. An unexplained drop is treated as a defect in the claim path</td>
</tr>
</tbody>
</table>
<p>Two honest notes on that table. Every owner is a role and says so, because the case has no access to the company, and every review point I chose rather than found is tagged. And RSK-05 is the row that looks least like a risk: it fires when the project succeeds on the number it is being judged by.</p>
<h2 id="why-is-there-no-probability-and-impact-score">Why is there no probability and impact score?</h2>
<p>Because I cannot produce either honestly, and a five by five grid would hide that rather than show it.</p>
<p>The case counts how often a case stalls today as unknown: four of the ten complaint threads I selected ended in that state <code>[THREADS n=10]</code>, which is a count of ten threads and not a rate, and no rate is obtainable from outside the company. Measuring it is the first thing I would do with access <code>[OPEN, OQ-06]</code>. With no baseline, a probability of 3 out of 5 is a number I chose, an impact of 4 out of 5 is a second number I chose, and multiplying them produces a 12 that looks like it came from somewhere.</p>
<p>The register replaces that pair with two columns somebody else can check: the trigger, and the response when it fires. A trigger is a claim about what is observable in your system, so a reviewer can argue with it. Nobody can argue with a 12.</p>
<p>This is not an argument against scoring where a baseline exists. With your own incident history behind the numbers, score it. From outside a business, on public sources, scoring is decoration with arithmetic on it.</p>
<h2 id="what-do-the-standards-actually-ask-for">What do the standards actually ask for?</h2>
<p>Less than the templates do, and the part they do ask for is the part templates leave out.</p>
<p>HM Treasury's <a href="https://www.gov.uk/government/publications/orange-book">Orange Book</a>, the free risk management guidance for UK government organisations, last updated in July 2026, asks for "clear processes for bringing significant issues to its attention more rapidly when required, with agreed triggers for doing so", and for reporting that shows trends and supports "early warning indicators". Agreed triggers, in other words, and a route that they open. It also puts ownership with management rather than with a document: "management have primary ownership, responsibility and accountability for identifying, assessing and managing risks".</p>
<p>The Software Engineering Institute published its <a href="https://www.sei.cmu.edu/library/continuous-risk-management-guidebook/">Continuous Risk Management Guidebook</a> in 1996, and the word doing the work in that title is continuous. A register produced once, at the point where a business case needs an appendix, is not what either document describes.</p>
<p>What both ask for, then, is ownership held by people and a route that opens when something changes. Neither of those arrives with a file.</p>
<h2 id="the-blank-card">The blank card</h2>
<p>One row per risk. If you cannot fill the trigger column, you have not found a risk yet.</p>
<table>
<thead>
<tr>
<th>Field</th>
<th>What goes in it</th>
</tr>
</thead>
<tbody>
<tr>
<td>Id</td>
<td>[RSK-nn. Numbered so a reviewer's comment lands on a line]</td>
</tr>
<tr>
<td>Condition, then consequence</td>
<td>[What is true, and what follows from it. Two clauses, one sentence, no "there is a risk that"]</td>
</tr>
<tr>
<td>Derived from</td>
<td>[The artifact and the section. If this cell says "workshop", say which session and when]</td>
</tr>
<tr>
<td>Owner</td>
<td>[A person, or a role plus a note saying the person could not be named. Never a team]</td>
</tr>
<tr>
<td>Trigger</td>
<td>[The observable event that says act now, and who other than you sees it first]</td>
</tr>
<tr>
<td>Review date</td>
<td>[A date, or a named event such as "before the change ships". Mark it if you chose it]</td>
</tr>
<tr>
<td>Response when it fires</td>
<td>[What happens, named tightly enough that somebody can fail to do it]</td>
</tr>
<tr>
<td>Status</td>
<td>[Open, retired with a date and a reason, or fired on a date with what happened next]</td>
</tr>
</tbody>
</table>
<p><strong>Three rules for using it.</strong> Write the trigger before the response, because a response you cannot attach to an event is a good intention with a paragraph around it. Retire rows out loud, with a date and a reason: a register nobody ever subtracts from is read once. And when a trigger reads "somebody notices", the risk has no owner yet, whatever the owner column says.</p>
<h2 id="what-this-register-does-not-tell-you">What this register does not tell you</h2>
<p>It does not tell you whether the change is worth making, and it prices nothing. The one-page summary in the case carries no cost figures and says why: internal effort cannot be priced from outside the company, and an invented figure is the first thing to break in the room. The risks of changing nothing sit on that page too, under what happens if nothing is decided.</p>
<p>It is also silent on volumes, staffing and cost, the three subjects where public sources gave me nothing. A register that looked complete would be lying about exactly that.</p>
<h2 id="where-to-start">Where to start</h2>
<p>Open the last pack you wrote and find the section where you said what your proposal makes worse. If there is no such section, that is the finding, and a larger one than a missing register. Then read your requirements for criteria worded as prohibitions: each is a risk you already identified and filed where no risk owner will look.</p>
<p>Three pieces on this site pick up where this one stops. <a href="https://analify.com/blog/as-is-before-to-be">As-is before to-be</a> puts the two models side by side with a column for what each change breaks, which is where RSK-01 and RSK-04 came from. <a href="https://analify.com/blog/definition-of-ready-for-a-requirement">Definition of ready for a requirement</a> runs a seven-condition gate over the same register and finds the failures a checklist can catch a week late. <a href="https://analify.com/blog/questions-a-reviewer-asks">The questions a reviewer asks about your work sample</a> is the same material seen by somebody with twenty minutes and no reason to be kind.</p>
<p>The twenty-five checks behind the artifacts named here are on the <a href="https://analify.com/scorecard">scorecard</a>: yes or no, free, no email address asked for. The worked case this register was derived from, with its version history and its review log, is at <a href="https://analify.com/case">the case</a>, and the six blank templates are on <a href="https://analify.com/templates">templates</a>.</p>
<p>One last thing, since the phrase "risk register template" belongs to tool vendors and it would be strange to pretend otherwise. They will outrank this page for a long time, and their download looks better than the card above. What they cannot hand you is a register with the derivation written beside every row, on a case whose review log is published with it.</p>]]></content:encoded>
</item>
<item>
<title>Definition of Ready for a Requirement, Not a Ceremony</title>
<link>https://analify.com/blog/definition-of-ready-for-a-requirement</link>
<guid isPermaLink="true">https://analify.com/blog/definition-of-ready-for-a-requirement</guid>
<pubDate>Wed, 16 Sep 2026 00:00:00 +0000</pubDate>
<dc:creator>Sebastian Koczyk</dc:creator>
<category>requirements</category>
<category>register</category>
<category>review</category>
<category>craft</category>
<category>acceptance-criteria</category>
<description>A definition of ready for requirements: seven conditions a stranger can check from the requirement itself, run backwards over three versions of my own register.</description>
<content:encoded><![CDATA[<p>The case under this piece is the returns case published on this site: returns and refunds at a mid-size online retailer, built from a published returns policy, its help centre articles, ten public complaint threads I selected myself <code>[THREADS n=10]</code>, consumer law and a walk through the published customer journey <code>[WALKTHROUGH]</code>. No client, no engagement, not one interview. The case is also the reason this piece can be written at all, because it was published with its version history and its review log attached, and that lets me do something to my own work that I cannot do to anybody else's: run a gate over it backwards and see what it would have stopped.</p>
<p>A definition of ready for a requirement is a short list of conditions, each answerable yes or no by a stranger reading the requirement itself, that decides whether it can enter a conversation about building it. A meeting is not one of the conditions. Neither is a stage in a tool, nor a confidence score. The list is applied to one requirement at a time, by somebody who cannot ask the author what it meant.</p>
<p>The word ready carries Scrum baggage it never earned. The <a href="https://scrumguides.org/scrum-guide.html">Scrum Guide</a> defines a Definition of Done and does not mention a Definition of Ready anywhere, so whatever your team runs under that name was invented locally, by people, for reasons. That is not a criticism. It does mean nobody can appeal to an authority for the contents, and the list is yours to make answerable.</p>
<h2 id="in-short">In short</h2>
<ul>
<li>A condition earns its place on the list only if a stranger can answer it yes or no from the document. Anything that needs the author in the room has already failed, and the meeting you called to check it is the proof.</li>
<li>Run the list backwards over work you have already finished. Seven conditions over my own published register found seven failures across three versions, and none of them was caught by me at the moment of writing.</li>
<li>Five of those seven were caught by another person reading the document, and two by running a checklist against my own draft a week later. The list is worth keeping for those two, not for the five.</li>
<li>A gate with no consequence is a ceremony. The consequence is narrow and unglamorous: the requirement goes back to the author, and nobody estimates it in the meantime.</li>
</ul>
<h2 id="what-does-the-gate-actually-check">What does the gate actually check?</h2>
<p>Seven conditions. Each one is a property of the text on the page, which is the only thing a gate can honestly inspect.</p>
<table>
<thead>
<tr>
<th>#</th>
<th>Condition</th>
<th>The question behind it</th>
<th>Where it comes from</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>It traces to a rule that exists somewhere else</td>
<td>If this requirement is cut, what breaks, and who decided that?</td>
<td>Scorecard check 01</td>
</tr>
<tr>
<td>2</td>
<td>Every acceptance criterion is testable without the author</td>
<td>Can a tester run this tomorrow without phoning me?</td>
<td>Check 02</td>
</tr>
<tr>
<td>3</td>
<td>Every duration names the event that starts the clock</td>
<td>From what moment?</td>
<td>Check 13</td>
</tr>
<tr>
<td>4</td>
<td>Every number carries a tag: a source, or <code>[MINE]</code></td>
<td>Did I find this, or choose it?</td>
<td>Check 17, and the tag legend the whole case runs on</td>
</tr>
<tr>
<td>5</td>
<td>The branch where the thing fails has a named owner and a time limit</td>
<td>When it stalls, whose desk is it on, and by when?</td>
<td>Check 12</td>
</tr>
<tr>
<td>6</td>
<td>Every open question has an owner, a date and a fallback</td>
<td>What happens if nobody answers?</td>
<td>Check 05</td>
</tr>
<tr>
<td>7</td>
<td>It carries an id, a version and the date it last changed</td>
<td>Which draft are we arguing about?</td>
<td>Check 14</td>
</tr>
</tbody>
</table>
<p>Five of the seven are scorecard checks, carried over with no more rewording than putting them on a single requirement demands. Two ask for more than the check does, and the table names the check each one leans on. Condition 4: check 17 asks for labelled inference in the rule register, and I have extended it to every number that appears in a requirement. Condition 6: check 05 asks an open question for an owner and a date, and the fallback is mine - the returns case carries one next to every question, and the <a href="https://analify.com/scorecard">scorecard</a> does not ask for it. Reusing the wording is deliberate. A definition of ready with its own vocabulary gives you two lists to maintain and two arguments about wording, and the second list always loses.</p>
<p>Condition 4 also carries the most weight for the least effort. A requirement is where a number gets laundered: a threshold somebody chose reads exactly like a threshold the business set, in the same font, in the same cell, unless one of them says <code>[MINE]</code>. In the published register, the 40 EUR partial refund threshold is <code>[POLICY]</code> and holds a rule id; the three file, 10 MB upload limit and the 48 hour decision window are both <code>[MINE]</code>, kept visible so somebody can argue with me instead of inheriting them. One word per number, and it is the difference between a register and a rumour with decimal places.</p>
<p>What is not on the list matters as much. Nothing here asks whether the requirement is well written, whether the story follows a template, whether estimates exist, or whether anybody is confident about it. Those are opinions, and an opinion cannot be failed. A condition that cannot be failed is decoration on a gate.</p>
<h2 id="what-happened-when-i-ran-it-backwards-on-my-own-register">What happened when I ran it backwards on my own register?</h2>
<p>The published case has three versions with dates on them: v1.0 drafted 24 March 2026, v1.1 after a self-review against the scorecard on 31 March, v1.2 after external review on 9 April. Sources were read between 12 and 21 March. Two peers reviewed it across two sessions and raised five objections, four accepted in full and one accepted in part.</p>
<p>So I know, line by line, what was wrong and when it stopped being wrong. Here is the same seven-condition gate applied to the register as it stood at each of those dates.</p>
<table>
<thead>
<tr>
<th>Condition</th>
<th>Where it failed</th>
<th>Passed at</th>
<th>What caught it</th>
<th>What the fix cost</th>
</tr>
</thead>
<tbody>
<tr>
<td>3, clock has a start event</td>
<td>REQ-014 criterion 2 stated a decision window and never named the moment it started</td>
<td>v1.2</td>
<td>A developer reading it as a build team would, 2 April</td>
<td>One clause, and it exposed a second decision hiding underneath, now OQ-04 with a fallback</td>
</tr>
<tr>
<td>5, failure branch has an owner</td>
<td>The as-is had no parked branch at all, so no requirement covered the state where a case stops</td>
<td>v1.2</td>
<td>The same developer, same session</td>
<td>Two new artifacts: REQ-015 and the rule behind it, BR-12. Neither existed in v1.0</td>
</tr>
<tr>
<td>4, every number has a tag</td>
<td>The 40 EUR threshold sat in the register as a single line, no source, no owner, no reason</td>
<td>v1.2</td>
<td>A business analyst asked to be unkind, 6 April</td>
<td>A rules page: source, rationale labelled as my inference, owner slot open as OQ-03</td>
</tr>
<tr>
<td>4, a count is not a rate</td>
<td>An early draft of the brief turned four of ten threads I selected into a statement about all cases</td>
<td>v1.2</td>
<td>The same reviewer, same session</td>
<td>Every use of the figure now names the denominator, the selection method and the date</td>
</tr>
<tr>
<td>5, an excluded branch is still a decision</td>
<td>The to-be routed everything through a form built on photographs, and said nothing about the customer who has nothing to photograph</td>
<td>v1.2</td>
<td>The same reviewer, same session</td>
<td>Non-delivery and lost parcels named out of scope, with a reason and an owner, in the scope section rather than buried in a fourth criterion</td>
</tr>
<tr>
<td>6, open question has a fallback</td>
<td>REQ-016 carried a proposed retention period with no statement of what happens if legal never answers</td>
<td>v1.1</td>
<td>The scorecard, run against my own draft a week after writing it</td>
<td>One sentence: shortest defensible period, and the decision escalates rather than sits</td>
</tr>
<tr>
<td>2 and 5 together, the automated path</td>
<td>Nothing said what the automated pre-check may not do, so the obvious implementation could refuse a customer with nobody to argue with</td>
<td>v1.1</td>
<td>The same self-review, against check 03</td>
<td>REQ-018, three criteria, and it ships with the automation or the automation does not ship</td>
</tr>
</tbody>
</table>
<p>Seven failures. Zero of them caught at the moment of writing, by me, while intending to do every one of these things properly.</p>
<p>That number is the argument of this piece and it cuts both ways. Five of the seven needed another person, which no checklist replaces and which is why the review log is the artifact I would read first in somebody else's pack. Two needed nothing but the list and a week of distance. Those two are cheap and repeatable, and they are also the two that would otherwise have reached a build conversation: neither of the five objections in the log is about a missing fallback.</p>
<p>There is a second pattern in that table worth naming. Four of the seven failures are the same shape: a branch where the work stops and nobody owns it. The parked case with no clock, the customer with no photograph, the open question with no fallback, the automated refusal with nobody to appeal to. That shape is what a definition of ready is actually hunting, and if you only ever ask one question of a requirement, ask what happens on the branch where it does not work.</p>
<h2 id="when-does-a-definition-of-ready-turn-into-a-ceremony">When does a definition of ready turn into a ceremony?</h2>
<p>Four ways, and all of them are recoverable.</p>
<p><strong>The list grows.</strong> A list short enough to hold in your head gets applied. A long one gets completed, from memory, in the last two minutes before the meeting. If you want to add a condition, say which one it replaces.</p>
<p><strong>A condition becomes an opinion.</strong> "Well understood by the team" is not checkable, so it gets a yes every time and quietly teaches everybody that the list is theatre. Delete it, or turn it into the thing you were really worried about, which is usually condition 2 wearing a friendlier face.</p>
<p><strong>The gate becomes a meeting.</strong> The conditions are answerable from the document by somebody who did not write it. If checking them needs the author present to explain, condition 2 has already failed and the meeting is where you found out. Hand the requirement to one colleague, silently, and ask for the nos.</p>
<p><strong>There is no consequence.</strong> A gate that flags a problem and waves the requirement through is worse than no gate, because it leaves a record saying the work was checked. The consequence has to be small enough to actually apply: the requirement goes back, it is not estimated, and it is not in the sprint.</p>
<p>One failure mode is subtler than those four. A gate can turn into a weapon against the person who writes things down. The analyst who records an open question fails condition 6 until the fallback is written; the one who never asks the question passes every condition, because their document has no visible holes. If your list rewards silence, it is producing worse requirements than no list, and the fix is to read the nos as a map of what is unresolved rather than as a verdict on the author.</p>
<h2 id="the-card-filled-in">The card, filled in</h2>
<p>This is the gate applied to one requirement from the published register, in the state it is in now. Copy the shape, not the content.</p>
<table>
<thead>
<tr>
<th>Condition</th>
<th>Verdict</th>
<th>Evidence in the document</th>
</tr>
</thead>
<tbody>
<tr>
<td>1. Traces to a rule that exists</td>
<td>Yes</td>
<td>REQ-014 traces to BR-04, BR-11 and BR-07, all three in the rules register with a status and an owner slot</td>
</tr>
<tr>
<td>2. Criteria testable without me</td>
<td>Yes</td>
<td>Three criteria: file count and size, a decision recorded within a stated window, and the partial refund boundary stated at the threshold as well as above it</td>
</tr>
<tr>
<td>3. Durations name their start event</td>
<td>Yes, since v1.2</td>
<td>Criterion 2 anchors to the timestamp on the submitted form, not to the moment an agent opens it</td>
</tr>
<tr>
<td>4. Numbers tagged</td>
<td>Yes</td>
<td>40 EUR is <code>[POLICY]</code> with a rule id. The three file, 10 MB limit and the decision window are <code>[MINE]</code></td>
</tr>
<tr>
<td>5. Failure branch owned</td>
<td>Yes, since v1.2</td>
<td>On breach the case goes to REQ-015, which says in as many words that a shared mailbox, a group or a queue does not satisfy it</td>
</tr>
<tr>
<td>6. Open questions have owner, date, fallback</td>
<td>Yes</td>
<td>OQ-04 and OQ-05, each with an owner role, a due point (one a date, one the event "before build starts") and a stated fallback</td>
</tr>
<tr>
<td>7. Id, version, date</td>
<td>Yes</td>
<td>REQ-014, v1.2, last changed 9 April 2026, pointing at the review log entry that changed it</td>
</tr>
</tbody>
</table>
<p><strong>Verdict:</strong> ready. <strong>Not ready on:</strong> none. <strong>Blocked by:</strong> nothing. <strong>Checked by:</strong> the author, which is the weakest version of this and says so.</p>
<p>Two honest notes on that card. The owner on OQ-04 and OQ-05 is a role, not a person, because this case has no access to the company: the gate accepts a role plus a note saying the person could not be named, and rejects a plausible job title filled in to make the cell look complete. And every requirement in this register is marked Must have for release 1, which is a smell the case admits on its own face and answers by naming the one it would cut first. Priority is not on my list of seven, because it cannot be failed by reading one requirement on its own. It fails at the register level, where everything says Must.</p>
<h2 id="the-blank-card">The blank card</h2>
<table>
<thead>
<tr>
<th>Condition</th>
<th>Verdict</th>
<th>Evidence in the document</th>
</tr>
</thead>
<tbody>
<tr>
<td>1. Traces to a rule that exists elsewhere</td>
<td>[Yes / No]</td>
<td>[The rule id, or the named need. If it traces to nothing, either the rule is undocumented or this is somebody's preference]</td>
</tr>
<tr>
<td>2. Criteria testable without the author</td>
<td>[Yes / No]</td>
<td>[Point at the criterion a tester would run first]</td>
</tr>
<tr>
<td>3. Every duration names its start event</td>
<td>[Yes / No / none in this requirement]</td>
<td>[The event, quoted from the criterion itself, not from a note underneath it]</td>
</tr>
<tr>
<td>4. Every number carries a tag</td>
<td>[Yes / No]</td>
<td>[Source per number, or <code>[MINE]</code> where you chose it]</td>
</tr>
<tr>
<td>5. The failure branch has an owner and a limit</td>
<td>[Yes / No]</td>
<td>[Who holds it, by when, and what the customer is told]</td>
</tr>
<tr>
<td>6. Open questions have owner, date, fallback</td>
<td>[Yes / No / none open]</td>
<td>[Question id, owner, date, and what happens if the date passes]</td>
</tr>
<tr>
<td>7. Id, version, date last changed</td>
<td>[Yes / No]</td>
<td>[The line where a reviewer's comment can land]</td>
</tr>
</tbody>
</table>
<p><strong>Verdict:</strong> ☐ ready ☐ back to the author. <strong>Not ready on:</strong> <strong><em>_</em></strong><strong><em>_</em></strong>
<strong>Blocked by, with a name and a date:</strong> <strong><em>_</em></strong><strong><em>_</em></strong> <strong>Checked by:</strong> <strong><em>_</em></strong><strong><em>_</em></strong></p>
<p>Three rules for using it. Write the verdict before the evidence column, then make yourself fill the evidence in, because a yes you cannot evidence is a no you have not admitted yet. A no is not a defect report, it is a sentence you have not written, and most of them cost one clause. And run it now and then on a requirement somebody else wrote, because the gate is much easier to apply to a document you are not defending, and that is the version of your own judgement worth practising.</p>
<h2 id="what-this-does-not-tell-you">What this does not tell you</h2>
<p>The gate inspects one requirement as a piece of text. It cannot tell you whether the requirement is needed, whether the rule behind it is true, whether the priority is honest, or whether the whole slice of process was worth changing. It cannot tell you that a rule owner will overturn a number the moment they see it either. The register says as much about its own 48 hour window: of everything in the case, that is the figure most likely to be changed by the person who owns the rule, and the design does not fall over if it becomes 72.</p>
<p>What it does is stop a particular kind of expensive silence: the criterion everybody read and nobody could test, the branch nobody owned, the question with no name against it. Those cost nothing to fix on the page and a great deal to fix in a build.</p>
<h2 id="where-to-start">Where to start</h2>
<p>Take the last requirement you wrote and answer condition 6 out loud: who owns the open question, by when, and what happens if that date passes with no answer. If you have no open questions at all on a requirement written from the outside of a business, that is the finding.</p>
<p>Then, when a criterion fails condition 2, <a href="https://analify.com/blog/acceptance-criteria-that-survive">acceptance criteria that survive a sprint review</a> is the piece on rewriting it into something a tester can run. When condition 5 fails, the branch you are missing is usually one your process model never drew, and <a href="https://analify.com/blog/as-is-before-to-be">as-is before to-be</a> is about finding it. When you want the view from the other side of the desk, <a href="https://analify.com/blog/questions-a-reviewer-asks">the questions a reviewer asks about your work sample</a> is the same gate applied by somebody with twenty minutes and no reason to be kind.</p>
<p>The full list of twenty-five checks behind conditions 1 to 7 is on the <a href="https://analify.com/scorecard">scorecard</a>: yes-or-no, free, no email address asked for. The worked case whose three versions this piece pulled apart, plus six blank templates, is in the <a href="https://analify.com/downloads/proof-pack">Proof Pack</a>.</p>
<p>The gate did not save me from any of the seven. It caught two of them a week late, which is still before anybody built anything, and it gave the other five a place to be recorded instead of a conversation somebody would have half remembered. That is the whole claim. A definition of ready is worth having when it is seven answerable questions and a consequence, and worth deleting on the day it becomes a meeting where everyone says yes.</p>]]></content:encoded>
</item>
<item>
<title>Five Whys Stops Working at Why Number Two</title>
<link>https://analify.com/blog/five-whys-stops-at-why-two</link>
<guid isPermaLink="true">https://analify.com/blog/five-whys-stops-at-why-two</guid>
<pubDate>Sun, 13 Sep 2026 00:00:00 +0000</pubDate>
<dc:creator>Sebastian Koczyk</dc:creator>
<category>root-cause</category>
<category>process</category>
<category>requirements</category>
<category>elicitation</category>
<category>craft</category>
<description>When five whys does not work, and what to do instead: one incident from a published returns case, three honest why chains, three different recommendations.</description>
<content:encoded><![CDATA[<p>The case under this piece is the returns case published on this site: returns and refunds at a mid-size online retailer, built from the published returns policy, its help centre articles, ten public complaint threads I picked myself <code>[THREADS n=10]</code> and a walk through the published journey as far as it goes without placing a real order <code>[WALKTHROUGH]</code>. No client, no engagement, not one interview. That matters here more than usual, because a case built entirely from outside cannot quietly repair a broken why chain with something somebody told me in a corridor. Every link below either has a tag against it or is marked as a wall.</p>
<p>Five Whys assumes each answer has exactly one parent. The first answer usually has three, and the technique gives you nowhere to put the other two, so by question number two you are no longer asking about the incident. You are asking about the branch you happened to pick, and everything after that inherits the choice.</p>
<h2 id="in-short">In short</h2>
<ul>
<li>The chain does not break because you stopped at four or went on to six. It breaks at the first link where two or more answers are equally true and nothing in the method tells you to write that down.</li>
<li>Run the chain three times from the same incident, once from each direction somebody would naturally take it, and compare the endpoints. Three different endpoints is the normal result, not a sign that you did it badly.</li>
<li>Most chains end on a condition rather than an event: something that was true of every case that day, including the ones that went fine. Conditions are fixed by design decisions, not by more questions.</li>
<li>Stop at the first link nothing public can answer. Log it as an open question with an owner, a date and a fallback. The alternative is inventing link five to reach the number.</li>
</ul>
<h2 id="where-does-the-chain-actually-fork">Where does the chain actually fork?</h2>
<p>Here is the incident, stated the way it appears in the case: a damaged-delivery case reached a state where nobody owned it and no clock was running, and the only thing that moved it again was the customer chasing it.</p>
<p>Three people would take that incident in three different directions, and all three are reading the same document. Below is each chain, run to its natural end. A link with a tag is a link somebody else can check. A link with no tag is one I worked out from the model, and a link marked "wall" is one nothing public answers, which is where that chain stops.</p>
<table>
<thead>
<tr>
<th>Link</th>
<th>Chain A, run by someone asking about the decision</th>
<th>Chain B, run by someone asking about ownership</th>
<th>Chain C, run by someone asking about the channel</th>
</tr>
</thead>
<tbody>
<tr>
<td>Why did nobody decide?</td>
<td>The agent could not tell whether the photographs were enough <code>[WALKTHROUGH]</code></td>
<td>Once the case was parked, nothing in the process was going to move it <code>[THREADS n=10]</code></td>
<td>The case began on the phone. The help centre routes a damaged delivery to a phone line <code>[WALKTHROUGH]</code></td>
</tr>
<tr>
<td>Why?</td>
<td>No written test of sufficiency exists in any source I could read <code>[WALKTHROUGH]</code></td>
<td>Nothing was late</td>
<td>There is no self-service damage form. The help centre article ends with a phone number and an opening time <code>[WALKTHROUGH]</code></td>
</tr>
<tr>
<td>Why?</td>
<td>Not answerable from outside the company <code>[OPEN]</code></td>
<td>No clock had been started</td>
<td>Photographs are requested by email after the call, so the customer makes contact twice before anything is assessed <code>[HELP]</code></td>
</tr>
<tr>
<td>Why?</td>
<td>Wall</td>
<td>No owner exists to start one. A shared mailbox is a room, not an owner</td>
<td>In three of the four threads that ended without a decision, a second agent asked for evidence the customer had already sent <code>[THREADS n=10]</code></td>
</tr>
<tr>
<td>Why?</td>
<td>Wall</td>
<td>Nothing published says a case that misses its window gets a name against it <code>[OPEN]</code></td>
<td>Why the thread restarts on the second contact is not visible from outside. That it restarts is <code>[THREADS n=10]</code></td>
</tr>
<tr>
<td>Where it lands</td>
<td>A written evidence test, which the register does not carry as an open question at all</td>
<td>A named owner and a due date on the parked branch, REQ-015 and the rule behind it, BR-12</td>
<td>Evidence collected before a person sees the case, change 1 in the to-be</td>
</tr>
</tbody>
</table>
<p>Three chains, three endpoints, one incident. None of them is wrong. Chain B ends on a rule that does not exist today and had to be proposed, which is why it carries my name in the register rather than the company's. Chain C ends on a decision about the channel, not on anything that happened in this case: the spoken description of the damage is not something a second agent can read, and that was true before the parcel was sent. Chain A ends on a wall at link three, and the useful thing about it is that the chain found a hole no other artifact in the pack had noticed: the register carries six open questions and not one of them asks who decides what counts as enough evidence.</p>
<p>That last one is the argument for running the chain more than once. The branch that ends in a wall is the branch that produced something new.</p>
<h2 id="why-does-the-branch-you-take-decide-the-recommendation">Why does the branch you take decide the recommendation?</h2>
<p>Because the method rewards whoever asks first. Link one has three true answers, you write down the one that came to mind, and every question after that is a question about that answer rather than about the incident. By link three the other two branches are not rejected, they are invisible, and the chain reads as though it could not have gone anywhere else.</p>
<p>The published case settles this in a way I did not plan. The proposed process changes exactly two things: evidence is collected before a human sees the case, and the parked branch gets a named owner with a clock on it. Two changes, arrived at separately, both kept after review. If a single root cause had been sitting under that incident, one change would have been enough and the second would have been padding. It was not padding. Each change closes a different chain, and the reviewer who read the process model first objected that the original as-is showed only the path where things go well, which is what put the parked branch on the model at all.</p>
<p>So the honest reading is that this incident has at least two causes that a design has to answer, plus a third question nobody can answer from outside. A technique whose output is one sentence with the word "therefore" in front of it cannot represent that.</p>
<h3 id="cause-or-condition-which-is-the-distinction-that-does-the-work">Cause or condition, which is the distinction that does the work</h3>
<p>Look again at where Chains B and C end. Neither endpoint is an event. No owner exists on the parked branch, and no self-service form exists on the store front. Both were true on the day the case stalled, and both were equally true on every day that a case did not stall.</p>
<p>That is a condition, and the test for it takes one question. Was this also true of the cases that came out fine? If the answer is yes, you have found something that lets the failure happen rather than something that made it happen, and no further why will convert one into the other. Conditions get closed by a design decision, an owner and a date. Events get closed by an investigation.</p>
<p>Chains that end on a condition are the useful ones, and the method gives you no signal that you have crossed from one kind of thing to the other. On the wall in Chain A the same test says something different again: an unknown is neither, and the only correct move is to write it down as unknown.</p>
<h2 id="the-branch-sheet">The branch sheet</h2>
<p>This is what I keep instead of a chain. Same ten minutes, one more column, and the column that earns the page is the last one.</p>
<table>
<thead>
<tr>
<th>Link</th>
<th>Answer</th>
<th>Tag</th>
<th>Cause or condition</th>
<th>What would show this link is wrong</th>
<th>Branch not taken here</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>Once the case was parked, nothing in the process moved it. Every second contact in the threads I read was the customer's</td>
<td><code>[THREADS n=10]</code></td>
<td>Condition</td>
<td>A queue export showing parked cases that resolve without the customer chasing</td>
<td>The agent could not judge the evidence (Chain A). The case arrived by phone (Chain C)</td>
</tr>
<tr>
<td>2</td>
<td>Nothing was late</td>
<td>Mine, read off the model</td>
<td>Condition</td>
<td>Any alert, report or review that fires on an undecided case</td>
<td>That somebody was watching it informally, which is invisible from outside</td>
</tr>
<tr>
<td>3</td>
<td>No clock had been started</td>
<td>Mine</td>
<td>Condition</td>
<td>A start event named anywhere in the published process</td>
<td>-</td>
</tr>
<tr>
<td>4</td>
<td>No owner exists to start one. A shared mailbox is a room, not an owner</td>
<td>Mine</td>
<td>Condition</td>
<td>A named duty rota that covers undecided cases</td>
<td>A rota that exists but is unstaffed at the weekend, which is a different problem with the same symptom</td>
</tr>
<tr>
<td>5</td>
<td>Nothing published says a case that misses its window gets a name against it</td>
<td><code>[OPEN]</code></td>
<td>Condition</td>
<td>A published escalation rule</td>
<td>-</td>
</tr>
</tbody>
</table>
<p>Read the right-hand column on its own and you have the two chains you did not run, written down where they can be picked up later instead of lost. Read the fifth column on its own and you have a list of things that would falsify your own conclusion, which is the difference between a chain you can defend and a chain you happen to believe.</p>
<p>The tag column is the one people skip, and here it is the one that hurts. One link of the five carries evidence, one is an open question, and the three in between are mine: I read them off my own process model rather than out of a source anybody else can open. That chain produced a requirement and a proposed rule. It is still the honest version, because the alternative was not a better-sourced chain, it was the same chain with the middle presented as fact. Labelling an inference as an inference is check 17 on the scorecard, and it costs one word per row.</p>
<h2 id="the-blank-version">The blank version</h2>
<p>Copy this. Fill the tag column at the same time as the answer, never afterwards, because afterwards you will remember every answer as better sourced than it was.</p>
<table>
<thead>
<tr>
<th>Link</th>
<th>Answer</th>
<th>Tag</th>
<th>Cause or condition</th>
<th>What would show this link is wrong</th>
<th>Branch not taken here</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>[One sentence, the answer as you would say it out loud]</td>
<td>[Source tag, or "mine"]</td>
<td>[Cause / condition / unknown]</td>
<td>[The document, export or observation that would kill it]</td>
<td>[Every other answer to this same question]</td>
</tr>
<tr>
<td>2</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>3</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>4</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>5</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<p><strong>Incident, in one sentence:</strong> <strong><em>_</em></strong><strong><em>_</em></strong>
<strong>Stopped because:</strong> ☐ reached a condition with an owner ☐ reached a wall ☐ ran out of evidence
<strong>Branches parked, with owner and date:</strong> <strong><em>_</em></strong><strong><em>_</em></strong></p>
<p>Three rules for filling it in. Two links in a row marked as yours means the chain has left the evidence and what follows is your model of the process. That is allowed, and the parked branch in this case got onto the model exactly that way, but it has to be visible, because those are the links somebody can knock over without leaving the room. If column five is empty for a link, you cannot yet tell whether that link is true, so it is not a finding. And if column six is empty for link one, you have not run a chain, you have written down the first thing you thought of and asked why about it four times.</p>
<h2 id="where-do-you-stop-asking">Where do you stop asking?</h2>
<p>Not at five. Five is a number in the name, not a property of any process, and in the chains above the honest stopping points fell at three, five and five.</p>
<p>Stop at the first link you can only mark as unknown. Then do the thing the method does not include: turn that link into an open question with an owner and a date, which is check 05 on the scorecard, plus a fallback for when the date passes, which the scorecard does not ask for and the returns case carries anyway. An unowned question does not stay a question. It gets quietly promoted to an assumption somewhere between the workshop and the build, and nobody notices until it is expensive.</p>
<p>The returns case carries six open questions and every one has a fallback written next to it, because an open question without a fallback is a wish with a due date attached. The one that matters most is the measurement: how many cases actually stall today, and for how long. Until that number exists, all three chains above are descriptions of a failure mode whose size nobody knows, and the case says so in the same line where the count appears. Four of ten threads I selected myself is a count of ten threads, on every page where it appears, which is check 10.</p>
<p>There is a quieter reason to stop early. Every link past the evidence is a link somebody can argue with in a room where you are not present, and it will be the weakest one they quote. A three-link chain that ends in an honest unknown survives a hostile reading. A five-link chain whose last two links are guesses presented as findings does not, and the three good links go down with them.</p>
<h2 id="when-is-it-still-worth-the-ten-minutes">When is it still worth the ten minutes?</h2>
<p>More often than this piece makes it sound.</p>
<p>Five Whys is fast, costs nothing, and needs no preparation, which makes it the right opening move in a room where people are still describing the symptom to each other. It works properly when three things hold: one actor, one run of the process, and an answer at every step that somebody present can check on the spot. Picture the simplest possible version of that: a machine stops, the wrong part was fitted, that part was sitting in the wrong bin, the bins were relabelled last week. Four links, one actor, every one of them verifiable by walking to the bin. That chain is fine and a branch sheet on top of it would be overhead.</p>
<p>It also earns its keep as a boundary finder. Run it once, quickly, and watch where the answers change from "here is the document that says so" to "well, what usually happens is". That switch is the edge of what anybody in the room actually knows, and finding it in ten minutes is worth more than the chain you were nominally building.</p>
<p>What it cannot do is carry a process with more than one actor, an exception path and a decision that changes hands. For that shape, the model is the tool and the chain is a warm-up for drawing it.</p>
<h2 id="where-to-start">Where to start</h2>
<p>Take the last root cause you wrote down and try to falsify link two. Not link five, which is where the argument usually happens. Link two, where the chain narrowed to one answer for the first time, and where you can still remember what the other answers were.</p>
<p>Then put the branches you did not take somewhere they survive the week, with the same three columns as an open question: owner, date, and what happens if the date passes.</p>
<p>If the process you are working on has an exception path, <a href="https://analify.com/blog/as-is-before-to-be">as-is before to-be</a> is the piece on drawing the branch where work stops, and the parked branch in this case is the one both Chain B and Chain C are really about. If your chain ended on a link only a person inside the business can settle, <a href="https://analify.com/blog/eight-questions-first-stakeholder-interview">the eight questions in a first stakeholder interview</a> is how that becomes an agenda rather than a note. If it ended on an unowned rule, <a href="https://analify.com/blog/stakeholder-map-that-survives">the stakeholder map that survives contact with the project</a> is where the owner column belongs.</p>
<p>Then run the artifacts through the <a href="https://analify.com/scorecard">scorecard</a>: twenty-five yes-or-no checks, free, no email address asked for, and checks 05, 10 and 17 are the three this habit answers to. The worked case and the six blank templates are in the <a href="https://analify.com/downloads/proof-pack">Proof Pack</a>.</p>
<p>The chains above are the ones I could run from outside, and Chain A stops at a wall I cannot get past without access to the company. That is the price of a case anybody can check, and it is also the clearest demonstration I have of the point: the method gave me three answers, and the only reason you can tell which of them are load-bearing is that every link carries a tag saying where it came from.</p>]]></content:encoded>
</item>
<item>
<title>The Eight Questions in a First Stakeholder Interview</title>
<link>https://analify.com/blog/eight-questions-first-stakeholder-interview</link>
<guid isPermaLink="true">https://analify.com/blog/eight-questions-first-stakeholder-interview</guid>
<pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate>
<dc:creator>Sebastian Koczyk</dc:creator>
<category>elicitation</category>
<category>stakeholders</category>
<category>interview</category>
<category>requirements</category>
<category>craft</category>
<description>First stakeholder interview questions, built backwards from the six things a case assembled from public sources could not settle, and what each answer changes.</description>
<content:encoded><![CDATA[<p>The case under this piece is the returns case published on this site: returns and refunds at a mid-size online retailer, built from the published returns policy, its help centre articles, ten public complaint threads I picked myself <code>[THREADS n=10]</code> and a walkthrough of the published journey as far as it goes without placing a real order <code>[WALKTHROUGH]</code>. No client, no engagement, and not one interview. Nobody inside that company has been asked anything by me or on my behalf. That is a strange place to write about interviewing from, and it is also the only reason this particular list is worth your time: a case assembled entirely from outside produces an exact inventory of what the outside cannot tell you. Six of those gaps sit in the register as open questions, each with a date and a fallback <code>[OPEN]</code>; five of the six carry an owner, and the sixth is open precisely because no public source names one. The eight questions below are those gaps, turned around and pointed at a person.</p>
<p>A first stakeholder interview is the session where the things you could not establish on your own become rules with owners and dates against them. Which makes the agenda a derived document rather than a checklist: you do not walk in with eight good questions, you walk in with the eight holes in your own draft, ordered so that the answer most likely to resize the work arrives while there is still time to use it.</p>
<h2 id="in-short">In short</h2>
<ul>
<li>The agenda comes out of your draft, not out of a list somebody published. Every claim you tagged as your own inference and every owner slot you left open is a candidate question.</li>
<li>Write down what a yes and a no each change in the document, before the session. A question whose two answers lead to the same next step is a question you can skip.</li>
<li>Three of the eight can resize or cancel the work. Ask those first, in case the session is cut short.</li>
<li>An answer with no name and no date against it cannot be rechecked by anybody, including you, and that only becomes a problem months later when somebody asks who agreed to it.</li>
</ul>
<h2 id="where-does-a-good-interview-question-actually-come-from">Where does a good interview question actually come from?</h2>
<p>Not from a list of openers. "What are your main pain points" gets you a paragraph you could have written yourself before the meeting, and it puts the work of structuring the conversation on the person you came to learn from.</p>
<p>It comes from the draft you wrote before the meeting. Build the document first from whatever is public: the policy, the help pages, the complaints, the part of the journey you can walk yourself. Tag every claim with where it came from, then read your own tags. Every <code>[MINE]</code> is a number you chose and nobody confirmed. Every <code>[OPEN]</code> is a slot you could not fill from outside. That is your agenda, and it has a property no generic list has: you can say out loud what you will do with each answer.</p>
<p>The scorecard check behind this is 05, open questions listed with an owner and a date. It earns a place among twenty-five checks because a question with nobody's name on it quietly becomes an assumption, and assumptions surface during build at the worst price you will pay all year.</p>
<p>There is a second effect. Turning up with "your published policy says partial refunds are permitted only above 40 EUR of order value <code>[POLICY]</code>, and I could not find who owns that figure" is a different opening from "tell me about returns". The first one can only be asked by somebody who did the reading, and it asks for a decision right rather than for a briefing.</p>
<h2 id="the-eight-questions-and-the-gap-each-one-came-from">The eight questions, and the gap each one came from</h2>
<p>This is the plan I would take into a first session on the returns case, if access appeared tomorrow. Every row on the left exists because something on the right could not be settled from outside. The plan assumes one session and no guarantee of a second <code>[MINE]</code>.</p>
<table>
<thead>
<tr>
<th>#</th>
<th>The question, as I would ask it</th>
<th>The gap it came from</th>
<th>If the answer is one thing</th>
<th>If it is the other</th>
<th>Where the answer lands</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>"Five working days on a returns case: something you can be held to, or something you aim at?"</td>
<td>The help centre says the company aims to resolve returns within five working days <code>[HELP]</code>. From outside, a promise and an aspiration read identically <code>[OPEN, OQ-02]</code></td>
<td>Commitment: BR-07 stays a rule and the escalation hangs off it</td>
<td>Target: it is published as a target, and the escalation hangs off the 48 hour window, which is mine to guarantee</td>
<td>Rule register: BR-07 status and owner</td>
</tr>
<tr>
<td>2</td>
<td>"Who can change the 40 EUR threshold, and what would make them want to?"</td>
<td>The figure and its wording as a hard rule are consistent across the policy and two help centre articles <code>[POLICY]</code>; no public source names an owner <code>[OPEN, OQ-03]</code></td>
<td>A name: the rule gets an owner, and my rationale gets confirmed or killed</td>
<td>Nobody: that is a finding, and neither threshold moves until the slot is filled</td>
<td>Rule register: owner and review trigger, BR-04 and BR-11</td>
</tr>
<tr>
<td>3</td>
<td>"Can you pull the case queue: how many are open now, and how old is the oldest?"</td>
<td>Four of the ten threads I read ended with nobody owning the case <code>[THREADS n=10]</code>. The rate across all cases is unreachable from outside <code>[OPEN, OQ-06]</code></td>
<td>A number: the problem is sized and the analysis is worth finishing</td>
<td>Rare and short: I say so, and this does not get a release slot</td>
<td>Problem statement, and whether there is a project at all</td>
</tr>
<tr>
<td>4</td>
<td>"What happens to a case that arrives late on a Friday evening?"</td>
<td>My decision window is 48 clock hours <code>[MINE]</code>, the published promise is in working days <code>[HELP]</code>, and the rota is invisible from outside <code>[OPEN, OQ-04]</code></td>
<td>Covered: the clock stays in clock hours</td>
<td>Not covered: the window becomes two working days and the public promise changes to match</td>
<td>REQ-014, criterion 2, and the published wording</td>
</tr>
<tr>
<td>5</td>
<td>"Who else can undo this decision after you have made it?"</td>
<td>A warehouse lead in the returns bay can reverse a refund after inspection <code>[POLICY]</code> <code>[HELP]</code>, and no public source gives a route to them <code>[OPEN]</code></td>
<td>A route: the row gets a decision right and a way in</td>
<td>No route: the row stays open, with the reason written down</td>
<td>Stakeholder map: the reach and losses columns</td>
</tr>
<tr>
<td>6</td>
<td>"When a case gets stuck waiting, what do people do while it waits?"</td>
<td>The parked branch has no owner and no clock. From outside I see that cases end there, not what happens around them <code>[THREADS n=10]</code></td>
<td>A workaround: it goes in the as-is, approved or not</td>
<td>Nothing: the dead end is confirmed rather than suspected</td>
<td>As-is exception path. Escalation ownership, REQ-015</td>
</tr>
<tr>
<td>7</td>
<td>"Do partial refunds have to be in release 1, or can that conversation wait?"</td>
<td>A scope question nobody outside can answer <code>[OPEN, OQ-05]</code>, dated 30 April 2026</td>
<td>In: the threshold conversation closes before build</td>
<td>Out: it moves to release 2 and stops holding up the rest</td>
<td>Requirements register, priority. Decision summary</td>
</tr>
<tr>
<td>8</td>
<td>"How long do you have to keep the photographs a customer uploads, and who says so?"</td>
<td>The 90 days in my draft is a number I chose, not one I found <code>[MINE, OPEN, OQ-01]</code>, and statutory limits apply <code>[LAW]</code></td>
<td>A period with a legal basis: it replaces mine, and legal owns it</td>
<td>No answer: shortest defensible period, escalated rather than absorbed</td>
<td>REQ-016, criterion 1. Open questions register</td>
</tr>
</tbody>
</table>
<p>Six rows come straight out of the open questions register. Two do not: question 5 comes from the reach column of the stakeholder map, where the honest entry was that no public source names a route to the person who can reverse a refund, and question 6 from the exception path in the as-is, where the branch exists and everything around it is invisible from outside. Both gaps sat in the artifacts for weeks without being written down as questions, which is its own lesson about where to look.</p>
<h3 id="1-rule-or-target">1. Rule or target</h3>
<p>A commitment can be breached, so it needs a mechanism, an owner and a consequence. A target cannot be breached, so anything you hang off it is decoration. "Aims to resolve" <code>[HELP]</code> leaves both readings open and rereading it will not settle them. Ask early: BR-07, the escalation in REQ-015 and the published wording all move with the answer.</p>
<h3 id="2-who-owns-the-number">2. Who owns the number</h3>
<p>Owner and review trigger are separate things and you want both. A rule with a name against it can be renegotiated; one without a name can only be worked around, quietly. Scorecard check 16 asks for the name and the date, check 18 for the event that would make the rule wrong. If nobody owns it, that is not a failed question, it is a finding, and it goes in the register in those words.</p>
<h3 id="3-can-you-pull-the-queue">3. Can you pull the queue</h3>
<p>The one that can cancel the work. Four of the ten threads I read ended with an unowned case, and the same sentence in my case says the frequency across all cases is unknown from outside <code>[THREADS n=10]</code>. If the export shows parked cases are rare and short, the failure mode was real and not worth a release slot, and saying so is the job. Ask for the export rather than an impression: an impression cannot be rechecked afterwards, including by the person who gave it.</p>
<h3 id="4-which-clock-and-what-happens-at-the-weekend">4. Which clock, and what happens at the weekend</h3>
<p>A duration means nothing until the event that starts it is named, which is scorecard check 13. Two clocks in one process, one in clock hours and one in working days, decide a case under one and pay it under the other. Whoever runs the rota can answer immediately, and it is written down nowhere.</p>
<h3 id="5-who-can-undo-it">5. Who can undo it</h3>
<p>The head of the department is the obvious first interview and rarely the most useful one. The person who receives the returned goods can hand an item back and unmake a refund the office has already promised <code>[POLICY]</code> <code>[HELP]</code>, and nothing public says they are ever in the conversation where the refund window is set <code>[OPEN]</code>. Ask for the route as well as the name: a calendar invite, their manager, the weekly returns call, ten minutes on the bay. Then ask what that person loses if the change goes through, which is scorecard check 08.</p>
<h3 id="6-what-people-do-while-a-case-waits">6. What people do while a case waits</h3>
<p>My as-is has a branch where work stops, and the interesting part is whatever has grown around it: a spreadsheet somebody maintains, a message to a colleague, a call made out of hours. From outside you can see that cases end there <code>[THREADS n=10]</code>, never what happens around them, and a workaround in daily use is part of the current process whatever the documents say. If the answer is that the case simply waits, write that down too.</p>
<h3 id="7-which-release-and-when-does-the-decision-expire">7. Which release, and when does the decision expire</h3>
<p>Scope questions asked without a date come back as assumptions. The register carries this one as 30 April 2026 with a fallback for the day after. The sentence worth agreeing in the session is that fallback, not the intention to decide soon.</p>
<h3 id="8-how-long-do-you-keep-it">8. How long do you keep it</h3>
<p>The 90 days in my draft is mine: I chose it, found no basis for it anywhere public, and tagged it so nobody inherits it by accident <code>[MINE, OPEN, OQ-01]</code>. It is the one question here whose right answer is somebody else's job, and where guessing produces a document that looks finished and is quietly wrong. Legal owns it, and the fallback is the shortest defensible period, escalated rather than absorbed.</p>
<h2 id="what-if-you-only-get-fifteen-minutes">What if you only get fifteen minutes?</h2>
<p>Plan the short version before you need it. Take three: question 3, then question 1, then question 5.</p>
<p>Question 3 first because it can end the project, and an early no costs less than a late one. Question 1 second because more rows in the register depend on its answer than on any other: BR-07 status, the escalation in REQ-015 and the published wording all move with it. Question 5 third because it is the only one of the eight whose answer arrives from outside the room you are in, and because it costs one sentence to ask.</p>
<p>The other five survive being asked by email. Those three do not, because each of them needs a follow-up in the same breath.</p>
<h2 id="what-do-you-write-down-while-they-are-talking">What do you write down while they are talking?</h2>
<p>Three habits, all of them cheap, all of them worth more later than they feel at the time.</p>
<p><strong>Record the wording, not your summary of it, for anything that will become a rule.</strong> "Aims to resolve within five working days" and "must be resolved within five working days" are one word apart and produce different documents. Your paraphrase always drifts towards the version that suits your draft.</p>
<p><strong>Tag the answer with the session and the date.</strong> The pack's provenance convention is built for exactly this: add a tag of your own, <code>[INTERVIEW 2026-05-12]</code>, in the same line as the claim. The worked case carries no such tag anywhere, because it had no interviews, and that absence is visible on every page. An unattributed answer is a fact nobody can check, which is what the convention exists to prevent.</p>
<p><strong>Write down what you did not get.</strong> The vague answer is more useful in your notes than the clear one, because it is the one still open in six weeks. Same three columns as the register: owner, date, and what happens if the date passes.</p>
<p>The review log on this case records two sessions with peer reviewers, on 2 and 6 April 2026, five objections in total. Neither reviewer works for the retailer and neither session was an interview with anybody inside it, which the log says on its face. Keep the two kinds of session apart in your own notes, because a reader who cannot tell them apart has to assume the weaker of the two.</p>
<h2 id="the-blank-version">The blank version</h2>
<p>Copy the table, fill in the middle column first, and only then write the questions. Working in that order stops you from importing somebody else's agenda into your own document.</p>
<table>
<thead>
<tr>
<th>#</th>
<th>The question, as you would ask it</th>
<th>The gap it came from (tag it)</th>
<th>If the answer is one thing</th>
<th>If it is the other</th>
<th>Where the answer lands</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>[Your wording, in one sentence, as a person would say it]</td>
<td>[The <code>[MINE]</code> claim or <code>[OPEN]</code> slot it came from, with its id]</td>
<td>[What changes in the document]</td>
<td>[What changes in the document]</td>
<td>[Artifact, row, column]</td>
</tr>
<tr>
<td>2</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>3</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>4</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>5</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>6</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>7</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>8</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<p>Two rules for filling it in. If columns four and five say the same thing, cut the row: the answer changes nothing, so the question is curiosity rather than analysis. If column six is empty, you do not yet know what the answer is for, and asking it will produce a note rather than a decision.</p>
<p>Then order the rows by which answer would change the most, and mark the top three. Those are the ones you ask when the meeting turns out to be fifteen minutes.</p>
<h2 id="where-to-start">Where to start</h2>
<p>Take the document you have now and read only your own tags. The inferences you made and the slots you left open are your first draft agenda, and it is more specific than any published list of interview questions, including this one, because it is about your case.</p>
<p>Then run the artifacts through the <a href="https://analify.com/scorecard">scorecard</a>: twenty-five yes-or-no checks, free, no email address asked for, and check 05 is the one this habit answers to. The worked case and the six blank templates are in the <a href="https://analify.com/downloads/proof-pack">Proof Pack</a>. If your stakeholder map is still a list of job titles, <a href="https://analify.com/blog/stakeholder-map-that-survives">the map that survives contact with the project</a> is the piece to read before the session, and <a href="https://analify.com/blog/questions-a-reviewer-asks">the questions a reviewer asks</a> is what happens to your notes afterwards.</p>
<p>Six of the eight above are the open questions in my register, all eight are unanswered, and they will stay that way: the case is built from public sources on purpose and nobody at that retailer is going to be asked. That is the price of a case anybody can check. With access you can close in one session what I cannot close at all, and having closed it, with a name and a date beside the answer, is most of what a reader is looking for.</p>]]></content:encoded>
</item>
<item>
<title>Conflicting Requirements Are an Unmade Decision</title>
<link>https://analify.com/blog/when-two-stakeholders-want-opposite-things</link>
<guid isPermaLink="true">https://analify.com/blog/when-two-stakeholders-want-opposite-things</guid>
<pubDate>Sun, 06 Sep 2026 00:00:00 +0000</pubDate>
<dc:creator>Sebastian Koczyk</dc:creator>
<category>stakeholders</category>
<category>decisions</category>
<category>requirements</category>
<category>conflict</category>
<category>craft</category>
<description>Conflicting requirements are an unmade business decision. The one-page card I write instead of mediating, filled in on a 40 EUR refund threshold.</description>
<content:encoded><![CDATA[<p>A finance lead who will not move off the 40 EUR threshold. A head of customer care who wants partial refunds available on any order, whatever it is worth. Both right by the numbers each of them answers for, both outranking the analyst, and both waiting for that analyst to write down how it will work. A requirements conflict is a business decision that nobody with the authority to make it has been asked to make.</p>
<p>One thing straight before the method. That standoff is the shape of the conflict, not a meeting I am reporting, and it is certainly not a scene from the returns case published on this site. That case has no client, no meeting and no interviews, and nobody inside the retailer was asked anything, so nobody argued in front of me there. What it does have is the thing underneath a conflict like this one: a published 40 EUR threshold whose owner I could not find anywhere public, carried in the register as an open question rather than filled in with a plausible department.</p>
<h2 id="in-short">In short</h2>
<ul>
<li>Conflicting requirements are a decision, so the question worth asking is who gets to make it, not who is right.</li>
<li>Most of them dissolve on one question: what happens if you do not get this?</li>
<li>Three signals say the argument is standing in for a missing owner: nobody can name who set the rule, the argument restarts instead of resuming, and both sides hand the choice to you.</li>
<li>The card that moves it off your desk: what is disputed, the options, the cost of each, your recommendation marked as yours, a named decider, and a date with a consequence attached.</li>
</ul>
<p>For years I read a standoff like that as a communication problem. Get them in a room, find the common ground, keep the temperature down, leave with something everyone can live with. It sometimes worked, and I could never explain why.</p>
<p>It worked on the days the disagreement was not real. When it is real, the room has nothing to decide with, and neither do I. I have no authority to resolve it, and neither does anyone else who is likely to be sitting there. What I owe instead is a name for the thing being decided, an honest price on each option, and a form the decision can be taken in.</p>
<h2 id="is-this-conflict-real">Is this conflict real?</h2>
<p>Most of what arrives as a conflict is two people defending solutions whose underlying needs do not actually clash. Nobody has said the needs out loud, so the solutions do the arguing. One question separates the two: <strong>what happens if you do not get this?</strong></p>
<p>Finance is not defending 40 EUR. Ask what breaks without it and the answer is that below some order value the manual check costs more than the refund it is checking. The number is a proxy for that sentence. Customer care is not defending "no threshold" either. Ask the same question and you get a customer with a damaged 30 EUR item, told the policy has nothing for them, calling three times.</p>
<p>Written that way, the needs stop excluding each other. If the check below the threshold stops being manual, the cost the threshold protects against goes with it, and so does most of the argument.</p>
<p>There is a step before that, and in the returns case published here it was the whole job: nobody could produce a reason for the number. The threshold appears in the published policy and in two help centre articles, always worded as a hard rule, and nowhere does anything say why it is 40 rather than 25. You cannot price options against a rule whose purpose nobody can state.</p>
<p>Only when the needs still exclude each other do you have a real conflict. Then it is a decision, not a discussion.</p>
<h2 id="three-signals-the-conflict-is-fake">Three signals the conflict is fake</h2>
<p>Fake does not mean insincere. It means the argument is standing in for something else, and that something is usually a process with no owner.</p>
<p><strong>1. Nobody can tell you who set the rule, or when.</strong> The rule is published, the owner is not. Two departments are arguing over a threshold neither of them chose, defending a decision made by someone who has left, or never made deliberately at all. In my worked case it sits in the register as an open question with my own name against it: until it is answered, neither position can be taken seriously.</p>
<p><strong>2. The argument restarts instead of resuming.</strong> A conflict with an owner resumes: we decided this in March, the reason was this, what changed? A conflict without one begins at zero every time, often with different people in the chairs. No record of the last round means there was no decision in the last round either.</p>
<p><strong>3. Both sides ask you to decide, and then accept whatever you say.</strong> This one arrives disguised as trust. Two directors who genuinely disagree do not both hand the decision to the analyst. What they are handing over is not the choice, it is the consequence. Take it and you own a rule you cannot defend in six months, and the complaint lands on your desk rather than theirs.</p>
<p>When those show up, do not facilitate harder. Put the vacancy into the card as the first thing that has to be decided: who owns this rule.</p>
<h2 id="the-card-i-send-when-requirements-conflict">The card I send when requirements conflict</h2>
<p>One page, written before the meeting and sent ahead, so the room argues about the options instead of about what somebody said last time.</p>
<table>
<thead>
<tr>
<th>Field</th>
<th>What goes in it</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>What is disputed</strong></td>
<td>One neutral sentence, no names. If either side would refuse to sign it, rewrite it.</td>
</tr>
<tr>
<td><strong>Why it is open now</strong></td>
<td>What forces the decision, and what is blocked while it stays open.</td>
</tr>
<tr>
<td><strong>Options</strong></td>
<td>Two or three, genuinely different. Not three flavours of the same answer.</td>
</tr>
<tr>
<td><strong>Cost of each</strong></td>
<td>Money, calendar time, what breaks, and who absorbs it. "Unknown" is allowed if it comes with an owner and a date.</td>
</tr>
<tr>
<td><strong>Recommendation and why</strong></td>
<td>Mine, marked as mine, reasoning in one sentence.</td>
</tr>
<tr>
<td><strong>Who decides</strong></td>
<td>A named person with the authority. Not a committee, not a department.</td>
</tr>
<tr>
<td><strong>Decide by</strong></td>
<td>A date, plus what happens automatically if the date passes.</td>
</tr>
</tbody>
</table>
<p>Filled in, on the threshold:</p>
<table>
<thead>
<tr>
<th>Field</th>
<th>The 40 EUR threshold</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>What is disputed</strong></td>
<td>Whether partial refunds are available below the 40 EUR order value that the current policy sets as the floor.</td>
</tr>
<tr>
<td><strong>Why it is open now</strong></td>
<td>Release 1 ships the refund form. The form either offers a partial refund below 40 EUR or it does not, and the answer changes what gets built.</td>
</tr>
<tr>
<td><strong>Option A</strong></td>
<td>Keep the threshold. Cost: the customer with a damaged 30 EUR item gets no partial refund and calls instead. Those calls stay in customer care's queue and in the numbers customer care is judged on.</td>
</tr>
<tr>
<td><strong>Option B</strong></td>
<td>Remove the threshold. Cost: every low value claim gets a manual check that can cost more than the refund itself, and finance carries that cost.</td>
</tr>
<tr>
<td><strong>Option C</strong></td>
<td>Keep the threshold for manual review, auto-approve below it against photographic evidence, cap the total per customer per month. Cost: build work inside release 1, plus a fraud path that has to be named rather than waved at.</td>
</tr>
<tr>
<td><strong>Recommendation</strong></td>
<td>C, and it is mine. It is the only option where both stated needs survive: the customer gets a decision, and nobody pays for a check that costs more than the money it protects.</td>
</tr>
<tr>
<td><strong>Who decides</strong></td>
<td>Head of customer care, as owner of the published promise, with finance holding a veto on any rule that changes money out.</td>
</tr>
<tr>
<td><strong>Decide by</strong></td>
<td>30 April. If the date passes, partial refunds drop out of release 1 and the argument moves to release 2. That is also a decision, just one nobody made on purpose.</td>
</tr>
</tbody>
</table>
<p><em>That card comes from the returns case published here, which is built from public sources. Both positions are reconstructed from a policy and two help centre articles rather than quoted from interviews, and the costs are inferences marked as inferences. On a live project you would have the quotes and the volumes. The card looks the same.</em></p>
<p>Four rules for filling it in.</p>
<p><strong>Do not average.</strong> "Let us say 25 EUR, it is roughly in the middle" produces a number nobody chose, nobody can explain and nobody defends six months later. Splitting the difference usually fails both of the needs it was assembled from.</p>
<p><strong>Do not leave a cost cell empty.</strong> The empty cell is where the decision goes wrong. Fill it, or write the open question with a name and a date against it.</p>
<p><strong>Do not let the date be decorative.</strong> Write what happens when nobody answers, and make it something the owner would rather avoid.</p>
<p><strong>Keep the card after the decision, with the answer written into it.</strong> Six months later somebody will ask why partial refunds stop where they stop. "Card of 30 April, decided by the owner of the published promise, reasoning in the register" ends that conversation. It does not answer who set the threshold originally, which no public source says and my register still leaves open. Silence starts a new one, on worse terms, with people who were not in the room the first time.</p>
<p>The row that fails most often is "who decides", and it fails earlier than this card does. If your map of the project holds job titles instead of decision rights, there is nothing to put in that cell, which is the argument in the note on <a href="https://analify.com/blog/stakeholder-map-that-survives">the stakeholder map that survives contact with the project</a>.</p>
<h2 id="what-would-a-reviewer-say-about-this-card">What would a reviewer say about this card?</h2>
<h3 id="your-recommendation-is-you-deciding-with-extra-steps">"Your recommendation is you deciding, with extra steps"</h3>
<p>Partly fair. The recommendation is not neutral, and hiding that would be worse, so it is labelled as mine and sits under the options rather than above them. The test: write the option you did not recommend well enough that its owner would sign your description of it. If Option A reads as a strawman, you wrote a decision and dressed it as a card. The second test is what happens afterwards. Record the decisions that went against your recommendation, in the same file, in the same tone, with no commentary. A register in which the analyst always turned out to be right is a register nobody believes.</p>
<h3 id="this-is-bureaucracy-for-a-five-minute-conversation">"This is bureaucracy for a five minute conversation"</h3>
<p>Usually right. Most disagreements are cheap, reversible and settled by two people at a desk, and putting a card in front of those is how an analyst becomes the person meetings get scheduled around. My rule: would reversing this after the build cost more than a sprint, or has it already come back twice? Then it gets a card. Otherwise one line in the log, which is enough to stop the third rerun.</p>
<h3 id="you-do-not-have-those-cost-numbers">"You do not have those cost numbers"</h3>
<p>Often true, and truest early, when the numbers sit inside a system I cannot reach. The answer is not an invented figure and it is not a blank. It is "unknown, two days of queue data would answer it, owner me, by 12 March", written into the cost cell. That does two things a guess cannot: it puts a price on staying undecided, and it gives whoever owns the data a reason to release it. More than once the measurement closed the argument before the meeting happened, because one option turned out to cost almost nothing.</p>
<h2 id="the-part-that-stays">The part that stays</h2>
<p>The threshold argument was never about 40 EUR. It is about which department absorbs the cost of a case nobody wants, and that is a question about the business, not about the requirements document.</p>
<p>An analyst who settles that quietly, by picking whichever option is simpler to build, has taken on a responsibility nobody gave them. Writing it down, pricing it and handing it to the person whose job it is looks like less work and is the harder thing.</p>
<p>Take the disagreement your project has been carrying for a month and put it on one page tonight: what is disputed, the options, what each one costs, your recommendation, the named person who decides, the date. If you cannot fill the "who decides" cell, you have not found a conflict. You have found a vacancy.</p>]]></content:encoded>
</item>
<item>
<title>Writing a Use Case: The Main Flow Is the Easy Half</title>
<link>https://analify.com/blog/use-case-main-flow-easy-half</link>
<guid isPermaLink="true">https://analify.com/blog/use-case-main-flow-easy-half</guid>
<pubDate>Sun, 06 Sep 2026 00:00:00 +0000</pubDate>
<dc:creator>Sebastian Koczyk</dc:creator>
<category>use-cases</category>
<category>requirements</category>
<category>exceptions</category>
<category>modelling</category>
<category>craft</category>
<description>The main flow of a use case writes itself. A worked returns case where the exceptions take three times the space, with the source of each one named.</description>
<content:encoded><![CDATA[<p>Open any requirements pack and find the use case. The main flow runs six or seven steps, each a clean sentence, and you agree with all of them before you reach the bottom. Then scroll. Alternative flows: none listed. Exceptions: "the system handles errors and informs the user." Somebody spent an afternoon on that page, and the afternoon went into the half nobody was going to argue about.</p>
<p>A use case is a description of how an actor and a system interact to reach a goal, written as a numbered sequence of steps together with every way that sequence can go differently. The second half of that sentence is where the work is, and it is the half that arrives empty.</p>
<h2 id="in-short">In short</h2>
<ul>
<li>The main flow is the version everyone already agrees on, which is why writing it feels productive and costs you nothing.</li>
<li>The value sits in the branches: the variations that still reach the goal, and the exceptions that do not.</li>
<li>In the worked case below the main flow is six steps and the exceptions run to fourteen, roughly the proportion I now expect to see.</li>
<li>Every exception should carry a source. Published rule, observed complaint, or your own inference labelled as one. An exception with no provenance is a guess with a delivery date attached.</li>
</ul>
<p>The worked case here is returns and complaints at a mid-size online retailer, built from public sources only: the published returns policy, the help centre articles, and ten public complaint threads I selected myself. No engagement, no client, no interviews, no workshop, and nobody at that company was asked about anything. Where a branch comes from my own reasoning, the document says so on its face.</p>
<h2 id="why-does-nobody-argue-about-the-main-flow">Why does nobody argue about the main flow?</h2>
<p>Because the main flow is the story the business tells about itself: the version on the marketing page, in the onboarding deck, in the sponsor's head when they approve the budget. Everyone is carrying the same picture of it, so reading it back produces nods rather than questions.</p>
<p>Disagreement needs a branch. It appears the moment you ask what happens when the warehouse says the item came back used and the customer says it did not. There is no shared picture of that, because most people in the room have never had to hold it.</p>
<p>A thin exception section costs you three things, all after you have left the document. The developer invents the missing branch at the keyboard, choosing whatever is cheapest to build. The tester cannot test a case with no stated outcome, so it ships untested. And the stakeholder who would have caught the gap never sees it on a page.</p>
<h2 id="uc-03-return-an-item-bought-online">UC-03: Return an item bought online</h2>
<p>Read this for the proportion before you read it for the content.</p>
<p><strong>Actor.</strong> Customer (primary). Supporting: returns handling system, carrier, warehouse, payment provider.</p>
<p><strong>Goal.</strong> Send back a delivered item and get the money back to the instrument that paid for it.</p>
<p><strong>Precondition.</strong> The order is delivered, the customer can identify it, and the item is not in a category the published policy excludes from return.</p>
<p><strong>Trigger.</strong> The customer decides to send the item back.</p>
<p><strong>Main flow</strong></p>
<ol>
<li>The customer opens the delivered order and selects the line to return.</li>
<li>The customer picks a return reason from the list and submits the request.</li>
<li>The system checks the line against the return rules and accepts the request.</li>
<li>The system issues a return id and a shipping label.</li>
<li>The customer sends the item back; the warehouse receives it and records its condition as matching the stated reason.</li>
<li>The system refunds the line to the original payment method and closes the return with an outcome and a reason code.</li>
</ol>
<p><strong>Postcondition (success).</strong> The item is back in stock or written off, the refund is recorded against the paying instrument, and the return closes with a reason code that can be counted later.</p>
<p><strong>Alternative flows</strong> (the goal is still reached)</p>
<ul>
<li>2a. The customer chooses an exchange. Step 6 issues a replacement order, and the return closes only when the replacement is dispatched.</li>
<li>4a. The customer has no printer and uses a drop-off point with a code instead of a label. The return id is unchanged.</li>
<li>6a. The order was paid partly with store credit. The refund splits across instruments in proportion, and the split is shown before it is made.</li>
</ul>
<p><strong>Exceptions</strong> (the goal as stated is not reached)</p>
<ul>
<li>1a. The order is outside the return window published in the policy. Refused, showing the window and the delivery date, with the statutory withdrawal right stated separately so the refusal cannot swallow it.</li>
<li>1b. The line is in a non-returnable category. Refused, naming the category and the clause rather than showing a generic block.</li>
<li>1c. The person holding the item is not the account holder: gift, guest checkout, someone acting for a relative. Out of scope for release 1, with a route to support and the exclusion written into the scope section, not left implied.</li>
<li>3a. The item arrived damaged or the wrong item was sent. The request leaves this use case for the complaint flow, where the customer does not pay return shipping.</li>
<li>3b. The parcel never arrived. There is nothing to return, so this use case does not apply and the non-delivery flow owns it.</li>
<li>4b. The label is issued but never reaches the customer, so the return sits with no movement. After the period in the policy it goes to a named owner who re-issues, and the customer hears from someone before the window closes.</li>
<li>5b. The parcel is lost in transit. The customer holds proof of postage and no item exists to inspect. The carrier claim runs in parallel and the refund decision does not wait for it.</li>
<li>5c. The warehouse records a condition that does not match the stated reason: used, missing parts, a different item in the box. The return stops. A named owner decides, the customer is told what was found, and the evidence is recorded with the decision.</li>
<li>5d. Nothing arrives by the deadline. The return closes as not received, with one notice beforehand and a route to reopen it.</li>
<li>5e. Two lines arrive under one return id, or one id arrives split across two parcels. Each line is resolved on its own; the return closes when the last one has an outcome.</li>
<li>6b. The paying card has expired or the account is closed. The refund cannot follow the original instrument, so it needs an alternative and a check that the alternative belongs to the same person.</li>
<li>6c. The provider declines the refund. That is a failed refund, not a completed return, and it needs an owner, not a retry loop.</li>
<li>6d. The line was bought under a discount applied across the whole order. Refunding it changes what the rest qualified for. Either the discount is recalculated or the rule says it is not, but somebody has to say which.</li>
<li>6e. A refund already exists for this line. The second request is refused, and the refusal names the first so nobody has to phone anyone to find out why.</li>
</ul>
<p>Count the lines. Main flow six, alternative flows three, exceptions fourteen: about three times the space, and not padding. Every exception ends in an outcome you could write <a href="https://analify.com/blog/acceptance-criteria-that-survive">an acceptance criterion</a> against, which is a harder standard than listing what could go wrong.</p>
<h2 id="where-does-each-exception-come-from">Where does each exception come from?</h2>
<p>Every branch traces to one of four places. P is the published policy, H the help centre articles, T the ten complaint threads I picked, I my own inference.</p>
<table>
<thead>
<tr>
<th>Exception</th>
<th>Source</th>
<th>What it rests on</th>
</tr>
</thead>
<tbody>
<tr>
<td>1a window, 1b category</td>
<td>P</td>
<td>Written rules in the policy</td>
</tr>
<tr>
<td>1c not the account holder</td>
<td>T, I</td>
<td>Threads show gift and guest cases; the scope call is mine</td>
</tr>
<tr>
<td>3a damaged or wrong item</td>
<td>P, H</td>
<td>Policy names it, the help centre routes it separately</td>
</tr>
<tr>
<td>3b never arrived</td>
<td>H, T</td>
<td>The help centre separates non-delivery from returns</td>
</tr>
<tr>
<td>4b label never received</td>
<td>T</td>
<td>Threads where the return stalls before it starts</td>
</tr>
<tr>
<td>5b lost in transit</td>
<td>T</td>
<td>Threads with proof of postage and no item</td>
</tr>
<tr>
<td>5c condition dispute</td>
<td>T, H</td>
<td>The longest threads; the help centre explains inspection</td>
</tr>
<tr>
<td>5d nothing arrives</td>
<td>I</td>
<td>Nothing public describes it; the wait needs an ending</td>
</tr>
<tr>
<td>5e split or merged parcels</td>
<td>I</td>
<td>One id and many lines cannot both be atomic</td>
</tr>
<tr>
<td>6b instrument gone</td>
<td>I</td>
<td>Time passing between purchase and refund</td>
</tr>
<tr>
<td>6c refund declined</td>
<td>I</td>
<td>Any external provider call can fail</td>
</tr>
<tr>
<td>6d discount across the order</td>
<td>I</td>
<td>Pricing rule and line-level refund cannot both hold</td>
</tr>
<tr>
<td>6e duplicate refund</td>
<td>H</td>
<td>The help centre asks customers not to file twice, so they do</td>
</tr>
</tbody>
</table>
<p>Three of the ten threads I read ended in a condition dispute. That is a count of ten threads I picked myself, not a rate, and it is my own tally from those threads rather than a figure carried in the published case, which counts a different thing: four of the ten ended with nobody owning the case at all. Enough to know the branch exists, nowhere near enough to know how often.</p>
<p>The rows marked I are the interesting ones. Five of the fourteen rest on nothing public at all - 5d, 5e, 6b, 6c and 6d - and they came from reading the main flow one step at a time and asking what else can happen here. No interview would have produced them either: they are the cases nobody owns, which is why they end up unowned in the live process too.</p>
<h2 id="the-blank-version">The blank version</h2>
<p>Copy this. The hints in square brackets are the parts that go missing first.</p>
<pre><code>UC-[nn]: [verb + object, from the actor's point of view]

Actor:          [primary actor, then supporting systems]
Goal:           [what the actor has when this succeeds]
Precondition:   [what must already be true; if you cannot check it, it is a step]
Trigger:        [the event that starts this, not the screen it starts on]

Main flow
1. [actor does something]
2. [system responds]
6. [end state in business terms, not a screen message]

Postcondition (success): [what is now true, and what can be counted]

Alternative flows  [same goal, different route]
- [step]a. [variation] -&gt; [where it rejoins the main flow]

Exceptions  [goal not reached; expect two to four per main-flow step]
- [step]a. [what goes wrong] -&gt; [outcome, and the named owner who holds it]
            [source: policy / observed / inferred]

Out of scope on purpose: [the exception you excluded, and why]
Open questions: [question, owner, date it is needed by]
</code></pre>
<p>The last two lines are the ones I used to leave off. An exception you excluded on purpose is a decision. An exception you never noticed is a defect with a release date on it, and from the outside the two documents look the same.</p>
<h2 id="which-questions-generate-the-exceptions">Which questions generate the exceptions?</h2>
<p>I do not find branches by staring at the flow. I run these against every step and stop when a question produces nothing twice running.</p>
<ol>
<li><strong>Is the actor who the system thinks they are?</strong> Gifts, guest checkout, someone acting for a relative.</li>
<li><strong>Does the thing still exist in the state this step assumes?</strong> Already refunded, cancelled, or returned once.</li>
<li><strong>What if the step happens twice?</strong> Double submit, two parcels, a retry after a timeout.</li>
<li><strong>What if it never happens?</strong> Every wait needs an ending: a period, an owner, and one notice before it closes.</li>
<li><strong>What if it happens partly?</strong> One line of three, a split payment, a parcel with an item missing.</li>
<li><strong>What if the other side says no?</strong> The provider declines, the carrier loses it, the warehouse disagrees.</li>
<li><strong>What does the law say where the policy says otherwise?</strong> Published rules do not override statutory rights, and the refusal message is where that goes wrong.</li>
<li><strong>What if the actor changes their mind halfway?</strong> Started a return, now wants an exchange; posted the parcel, now wants to cancel.</li>
<li><strong>When the flow stops, who is holding it?</strong> If the answer is a shared inbox, the case has just stopped being anybody's problem.</li>
</ol>
<p>Question 9 is the one that changes documents. Every branch that ends without a name is a branch that will end without a decision.</p>
<p>Take a use case you have already written. Count the main-flow steps, count the exceptions, and if the second number is not the larger one, you wrote the easy half and stopped. Run the nine questions down the flow and watch the proportion move.</p>
<p>The returns case this use case is written against, with the register its criteria feed, is the <a href="https://analify.com/downloads/proof-pack">worked case</a> on this site. The pack carries the process models and the register rather than a use case document, so the flow above is the same material laid out the other way. That register is one of the <a href="https://analify.com/blog/business-analyst-portfolio">six artifacts a reviewer looks for</a>, and the outcomes in the exception list are where its acceptance criteria come from.</p>
<hr />]]></content:encoded>
</item>
<item>
<title>The Traceability Matrix That Survives a Change Request</title>
<link>https://analify.com/blog/traceability-matrix-change-request</link>
<guid isPermaLink="true">https://analify.com/blog/traceability-matrix-change-request</guid>
<pubDate>Sun, 06 Sep 2026 00:00:00 +0000</pubDate>
<dc:creator>Sebastian Koczyk</dc:creator>
<category>traceability</category>
<category>requirements</category>
<category>change-request</category>
<category>impact-analysis</category>
<category>craft</category>
<description>What a traceability matrix actually is, one change request walked through it row by row in a quarter of an hour, and the questions it still cannot answer.</description>
<content:encoded><![CDATA[<p>The request is one sentence, and it arrives on a Thursday afternoon, because that is when they arrive: can people start a return without uploading a photo?</p>
<p>Nothing in that sentence looks expensive. It takes a step away. It makes the form shorter. In a corridor you would say yes to it in four seconds and mean it.</p>
<p>A traceability matrix is a table that ties each business rule to the requirements that carry it, each requirement to its acceptance criteria, and each criterion to the test that proves it, so that touching any one of them shows you what else has to move. Produced as a deliverable and filed, it is a table nobody opens twice. On a Thursday afternoon it is the difference between an answer and a fortnight of finding out.</p>
<p>The case underneath this is my own: returns and complaints at a mid-size online retailer, built only from the published returns policy, the help centre articles and ten public complaint threads I picked myself. There was no engagement and no client, nobody at that company was interviewed, and nobody there has been asked about anything. The change request above is one I wrote against my own case on purpose, to see what the matrix would catch. Waiting for a real request to find out whether your matrix works means finding out while you are answering it.</p>
<h2 id="in-short">In short</h2>
<ul>
<li>A change request rarely lands on a requirement. It lands on a mechanism, which lives in an acceptance criterion, and the matrix is what walks you from there up to the rule and down to the tests.</li>
<li>Fifteen minutes of matrix gets you a list of consequences: which criteria die, which tests retire, which get rewritten, which rows are untouched. The untouched ones are half the value.</li>
<li>The rows worth having are the ones people leave out: rules you inferred rather than read, things you excluded on purpose, and open questions with a due date. A change request reopens exactly those.</li>
<li>It gives you impact, never judgement. Whether the change is a good idea, what it costs and who will fight it are three other conversations, and the matrix answers none of them.</li>
</ul>
<h2 id="where-does-one-sentence-actually-land">Where does one sentence actually land?</h2>
<p>Here is the part of the matrix the request touches. Six rows, five columns, no tooling.</p>
<table>
<thead>
<tr>
<th>Rule or decision, and where it comes from</th>
<th>Requirement</th>
<th>Acceptance criterion</th>
<th>Test</th>
<th>Owner</th>
</tr>
</thead>
<tbody>
<tr>
<td>Change 1 in the to-be: evidence is collected before a human sees the case. My design decision <code>[MINE]</code>, with no published rule behind it.</td>
<td>REQ-014 Refund on damaged delivery</td>
<td>AC-014-01 Photo upload accepts up to 3 files, 10 MB each. A fourth is rejected with a message that names the limit.</td>
<td>TC-014-01, TC-014-02</td>
<td>Me for the requirement and for the decision under it.</td>
</tr>
<tr>
<td>BR-04. Damage must be reported within 14 days of delivery. Published returns policy <code>[POLICY]</code>, owner slot open, OQ-03.</td>
<td>REQ-018 The automated pre-check may approve, never refuse</td>
<td>AC-018-01 The pre-check approves a case that satisfies BR-04 and BR-11 with no human involvement. Anything it does not approve goes to a person, with the reason it stopped.</td>
<td>TC-018-01</td>
<td>Me for the requirement. Rule owner slot open, OQ-03.</td>
</tr>
<tr>
<td>BR-07. No refund case stays open beyond 5 working days. Help centre wording is "aims to resolve", so the status is open, OQ-02.</td>
<td>REQ-015 Escalation ownership</td>
<td>AC-015-01 On breach of the 48 hour window the case is assigned to a named individual. A shared mailbox, a group or a queue does not satisfy it.</td>
<td>TC-015-04</td>
<td>Me for the requirement. Duty owner unnamed.</td>
</tr>
<tr>
<td>BR-11. Partial refund threshold, 40 EUR order value. Published policy and two help centre articles, same wording in all three <code>[POLICY]</code>.</td>
<td>REQ-014</td>
<td>AC-014-03 Partial refund permitted only above the threshold. At or below it, the refund is full or refused, never partial.</td>
<td>TC-014-07</td>
<td>Rule owner slot open, OQ-03.</td>
</tr>
<tr>
<td>SCOPE. Non-delivery and lost parcels are out of scope. Decision from review, RL-04, reason recorded: a parcel that never arrived cannot be photographed.</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>Me</td>
</tr>
<tr>
<td>OQ-01. Retention period for uploaded photographs, to be checked against the statutory limits.</td>
<td>REQ-016 Evidence retention</td>
<td>AC-016-01 Photographs are deleted 90 days after the case closes <code>[MINE, OPEN]</code>.</td>
<td>-</td>
<td>Legal, due before build starts</td>
</tr>
</tbody>
</table>
<p>Set a timer. The walk has four moves and none of them is clever.</p>
<h3 id="minutes-one-to-three-find-the-noun">Minutes one to three: find the noun</h3>
<p>The sentence contains one concrete noun, photo, so that is what I search on. Four rows come back: AC-014-01, the pre-check in REQ-018, the scope exclusion, and OQ-01.</p>
<p>Notice where the request did not land. It never touched a requirement statement. Customers still need their money back for a damaged item, and REQ-014 says so without mentioning a camera. What the request actually edits is the first row: evidence collected before a human sees the case, which is not a published rule at all. It is a design decision of mine, tagged as mine, and the whole to-be stands on it. Ninety seconds in, the shape of the answer has changed: this is not a form tweak, it is a change to the decision the automated pre-check was built around, and that decision has nobody outside the document to confirm it.</p>
<h3 id="minutes-four-to-seven-read-upwards">Minutes four to seven: read upwards</h3>
<p>From the criterion to the requirement to the rule.</p>
<p>AC-014-01 dies outright. There is no upload, so there is no upload limit to test. REQ-014 survives with a smaller criteria set. REQ-018 survives too, and that is the row worth slowing down on: the pre-check reads the delivery date and the order value, neither of which comes from a photograph, so it still approves the easy cases. What changes is the pile it does not approve. Those go to a person with no evidence attached, which puts the judgement the as-is model was criticised for, one agent deciding whether the evidence is enough with no written test, straight back where it was.</p>
<p>Then the answer nobody asks for and everybody wants: AC-014-03 and BR-11 are untouched. The partial refund threshold has nothing to do with photographs, and I can say so with a row behind me instead of a feeling. Naming what does not move is what stops a one sentence request from becoming a full regression pass, and it is the half of impact analysis people skip because it feels like saying nothing.</p>
<h3 id="minutes-eight-to-eleven-read-downwards">Minutes eight to eleven: read downwards</h3>
<p>Criteria point at tests, and tests are where the estimate lives.</p>
<p>TC-014-01 and TC-014-02 retire. That is the cheap kind of consequence. TC-018-01 is the expensive kind: it does not retire, it gets rewritten, because its precondition assumed a case arrives with evidence attached and now a case can arrive with nothing in it. A test that was passing before the change and passes after it, while checking something different, is the failure mode that survives a whole release. Rewritten tests need a name against them for that reason, and the owner column already has one.</p>
<p>Then the owner column earns its place a second time. Every row that moves is mine, and that is the uncomfortable part rather than the convenient one: the thing this change edits was never published, I decided it, and I have nobody to confirm it with. The published rules in the table, BR-04 and BR-11, do not move at all, and their owner slot has been open since the register was written, OQ-03. In an engagement that sentence names an approver. Here it names an open question, which is the same job done with less authority.</p>
<h3 id="minutes-twelve-to-fifteen-read-sideways">Minutes twelve to fifteen: read sideways</h3>
<p>Everything else that points at the evidence decision. This is the move people miss, and it is where the matrix pays for itself.</p>
<p>The scope exclusion is there. Non-delivery and lost parcels were excluded from scope in review, RL-04, and the reason written into the row is that there is nothing to photograph when a parcel never arrives. Make photos optional and that reason evaporates. The request quietly reopens a scope decision that a reviewer forced me to make, and the group it affects is the one least able to argue about it. Without the row, that comes back during build as a defect with somebody's name on it. With the row, it is a line in a Thursday afternoon reply.</p>
<p>OQ-01 shrinks rather than disappearing. Optional photos still means some photos, so the retention question stays open, with a smaller volume behind it and the same due date.</p>
<h3 id="what-you-can-send-at-the-fifteen-minute-mark">What you can send at the fifteen minute mark</h3>
<p>One requirement narrowed, one criterion dead, one requirement whose easy half survives and whose hard half lands back on a person, two tests retired, one test rewritten with a name against it, two published rules confirmed as untouched, one design decision of mine now needing a decision it never had, and one scope exclusion reopened with the reason it was made.</p>
<p>That is a consequence list. It is not a recommendation, and the difference matters when you send it.</p>
<h2 id="what-does-the-matrix-refuse-to-tell-you">What does the matrix refuse to tell you?</h2>
<p>This is the part tool guides leave out, and it is the reason a matrix disappoints people who expected more from it.</p>
<p><strong>Whether the change is a good idea.</strong> Impact is not judgement. The matrix will walk you cheerfully through a change that halves the evidence quality on every case, and never once suggest that it is a bad trade.</p>
<p><strong>What it costs.</strong> Three retired tests and one rewritten one is a shape, not an estimate. The people who build the thing own that number.</p>
<p><strong>Anything that was never written down.</strong> A matrix knows the rows you gave it. The coupling in one developer's head, the arrangement agreed verbally, the report somebody built on your data without telling you: none of it is in the table, and reading the table harder will not find it. A matrix reduces surprises, it does not remove them.</p>
<p><strong>Who will object.</strong> Consequences do not come with politics attached. The map of who can approve, block or quietly sabotage is a different artifact, and it is <a href="https://analify.com/blog/business-analyst-portfolio">one of the six</a> a reader looks for.</p>
<p><strong>Whether the tests are any good.</strong> Every row having a test id proves that a link exists. It proves nothing about what the test checks. A matrix with full coverage and weak criteria is a tidy table over a soft product, which is why the criteria have to survive on their own terms before traceability means anything. That standard is <a href="https://analify.com/blog/acceptance-criteria-that-survive">a separate piece of work</a>.</p>
<p><strong>Whether it is still true.</strong> A matrix last edited three deploys ago is a map of a country that has since moved its roads. It ages faster than any other artifact you keep, because everything else changes underneath it.</p>
<h2 id="the-blank-version">The blank version</h2>
<p>Copy this. The brackets are the hints, and the last three rows are the ones people delete when they are tidying up, which is exactly when they become useful.</p>
<table>
<thead>
<tr>
<th>Rule id and source</th>
<th>Requirement</th>
<th>Acceptance criterion</th>
<th>Test</th>
<th>Owner</th>
</tr>
</thead>
<tbody>
<tr>
<td>[BR-nn. The rule in one sentence, then where it came from. Say published or inferred, and if inferred, say who inferred it]</td>
<td>[REQ-nn. The need, not the mechanism. A mechanism in this cell is how a change request breaks you]</td>
<td>[AC-nn-nn. One row per criterion, not per requirement. Testable by someone who cannot ask you what you meant]</td>
<td>[TC ids from the tool the testers actually use, not ids invented for this table]</td>
<td>[A name for the requirement, a name for the rule. Open is an answer, blank is not]</td>
</tr>
<tr>
<td>[BR-nn for a rule you can quote from a public source. Keep published and inferred rules visibly different]</td>
<td>[REQ-nn]</td>
<td>[AC-nn-nn]</td>
<td>[TC-nn]</td>
<td>[name]</td>
</tr>
<tr>
<td>[SCOPE-nn. Something you excluded on purpose, with the reason you excluded it. A change request can reopen an exclusion, and only the reason tells you when]</td>
<td>[-]</td>
<td>[-]</td>
<td>[-]</td>
<td>[who decided, and when]</td>
</tr>
<tr>
<td>[OQ-nn. Open question, with what it blocks and a due date. Unanswered questions are part of the trace, not a gap in it]</td>
<td>[what it blocks]</td>
<td>[-]</td>
<td>[-]</td>
<td>[who owes the answer]</td>
</tr>
<tr>
<td>[RETIRED-nn. A row you removed, with the date and the change that removed it. Deleting rows destroys the only record of why the shape changed]</td>
<td>[-]</td>
<td>[-]</td>
<td>[-]</td>
<td>[who removed it]</td>
</tr>
</tbody>
</table>
<h2 id="how-do-you-keep-one-without-it-becoming-a-second-job">How do you keep one without it becoming a second job?</h2>
<p>Five habits, and none of them requires a tool.</p>
<p><strong>One row per criterion.</strong> Requirement level rows look tidy and answer nothing, because the mechanism a change request names always sits one level down.</p>
<p><strong>Ids are the product.</strong> Renumbering is how a matrix dies. Retire an id, never reuse it, and never renumber to close the gaps.</p>
<p><strong>Edit it in the same sitting as the change.</strong> A matrix maintained in a Friday catch-up pass is wrong from Monday to Thursday, which is when the requests arrive.</p>
<p><strong>Keep it in the same file as the register.</strong> Two files drift. One file with a table at the end survives handover to someone who has never heard of you.</p>
<p><strong>Mark inference on the face of the row.</strong> Published rules and your own decisions behave differently under a change request, as BR-11 and the evidence decision did above, and you will not remember which was which in six weeks.</p>
<p>Take one requirement you already have and write its row: rule, criterion, test, owner, sources named. Then write a one sentence change request against it, the kind that would arrive on a Thursday, and time yourself walking it through. If the walk takes longer than a quarter of an hour, the missing pieces are the columns you skipped.</p>
<p>Traceability is check 01 in the <a href="https://analify.com/scorecard">scorecard</a>, which is twenty-five checks you can run on your own case before anybody else runs them on you.</p>]]></content:encoded>
</item>
<item>
<title>The Success Measure That Makes a Business Case Falsifiable</title>
<link>https://analify.com/blog/success-measure-falsifiable</link>
<guid isPermaLink="true">https://analify.com/blog/success-measure-falsifiable</guid>
<pubDate>Sun, 06 Sep 2026 00:00:00 +0000</pubDate>
<dc:creator>Sebastian Koczyk</dc:creator>
<category>success-measures</category>
<category>business-case</category>
<category>metrics</category>
<category>value</category>
<category>craft</category>
<description>Five success measures in the wording documents use, put through one question: what result would mean this did not work. Plus the table the survivors go into.</description>
<content:encoded><![CDATA[<p>A project I worked on stopped in its ninth month. Nobody cancelled it. The sponsor changed roles, the successor arrived with a different list, and within a few weeks the work stopped being mentioned in status meetings. The business case had a section headed Success Measures. Three bullets, all approved by everyone who had to approve them. Not one of them could have come back false.</p>
<p>A success measure is a statement about a future observation, written so that at least one possible result counts as failure. A line that no result can contradict is decoration, and decoration is what most of these sections are made of.</p>
<p>There is one question that separates the two, and I ask it out loud, of every line, in the room where the document is being reviewed: what result would mean this did not work? Not what we hope to see. What we would have to see to admit the thing failed. Lines that get an answer stay. Lines that get a pause and a rewording of the same sentence come out.</p>
<h2 id="in-short">In short</h2>
<ul>
<li>A project without a measure that can fail does not get cancelled. It ends when attention moves somewhere else, and nobody has to say so.</li>
<li>Three of the five measures below fail the test, and one of the three fails while carrying a percentage, which is how the appearance of rigour survives review.</li>
<li>One of them is perfectly falsifiable and still does not belong in a business case, because it measures whether we shipped rather than whether it worked.</li>
<li>A missing baseline calls for writing the measurement first and the target second, with a name and a date against the target, rather than for softer wording.</li>
</ul>
<h2 id="why-does-the-test-ask-for-failure-rather-than-success">Why does the test ask for failure rather than success?</h2>
<p>Because success never lacks witnesses. Any project that runs long enough produces a screen that exists, a launch date that happened and somebody willing to say the new thing is better than the old one. If your measure is satisfied by that, it was satisfied before you wrote it.</p>
<p>A measure earns its line by ruling something out. It has to name a world in which the money was wasted, in terms specific enough that a person who was not in the room can look at a report and say yes, that happened. The same property is what makes a <a href="https://analify.com/blog/non-functional-requirements-nobody-reads">non-functional requirement</a> worth reviewing: a threshold with no way to miss it never gets built to.</p>
<p>And it explains why these sections sail through approval. A measure that can fail is a measure somebody will be asked about in eleven months, so it gets argued over now. A measure that cannot fail costs nobody anything, so it gets a nod. Read the silence in that review as the absence of anything at stake rather than as agreement.</p>
<h2 id="what-this-example-is-built-from">What this example is built from</h2>
<p>The returns case published here covers returns and complaint handling at a mid-size online retailer. The material is the published returns policy, the help centre articles, and ten public complaint threads I selected myself on a date I wrote down. There was no engagement and no client. I have never seen a queue export, an analytics account, a support rota or a cost line from that company, and I am not going to pretend otherwise in the middle of an article about honest measurement.</p>
<p>So every figure below is one of two things: a count of my own reading, labelled as one, or an assumption of mine with the source it would have to come from and the person who would confirm it written beside it. None of them is a fact about that retailer. That constraint is not a disclaimer bolted on at the end, it is the situation you are in every time you write a success measure before anybody has given you access, which is most of the time.</p>
<h2 id="five-measures-one-question-each">Five measures, one question each</h2>
<p>These are the five as they arrive, in the wording documents actually use.</p>
<h3 id="1-improve-the-customer-experience-around-returns">1. "Improve the customer experience around returns."</h3>
<p>What result would mean this did not work?</p>
<p>There is not one. Any post-launch survey supports it, any single grateful customer supports it, and a flat result gets explained as too early to tell. There is no observation that this sentence forbids.</p>
<p><strong>Out.</strong> Not because the intention is wrong, but because the intention is all it is. It can stay as the goal line above the measures. It cannot occupy a row in the table.</p>
<h3 id="2-reduce-operational-costs-by-15">2. "Reduce operational costs by 15%."</h3>
<p>What result would mean this did not work?</p>
<p>Costs come down 9%. That answer arrives quickly, and it is why this line survives most reviews. Then the follow-up: 15% of what, on which cost line, over which period, produced by whom? On this case nobody could name the report, because I have never seen one. If nobody can produce the number, nobody can produce the failing number either, and the measure is exactly as testable as the first one while looking like arithmetic.</p>
<p><strong>Out as a measure, in as an open question,</strong> with an owner and a due date before build starts. When the answer arrives it comes back as a measure, carrying the name of whoever pulled the figure and the date they pulled it.</p>
<h3 id="3-deliver-the-returns-portal-by-the-end-of-q3">3. "Deliver the returns portal by the end of Q3."</h3>
<p>What result would mean this did not work?</p>
<p>It ships in November. Instant answer, unambiguous, checkable by anyone with a calendar. This measure is falsifiable and it still does not belong in the success measures section, because it tests whether we did the thing, not whether the thing worked. A business case that counts delivery as success is finished on the day the code ships and can never be wrong after that.</p>
<p><strong>Out of this section, on to the plan,</strong> where dates belong and where nobody mistakes them for value.</p>
<h3 id="4-fewer-damaged-delivery-cases-end-up-with-nobody-handling-them">4. "Fewer damaged-delivery cases end up with nobody handling them."</h3>
<p>What result would mean this did not work?</p>
<p>The share of damaged-delivery cases with no named owner after the first contact is the same or higher two months after launch than in the period we measured before it. Specific, produced by an export, and an answer somebody would have to live with.</p>
<p><strong>Survives</strong>, and needs rewriting. As written it has no baseline, no target, no date, no owner and no counting rule.</p>
<h3 id="5-reduce-the-number-of-support-contacts-per-refund-case">5. "Reduce the number of support contacts per refund case."</h3>
<p>What result would mean this did not work?</p>
<p>Contacts per case flat or higher after three months. Also a real answer. This one carries a second problem worth keeping visible: it can be met by making support harder to reach. A measure that can be satisfied by damaging the thing it stands for needs a companion that catches the cheap win, otherwise the honest team and the team gaming it file the same report.</p>
<p><strong>Survives, paired with a guardrail.</strong></p>
<p>Three of the five are out, and the one carrying a percentage was among them. That ratio is normal once the question gets asked of every line rather than only of the ones that already look weak.</p>
<h2 id="the-two-survivors-written-out">The two survivors, written out</h2>
<pre><code>SM-1  Share of damaged-delivery cases with no named owner after
      first contact.

      Counting rule: cases opened under the damaged-delivery
      reason in the month, divided into those that have a named
      handler recorded against the case at the point of first
      response and those that do not.

      Baseline: not measured today. The nearest thing I have is
      that four of the ten public complaint threads I selected
      end with nobody named on the case after the first contact.
      That is a count of ten threads I chose myself, it is not a
      rate, and it says nothing about how often this happens in
      the queue. The real baseline comes from two weeks of queue
      export before build starts.

      Target: at or below one in ten, held for two consecutive
      months. This figure is my assumption and nothing else. It
      is a placeholder until the two-week measurement exists,
      and the number that ships is the one the returns queue
      owner sets against that measurement.

      This has failed if the share in either measured month is
      at or above the baseline, or if the queue is still not
      being measured at all two months after launch.

SM-2  Support contacts per refund case.

      Counting rule: contacts logged against a case id, divided
      by cases closed in the same month.

      Baseline: unknown. No public source carries contact
      counts, and I will not invent one. Same two-week export
      as SM-1, same owner.

      Target: below the measured baseline by month three,
      by a margin the support lead sets when the baseline
      exists. My placeholder margin is one fifth, marked as
      mine, and it has no evidence behind it.

      This has failed if contacts per case are at or above the
      baseline in month three.

SM-2G Guardrail on SM-2: share of started refund cases
      abandoned before a decision.

      This exists because SM-2 can be met by hiding the contact
      channel. If contacts fall and abandonment rises above its
      own baseline, SM-2 has not been met, it has been gamed,
      and the result is read as a failure regardless of what the
      contact ratio says.
</code></pre>
<p>What makes these usable is the last sentence of each one. If a measure does not end with a line beginning "this has failed if", it has not finished being written.</p>
<h2 id="the-artifact-six-columns">The artifact: six columns</h2>
<p>Every surviving measure gets a row. Six columns, because those are the six things people argue about eleven months later.</p>
<table>
<thead>
<tr>
<th>Measure</th>
<th>Baseline</th>
<th>Target</th>
<th>Measured on</th>
<th>Measured by</th>
<th>Counts as failure</th>
</tr>
</thead>
<tbody>
<tr>
<td>SM-1 Damaged-delivery cases with no named owner after first contact</td>
<td>Not measured. My own count of ten public threads I picked is not a rate and is not the baseline. Two weeks of queue export before build starts.</td>
<td>Author assumption: at or below 1 in 10, two consecutive months. Placeholder until the baseline exists; the figure that ships is the queue owner's.</td>
<td>Second and third full month after launch</td>
<td>Owner of the returns queue export. Slot left open: no public source names the role holder.</td>
<td>Share at or above baseline in either month, or the queue is still unmeasured in month two.</td>
</tr>
<tr>
<td>SM-2 Support contacts per refund case</td>
<td>Unknown, not published anywhere. Same two-week export.</td>
<td>Author assumption: one fifth below baseline by month three, confirmed or replaced by the support lead.</td>
<td>Monthly, months one to three after launch</td>
<td>Support lead. Slot open for the same reason.</td>
<td>Ratio at or above baseline in month three.</td>
</tr>
<tr>
<td>SM-2G Started cases abandoned before a decision</td>
<td>Unknown. Same export.</td>
<td>No rise above baseline.</td>
<td>Alongside SM-2, monthly</td>
<td>Same person as SM-2</td>
<td>Abandonment above baseline while contacts fall. That result reads as a failed SM-2.</td>
</tr>
</tbody>
</table>
<p>And the same table empty, with what belongs in each cell.</p>
<table>
<thead>
<tr>
<th>Measure</th>
<th>Baseline</th>
<th>Target</th>
<th>Measured on</th>
<th>Measured by</th>
<th>Counts as failure</th>
</tr>
</thead>
<tbody>
<tr>
<td>[one countable thing, with the counting rule: what is in the numerator and what is in the denominator]</td>
<td>[the number today, with source and date, or "not measured" plus the export that will produce it and when]</td>
<td>[the number, who set it, on what evidence; if it is yours, write "author assumption, placeholder until baseline"]</td>
<td>[a date or a named month, not "after launch"]</td>
<td>[a person, not a team; leave the slot empty rather than filling it with a plausible job title]</td>
<td>[the observation that ends this as a failure, written so a stranger could confirm it from the same report]</td>
</tr>
</tbody>
</table>
<p>Two of those columns do most of the work and both are usually missing. "Measured by" turns a number into somebody's job. "Counts as failure" is what keeps the other five honest, because a target with no failure condition beside it drifts on its own.</p>
<h2 id="what-goes-into-the-table-when-there-is-no-baseline">What goes into the table when there is no baseline?</h2>
<p>This is the situation nearly every guide skips, and it is the normal one. The current figure is not collected, or it is collected in a way nobody trusts, or it sits with a person who will not hand it over until the case is approved. The tempting fix is to soften the measure until the missing number stops mattering, which is how you end up back at improving the customer experience.</p>
<p>Do the opposite. Make the measurement itself the first deliverable, and write it with the same six columns: two weeks of export, a stated counting rule, a named person, a date it lands. The target line then reads as a placeholder with an owner attached, in plain words: set on this date, from the first measurement, by this person, and my figure until then is X, which is an assumption and carries no evidence. When the baseline comes back and it is nothing like your placeholder, that is information the case needed before anyone spent money, not an embarrassment to be quietly reworded. The one move that is never available is a target with no baseline and no note, because the first real measurement then turns into a negotiation about whether the number was ever meant literally, and that negotiation is won by whoever is closest to the deadline.</p>
<p>One more thing is worth saying out loud in this position. If the queue is not measured at all today, the first result of the project is that it can be, and that belongs in the business case as an outcome rather than in a technical annex. It is also the honest answer to the sponsor asking why you cannot simply put a number in: I can, it will be mine, and the document will say so on its face.</p>
<h2 id="where-to-start">Where to start</h2>
<p>Open the last business case you wrote and read only the success measures. Ask the one question of each line and write the answer beside it. In my experience a third survive intact, a third turn into open questions with an owner, and a third were goals wearing a metric's clothes.</p>
<p>Give the survivors the six columns. That is twenty minutes of typing. The hour after it is the conversation about who owns the baseline export and when it starts, and that conversation is the actual work, the same way the counted problem statement in <a href="https://analify.com/blog/eleven-edits-that-make-a-brd-worth-reading">eleven edits</a> is worth more than the ten edits around it.</p>
<p>The standard I hold my own documents to, success measures included, is the <a href="https://analify.com/scorecard">scorecard</a>: a fixed list of checks across the six artifacts, versioned, free, no email address asked for. A measure that can come back false is the only kind that can also come back true, and a project that can be shown to have worked is a project that gets a second release.</p>
<hr />]]></content:encoded>
</item>
<item>
<title>The Stakeholder Map That Survives Contact With the Project</title>
<link>https://analify.com/blog/stakeholder-map-that-survives</link>
<guid isPermaLink="true">https://analify.com/blog/stakeholder-map-that-survives</guid>
<pubDate>Sun, 06 Sep 2026 00:00:00 +0000</pubDate>
<dc:creator>Sebastian Koczyk</dc:creator>
<category>stakeholders</category>
<category>decision-rights</category>
<category>requirements</category>
<category>review</category>
<category>craft</category>
<description>A stakeholder map lists who can stop the work, what each one can stop, and where I know that from. A blank row to copy, three filled in from public sources.</description>
<content:encoded><![CDATA[<p>One line in a published help centre article put a warehouse goods-in lead on my stakeholder map: returned items are inspected when they arrive, and the inspection can change the outcome. That role approves nothing, and no public document I could find puts it in an approval flow. Approve refunds from photographs, which is the change I recommend, and the inspection starts landing after the money has gone. A stakeholder map is a list of the people who can stop the work, what each one of them can stop, and where I know that from.</p>
<h2 id="in-short">In short</h2>
<ul>
<li>A row earns its place when it finishes one of three sentences: can approve X, can veto Y, decides Z in practice.</li>
<li>Every row carries a source, and "my inference, unconfirmed" counts as one, as long as it is written down instead of implied.</li>
<li>The row that costs you month two is the one that loses something when the project succeeds, and no influence grid measures loss.</li>
<li>The blank row is below, ready to copy, followed by three rows built only from public sources, so you can check every claim in them.</li>
</ul>
<p>The grid takes ten minutes. Two axes, four quadrants, every name dropped somewhere on the square, and whoever lands top right gets a weekly meeting. I have drawn it, I have sat in workshops that produced it, and it has never once predicted the thing that later went wrong.</p>
<p>The axes are not the problem. The problem is that the grid answers a question nobody was going to ask. It tells me how much attention a person deserves. It never tells me what happens when that person says no.</p>
<p>Those are different questions and only one of them has consequences. "High influence, high interest" is a temperature reading. "Can refuse to sign the release" is a fact about the project I am standing in. The grid tells me how loudly to talk to someone. It never tells me whose no ends the conversation.</p>
<h2 id="what-turns-a-name-into-a-row">What turns a name into a row?</h2>
<p>Take anyone on your map and finish one of these three sentences about them.</p>
<ul>
<li><strong>Can approve X.</strong> Their yes is required. Without it, nothing ships.</li>
<li><strong>Can veto Y.</strong> Their no stops it, and enthusiasm everywhere else does not route around them.</li>
<li><strong>Decides Z in practice.</strong> Nothing on the org chart says so. They hold the outcome anyway, because the work passes through their hands.</li>
</ul>
<p>If none of the three fits, you have recorded an interest rather than a decision right. Interests are worth knowing. They are not what the map is for.</p>
<p>The third sentence earns the artifact. Approvals and vetoes are usually written down somewhere, so a diligent reader finds them. The decision that happens in practice is written down nowhere, it is held by whoever the work physically passes through, and it is the one that turns up late.</p>
<h2 id="where-do-you-know-that-from">Where do you know that from?</h2>
<p>The second thing a row needs is evidence: where you know the first part from.</p>
<p>I fill it in because the stakeholder map is where I guess most and admit it least. Attitudes, fears, what somebody "obviously" wants - it all feels like knowledge, and most of it is a story I assembled from two meetings and a tone of voice.</p>
<p>Three answers are acceptable there. A document and the section it sits in. A sentence somebody said, and roughly when. Or "my inference, unconfirmed". The third is not a failure. Silence is, because silence is how a guess gets promoted to a fact by the second reader.</p>
<p>The last column does the same job from the other side. It holds the sentence a reviewer would use against the row, written down by me before they get to say it. It takes a minute per row and it is the cheapest way I know of finding out which rows I have grown attached to.</p>
<h2 id="the-blank-row-and-three-filled-in">The blank row, and three filled in</h2>
<p>Copy this. Seven columns, one row per person, hints in the brackets.</p>
<table>
<thead>
<tr>
<th>Name / role</th>
<th>What they decide</th>
<th>What they gain</th>
<th>What they lose</th>
<th>Evidence</th>
<th>How to reach them</th>
<th>Where this row could be wrong</th>
</tr>
</thead>
<tbody>
<tr>
<td>[name, or the role if no name is public]</td>
<td>[can approve X, can veto Y, or decides Z in practice - one of the three, in those words]</td>
<td>[what gets better for them the day this ships]</td>
<td>[what they give up: discretion, control, protection, quiet]</td>
<td>[document and section, or a sentence and roughly when, or "my inference, unconfirmed"]</td>
<td>[the meeting, the corridor, or the person who gets you there; "no route from here" is an answer]</td>
<td>[the sentence a reviewer would use against this row]</td>
</tr>
</tbody>
</table>
<p>Here is the same table with the worked case in it. The rows come from the returns case published here: damaged-delivery refunds at a mid-size online retailer, built entirely from public sources - a published returns policy, the help centre, and complaint threads anyone can read. There was no engagement and no client, and nobody inside the company was asked anything, which is why the evidence column has to work hard. Two tags do the sourcing: <code>[POLICY]</code> is stated in the published returns policy, <code>[HELP]</code> in a help centre article.</p>
<table>
<thead>
<tr>
<th>Name / role</th>
<th>What they decide</th>
<th>What they gain</th>
<th>What they lose</th>
<th>Evidence</th>
<th>How to reach them</th>
<th>Where this row could be wrong</th>
</tr>
</thead>
<tbody>
<tr>
<td>Head of Customer Care (role identified, no name in public sources)</td>
<td>Approves the decision window and the wording of the public promise. Can veto a change to either</td>
<td>A promise that keeps itself, because the escalation sits in the process instead of in somebody's memory</td>
<td>Discretion. A published clock with a named owner removes the freedom to let a hard case sit</td>
<td>The "we aim to resolve within five working days" line is published, so somebody owns that sentence <code>[HELP]</code>. The gain is my inference, unconfirmed</td>
<td>Whoever chairs the returns review. From outside the company there is no route, and the map says so</td>
<td>No name anywhere public, so the row describes a chair rather than a person. If that five day clock is owned by a queue instead of a manager, the veto in column two sits elsewhere</td>
</tr>
<tr>
<td>Finance lead</td>
<td>Vetoes any change to the 40 EUR partial refund threshold, or to anything else that moves money out without a human</td>
<td>One rule instead of a threshold renegotiated case by case by whoever is on the phone</td>
<td>Control of the single number that decides how much leaves the company automatically</td>
<td>The threshold appears in the policy and in two help centre articles, always worded as a hard rule <code>[POLICY]</code>. The gain and the loss are my inference, unconfirmed</td>
<td>Not on any project distribution list. Through the sponsor, and I want the ask in writing, because threshold conversations get remembered differently</td>
<td>Nothing published says finance owns that number. I read the owner off what the number does, and a fraud team or the CFO would fit the same evidence just as well</td>
</tr>
<tr>
<td>Returns goods-in lead, warehouse</td>
<td>Decides in practice whether a returned item is accepted, restocked or scrapped. No approval right anywhere</td>
<td>Finds out a case exists before the parcel does. Today the item and the news arrive together</td>
<td>Protection. If the refund is approved from photographs before the parcel lands, every condition dispute reaches that dock after the money has gone</td>
<td>The help centre says the item is inspected on receipt and that the inspection can change the outcome <code>[HELP]</code>. The consequence for the role is mine, unconfirmed</td>
<td>Fifteen minutes at the dock, in person. Not a calendar invite, and not through the line manager, because both produce the answer the manager would give</td>
<td>"Decides in practice" is a description, not a promotion, and the org chart will say so first. How much room the inspection actually leaves the role is settled at the dock, not on a redrawn chart</td>
</tr>
</tbody>
</table>
<p>Sixty to ninety minutes for a map this size, once the reading is done. Most of it goes into the last three columns, which is the honest way of saying that the first four were quick because they were half invented.</p>
<p>Half of that evidence column says "my inference, unconfirmed", and the version without those words would be worse. An inference marked as one is a question with somewhere to land. An inference typed as a fact is a trap set for whoever reads the document after me. The fix is not deletion, it is a line in the open questions register with an owner, a date, and a fallback for when the date passes.</p>
<p>The missing names work the same way. Each one stays an open question rather than turning into a plausible invention. An empty owner slot with a question against it reads as diligence. An invented name reads as something else, and it comes apart in the first interview, when somebody asks how you met her.</p>
<h2 id="which-row-loses-something">Which row loses something?</h2>
<p>The head of customer care is the row that writes itself. That department owns the published promise, the change rewrites that promise, and on projects shaped like this one the owner of the promise is usually in the room from the first workshop. That last part is a guess about a room I have never been in. This case has no workshops in it, only documents.</p>
<p>The goods-in lead is the row I nearly did not write. The role appears in no approval flow that anyone outside the company can see. The published process still hands it the parcel, the judgement about whether its condition matches the claim, and the choice between the shelf and the scrap bin. That is a decision the published policy never mentions.</p>
<p>And the change I am recommending makes that position worse. Approving the refund from photographs, before the item arrives, moves every condition dispute past the point where the money is gone. Today the sequence protects that role by accident. My change removes the accident and replaces it with nothing. That is the sort of thing you want to find in your own document rather than in a meeting.</p>
<p>This is what the influence grid cannot do. On its axes the row is low influence and, until the first dispute, low interest. Bottom left, monitor, minimal effort. Every property the grid measures says ignore it, and the one property it does not measure says that under the change I am recommending, that inspection lands on a refund customer care has already communicated.</p>
<p>Read your own map with one question: which row loses something? If every row gains and nobody loses, you mapped the kick-off invite list, not the organisation. The resistance you meet in month two then arrives with no name on it, and you call it culture.</p>
<h2 id="what-to-do-with-this-on-saturday">What to do with this on Saturday</h2>
<p>Take a map you already have, from a real project or a case you built yourself. Add three columns and delete nothing.</p>
<p>In the first, write the sentence that person can say to stop or change the work. In the second, write where you know that from, including "my inference, unconfirmed" wherever it is true. In the third, write the objection a reviewer would raise against the row, in their words rather than yours.</p>
<p>Two things usually happen. Some rows turn out to be an audience rather than stakeholders and move to a list at the bottom. And one or two names appear that were never there, because the exercise makes you walk the process end to end and name every pair of hands.</p>
<p>The stakeholder map is the first of the <a href="https://analify.com/blog/business-analyst-portfolio">six artifacts I look for in a portfolio</a>, and the one people most often submit as decoration: twelve boxes copied off an org chart, ten minutes of work, nothing in it that could be wrong. Six rows with a decision right and a source behind each one take an afternoon and are hard to fake. The full worked case, with the register and the open questions behind these three rows, is in the <a href="https://analify.com/downloads/proof-pack">Proof Pack</a>.</p>
<p>The map is finished when a stranger can check every row in it without asking me a single question.</p>]]></content:encoded>
</item>
<item>
<title>RACI for Requirements Sign-Off: Who Actually Approves</title>
<link>https://analify.com/blog/raci-for-requirements-sign-off</link>
<guid isPermaLink="true">https://analify.com/blog/raci-for-requirements-sign-off</guid>
<pubDate>Sun, 06 Sep 2026 00:00:00 +0000</pubDate>
<dc:creator>Sebastian Koczyk</dc:creator>
<category>raci</category>
<category>governance</category>
<category>requirements</category>
<category>sign-off</category>
<category>craft</category>
<description>A sign-off matrix on a published returns case: one business rule walked through every role that can approve it, and what to write when nobody can be named.</description>
<content:encoded><![CDATA[<p>There is one cell in my rule register I could not fill, and it is the one that decides whether the rule can ever change. BR-11 says partial refunds are permitted only above 40 EUR of order value. The figure is published, worded as a hard rule in the returns policy and in two help centre articles <code>[POLICY]</code>. Who set it, and whose yes would make a different figure real, is nowhere I could reach.</p>
<p>The case under this piece is the one I publish on this site: returns and refunds at a mid-size online retailer, assembled from the published policy, the help centre and ten complaint threads anybody can open. I had no client and no access. Nobody inside that company has been asked a question by me or on my behalf, which is why the matrix below carries roles and no names, and why several of its approval cells are unfilled on purpose.</p>
<p>A RACI matrix is a table with work or decisions in the rows, roles in the columns, and one of four letters in each cell: R for whoever does the work, A for the single role whose approval makes it count, C for whoever must be asked first, I for whoever is told afterwards. Almost everything published about it is a template for project tasks. This is the narrower use that bites: who approves a requirement, and who approves the rule underneath it.</p>
<h2 id="in-short">In short</h2>
<ul>
<li>Sign-off rows are artifacts at a version, never activities. The question that stops a requirements document is whose yes makes one sentence in it true.</li>
<li>One A per row. Where no person can be named, the cell still carries the role, an open question id, a due date and the default that applies if the date passes.</li>
<li>Every role in the chain can be absent, and each absence fails differently: a rule approved and never built, a policy page that stops matching the system, a decision unmade at the loading dock.</li>
<li>The matrix creates no authority. It shows where authority is missing, while asking for it is still cheap.</li>
</ul>
<h2 id="why-do-sign-off-rows-have-to-be-decisions-rather-than-activities">Why do sign-off rows have to be decisions rather than activities?</h2>
<p>The RACI that ships with a project plan puts activities in the rows: gather requirements, migrate data, run UAT. That tells you who is busy this month. It says nothing about the sentence in your register somebody will quote back at you in eighteen months.</p>
<p>Sign-off rows are artifacts and the decisions taken on them: this rule statement, this rationale, this criterion, this exclusion, this baseline. The difference appears the moment you fill in letters. "Write the business rules" has an obvious R and a woolly A. "BR-11 as written" has a precise A, and mine is a cell I cannot fill, which is worth knowing in April rather than in build.</p>
<h2 id="the-matrix-filled-in-with-no-names-in-it">The matrix, filled in, with no names in it</h2>
<p>Columns come from the stakeholder map in the same case, seven rows written as decision rights rather than job titles. <code>[OPEN]</code> beside an A means the role is identified and the person is not.</p>
<table>
<thead>
<tr>
<th>What is being approved</th>
<th>BA (me)</th>
<th>Finance lead</th>
<th>Head of Customer Care</th>
<th>E-commerce PO</th>
<th>Goods-in lead</th>
<th>Legal</th>
<th>Approval expires when</th>
</tr>
</thead>
<tbody>
<tr>
<td>BR-11 as written: partial refunds above 40 EUR only <code>[POLICY]</code></td>
<td>R</td>
<td><strong>A</strong> <code>[OPEN, OQ-03]</code></td>
<td>C</td>
<td>I</td>
<td>I</td>
<td>-</td>
<td>Per-transaction fee changes</td>
</tr>
<tr>
<td>The rationale under BR-11, marked as my inference <code>[MINE]</code></td>
<td>R, <strong>A</strong></td>
<td>C, confirm or kill</td>
<td>I</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>Cost data appears</td>
</tr>
<tr>
<td>BR-07 status: five working days, promise or target <code>[HELP]</code></td>
<td>R</td>
<td>I</td>
<td><strong>A</strong> <code>[OPEN, OQ-02]</code></td>
<td>I</td>
<td>C</td>
<td>-</td>
<td>The published wording changes</td>
</tr>
<tr>
<td>REQ-014 criterion 3, what the form does at the threshold</td>
<td>R</td>
<td>C</td>
<td><strong>A</strong> <code>[OPEN]</code></td>
<td>C</td>
<td>I</td>
<td>-</td>
<td>BR-11 changes</td>
</tr>
<tr>
<td>REQ-016 criterion 1, 90 day photo retention <code>[MINE, OPEN, OQ-01]</code></td>
<td>R</td>
<td>-</td>
<td>I</td>
<td>C</td>
<td>-</td>
<td><strong>A</strong></td>
<td>Statute changes</td>
</tr>
<tr>
<td>Scope exclusion: non-delivery and lost parcels, with the reason <code>[MINE]</code></td>
<td>R, <strong>A</strong></td>
<td>-</td>
<td>C</td>
<td>I</td>
<td>C</td>
<td>-</td>
<td>Anyone asks why they are absent</td>
</tr>
<tr>
<td>Whether partial refunds are wanted in release 1 (OQ-05)</td>
<td>C</td>
<td>C</td>
<td><strong>A</strong> <code>[OPEN]</code></td>
<td>C</td>
<td>-</td>
<td>-</td>
<td>30 April 2026 passes</td>
</tr>
<tr>
<td>Whether release 1 has room for them</td>
<td>C</td>
<td>I</td>
<td>C</td>
<td><strong>A</strong> <code>[OPEN]</code></td>
<td>-</td>
<td>-</td>
<td>The release plan moves</td>
</tr>
<tr>
<td>Baseline of the register at v1.2, 9 April 2026</td>
<td>R, <strong>A</strong> <code>[MINE]</code></td>
<td>I</td>
<td>I</td>
<td>I</td>
<td>I</td>
<td>I</td>
<td>The next change request</td>
</tr>
</tbody>
</table>
<p><strong>One A per row, including the rows where the A is me.</strong> Where nobody could be named the letter still goes against the role. A blank cell would have been the easier lie.</p>
<p><strong>Read the A column on its own.</strong> Six of the nine rows have an unclaimed A: a role identified, a person missing. This case can be written, reviewed and pulled apart, and nobody except me can baseline it.</p>
<p><strong>Four unclaimed cells are the same absent person.</strong> My register tracks the gap at rule level, as OQ-02 and OQ-03, never at role level, so the Customer Care rows carry an open tag with no id behind it. Fifteen minutes of filling in letters found a hole four other artifacts walked past.</p>
<h2 id="the-chain-one-rule-every-role-it-has-to-pass">The chain: one rule, every role it has to pass</h2>
<p>Here is the route BR-11 travels before anyone can rely on it, and what happens at each link when the role is absent.</p>
<h3 id="1-the-analyst-who-writes-it-down-r">1. The analyst, who writes it down (R)</h3>
<p>In v1.1 my register carried the rule as one line: the number, nothing else. A business analyst reading it on 6 April 2026 asked "Why 40 EUR? Who set that?", and the answer ran to a page. The R belongs to whoever can give that answer in one breath, with the source, the status, the reasoning and the review trigger.</p>
<p><strong>Absent:</strong> the figure survives as a law of nature, quoted for years and designed around, because nothing is written down to argue with.</p>
<h3 id="2-finance-whose-yes-makes-the-number-real-a">2. Finance, whose yes makes the number real (A)</h3>
<p>The threshold governs how much money leaves without a person looking at it, and the map gives the finance lead a veto over exactly that. I cannot name them, and typing in a job title to make the table look finished would have been the one line here a single phone call could take apart.</p>
<p><strong>Absent:</strong> OQ-03, due before the register is baselined, with the default in the row: both rules stay with the A unclaimed, and neither threshold moves until it is claimed. Freezing the number is what an unclaimed A buys.</p>
<h3 id="3-customer-care-who-lives-with-the-wording-c">3. Customer Care, who lives with the wording (C)</h3>
<p>The threshold is quoted at customers in the policy and in two help centre articles, and Customer Care owns the published promise. So they are C on the rule and A on anything that changes how it reads to a customer, which is why they hold criterion 3 of REQ-014 and the finance lead does not.</p>
<p><strong>Absent:</strong> the system and the policy page stop agreeing, and the first customer to quote the page back at an agent runs the test for us.</p>
<h3 id="4-the-product-owner-who-owns-the-slot-a-one-row-down">4. The product owner, who owns the slot (A, one row down)</h3>
<p>Approving a rule and making room to build the thing that enforces it are two decisions belonging to two people. This is where a two-name A cell shows up: "partial refunds in release 1" reads like one decision and is two. Split, it gives one A each, whether they are wanted (Customer Care) and whether there is room (product owner).</p>
<p><strong>Absent:</strong> a rule approved and never built. The register says v1.2, agreed; the form still hides nothing and refuses nothing; and the gap stays invisible until an order under the threshold is offered a partial refund the policy forbids.</p>
<h3 id="5-goods-in-informed-at-best-able-to-undo-it-anyway-i">5. Goods-in, informed at best, able to undo it anyway (I)</h3>
<p>The goods-in lead holds no approval right I can find. That role also receives the parcel, judges whether its condition matches the claim, and decides whether it is restocked or scrapped. On this matrix it is an I, and in the process it decides in practice. Finding a row like that is most of the reason to build a matrix rather than photograph the org chart.</p>
<p><strong>Absent:</strong> the decision is unmade at the dock, after the money has gone. That is why REQ-017 exists, and why my one-page summary asks for whoever holds that role to be in the room before anything ships.</p>
<h3 id="6-the-frontline-agent-who-applies-the-rule-all-week-c-one-row-over">6. The frontline agent, who applies the rule all week (C, one row over)</h3>
<p>No public source contains a written test for whether photographic evidence is "enough" <code>[WALKTHROUGH]</code>, so the judgement sits with whoever picks up the case. On BR-11 the agent is an I. On BR-04, the fourteen day damage reporting window, the agent is the C I would fight hardest to keep.</p>
<p><strong>Absent:</strong> the rule is enforced at a slightly different threshold by everyone applying it, and the first report to measure the variation gets read as a data quality problem.</p>
<h3 id="7-legal-absent-here-and-able-to-stop-the-release-anyway-a-elsewhere">7. Legal, absent here and able to stop the release anyway (A elsewhere)</h3>
<p>Legal has no view on a refund threshold. They hold an absolute A one row down, on retention of the uploaded photographs, where the ninety day figure is mine and still open <code>[MINE, OPEN, OQ-01]</code>. A chain belongs to an artifact rather than a project, which is how a role can be irrelevant to eight rows and decisive on the ninth.</p>
<p><strong>Absent:</strong> the answer is identical whenever it arrives. Asked early it costs an email. Asked after build it costs the build.</p>
<h3 id="8-the-customer-who-has-no-column-at-all">8. The customer, who has no column at all</h3>
<p>The map gives the customer no right inside the company and one outside it. Four of the ten complaint threads I read were a customer escalating in public <code>[THREADS n=10]</code>, which counts the threads I chose and measures nothing about the ones I did not read. Their veto arrives through a chargeback, a statutory claim or a review, months after sign-off.</p>
<p><strong>Absent:</strong> they can be absent from the table and never from the process, and that is what makes the escalation look like bad luck.</p>
<h2 id="what-do-you-write-when-you-cannot-name-the-approver">What do you write when you cannot name the approver?</h2>
<p>This is the normal condition on a case built from outside a company, on any project in week two, and on more mature projects than people admit. An unclaimed A worth writing has four parts.</p>
<p><strong>The role, as a decision right.</strong> "Finance" approves nothing. "Whoever signs off refund policy in finance" is an approver with a missing name, which is a different thing to hand to the first colleague who does have access.</p>
<p><strong>An id,</strong> so the gap lands in the open questions register instead of a table nobody opens twice.</p>
<p><strong>A due date pinned to an event,</strong> because a date tied to an event survives a slipped plan: before the register is baselined, before build starts.</p>
<p><strong>A default resolution.</strong> OQ-02 asks whether five working days is a promise or a target. If 30 April passes unanswered, it gets published as a target and the escalation hangs off my own window, which is mine to guarantee. Write the unattractive default; it is what gets an answer out of an organisation, and what protects the work when no answer comes.</p>
<p>The objection is fair and I have taken it more than once: a role with nobody behind it approves nothing, so the cell does less than I claim for it. What it does do is hold the position open, so the first person with real access fills it from a human being rather than from a guess.</p>
<h2 id="five-ways-a-sign-off-matrix-stops-working">Five ways a sign-off matrix stops working</h2>
<p><strong>Two A cells in one row.</strong> "We approve it jointly" resolves in practice to nobody having baselined it, and it surfaces the day somebody wants the decision reversed. When you cannot name one A, the row is cut wrong rather than the organisation being unusual, so split it. Where the two names disagree on substance, that belongs on <a href="https://analify.com/blog/when-two-stakeholders-want-opposite-things">a conflict card</a> instead of in this table.</p>
<p><strong>Everybody consulted.</strong> A C belongs to a role whose absence would make the decision wrong, rather than to one that would have liked to know. Ten C on a rule means it gets approved late and changed afterwards anyway, by the people consulted last.</p>
<p><strong>Names in the columns instead of decision rights.</strong> One reorganisation and the matrix becomes a work of history. My case has the opposite problem and the same fix: decision rights in the columns, names in a list that changes without anybody reopening the table.</p>
<p><strong>Approved once, then never re-read.</strong> Approval attaches to a version and expires with it. A change request that edits a rule statement expires the approval on every row tracing to it, and working out which rows those are is <a href="https://analify.com/blog/traceability-matrix-change-request">what a traceability matrix does in a quarter of an hour</a>.</p>
<p><strong>Treating A as seniority.</strong> The A follows the rule rather than the pay grade. Legal outranks nobody here and holds an absolute A on retention; the Head of Customer Care chairs the meeting and still does not own a money rule. The question that settles these arguments is not who is senior, but who will be asked to explain the decision in twelve months when it is quoted back at the company.</p>
<h2 id="the-empty-matrix-hints-left-in">The empty matrix, hints left in</h2>
<table>
<thead>
<tr>
<th>What is being approved</th>
<th>[Role 1, as a decision right]</th>
<th>[Role 2]</th>
<th>[Role 3]</th>
<th>Approval expires when</th>
</tr>
</thead>
<tbody>
<tr>
<td>[BR-nn as written, at a version. Never "write the rules"]</td>
<td>[R. Whoever can defend the source and the reasoning]</td>
<td>[<strong>A</strong>. One per row. A name, or the role plus an open id]</td>
<td>[C, only where absence makes the decision wrong]</td>
<td>[The review trigger for that rule]</td>
</tr>
<tr>
<td>[The rationale, and whose it is. An inference of yours is its own row]</td>
<td>[R, <strong>A</strong> where the reasoning is yours]</td>
<td>[C, to confirm or kill]</td>
<td>[I]</td>
<td>[Evidence appears that settles it]</td>
</tr>
<tr>
<td>[AC-nn-nn. One criterion. Criteria are where sign-off bites]</td>
<td>[R]</td>
<td>[<strong>A</strong>]</td>
<td>[C]</td>
<td>[The rule it implements changes]</td>
</tr>
<tr>
<td>[The scope exclusion, with its reason. Exclusions get approved too]</td>
<td>[R]</td>
<td>[<strong>A</strong>]</td>
<td>[C]</td>
<td>[Anyone asks why it is missing]</td>
</tr>
<tr>
<td>[The baseline, version and date. The only row saying what "approved" refers to]</td>
<td>[R]</td>
<td>[<strong>A</strong>, or the role plus OQ-nn]</td>
<td>[I]</td>
<td>[The next change request]</td>
</tr>
</tbody>
</table>
<p>Fill the A column first, top to bottom, then go back and put a name against every letter in it. The rows where you cannot are the output. On an engagement each one is a meeting request with its agenda already written. Where the stakeholder map those columns came from sits among the other five artifacts is <a href="https://analify.com/blog/business-analyst-portfolio">a separate piece</a>; decision rights are checks 04 and 06 of the standard I hold myself to, <a href="https://analify.com/scorecard">free to run against your own case</a>.</p>
<p>BR-11 still has an unclaimed A. It has carried one since 9 April, with a date and a default beside it, and the register says so on its face rather than in a footnote.</p>]]></content:encoded>
</item>
<item>
<title>The Questions a Reviewer Asks About Your Work Sample</title>
<link>https://analify.com/blog/questions-a-reviewer-asks</link>
<guid isPermaLink="true">https://analify.com/blog/questions-a-reviewer-asks</guid>
<pubDate>Sun, 06 Sep 2026 00:00:00 +0000</pubDate>
<dc:creator>Sebastian Koczyk</dc:creator>
<category>portfolio</category>
<category>review</category>
<category>work-sample</category>
<category>hiring</category>
<category>craft</category>
<description>What reviewers look for in a BA work sample, in the order they look for it: seven questions across twenty minutes, and what stops the read at each one.</description>
<content:encoded><![CDATA[<p>Someone sends me a work sample and I give it twenty minutes. I have been on the other side of those twenty minutes too, which is the more useful half. Everything below is worked on the returns case published on this site: returns and complaints at a mid-size online retailer, built only from the published returns policy, its help centre articles, ten public complaint threads I picked myself, and a walkthrough of the published journey as far as it goes without placing a real order. No client, no engagement, no interviews, nobody inside that company asked anything. I use it because I can show you every objection it collected without redacting a word.</p>
<p>A review of a work sample is a sequence of questions asked in a fixed order, where each answer decides whether the reader asks the next one. That order is the thing nobody tells you about, and it is why a strong document can be closed after ninety seconds.</p>
<h2 id="in-short">In short</h2>
<ul>
<li>The read runs as a sequence with stoppers in it. A sample only reaches question four if one to three came back clean.</li>
<li>The first two minutes go on provenance and on the decision you are asking for, which is why the summary page belongs at the front and the model does not.</li>
<li>The review log answers the one question a finished draft cannot, and it is the artifact almost nobody sends.</li>
<li>The filled table and the blank one are below. Run your own sample through the blank one before somebody else runs it through theirs.</li>
</ul>
<h2 id="what-do-reviewers-look-for-in-a-ba-work-sample">What do reviewers look for in a BA work sample?</h2>
<p>Not completeness. Completeness is easy to fake and boring to check.</p>
<p>What I am hunting for is seams. A document written by somebody who did the work has visible joins: a place where two sources disagreed, a number that got labelled rather than rounded, a branch added late because someone pushed back. One assembled from a template has none of that. Every heading present, every sentence smooth, nothing that had to be earned.</p>
<p>So the questions run in an order built to find seams fast and stop early when there are none. Below is how my own twenty minutes go. The clock is mine rather than a standard; the order is the part I would defend.</p>
<h2 id="the-reading-order-filled-in-on-the-returns-case">The reading order, filled in on the returns case</h2>
<table>
<thead>
<tr>
<th>Minute</th>
<th>What I open</th>
<th>The question underneath it</th>
<th>What stops me here</th>
<th>Where the returns case answers it</th>
</tr>
</thead>
<tbody>
<tr>
<td>0:00 - 0:30</td>
<td>Whatever the first screen is</td>
<td>Whose work is this, and am I allowed to be reading it?</td>
<td>A client name, a real volume, a screenshot of a system that is not public</td>
<td>The case sheet states what the case is not: client work, a benchmark, or evidence about any named company</td>
</tr>
<tr>
<td>0:30 - 2:00</td>
<td>The summary page</td>
<td>What am I asked to decide, who decides it, by when?</td>
<td>An opening line that describes the document instead of asking for something</td>
<td>The first line requests a decision, names who it is addressed to, and carries a decision date of 30 April 2026</td>
</tr>
<tr>
<td>2:00 - 6:00</td>
<td>The review log</td>
<td>Has anybody competent argued with this, and what happened when they did?</td>
<td>No log. Or a log where every objection was accepted</td>
<td>Five objections, two reviewers, two sessions, four accepted, one held with a reason, in v1.2 dated 9 April 2026</td>
</tr>
<tr>
<td>6:00 - 11:00</td>
<td>One requirement and its criteria</td>
<td>Could a tester run these without phoning the author?</td>
<td>A duration with no start event, a threshold with no id or owner, any sentence with "as appropriate" in it</td>
<td>REQ-014 traces to three named rules, and the question I could not close sits there as OQ-04, with an owner, a date and a fallback</td>
</tr>
<tr>
<td>11:00 - 15:00</td>
<td>The as-is model</td>
<td>Where does work stop in this process today?</td>
<td>An as-is with no failure branch, which makes the proposed process an improvement on a fiction</td>
<td>Section 3.2 is the parked branch: no owner, no clock, and the only exit is the customer chasing it</td>
</tr>
<tr>
<td>15:00 - 18:00</td>
<td>Any number, on any page</td>
<td>Where did this come from, and what is its denominator?</td>
<td>A percentage that started life as a count</td>
<td>Every fact carries a tag, and the branch reads "four of ten complaint threads I picked myself", never a rate <code>[THREADS n=10]</code></td>
</tr>
<tr>
<td>18:00 - 20:00</td>
<td>Open questions and scope</td>
<td>What does this person admit they do not know?</td>
<td>No open questions anywhere, so the guesses have hardened into statements</td>
<td>Six open questions, each with a date and a fallback for when the date passes; five of the six carry an owner, and the sixth is open precisely because no public source names one <code>[OPEN]</code></td>
</tr>
</tbody>
</table>
<p>Two things there matter more than the rows.</p>
<p>Four of the seven stoppers are about honesty rather than skill, and three of those end the read before minute six: a detail you were not free to publish, a figure that turned out to be an invention, and a sample with nothing open in it. From outside a company, answering every question is not possible, so a sample with no open questions says you either missed the gaps or filled them with plausible guesses.</p>
<p>And the order is the reverse of the one you wrote in. You built the model first and the summary last. Lay the file out in production order and the first thing I open is a diagram with no argument attached to it.</p>
<h2 id="minute-four-what-does-the-review-log-say-that-a-finished-draft-cannot">Minute four: what does the review log say that a finished draft cannot?</h2>
<p>A review log is a short table recording what somebody objected to, what changed as a result, and what did not change and why. Three to six rows, half an hour to keep, and it is the artifact I open before the requirements.</p>
<p>The reason is narrow. A polished draft tells me you can produce a polished draft. It cannot tell me what you do when somebody who knows more than you says the thing is wrong, and that is the behaviour being hired. A log answers it, and it is close to impossible to fake, because invented objections are soft. They are the ones you already knew how to answer.</p>
<p>Here is what came back on the returns case. Two readers, asked for objections rather than the compliment after a self-review against the scorecard: a developer on the delivery side who reads process models before registers, and a business analyst who reviews requirements documents for a living. Neither works for the retailer. Two sessions, 2 and 6 April 2026, five rows in all, and three of them show what a log does that a draft cannot.</p>
<p><strong>Row one. "Your as-is is the happy path, so your to-be looks better than it is."</strong> The developer, ten minutes into a session that started with the model and never reached the register. My first as-is ran call, evidence, decision, refund, and stopped. What changed: the parked branch went on to the model, with no owner, no clock and its frequency marked unknown. That one sentence produced more than my own second pass had. REQ-015, escalation ownership, did not exist before it, and neither did BR-12, the rule naming who owns a missed window.</p>
<p><strong>Row two. "A customer whose parcel never arrived has nothing to photograph."</strong> The business analyst, four days later. My proposed process routed everything through a form built around photographic evidence, which quietly made one group worse off, and it was the group least able to argue about it. What changed: non-delivery and lost parcels are out of scope now, with a reason and an owner. What did not: the placement. It went in the scope table rather than into a fourth acceptance criterion, because an exception you exclude on purpose is a scope decision and belongs where a reviewer will look for it.</p>
<p><strong>Row three, the one that earns the table its fifth column. "Four in ten is a count, not a rate."</strong> I had ten complaint threads I picked myself, four of which ended with nobody owning the case, and two pages after my own source table called those threads unrepresentative, I had written a sentence about all cases. What changed: every use of the figure now names the denominator, the selection method and the date. What did not: the number. The stronger objection was to cut it and say only that the branch exists. A labelled count can be rechecked by a stranger in twenty minutes, and a shrug tells the reader less. The disagreement stands in the log, where a future reader can find out that somebody competent thought I was wrong.</p>
<p>The log closes with a line that takes ten seconds to write: v1.2, 9 April 2026, two peers, two sessions, five objections raised, four accepted, one held with reason. Set that against the seven questions above. It settles provenance, it dates the document, and it says the argument happened before the version in my hands. Three of the seven, at the bottom of a table.</p>
<p>The common failure is the log where every row was accepted. That shows compliance, and compliance is not what is being assessed. You can be wrong in the fifth column and still finish ahead of the person who has no fifth column.</p>
<h2 id="the-blank-version-for-your-own-sample">The blank version, for your own sample</h2>
<p>Copy this and run it against a document you have already written. Twenty minutes, alone, before anybody does you the favour.</p>
<table>
<thead>
<tr>
<th>Minute</th>
<th>What the reviewer opens first</th>
<th>The question underneath it</th>
<th>What stops them here</th>
<th>Where your document answers it</th>
</tr>
</thead>
<tbody>
<tr>
<td>0:00 - 0:30</td>
<td>[What is actually visible first, not what you meant to put first]</td>
<td>[Whose work is this, and may I read it?]</td>
<td>[The detail you are not free to publish. Write it down, then remove it]</td>
<td>[Quote the line saying what the case is and is not, or write MISSING]</td>
</tr>
<tr>
<td>0:30 - 2:00</td>
<td>[Your summary page, if it exists]</td>
<td>[What decision, whose, by when?]</td>
<td>[An opening line that describes rather than asks]</td>
<td>[Your first line, verbatim. If it opens "This document describes", that is fix one]</td>
</tr>
<tr>
<td>2:00 - 6:00</td>
<td>[Your review log]</td>
<td>[Who argued with this, and what happened?]</td>
<td>[No log, or no row where you held your ground]</td>
<td>[Rows, dates, and the summary line: version, reviewers, raised, accepted, held]</td>
</tr>
<tr>
<td>6:00 - 11:00</td>
<td>[The requirement you are least sure of]</td>
<td>[Could a tester run this without asking you?]</td>
<td>[A duration with no start event; a threshold with no owner; "as appropriate"]</td>
<td>[Its id, the rule it traces to, the question you could not close]</td>
</tr>
<tr>
<td>11:00 - 15:00</td>
<td>[Your as-is model]</td>
<td>[Where does work stop today?]</td>
<td>[No failure branch anywhere in the current state]</td>
<td>[The branch where a case waits, who owns it, and for how long]</td>
</tr>
<tr>
<td>15:00 - 18:00</td>
<td>[Every number you wrote]</td>
<td>[Denominator, method, date?]</td>
<td>[A percentage that began life as a count]</td>
<td>[Tag each at source, or mark it as your inference]</td>
</tr>
<tr>
<td>18:00 - 20:00</td>
<td>[Open questions and scope]</td>
<td>[What do you admit you do not know?]</td>
<td>[No open questions, so the guesses have hardened]</td>
<td>[Owner, date and fallback for each, including what happens if the date passes]</td>
</tr>
</tbody>
</table>
<p>The fourth column does the work. Fill in your stoppers before the answers, because the ones you cannot bring yourself to type are the ones a stranger reaches first.</p>
<h2 id="where-to-start">Where to start</h2>
<p>Take the sample you already have and do three things to it, in this order.</p>
<p>Move the summary page to the front and rewrite its first line so that it asks for a decision, names who makes it and carries a date. Add the log, even if the only reviewer so far is you two days later, marked honestly as a self-review. Then run it through the <a href="https://analify.com/scorecard">scorecard</a>: twenty-five checks across six artifacts, free, no email address asked for, and check 20 is the one about holding your ground.</p>
<p>The worked case and the blank templates behind it are in the <a href="https://analify.com/downloads/proof-pack">Proof Pack</a>. If you are still deciding what to build, <a href="https://analify.com/blog/business-analyst-portfolio">the six artifacts a reviewer looks for</a> comes first.</p>
<p>Then send it to one person who will tell you it is wrong, and write down what they said before you answer them. Whatever lands in their first two minutes is what your reader was going to hit anyway. This time you get to fix it first.</p>]]></content:encoded>
</item>
<item>
<title>Non-Functional Requirements Nobody Reads Until Production</title>
<link>https://analify.com/blog/non-functional-requirements-nobody-reads</link>
<guid isPermaLink="true">https://analify.com/blog/non-functional-requirements-nobody-reads</guid>
<pubDate>Sun, 06 Sep 2026 00:00:00 +0000</pubDate>
<dc:creator>Sebastian Koczyk</dc:creator>
<category>non-functional-requirements</category>
<category>requirements</category>
<category>quality-attributes</category>
<category>review</category>
<category>craft</category>
<description>What a non-functional requirement is, six of them rewritten from adjective into something that can fail, and who really knows the load figure.</description>
<content:encoded><![CDATA[<p>The performance section ran to three pages. It promised a system that was fast, responsive under load and ready to scale with the business. Every reviewer signed it. I wrote it, and I could not tell you today whether it was met, because there was nothing in it that could have failed.</p>
<p>A non-functional requirement is a measurable statement of how well a system has to work, and under what conditions, rather than what it does: how fast, how available, how secure, at what load. Measurable is the load-bearing word. With no number, no condition and no way to check it, what you have written is an adjective.</p>
<p>Non-functional requirements do not fail because they are technical, or because the team cannot handle percentiles. They fail because an adjective cannot come back false. Drop the number and the condition it holds under, and the sentence sails through review for the same reason it is useless: nobody argues with a promise that cannot be broken.</p>
<h2 id="in-short">In short</h2>
<ul>
<li>A line with no number, no condition and no measuring point cannot be met and cannot be missed, and nobody finds that out until production.</li>
<li>The load figure sits with the engineer who was on call at the last peak and the supervisor who booked the extra shifts, not with the sponsor who names the ambition.</li>
<li>Ask what the system withstood last time rather than what it should withstand. The past has a date and a witness; the future invites a wish.</li>
<li>A threshold with no owner and no review trigger gets quietly relaxed by whoever sits nearest the deadline.</li>
</ul>
<blockquote>
<p>A requirement nobody can fail is a requirement nobody has to build. That is why adjectives survive every review and lose the first real peak.</p>
</blockquote>
<p>The checks I run on <a href="https://analify.com/blog/acceptance-criteria-that-survive">acceptance criteria</a> apply here too, and they are not enough on their own. A criterion asks whether one behaviour happened. A non-functional requirement asks how much of it the system holds under pressure, and that carries a cost somebody has to agree to pay.</p>
<h2 id="six-that-actually-bite-as-they-arrive-and-as-they-go-out">Six that actually bite, as they arrive and as they go out</h2>
<p>The case is the one I use throughout this site: returns and refunds at a mid-size online retailer, reconstructed from public material - the published returns policy, the help centre articles, and ten public complaint threads I picked myself. Nobody inside the company was asked anything. Every number below is therefore either mine and labelled as mine, or a placeholder for the figure your own evidence would put there, which is the position you are in every time you write these before anyone has handed you access.</p>
<p>The textbooks list more attributes than this, in a tidier order. These six bit on this case. Two more get a paragraph at the end, because a paragraph is what they were worth here.</p>
<h3 id="performance">Performance</h3>
<p><strong>Weak:</strong> The returns portal must be fast, even under load.</p>
<p><strong>Fixed:</strong> The refund form confirms submission in under 2 seconds at the 95th percentile with 3,000 sessions active, measured in the browser, not at the load balancer. The 3,000 is my own estimate and the requirement says so on its face; where there is access, that figure comes out of analytics and carries the name of whoever pulled it, with the date.</p>
<p><em>What changed:</em> fast picked up a number, a statistic, a stated load and a measuring point, and the load figure got a source.</p>
<p>The first thing a reviewer says to that is that I have swapped a vague requirement for a precise fiction, and more than once they have been right. A confident 3,000 with nothing behind it is worse than fast, because it looks defensible and gets built to. The answer is not a better guess. It is the label: a threshold carries the person, the date and the pull it came from, or it goes in as an open question and stays visible until somebody closes it.</p>
<h3 id="availability">Availability</h3>
<p><strong>Weak:</strong> The portal must be highly available.</p>
<p><strong>Fixed:</strong> At least 99.9% availability per calendar month, measured 06:00 to 22:00 local time by an external check every 60 seconds against the refund form itself, not the home page. Maintenance announced 48 hours ahead and run outside that window does not count.</p>
<p><em>What changed:</em> the nines got a window, a probe, a page worth probing and one written exclusion, so the monthly report means the same thing to both sides.</p>
<p>This is the line a developer declines to sign, and the refusal is fair: nines cost money and I am not the one paying for them. A demanding threshold goes in with the cheaper option written next to it and one sentence on what the business gives up by taking that option. Three nines and four nines are not two versions of the same sentence; they are two budgets, and the choice belongs to the person holding one.</p>
<h3 id="security">Security</h3>
<p><strong>Weak:</strong> Customer data must be secure.</p>
<p><strong>Fixed:</strong> Evidence photos are encrypted at rest and served over TLS 1.2 or higher. Every view of a customer's photo writes a log line with agent id, case id and timestamp, retained 12 months. No critical or high finding from the penetration test is open at go-live, and the release manager signs that line.</p>
<p><em>What changed:</em> one adjective became three statements that can be shown to be false, and the last names the person who reads the report before release.</p>
<p>This is also where requirements start pulling against each other. Stronger authentication and fewer clicks want opposite things, and a conflict nobody writes down gets settled quietly at build time by whoever is nearest the code. Where two requirements pull like that, the pair gets a line saying which one wins, and who decided.</p>
<h3 id="usability">Usability</h3>
<p><strong>Weak:</strong> The refund flow must be intuitive and user friendly.</p>
<p><strong>Fixed:</strong> A first-time customer completes a damaged-delivery refund in no more than four screens without contacting support. In the first month after launch, at least 80% of started cases reach a decision with no support contact logged against the case id.</p>
<p><em>What changed:</em> a judgement nobody can fail became a count anyone can check, plus one outcome measured after launch, which is the half that usually goes missing.</p>
<p>That second half attracts the flattest objection of the lot: nobody will measure this after go-live. Often true, and fatal. An 80% target with no report behind it is a sentence in a file, exactly like an availability target with no monitor. Before I sign, every line of this kind names how it will be verified and who owns the dashboard or the report it lands on.</p>
<h3 id="compliance">Compliance</h3>
<p><strong>Weak:</strong> The solution must be GDPR compliant.</p>
<p><strong>Fixed:</strong> Evidence photos are deleted 90 days after the refund case closes, and the deletion is logged. A data subject request is answered inside the statutory window named by legal, not the one I remember. The 90 days is not mine to set: it goes in as an open question with the data protection officer as its owner and a due date before build starts, and when the answer comes back the requirement carries the rule id and the date it was confirmed in writing.</p>
<p><em>What changed:</em> a regulation nobody can test against became two obligations this system can be tested against, with the deadline I am not qualified to state left to the person who is.</p>
<h3 id="scalability">Scalability</h3>
<p><strong>Weak:</strong> The solution must be scalable.</p>
<p><strong>Fixed:</strong> A new country is added by configuration - currency, returns window, address format - with no code change and no downtime. The architecture holds a fourfold rise in monthly cases over 18 months without re-platforming. Fourfold is a placeholder for a figure that lives in somebody's expansion plan; until it has that owner and that date, it stands as my assumption and is marked as one.</p>
<p><em>What changed:</em> scalable got an axis to scale along, a price for adding the next country, and a note saying where the multiple has to come from before anyone builds to it.</p>
<h3 id="maintainability-and-browser-support-kept-short-on-purpose">Maintainability and browser support, kept short on purpose</h3>
<p><strong>Weak:</strong> The code must be maintainable and well documented. The portal must work on all devices and browsers.</p>
<p><strong>Fixed:</strong> A developer who has never seen the repository runs it locally from the README in under an hour, and adding a new refund reason touches configuration and one module rather than four. Supported browsers are the current and previous major versions of Chrome, Safari, Edge and Firefox on desktop, plus Safari on iOS and Chrome on Android, drawn from real traffic rather than from anyone's preference, with a named owner and a quarterly review. Anything outside that list gets a plain message and the support number instead of an upload that fails without saying why.</p>
<p>These two share one entry for the reason a reviewer usually gives out loud: half of this belongs in the definition of done. Correct. The browser list holds for everything the team ships, so repeating it story by story turns it into wallpaper. Thresholds that change from feature to feature stay on the requirement; constraints that hold everywhere live in the definition of done, and the requirement points at them. Writing a full set of eight quality attributes because a textbook lists eight is how documents get long and reviews get skimmed.</p>
<h2 id="who-actually-knows-the-load-figure">Who actually knows the load figure?</h2>
<p>Ask the sponsor how many people will use this at once and you get a figure that describes the ambition. That is not dishonesty. The sponsor sits furthest from the graphs, and their number is the one they would like to be true by next year.</p>
<p>The people holding the real figure sit two or three rungs down and are rarely in the workshop. The engineer who was on call knows what the system survived last time and the hour it gave up. The supervisor who staffs the support queue knows the week when volume triples, because they are the one booking the extra shifts. Somebody in marketing or operations is already sitting on the next peak without thinking of it as load at all: a campaign send, an enrolment deadline, a policy change with a cut-off date. All of them sit in a calendar weeks before they reach anybody's requirement. The infrastructure lead has last January in a dashboard and is almost never asked before the target is written. And on anything touching retention or reporting, the figure belongs to whoever would answer the regulator, not to the person who read the same summary of the regulation that you did.</p>
<p>None of them are hard to reach. They are simply not on the invitation list for the workshop where the number gets written, which is the whole problem: the target is drafted in the one room where nobody has the evidence.</p>
<p>So the question I ask is not how much this should withstand. It is: how much did it withstand last time, who was watching, and where is that written down. A wish has no author and no date. A past peak has both, usually with a graph attached, and it holds six months later when somebody wants the threshold relaxed: the conversation is then not my opinion against theirs, but a named person and a dated observation against a preference. And when nobody can answer at all, that is the finding. It goes in as an open question with a name and a due date, not as a round number chosen because the document needed one.</p>
<h2 id="what-makes-a-non-functional-requirement-testable">What makes a non-functional requirement testable?</h2>
<p>Six slots. Every one I keep has them filled in, and the empty slots are where the argument goes once the system is live.</p>
<table>
<thead>
<tr>
<th>Slot</th>
<th>The question it answers</th>
<th>What happens when it is missing</th>
</tr>
</thead>
<tbody>
<tr>
<td>Number</td>
<td>How much?</td>
<td>Two teams build to two targets, both sure they complied</td>
</tr>
<tr>
<td>Unit and statistic</td>
<td>Average, p95, p99?</td>
<td>An average hides the one user in twenty waiting twenty seconds</td>
</tr>
<tr>
<td>Condition</td>
<td>Under what load, at what hour?</td>
<td>Met on an empty system, missed on a Monday</td>
</tr>
<tr>
<td>Measurement point</td>
<td>Browser, load balancer, probe?</td>
<td>The dashboard is green while customers are on the phone</td>
</tr>
<tr>
<td>Owner</td>
<td>Who can renegotiate it?</td>
<td>It gets quietly relaxed by whoever sits nearest the deadline</td>
</tr>
<tr>
<td>Review trigger</td>
<td>What makes this number wrong?</td>
<td>It is still last year's figure when the fifth market opens</td>
</tr>
</tbody>
</table>
<p><strong>Template.</strong> <em>X</em> is <em>number unit</em> at <em>statistic</em>, under <em>condition</em>, measured by <em>method</em> at <em>point</em>. Set by <em>name</em> on <em>date</em>. Review when <em>trigger</em>.</p>
<h2 id="where-to-start">Where to start</h2>
<p>Open the last requirements document you wrote and read only the non-functional section. Count the sentences that could come back false. If the count is zero, that section was skimmed, not reviewed.</p>
<p>Then take the line that matters most and fill the six slots. Twenty minutes for the line. The twenty minutes after that are the phone call to whoever was on call last January, and that call is the actual work.</p>
<p>The scorecard I hold my own documents to is on the <a href="https://analify.com/downloads">downloads page</a>. It has no check aimed at a non-functional line, so do not go looking for one: the nearest two are 16 and 18, which ask a business rule who set it and what event would make it wrong, and those are the same two questions this page turns on.</p>
<hr />]]></content:encoded>
</item>
<item>
<title>Eleven Edits That Make a BRD Worth Reading</title>
<link>https://analify.com/blog/eleven-edits-that-make-a-brd-worth-reading</link>
<guid isPermaLink="true">https://analify.com/blog/eleven-edits-that-make-a-brd-worth-reading</guid>
<pubDate>Sun, 06 Sep 2026 00:00:00 +0000</pubDate>
<dc:creator>Sebastian Koczyk</dc:creator>
<category>craft</category>
<category>requirements</category>
<category>brd</category>
<category>portfolio</category>
<category>review</category>
<description>What a BRD is for, and one fragment of one shown twice: the way it usually arrives, and after eleven edits, with the objection each edit still takes.</description>
<content:encoded><![CDATA[<blockquote>
<p>"The current returns process is inefficient and causes customer dissatisfaction."</p>
</blockquote>
<p>I have read that sentence, or one built to the same pattern, in more requirements documents than I want to count. It is not false. It is just not evidence of anything. Anybody can write it after ten minutes on the company website, which is the problem when the document is attached to a job application.</p>
<p>A business requirements document, a BRD, is the document that says what a business needs to change, why, and how anyone will know the change worked. Every line in it is meant to be checkable by somebody who was not there when it was written.</p>
<p>One limit before any of this is worth reading. I have never sat on the hiring side of the table, so I cannot tell you what happens to your document once it is submitted. What I can describe is the thing I actually do: pick up a document written by a stranger and decide, inside two minutes, whether I trust the person who wrote it. That happens on international projects, and again with the work people send me on the Polish training platform I run. Whether the first screen of a recruitment process works the same way is a guess, and it is the only claim here I cannot back.</p>
<h2 id="in-short">In short</h2>
<ul>
<li>The first version of the fragment below cannot be argued with, and that is the whole problem: not one sentence in it had to be checked with anybody.</li>
<li>Count the problem instead of describing it, then say what the count is not, because four of ten complaint threads I selected myself is a count and never a rate.</li>
<li>Give every business rule a source, and leave the owner slot open when no public source names one rather than filling it in with a plausible job title.</li>
<li>Two of the eleven edits do most of the work in the first thirty seconds of reading: a counted problem statement, and a scope section with a reason beside every exclusion.</li>
</ul>
<h2 id="who-reads-a-brd-and-what-are-they-looking-for">Who reads a BRD, and what are they looking for?</h2>
<p>Your delivery team reads a BRD to build something. They need it complete. They will read every page, badly, over several weeks, and they will come back to you about the gaps because they have to.</p>
<p>A stranger deciding whether to interview you reads three paragraphs and stops. They are not auditing the document. They are looking for traces of thinking: whether you asked anyone anything, whether you noticed two rules contradicting each other, whether you wrote down what you did not know. Nobody is checking your BRD for completeness, and completeness is the cheap half anyway.</p>
<p>Complete and thought-through are not the same thing, and a document can be all of the first and none of the second. Most of what people send me has exactly that shape: every heading from the template present, and not one sentence that had to be earned.</p>
<p>What follows is a fragment of the worked case I publish here: returns handling at a mid-size retailer. There was no engagement and no client. Everything in it is built from published policy, help centre articles and public complaint threads, and every line says which. Read the numbers as a method, not as a finding about retail.</p>
<h2 id="the-fragment-the-way-it-usually-arrives">The fragment, the way it usually arrives</h2>
<pre><code>3. Business need

The current returns process is inefficient and causes customer
dissatisfaction. Customers must call support to request a refund,
which generates a high volume of calls and increases operational
costs. The business requires a modern, user-friendly solution to
streamline the returns process and improve the customer experience.

4. Scope

In scope:  refunds, returns, notifications, reporting.
Out of scope: TBD.

5. Requirements

BR-1  The system shall allow customers to request a refund online.
BR-2  The system should process refunds quickly.
BR-3  The system must be user-friendly and intuitive.
</code></pre>
<p>Nothing in there is wrong. Nothing in there can be argued with either, and that is the tell: no sentence in it had to be checked with anybody.</p>
<h2 id="the-same-fragment-after-eleven-edits">The same fragment after eleven edits</h2>
<pre><code>3. Business need

3.1  Four of the ten damaged-delivery complaint threads I read
     end with no named person owning the case after the first
     contact. Source: ten public complaint threads I selected
     and read between 12 and 21 March, with their dates. This
     is a count of the ten threads I chose, not a rate across
     all cases, and the true frequency cannot be known from
     outside until somebody measures the queue.

3.2  We are not trying to reduce the number of refunds. We are
     trying to reduce the number of cases with no owner and no
     clock. If refunds fall, that is a side effect I want to see
     explained, not celebrated.

3.3  This work is finished when the share of damaged-delivery
     cases sitting with nobody's name on them, once the queue is
     measured at all, stays under one in ten for two consecutive
     months, with the refund rate flat within one percentage
     point.

4. Scope

In scope:      damaged-delivery refunds for web store orders, from
               evidence upload to refund decision.
Out of scope:  change-of-mind returns (separate published policy,
               separate rules), marketplace orders (different
               terms, outside the returns policy), the accounting
               posting itself (unchanged by this work).
Not decided:   whether partial refunds ship in this release.
               Owner: Head of Customer Care, role identified,
               person not named in this case. Needed by
               30 April 2026. If nobody answers: out of
               release 1.

5. Business rules

BR-07  No refund case may stay open longer than five working days.
       Source: the help centre, which says the company aims to
       resolve returns within five working days. &quot;Aims to&quot; is not
       a rule, so the status stays open until somebody says which
       it is, and no public source names who owns the sentence.

BR-11  Partial refunds are allowed only above 40 EUR order value.
       Source: the same policy and two help centre articles, all
       three wording it identically. Rationale not published.
       My inference, marked as one: below 40 EUR the handling
       cost of a split refund plausibly exceeds what it recovers.
       I have no cost data. The inference and what would settle
       it sit in the rule register, for the rule owner to confirm
       or kill.

BR-12  A case that misses the decision window is assigned to a named
       person, not to a queue. Traces to BR-07: a deadline with no
       owner is a deadline nobody keeps and nobody breaks.

Note on the clock: the 48 h window in REQ-014 runs from the
timestamp on the submitted form, not from the moment somebody
opens the case.
</code></pre>
<p>Same document, same case. One version tells you nothing about its author. The other is hard to fake without having done the work.</p>
<h2 id="the-eleven-edits">The eleven edits</h2>
<p>Five of them carry a note in the margin: the objection that edit has actually taken in review, next to the edit it hit. A clean list of improvements is the half that proves least.</p>
<ol>
<li><strong>Counted the problem instead of describing it.</strong> "Inefficient" is an opinion nobody can check. "Four of the ten threads I read" is a claim someone can repeat in twenty minutes and disprove, which is what makes it worth reading.</li>
</ol>
<p><em>Objection I take on this one:</em> "It reads like a data report now, and a director will not find the ask." Correct. In the full document one sentence sits above 3.1 saying which decision I want and by when. I left it out here to keep the contrast visible, which is a small dishonesty worth naming.</p>
<ol start="2">
<li><strong>Named the source, the selection method and the denominator, and said what the number is NOT.</strong> A number with nobody attached to it is a rumour with a decimal point. A count dressed up as a rate is worse, because it survives the first challenge and collapses at the second.</li>
</ol>
<p><em>Objection:</em> "Ten threads you picked yourself are not a sample of anything, so why print the figure at all?" The stronger version of that is to cut the figure and say only that cases end up with nobody's name on them. I kept it, because a labelled count with a stated method can be rechecked by a stranger in twenty minutes and a shrug cannot. The disagreement is in the review log rather than resolved quietly in my favour.</p>
<ol start="3">
<li>
<p><strong>Wrote down the anti-goal.</strong> Saying what I am not trying to improve stops the team optimising the one metric that would make the business worse.</p>
</li>
<li>
<p><strong>Put the success condition next to the problem.</strong> A document that never says when the work is finished produces a project that ends when somebody gets tired.</p>
</li>
<li>
<p><strong>Cut the solution language out of the business need.</strong> "Modern, user-friendly solution" names an answer before the scope is agreed, and every hour after that goes into defending it rather than testing it.</p>
</li>
<li>
<p><strong>Replaced "Out of scope: TBD" with named exclusions and a reason for each.</strong> When I see TBD in a scope section I stop reading for content and start reading for who the author has spoken to. Usually the answer is nobody.</p>
</li>
</ol>
<p><em>And here is the objection to the whole approach:</em> somebody writing a portfolio piece has spoken to nobody either, and has no Head of Customer Care to name. True, and in this case it is deliberate: the entire study is built from public sources so that it can be published. Then say exactly that inside the document. "Public sources, listed, selection method stated" reads as competence. A borrowed logo and an invented stakeholder name read as something else, and I have seen both.</p>
<ol start="7">
<li>
<p><strong>Split "not in scope" from "not decided yet", and gave the undecided item an owner and a deadline.</strong> They look similar on the page and behave nothing alike in a project, because one of them is coming back.</p>
</li>
<li>
<p><strong>Replaced "quickly" with a threshold and the event that starts the count.</strong> Most of the argument about a deadline is never about the number. It is about which moment it runs from, and the vague version hides that there is a choice at all.</p>
</li>
<li>
<p><strong>Deleted BR-3.</strong> "User-friendly and intuitive" is a requirement nobody can fail, so it protects nobody and takes up a line.</p>
</li>
<li>
<p><strong>Gave every rule a source, and left the owner slot open where no public source names one.</strong> A rule with a name on it can be renegotiated. An anonymous rule can only be worked around.</p>
<p><em>Objection:</em> "An empty owner field is not an owner, so this edit does less than you claim." Fair. What it does do is keep the field visible, so the first person with access to the company fills it in from a person instead of from a guess. Writing "Finance" there because it sounds right would have been an invented fact wearing a name badge.</p>
</li>
<li>
<p><strong>Wrote down the reasoning behind the 40 EUR threshold, marked it as my inference, and said where the working lives.</strong> The number is the least interesting part. The argument behind it is what stops it being changed in a corridor six months later.</p>
<p><em>Objection, and I have earned this one more than once:</em> "The line pointed at an appendix nobody had written." Guilty, which is why it now points at the rule register, where the reasoning actually sits. A citation to a document that does not exist is worse than no citation, because it buys trust the document has not earned.</p>
</li>
</ol>
<p>There is a twelfth change I did not count, because it is a habit rather than an edit: the rules are numbered to match the register, so a reviewer's comment lands on one line instead of a paragraph.</p>
<h2 id="where-should-you-start-if-you-have-one-hour">Where should you start if you have one hour?</h2>
<p>Take a document you already have and do edits 1 and 6 on it: a counted problem statement, and a scope section with a reason beside every exclusion. Give it an hour. In my experience those two change the first thirty seconds of the reading more than the other nine together.</p>
<p>The rest of the standard I hold myself to is on this site: the <a href="https://analify.com/downloads/scorecard">scorecard</a> is twenty-five checks across six artifacts, versioned, free and with no email address asked for. The case this fragment comes from is in the <a href="https://analify.com/downloads/proof-pack">Proof Pack</a>, finished, with the review notes left in. If you want the requirement these numbers end up in, that is in <a href="https://analify.com/blog/business-analyst-portfolio">the six artifacts piece</a>.</p>
<hr />]]></content:encoded>
</item>
<item>
<title>Decision Tables: Business Logic You Can Test</title>
<link>https://analify.com/blog/decision-tables-business-logic</link>
<guid isPermaLink="true">https://analify.com/blog/decision-tables-business-logic</guid>
<pubDate>Sun, 06 Sep 2026 00:00:00 +0000</pubDate>
<dc:creator>Sebastian Koczyk</dc:creator>
<category>business-rules</category>
<category>decision-tables</category>
<category>requirements</category>
<category>testing</category>
<category>craft</category>
<description>A returns rule that reads well in prose, laid out as a sixteen-row decision table: which combinations the policy settles, and what to do with the rest.</description>
<content:encoded><![CDATA[<p>Here is a business rule as it stands on a public returns page.</p>
<blockquote>
<p>Items can be returned within 30 days of delivery. Damaged or faulty items are refunded in full, including the original delivery cost. If you have changed your mind, the item must be unused and in its original packaging. Partial refunds are available on orders over 40 EUR.</p>
</blockquote>
<p>Four sentences, nothing obviously missing. I read it twice and could not say what was wrong. Then I put it in a grid and by the third column it had become sixteen cases, seven of which the text does not answer.</p>
<p>A decision table is a grid that lists every combination of the conditions a rule depends on and states the outcome for each combination, so that the cases nobody thought about show up as empty cells instead of as arguments during build.</p>
<p>No client and no engagement here: a published returns policy, a few help centre articles from the same retailer, ten public complaint threads I picked myself. Nobody there was asked anything and I hold no internal data, so every number below comes from those sources or from counting cells you can recount.</p>
<h2 id="in-short">In short</h2>
<ul>
<li>A rule that reads cleanly in prose turns into sixteen cases once you lay out its conditions, and seven of them come out empty.</li>
<li>An empty cell is not a gap in your table, it is a decision nobody has made, so it needs an owner, a due event and a default.</li>
<li>The 40 EUR threshold everyone quotes changes the outcome in one of the seven distinct rules, and there it only removes an option.</li>
<li>Sixteen rows collapse back to seven once you mark the irrelevant conditions, and that shorter version is what a developer gets.</li>
</ul>
<h2 id="what-are-the-conditions-actually">What are the conditions, actually?</h2>
<p>Decomposing prose means reading it for anything that can take more than one value. Most of the work is here, because prose hides conditions in adjectives.</p>
<p><strong>Reason for return.</strong> Damaged or faulty, against changed my mind. The parcel that never arrived is a third case the passage does not cover: a customer with no item has nothing to return. Out of scope here on purpose, with a line saying so.</p>
<p><strong>Inside the 30 day window.</strong> The text names a start event, better than most, though the carrier's delivery date and the day the box was opened are not always the same. Note that this is the general return window, and it is not the clock BR-04 runs on in the worked case: damage in transit has to be reported within 14 days of delivery. Two windows in one policy, and the table above only lays out the wider one. Anchoring a duration to a named event is the subject of <a href="https://analify.com/blog/acceptance-criteria-that-survive">acceptance criteria that survive a sprint review</a>.</p>
<p><strong>Unused and in original packaging.</strong> Two conditions wearing one coat. Used but boxed, and unused but the box went out with the recycling, get the same answer in my table. I collapsed them because splitting doubles the table, and wrote that down so a reviewer can overrule me in one line.</p>
<p><strong>Order value above 40 EUR.</strong> Published, repeated in help centre wording as a hard rule, and no public source I found gives the reason for it or names who owns it. The boundary is soft as written: above 40 EUR and 40 EUR or more are different rules, and whether order value includes delivery is not stated.</p>
<p>Four conditions, two values each, sixteen rows. Then the outcomes, where prose was hiding a second decision. The rule reads as though there is one answer per case. There are two: whether the return is accepted, and what amount comes back. They do not always move together, and that is invisible until the columns are separate.</p>
<h2 id="sixteen-rows">Sixteen rows</h2>
<p>Open means the passage above does not answer it.</p>
<table>
<thead>
<tr>
<th>#</th>
<th>Reason</th>
<th>Within 30 days</th>
<th>Unused and boxed</th>
<th>Over 40 EUR</th>
<th>Return accepted?</th>
<th>Amount refunded</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>Damaged</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Item + delivery</td>
</tr>
<tr>
<td>2</td>
<td>Damaged</td>
<td>Yes</td>
<td>Yes</td>
<td>No</td>
<td>Yes</td>
<td>Item + delivery</td>
</tr>
<tr>
<td>3</td>
<td>Damaged</td>
<td>Yes</td>
<td>No</td>
<td>Yes</td>
<td>open</td>
<td>open</td>
</tr>
<tr>
<td>4</td>
<td>Damaged</td>
<td>Yes</td>
<td>No</td>
<td>No</td>
<td>open</td>
<td>open</td>
</tr>
<tr>
<td>5</td>
<td>Damaged</td>
<td>No</td>
<td>Yes</td>
<td>Yes</td>
<td>open</td>
<td>open</td>
</tr>
<tr>
<td>6</td>
<td>Damaged</td>
<td>No</td>
<td>Yes</td>
<td>No</td>
<td>open</td>
<td>open</td>
</tr>
<tr>
<td>7</td>
<td>Damaged</td>
<td>No</td>
<td>No</td>
<td>Yes</td>
<td>open</td>
<td>open</td>
</tr>
<tr>
<td>8</td>
<td>Damaged</td>
<td>No</td>
<td>No</td>
<td>No</td>
<td>open</td>
<td>open</td>
</tr>
<tr>
<td>9</td>
<td>Changed mind</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>open</td>
</tr>
<tr>
<td>10</td>
<td>Changed mind</td>
<td>Yes</td>
<td>Yes</td>
<td>No</td>
<td>Yes</td>
<td>open</td>
</tr>
<tr>
<td>11</td>
<td>Changed mind</td>
<td>Yes</td>
<td>No</td>
<td>Yes</td>
<td>open</td>
<td>open</td>
</tr>
<tr>
<td>12</td>
<td>Changed mind</td>
<td>Yes</td>
<td>No</td>
<td>No</td>
<td>No</td>
<td>None</td>
</tr>
<tr>
<td>13</td>
<td>Changed mind</td>
<td>No</td>
<td>Yes</td>
<td>Yes</td>
<td>No</td>
<td>None</td>
</tr>
<tr>
<td>14</td>
<td>Changed mind</td>
<td>No</td>
<td>Yes</td>
<td>No</td>
<td>No</td>
<td>None</td>
</tr>
<tr>
<td>15</td>
<td>Changed mind</td>
<td>No</td>
<td>No</td>
<td>Yes</td>
<td>No</td>
<td>None</td>
</tr>
<tr>
<td>16</td>
<td>Changed mind</td>
<td>No</td>
<td>No</td>
<td>No</td>
<td>No</td>
<td>None</td>
</tr>
</tbody>
</table>
<p>Rows 3 and 4: the policy attaches the packaging condition to the change of mind sentence only, while a help centre article asks for original packaging on all returns where possible. Two sources, one soft qualifier, nothing decidable from outside.</p>
<p>Rows 5 to 8: the passage says nothing about a fault found after the window closes, and whether rights of some kind outlive a retailer's own 30 days is for someone with standing to answer.</p>
<p>Rows 9 and 10 I did not expect: the return is accepted and no amount is stated, because the refund including delivery is promised for damaged goods only.</p>
<p>Row 11 is the interesting one. Read strictly, the item fails the unused and boxed condition and the return is refused. Read against the partial refund sentence, which names a threshold and never says what triggers one, a used item over 40 EUR is the case that clause would exist for. Both readings fit.</p>
<p>AS-1: unused and in original packaging treated as one condition. Splitting gives thirty two rows and matters in rows 11 and 12. Recorded, not resolved.</p>
<h2 id="how-much-of-this-does-the-policy-actually-settle">How much of this does the policy actually settle?</h2>
<p>Sixteen rows and two outcome columns give thirty two cells: sixteen filled from the published text, sixteen open. Read row 11 the other way and the count changes, which is the useful kind of disagreement: it is about the business, not the table.</p>
<p>Now collapse it: where a condition makes no difference, mark it irrelevant and merge. Sixteen rows become seven rules.</p>
<ol>
<li>Damaged, in window, boxed: accept, item plus delivery. Value irrelevant.</li>
<li>Damaged, in window, not boxed: open.</li>
<li>Damaged, out of window: open. Other conditions irrelevant.</li>
<li>Changed mind, in window, boxed: accept, amount open. Value irrelevant.</li>
<li>Changed mind, in window, not boxed, over 40 EUR: open.</li>
<li>Changed mind, in window, not boxed, 40 EUR or under: refuse.</li>
<li>Changed mind, out of window: refuse. Other conditions irrelevant.</li>
</ol>
<p>Three of the seven have nothing in them and a fourth has an acceptance with no amount. Seven is also the version to hand a developer, because sixteen rows invite somebody to implement four conditions where two would do.</p>
<p>The collapse also shows what the threshold does. Order value survives in one rule out of seven, and only to remove partial refund from the options in rule 6. It is the most quoted number in the policy and decides less than the sentence structure around it. I am not calling it wrong, since it is published policy and I cannot price a split refund from outside. A number can be prominent and nearly inert at once, and the table is what tells the difference.</p>
<p>Three of my ten threads land in rows this table leaves open, on my own reading of threads I picked, which is how I choose the cell to ask about first.</p>
<h2 id="why-is-an-empty-cell-worse-than-a-wrong-one">Why is an empty cell worse than a wrong one?</h2>
<p>A wrong outcome is visible. Somebody reads rule 6, disagrees, and the argument happens in review where it is cheap.</p>
<p>An empty cell gets filled in anyway, later and by somebody else. A developer meets the case in build and takes the branch that is easiest to write. An agent meets it on a Tuesday, makes a reasonable call, then makes a different reasonable call three weeks later. Nobody logs a decision, because from where each of them sits nothing was decided. The behaviour ends up with no author and no record, and the first time anyone reads it as a rule is when a customer holds two answers side by side.</p>
<h2 id="who-fills-them-in-and-by-when">Who fills them in, and by when?</h2>
<p>Sixteen open cells is not sixteen questions. Grouped by the decision behind them, they are four.</p>
<table>
<thead>
<tr>
<th>#</th>
<th>Open question</th>
<th>Cells</th>
<th>Who decides</th>
<th>Due by</th>
<th>Default if the date passes</th>
</tr>
</thead>
<tbody>
<tr>
<td>OQ-07</td>
<td>Is a fault handled after the 30 day window, and on what terms?</td>
<td>8</td>
<td>Refund policy owner, with legal input. Public sources name no person, so the row stays a role</td>
<td>Before build starts, it changes the intake form</td>
<td>Route to a human queue with a named owner, never auto refuse</td>
</tr>
<tr>
<td>OQ-08</td>
<td>Is a damaged item accepted without its original packaging?</td>
<td>4</td>
<td>Refund policy owner, with the warehouse that receives the item</td>
<td>Before build starts</td>
<td>Accept, since refusing on a where possible is the harder position to defend</td>
</tr>
<tr>
<td>OQ-09</td>
<td>On a change of mind, does the original delivery cost come back?</td>
<td>2</td>
<td>Refund policy owner, with finance</td>
<td>Before the refund amount is coded</td>
<td>Item only, said on the return screen before the parcel is posted</td>
</tr>
<tr>
<td>OQ-10</td>
<td>Used item over 40 EUR: refuse outright, or offer a partial refund?</td>
<td>2</td>
<td>Refund policy owner</td>
<td>Before build starts, it decides whether partial refund exists at all</td>
<td>Refuse, and record the partial refund clause as unreachable until a trigger is defined</td>
</tr>
</tbody>
</table>
<p>The numbering carries on from the register in the worked case, which already holds OQ-01 to OQ-06. Ids are permanent and never reused, so a question raised by a decision table gets the next free number rather than a private sequence that collides with the one a reader already has.</p>
<p>The last three columns matter more than the question. The owner is a role, because I could not name a person from public sources and an invented one is worse than an open row. The due date is an event in the build, so it survives a change of schedule. The default is the column people leave out, and it stops the question becoming a silent decision taken by whoever sits closest to the keyboard.</p>
<p>The sixteen settled cells go the other way: each is now a statement a tester can run without asking me what I meant.</p>
<h2 id="the-blank-template">The blank template</h2>
<p>Three conditions, eight rows. Add the fourth only when you have proved you need it.</p>
<table>
<thead>
<tr>
<th>#</th>
<th>[Condition 1, phrased so the answer is yes or no]</th>
<th>[Condition 2]</th>
<th>[Condition 3]</th>
<th>[Outcome A: the decision]</th>
<th>[Outcome B: amount, status or owner]</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>[outcome, or "open"]</td>
<td>[outcome, or "open"]</td>
</tr>
<tr>
<td>2</td>
<td>Yes</td>
<td>Yes</td>
<td>No</td>
<td></td>
<td></td>
</tr>
<tr>
<td>3</td>
<td>Yes</td>
<td>No</td>
<td>Yes</td>
<td></td>
<td></td>
</tr>
<tr>
<td>4</td>
<td>Yes</td>
<td>No</td>
<td>No</td>
<td></td>
<td></td>
</tr>
<tr>
<td>5</td>
<td>No</td>
<td>Yes</td>
<td>Yes</td>
<td></td>
<td></td>
</tr>
<tr>
<td>6</td>
<td>No</td>
<td>Yes</td>
<td>No</td>
<td></td>
<td></td>
</tr>
<tr>
<td>7</td>
<td>No</td>
<td>No</td>
<td>Yes</td>
<td></td>
<td></td>
</tr>
<tr>
<td>8</td>
<td>No</td>
<td>No</td>
<td>No</td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<p>Underneath it, two blocks that do most of the work.</p>
<pre><code>AS-n  [a condition you collapsed, a boundary you read one way, a case you
       put out of scope. One line each, so a reviewer can overrule you]

OQ-n  [the open question, one sentence]
      Cells:   [which rows it covers]
      Owner:   [the role holding the decision right, not a name you guessed]
      Due:     [an event in the build, not a calendar date]
      Default: [what happens if that event arrives with no answer]
</code></pre>
<p>Then one line naming the source of every filled cell, so a reader can tell which outcomes came from a published rule and which from you.</p>
<h2 id="when-is-the-table-the-wrong-tool">When is the table the wrong tool?</h2>
<p>Above five or six conditions it stops being readable, so split it by reason for return. Continuous values fit only once you band them, and the arguments then move to the band edges. Sequence it does not model at all: who holds the case while it waits is a question for a process model. And a first pass with no empty cells usually means you picked the conditions to fit the answers you already had.</p>
<p>The full returns case, with the register the criteria sit in and the rule register the thresholds come from, is in the <a href="https://analify.com/downloads/proof-pack">proof pack</a>. The table above is not in it: the pack carries these rules as a register rather than as a grid, so this page is the same logic laid out the other way. The <a href="https://analify.com/scorecard">scorecard</a> carries the checks I run before anybody else sees it.</p>
<p>Twenty minutes, today: take a rule from a product you use, find two conditions, write the four rows and see how many you can answer. Two is a normal score. The two you cannot answer are the ones your team will decide by accident.</p>
<hr />]]></content:encoded>
</item>
<item>
<title>The Context Diagram That Settles the Scope Argument</title>
<link>https://analify.com/blog/context-diagram-scope-argument</link>
<guid isPermaLink="true">https://analify.com/blog/context-diagram-scope-argument</guid>
<pubDate>Sun, 06 Sep 2026 00:00:00 +0000</pubDate>
<dc:creator>Sebastian Koczyk</dc:creator>
<category>scope</category>
<category>context-diagram</category>
<category>brd</category>
<category>modelling</category>
<category>craft</category>
<description>The scope argument runs on what stays outside and who inherits it. One box, a ring of entities, one line per exchange, and two tables you can copy.</description>
<content:encoded><![CDATA[<p>Two people, one meeting, forty minutes gone. One wants the warehouse inspection inside the project, the other wants it out. They are describing the same returns process, they are both right, and neither is arguing about what they think they are arguing about. The disagreement is over the part that will sit outside the new system, and who gets handed it on the Monday after go live. Nobody has said that out loud, which is why the meeting has another forty minutes in it.</p>
<p>A context diagram is one box for the thing you are changing, a ring of everything outside it that sends it something or receives something from it, and one labelled line per exchange. No internal steps, no screens, no boxes inside the box. That is the entire notation, which is why it takes five minutes and why it closes this argument.</p>
<p>One limit first. That argument is a composite of ones I have sat in on real projects, not a transcript. The returns case on this site has no meeting room in it: returns and complaints at a mid-size online retailer, built only from the published returns policy, the help centre and ten public complaint threads I picked myself. No engagement, no client, nobody inside the company asked anything. Where I claim a system exists across the boundary, I am inferring it from what those sources make visible, and the row says so.</p>
<h2 id="in-short">In short</h2>
<ul>
<li>The scope argument is rarely about the thing being built. It runs on the part being left out, and on who quietly inherits it.</li>
<li>Draw one box, name every entity that exchanges something with it, write one line per exchange. Anything you cannot draw a line to is outside, and the reason goes on the page.</li>
<li>The column that does the work is the last one: what happens when this flow is missing. That is where an exclusion stops being an opinion and becomes a cost with a name against it.</li>
<li>Both tables are below, filled in and then blank, ready to copy.</li>
</ul>
<h2 id="why-does-the-same-scope-argument-restart-every-week">Why does the same scope argument restart every week?</h2>
<p>Two positions, near enough word for word, because they repeat with the job titles swapped.</p>
<p>If inspection stays outside, we approve refunds from photographs, and the first time somebody photographs an empty box we have paid for nothing.</p>
<p>Inspection is a warehouse process with its own hands, its own building and its own system. Pull it in and we are rewriting the warehouse, and this ships in a year rather than a quarter.</p>
<p>Both are true, which is the problem. Two true sentences can sit opposite each other for as long as the meeting lasts, because the word doing the damage is "returns", and it covers at least six things: the claim, the evidence, the eligibility check, the decision, the money leaving, and the item coming back. Each person holds a different subset and uses the same word for it.</p>
<p>A drawing removes the option. You cannot draw a boundary and keep two versions of it, and once the line is on the page the question changes shape. It stops being "should inspection be in the project" and becomes "if inspection sits outside, what crosses the line, in which direction, and what breaks when that crossing does not happen".</p>
<h2 id="the-diagram-written-out-so-you-can-copy-it">The diagram, written out so you can copy it</h2>
<p>In the middle, one box, named as narrowly as the scope line in the document: damaged-delivery refunds for web store orders, from evidence upload to decision.</p>
<p>Around it, the entities, each with its source. <code>[POLICY]</code> is stated in the published returns policy, <code>[HELP]</code> in a help centre article, <code>[THREADS]</code> in the ten threads, and <code>[INFERRED]</code> marks reasoning from what those sources imply rather than state.</p>
<ul>
<li>Customer <code>[POLICY]</code> <code>[HELP]</code></li>
<li>Support contact route, the way the help centre says a case is raised <code>[HELP]</code></li>
<li>Warehouse goods-in inspection <code>[HELP]</code></li>
<li>Order and delivery record, the web store itself <code>[POLICY]</code></li>
<li>Payment and refund execution <code>[INFERRED]</code>, because the policy says refunds return to the original payment method, so something executes them</li>
<li>Carrier <code>[INFERRED]</code>, because a damaged delivery usually has a claim path behind it</li>
<li>Accounting ledger <code>[INFERRED]</code></li>
<li>Marketplace channel <code>[POLICY]</code>, on the diagram because it is outside</li>
</ul>
<p>One row per exchange. The last two columns are worth your afternoon.</p>
<table>
<thead>
<tr>
<th>Entity</th>
<th>What it sends in</th>
<th>What it gets back</th>
<th>What happens when this flow is missing</th>
<th>Where I know this from</th>
</tr>
</thead>
<tbody>
<tr>
<td>Customer</td>
<td>Claim, order reference, photographs of the damage</td>
<td>A decision, and a refund to the original payment method</td>
<td>The case is opened from a spoken description, and the evidence lives in somebody's memory of the call</td>
<td><code>[POLICY]</code> <code>[HELP]</code></td>
</tr>
<tr>
<td>Support contact route</td>
<td>The raised case, plus anything added later</td>
<td>Case status and the wording to send back</td>
<td>Automation refuses a case and no human path exists around the refusal, the shape several threads I read take</td>
<td><code>[HELP]</code> <code>[THREADS]</code></td>
</tr>
<tr>
<td>Warehouse goods-in inspection</td>
<td>The condition verdict once the item lands: accept, restock, scrap</td>
<td>Notice that a return is coming, and what was claimed</td>
<td>The verdict arrives after the money has gone, so condition disputes reach the dock with nothing left to decide</td>
<td><code>[HELP]</code>, the consequence is my inference, unconfirmed</td>
</tr>
<tr>
<td>Order and delivery record</td>
<td>Order, item, delivery date, carrier reference</td>
<td>A lookup, and the outcome written back</td>
<td>Eligibility is checked by asking the customer for facts the company holds, which reads as suspicion</td>
<td><code>[POLICY]</code></td>
</tr>
<tr>
<td>Payment and refund execution</td>
<td>Confirmation that the refund executed, or failed</td>
<td>The instruction to refund a stated amount</td>
<td>The case reads as refunded on one side and as nothing on the customer's, and nobody watches the gap</td>
<td><code>[INFERRED]</code></td>
</tr>
<tr>
<td>Carrier</td>
<td>Nothing I can see from outside</td>
<td>A damage report, if one is raised</td>
<td>A recoverable cost is absorbed, and nobody finds out how often</td>
<td><code>[INFERRED]</code>, an open question rather than a finding</td>
</tr>
<tr>
<td>Accounting ledger</td>
<td>Nothing back to the case</td>
<td>The posting for the refund</td>
<td>Money moves and the books learn about it by reconciliation, not by design</td>
<td><code>[INFERRED]</code></td>
</tr>
<tr>
<td>Marketplace channel</td>
<td>Orders that arrive here by mistake</td>
<td>Nothing. The flow that matters is the one sending them away</td>
<td>Web store rules get applied to orders on different terms, invisibly, until a complaint</td>
<td><code>[POLICY]</code></td>
</tr>
</tbody>
</table>
<p>Read down the fourth column. Half of those failures are not system failures. They are a person receiving something late, or nothing, and absorbing it. That is the argument the two people were really having, and it took a table to make it sayable.</p>
<h2 id="which-side-of-the-line-and-who-is-left-holding-the-rest">Which side of the line, and who is left holding the rest?</h2>
<p>The second table is the one that goes into the document.</p>
<table>
<thead>
<tr>
<th>In scope</th>
<th>Out of scope</th>
<th>Reason for exclusion, and who is left holding it</th>
</tr>
</thead>
<tbody>
<tr>
<td>Damaged-delivery refund decision for web store orders</td>
<td>Change-of-mind returns</td>
<td>Separate policy, separate rules <code>[POLICY]</code>. Stays on the existing path, untouched</td>
</tr>
<tr>
<td>Evidence upload, case creation, eligibility check</td>
<td>Physical inspection at goods-in</td>
<td>A warehouse process with its own building and system; taking it in means rewriting the warehouse. Left with the goods-in lead, whose verdict now lands after the decision</td>
</tr>
<tr>
<td>Web store orders</td>
<td>Marketplace orders</td>
<td>Different terms <code>[POLICY]</code>. Left with whoever handles marketplace disputes, and no public source names them, so the row stays open instead of taking a plausible department</td>
</tr>
<tr>
<td>The refund instruction and the record that it was issued</td>
<td>Execution of the payment itself</td>
<td>Existing capability, unchanged. Left with the payment path; the missing confirmation flow above is what this one costs</td>
</tr>
<tr>
<td>The decision record and its audit trail</td>
<td>The accounting posting</td>
<td>Unchanged here. Left with finance, who find out by reconciliation</td>
</tr>
<tr>
<td>A damage report raised at the point of decision</td>
<td>The carrier recovery claim</td>
<td>I cannot see that process from outside, so I will not scope it. Unassigned, and logged as an open question on this diagram rather than parked in a scope column</td>
</tr>
</tbody>
</table>
<p>The third column does what the first two cannot. "Out of scope: inspection" states a boundary. "Out of scope: inspection, and the goods-in lead now sees the verdict matter after the money has left" states a decision somebody may want to make differently.</p>
<p>One row type is missing on purpose. Anything genuinely undecided belongs in neither column; it needs its own line with an owner and a date, which is one of the <a href="https://analify.com/blog/eleven-edits-that-make-a-brd-worth-reading">eleven edits that make a BRD worth reading</a>. Parking an open question in the out-of-scope column is the commonest way I see a scope section lie without anybody meaning to.</p>
<h2 id="what-does-an-exclusion-cost-and-who-pays-it">What does an exclusion cost, and who pays it?</h2>
<p>The goods-in lead approves nothing. No public source I could find puts that role in an approval flow, and on an influence grid it sits in the quadrant you are told to monitor with minimal effort. It is on the diagram anyway, because the help centre says returned items are inspected on receipt and the inspection can change the outcome. A line crosses the boundary towards it whether anybody planned it or not.</p>
<p>Keeping inspection outside the box is almost certainly the right call. It is also the exclusion with a cost, and the cost lands on the one role here with no veto to defend itself with. Both are true at once, and the diagram lets you write them in one sentence instead of choosing. Same pattern as the <a href="https://analify.com/blog/stakeholder-map-that-survives">stakeholder map that survives contact with the project</a>: the row that matters in month two is the one that loses something, and no scope bullet surfaces it.</p>
<p>What you do about it is not heroic: name it in the document, log it as an open question with a fallback, and make sure whoever holds that role hears it from you and not from the first dispute.</p>
<h2 id="the-blank-version">The blank version</h2>
<p>Copy these two. Hints in the brackets.</p>
<table>
<thead>
<tr>
<th>Entity</th>
<th>What it sends in</th>
<th>What it gets back</th>
<th>What happens when this flow is missing</th>
<th>Where I know this from</th>
</tr>
</thead>
<tbody>
<tr>
<td>[system, team or role outside the box]</td>
<td>[what it hands over: data, a document, a decision, an item]</td>
<td>[what goes back; "nothing" is a real answer worth writing]</td>
<td>[the failure in one sentence; name the person if a person absorbs it]</td>
<td>[document and section, or "my inference, unconfirmed"]</td>
</tr>
</tbody>
</table>
<table>
<thead>
<tr>
<th>In scope</th>
<th>Out of scope</th>
<th>Reason for exclusion, and who is left holding it</th>
</tr>
</thead>
<tbody>
<tr>
<td>[the slice you are changing, as narrow as the box]</td>
<td>[the adjacent slice that stays outside]</td>
<td>[why it is outside, then the role that inherits it; "unassigned, open question" is honest, an invented department is not]</td>
</tr>
</tbody>
</table>
<p>Five minutes, no software.</p>
<ol>
<li>Write the box. One line, ending at a decision or a state rather than at a department.</li>
<li>List everything that touches it, walking the process end to end, exclusions included.</li>
<li>One row per exchange, per direction, because the two directions fail differently.</li>
<li>Fill the failure column before you argue with anyone. It is the only column that changes minds.</li>
<li>Anything with no line to the box is outside. Write the reason and the inheritor beside it, or take it back in.</li>
</ol>
<p>One fair objection: the table invites you to draw systems you have never seen. Hence the source column, and four entities tagged as inferences.</p>
<h2 id="where-to-start">Where to start</h2>
<p>Take a scope section you already have, with an out-of-scope bullet list. For each bullet, write what crosses the boundary in each direction and who is holding that bullet when the project succeeds. Twenty minutes, no diagramming tool, no meeting.</p>
<p>You will usually find one exclusion nobody has told the inheritor about. That conversation is cheaper now than after go live.</p>
<p>The standard I hold my own artifacts to is on this site: the <a href="https://analify.com/scorecard">scorecard</a> is twenty-five checks across six artifacts, versioned, free, no email address asked for. Run the diagram and the scope table through it before anyone else sees them.</p>
<p>A context diagram is finished when a stranger can point at any line and say what breaks if it goes quiet.</p>]]></content:encoded>
</item>
<item>
<title>From Change Request to Impact Analysis in One Page</title>
<link>https://analify.com/blog/change-request-impact-analysis</link>
<guid isPermaLink="true">https://analify.com/blog/change-request-impact-analysis</guid>
<pubDate>Sun, 06 Sep 2026 00:00:00 +0000</pubDate>
<dc:creator>Sebastian Koczyk</dc:creator>
<category>change-request</category>
<category>impact-analysis</category>
<category>requirements</category>
<category>traceability</category>
<category>craft</category>
<description>A one-line change request and the six fields of an impact analysis, filled in one at a time: what belongs in each field, and how to tell when one is wrong.</description>
<content:encoded><![CDATA[<blockquote>
<p>"Can we refund people as soon as they upload the photo, instead of making them wait for the parcel to come back?"</p>
</blockquote>
<p>That is the whole request. One sentence, no reason attached, no deadline, no name on it. Somebody will want to know what you think before lunch.</p>
<p>"It depends" is usually true, and it is the answer that costs you. An impact analysis is a short, dated note that says what a proposed change touches, what it breaks, what nobody knows yet and what you recommend, written so that somebody who was not in the conversation can act on it without you in the room. One page. The same day, while the question is still worth answering.</p>
<p>This is one of the few moments where the difference between an analyst and somebody who reformats requirements is visible from outside. Most requirements work is slow and private, and nobody watches you do it. A change request is a stopwatch that somebody else started, in public.</p>
<h2 id="in-short">In short</h2>
<ul>
<li>The first field is the one people skip: restating the one-line request as a change to a named rule, so everybody finds out now whether they were talking about the same thing.</li>
<li>The page has six fields. Five of them describe. The sixth commits, and a page without the sixth hands the decision back to the person who asked you for help.</li>
<li>"I do not know" is a legitimate entry, in a specific written form: question, owner, the thing that would settle it, and the moment it starts blocking.</li>
<li>Effort you have not costed with anyone who would build it is your guess. Label it as one on the page, or it gets quoted back to you as a commitment.</li>
</ul>
<h2 id="where-this-example-comes-from">Where this example comes from</h2>
<p>The case is returns and complaints at a mid-size online retailer, and it is built only from public material: the published returns policy, the help centre articles sitting next to it, and ten public complaint threads I selected myself. There was no engagement, no client, no team and no interviews. Nobody inside the company was asked anything, because there was nobody to ask.</p>
<p>That includes the request. I wrote it, in the form these arrive in. In a live project the first thing you do is find out who wants the change and what they think it will get them, and I cannot do that here, so the requester field stays honestly empty instead of being filled with a plausible job title. What transfers to a real project is not my answer. It is the shape of the page and the order the fields get filled in.</p>
<h2 id="why-does-it-depends-cost-so-much">Why does "it depends" cost so much?</h2>
<p>Because of what the other person does next. They came to you with a decision behind the question, and "it depends" leaves them holding it. They now have two options: wait for you, or ask somebody who will give them a number today. The second one is faster and it is always available. Two rounds of that and the next change request goes straight to a developer, and you find out about it at the release.</p>
<p>There is a slower cost as well. "It depends" is true of every change ever proposed, so it carries no information about this one. Say it often enough and you become the person who describes complexity rather than the person who reduces it. The one-page analysis is the cheapest way I know to stay on the right side of that line, because it says out loud what the answer depends on, in fields, with the unknowns named, and then recommends something anyway.</p>
<p>Six fields, filled in order. The later ones are unanswerable until the earlier ones are done, and filling them out of order is how people end up estimating something nobody asked for.</p>
<h2 id="field-1-what-is-actually-being-asked">Field 1: what is actually being asked</h2>
<pre><code>1. REQUEST, RESTATED

Raw: &quot;Can we refund people as soon as they upload the photo,
instead of making them wait for the parcel to come back?&quot;

Restated: change the point at which a refund is issued for a
damaged-delivery case, from &quot;after the returned item is received
and inspected&quot; (help centre article on returns) to &quot;after
photo evidence is accepted&quot;. Damaged-delivery cases only.

Requester: unknown. This case has no client, so nobody can be
named here. In a live project this field is filled first,
because the outcome the requester wants changes the answer.

Wanted outcome: not stated. Reading the public threads, the wait
rather than the decision is what people write about. Marked as
my inference, not as a requirement.
</code></pre>
<p>What belongs here is the request turned into a change to something specific: a rule, a published sentence, a step, a state. The test is whether a person who disagrees can now point at the exact thing they disagree with. "Speed up refunds" gives them nothing to point at, so nobody objects, and the disagreement surfaces during build instead.</p>
<p>What people write instead is the raw sentence, copied, with the word "Description" above it. That is transcription. It passes the request through unchanged to whoever reads next, and the reformatting is the only thing that happened to it.</p>
<p><em>Filled in wrong when:</em> the restatement could describe two different changes and you cannot tell which one is meant, or when it names a solution nobody asked for, such as a button, a screen or a new queue.</p>
<h2 id="field-2-what-it-touches">Field 2: what it touches</h2>
<pre><code>2. TOUCHED BY THIS CHANGE

Rules:     the published sequence: the item is inspected on
           receipt and the inspection can change the outcome
           (help centre). No rule id in my register carries
           that sentence, which is a finding of its own
           BR-07 case closes within five working days
           BR-11 partial refunds above a stated order value
Documents: published returns policy, section 4 (the sentence
           itself changes); the help centre articles that repeat
           that sentence almost word for word
Process:   evidence upload, refund decision, parcel receipt,
           refund posting
Data:      photo evidence retention; the case state model gains
           a state that does not exist today
Out of it: change-of-mind returns and marketplace orders,
           both under separate published terms
</code></pre>
<p>This field is the difference between an impact analysis that takes five minutes and one that takes two hours, and the difference is whether you keep a register mapping rules to documents to process steps. Running a change request through one is most of the reason to maintain it, which is a subject of its own: <a href="https://analify.com/blog/traceability-matrix-change-request">the matrix that makes this field fast</a>.</p>
<p>What people write instead is a list of system names. "Affects: checkout, CRM, warehouse." Systems are where the work lands, not where the change lives, and a system name tells the reader nothing about which rule stopped being true. Notice also the published text on that list. The help centre articles carry the old sentence alongside the policy, and a change that leaves customer-facing text stale generates the complaints it was meant to reduce.</p>
<p><em>Filled in wrong when:</em> every line is a system and no line is a rule, or when the "out of it" line is empty. A change that touches everything is a change nobody scoped.</p>
<h2 id="field-3-what-breaks">Field 3: what breaks</h2>
<pre><code>3. CONFLICTS AND CONSEQUENCES

C1  The published sequence makes inspection the gate before
    money moves. Refund first and inspection becomes a report.
    Somebody has to decide what happens when the report
    disagrees with the photo. No public source answers this.

C2  The parcel may never arrive. Today that case cannot exist,
    because no money has moved. After the change it exists,
    and it has no owner and no rule.

C3  Faster refunds plausibly change what people claim. I have
    no data, and there is no honest way to get any from
    outside the company. Flagged as a risk, not quantified,
    not left out.

C4  The help centre articles that repeat the sentence become
    wrong on release day, not a week later.
</code></pre>
<p>The first-order effect is the one already in the request. The second-order effects are the reason the request needed an analyst rather than a ticket. C2 is the shape to hunt for every time: the change creates a state that did not exist before, and a state with nobody's name against it is where cases go to sit. C3 is the other habit worth keeping, which is naming an effect you genuinely cannot size. Writing "risk: fraud, medium" with a colour next to it would look more finished and say less.</p>
<p><em>Filled in wrong when:</em> every entry is a generic risk with a probability, and not one entry names the rule that now contradicts another rule.</p>
<h2 id="field-4-what-i-do-not-know">Field 4: what I do not know</h2>
<pre><code>4. OPEN QUESTIONS

Q1  When inspection contradicts accepted photo evidence, who
    decides, and is the money recovered or written off?
    Owner: unassigned. No public source names who owns
    the published returns wording.
    Settled by: one decision in writing from that owner.
    Blocking: before any option is costed.

Q2  What share of damaged-delivery parcels come back at all?
    Owner: whoever can query returns receipts.
    Settled by: a count over the last full quarter.
    Blocking: before option C is considered.

Q3  Who approves a change to the published policy wording?
    Owner: unassigned.
    Settled by: a named approver, confirmed.
    Blocking: before release, not before build.
</code></pre>
<p>There is a version of "I do not know" that costs nothing and a version that costs you the room. The expensive one is the bare shrug, or its written form, "TBD". The cheap one has four parts: the question, the person who can answer it, the specific thing that would settle it, and the moment it starts blocking something. Written that way, "I do not know" reads as work in progress with a name against it, and it converts your ignorance into somebody else's task, visibly, in a document you signed. The alternative is guessing quietly, and a quiet guess holds until the day somebody reads the contract.</p>
<p><em>Filled in wrong when:</em> there are twelve entries, or a question has no owner. A long open-questions field looks thorough and works as a way of saying nothing.</p>
<h2 id="field-5-options-and-what-they-cost">Field 5: options and what they cost</h2>
<pre><code>5. OPTIONS

A  Do nothing. Cost zero. The pattern visible in the public
   threads stays as it is.
B  Smallest version that helps: photo-accepted refunds for
   damaged-delivery cases below the partial-refund threshold
   in BR-11, inspection kept as an after-the-fact check.
C  Full version: all damaged-delivery cases, inspection
   becomes a report, new state and named owner for the parcel
   that never arrives.

Effort: my own estimate, not a quote from anyone who would
build it. B reads as days rather than weeks. C is a different
size, and the reason is the new state and the money recovery
rule, not the screen. What would replace this guess: one hour
with whoever owns the refund posting, plus Q1 answered.
</code></pre>
<p>Two things keep this field honest. The first is that doing nothing is on it, priced at zero, so the reader can see what they are buying rather than only what they are choosing between. The second is the label on the effort. Any number you write without having spoken to somebody who would build it is a guess, and by the third reader it has become a commitment with your name on it. Say what would turn it into a real number, and the label stops sounding like hedging and starts sounding like the next step.</p>
<p><em>Filled in wrong when:</em> there is one option, or three options where two exist to make the middle one look reasonable.</p>
<h2 id="field-6-the-recommendation-signed">Field 6: the recommendation, signed</h2>
<pre><code>6. RECOMMENDATION

Recommend B, subject to Q1 being answered in writing first.

Reason: it gives the requester the outcome they appear to want
for most cases, and it keeps inspection as a gate on the cases
where the money is largest.

What would change my mind: if Q2 shows that almost all parcels
come back, C is cheaper than it looks and B is a detour. If Q1
comes back as &quot;write it off&quot;, B still holds and C becomes
affordable.

Not recommended in any form: an option that leaves the
never-arrived parcel unassigned.

Written by [name], same day the request arrived. Built from
public sources only: published returns policy, help centre
articles, ten public complaint threads. No interviews.
</code></pre>
<p>This is the field people leave off, and it is the reason the page exists. Five fields of description hand the decision straight back to the person who asked you for help, wearing neutrality as an excuse. Recommending is not deciding, and the page does not pretend you are the decision maker. What a recommendation does is make your reasoning attackable, which is the point, and the "what would change my mind" line is what makes it safe to write. It invites the correction instead of waiting to be corrected.</p>
<p>The signature earns its place for a duller reason. A page with a name and a date can be looked up in six months, when the change has shipped and the assumption under it has quietly gone stale. Field 6 is also where the change turns into work: option B, built, is a small set of <a href="https://analify.com/blog/acceptance-criteria-that-survive">acceptance criteria somebody other than you can check</a>, and those are far easier to write from a signed recommendation than from a chat message.</p>
<p><em>Filled in wrong when:</em> the recommendation reads "further analysis is required" and nobody is named. That is the shrug again, in a suit.</p>
<h2 id="what-if-the-six-fields-do-not-fit-on-one-page">What if the six fields do not fit on one page?</h2>
<p>Then one of the fields is wrong, and it is usually field 2 or field 4. Field 2 grows when it lists systems instead of rules, because there is no natural end to that list. Field 4 grows when open questions are used as a substitute for deciding what matters. Stacked, the six blocks above are the page: one side of A4, sent the same day, nothing attached.</p>
<p>The constraint is not about aesthetics. A page gets read in the meeting where the decision happens. Four pages get read afterwards, if at all, and by then somebody has already answered the question in a corridor.</p>
<p>Here is the blank form. Copy it, swap the labels for your organisation's words if it has its own, keep the order.</p>
<pre><code>IMPACT ANALYSIS  [ref]  [one line title]
Author: [your name]   Date: [date received / date written]
Sources: [what this is built from]

1. REQUEST, RESTATED
Raw: [the request, word for word, vague bits included]
Restated: [the change, as a change to a named rule, document or step]
Requester: [who asked, and their role. Blank if unknown, never guessed]
Wanted outcome: [what they think this gets them. Mark inference as inference]

2. TOUCHED BY THIS CHANGE
Rules: [ids, not descriptions]
Documents: [including published or customer-facing text]
Process: [the steps that change]
Data: [what is stored, retained, or newly created]
Out of it: [what this does not touch, and why]

3. CONFLICTS AND CONSEQUENCES
C1 [rule that now contradicts another rule]
C2 [state or case that did not exist before this change]
C3 [effect you suspect but cannot measure. Flag it, do not price it]

4. OPEN QUESTIONS
Q1 [question] / Owner: [who can answer] / Settled by: [the specific
   thing that would answer it] / Blocking: [when it starts blocking]

5. OPTIONS
A Do nothing: [what happens if this is not done]
B Smallest version that helps: [scope]
C Full version: [scope]
Effort: [your estimate, labelled as an estimate]
Confirmed by: [what would turn it into a number]

6. RECOMMENDATION
Recommend [option], subject to [condition].
Reason: [one or two sentences]
What would change my mind: [the finding that flips it]
Signed: [name], [date]
</code></pre>
<p>Take the last change request that reached you as a single sentence and put it through the six fields. Give it forty minutes and stop, whatever state field 5 is in. The value is in the order and in field 6, not in the polish, and a page that is rough and recommends something beats a tidy one that ends in "it depends".</p>
<p>The rest of the standard I hold myself to is on this site. The <a href="https://analify.com/scorecard">scorecard</a> is twenty-five checks across six artifacts, versioned, free, with no email address asked for. The change request page is not one of those six, and the checks it shares ground with are 05, on open questions carrying an owner and a date, and 22 to 25, on a page that asks for a decision rather than describing a situation. If you want the register that makes field 2 a five minute job, that is <a href="https://analify.com/blog/traceability-matrix-change-request">the traceability matrix piece</a>; if you want what happens after field 6, it is <a href="https://analify.com/blog/acceptance-criteria-that-survive">acceptance criteria that survive a sprint review</a>.</p>
<hr />]]></content:encoded>
</item>
<item>
<title>A Business Case a CFO Can Argue With</title>
<link>https://analify.com/blog/business-case-a-cfo-can-argue-with</link>
<guid isPermaLink="true">https://analify.com/blog/business-case-a-cfo-can-argue-with</guid>
<pubDate>Sun, 06 Sep 2026 00:00:00 +0000</pubDate>
<dc:creator>Sebastian Koczyk</dc:creator>
<category>business-case</category>
<category>brd</category>
<category>value</category>
<category>assumptions</category>
<category>craft</category>
<description>One page of business case, taken apart line by line: where each number came from, what halving it does to the decision, and who may challenge it.</description>
<content:encoded><![CDATA[<p>Somebody in finance reads your paper for ninety seconds, looking for the line they can push on. When they cannot find it, the paper is not approved but deferred, which is the same outcome with better manners.</p>
<p>A business case is the document that puts a proposed change in front of the person who controls the money, says what it costs, what it is expected to return, and under which conditions the answer should be no. That last part is the one people leave out, which is what makes a case unarguable. A page nobody can push on has not settled the question, it has hidden where the question lives.</p>
<p>I should say what I am not. I have never sat in the finance seat or held a budget of that size. What I do is write the paper finance takes apart, on international projects, and watch which line they go for. It is almost never the total, it is one input three lines above it, and the meeting turns on whether that input has an address.</p>
<h2 id="in-short">In short</h2>
<ul>
<li>The unarguable version is unarguable because no number in it has an owner, a source or a unit, so a reader who disagrees has nowhere to put it.</li>
<li>Mark every assumption as an assumption, and name the system it would come from in a real project plus the role that would confirm it.</li>
<li>Print the reversal point, the value at which your recommendation flips, rather than a payback figure that reads like a promise.</li>
<li>The case below comes only from public sources, so every figure is mine and labelled as mine, which is what honest looks like without access to the books.</li>
</ul>
<h2 id="what-is-a-business-case-for-if-you-already-know-your-answer">What is a business case for, if you already know your answer?</h2>
<p>You do know your answer, you would not have written the page otherwise. The case exists so somebody can test it without repeating your work: a reader with a budget is not following your reasoning, they are hunting for the load-bearing number, swapping in their own, and checking whether your recommendation survives.</p>
<p>So the quality question is not whether your numbers are right; written from outside a company, they will not be. It is whether a reader can see which numbers do the work, where they would come from, and how far each has to move before the answer flips.</p>
<h2 id="the-case-and-what-i-do-not-have">The case, and what I do not have</h2>
<p>The worked example on this site is returns and refunds at a mid-size online retailer, built from a published returns policy, help centre articles, and ten public complaint threads I selected myself. No engagement, no client, no interview, no cost figure or volume report, ever. That is where most people stand writing a first business case: a real process they can watch from outside, no access to the money.</p>
<p>The usual response is to invent a plausible cost per case and hope nobody asks. The better one is to use the number anyway, label it as yours, and name who would replace it. Every figure below is my assumption, not a finding about this retailer, and saying so buys the right to use numbers at all.</p>
<h2 id="the-one-page">The one page</h2>
<pre><code>BUSINESS CASE (one page)
Damaged-delivery refunds, web store
Version 1.2. Self-directed case study, built from public sources.
No company data was available to me. Every figure marked (A#) is my
own assumption. Register on page 2.

L1  DECISION REQUESTED
    Approve a named owner and a decision clock for damaged-delivery
    refund cases that stall after first contact.
    Decision owner: [role with authority over the returns process].
    Needed by: [date]. No decision means do nothing.

L2  PROBLEM, COUNTED
    Four of the ten damaged-delivery complaint threads I read end
    with no named person owning the case after first contact.
    Source: ten public threads I selected and read between 12 and
    21 March. A count of the threads I chose, not a rate.

L3  SCALE (A1, A2)
    Assumed 500 cases a month (A1), of which an assumed 20 per cent
    stall with nobody's name on them (A2), so 100 a month. A2 sits
    at half what my ten threads showed, because the threads people
    post are the failures.

L4  COST OF A STALLED CASE (A3)
    Assumed 25 EUR per stalled case (A3), mostly repeat contacts
    and manual chasing. My figure. I have seen no cost data.

L5  EFFECT OF THE CHANGE (A4)
    Assumed the change removes 60 per cent of stalls (A4).
    60 cases x 25 EUR = 1 500 EUR a month, gross.
    A4 is the one number nobody can source before the change ships.

L6  COST OF THE CHANGE (A5, A6, A7)
    Assumed 9 000 EUR one-off build (A5) and 300 EUR a month to run
    (A6). Net 1 200 EUR a month. Over a 24-month horizon (A7, a
    convention I do not own), 28 800 EUR against 9 000 EUR.
    Payback at 7.5 months.

L7  REVERSAL POINT
    The recommendation survives any ONE of A1 to A4 being half of
    what I assumed. It dies when two halve at once: the 24-month
    return then falls below the build cost. Break-even sits at
    45 per cent of assumed volume x stall rate x removal rate
    x unit cost.

L8  WHAT I WOULD MEASURE IN WEEK ONE
    Cases with no assignee after first contact, from the queue.
    One measurement, replacing A1 and A2.

L9  DO NOTHING
    The published policy already sets a deadline for closing a
    refund case, and nothing public says who owns a case that
    misses it. Doing nothing keeps a rule with no keeper.

L10 WHAT THIS PAGE IS NOT
    Not a costed proposal. An argument with its working shown from
    outside the company, every figure meant to be replaced.
</code></pre>
<h2 id="the-teardown-line-by-line">The teardown, line by line</h2>
<p>Three questions per line, always the same three. Where did this come from, what does the decision do when it is halved, who is entitled to argue with it. L1 takes them quickly: the ask is mine to write, it cannot be halved, and the only person who can argue with it owns the returns process, which is why that slot stays empty rather than holding a title I invented.</p>
<p><strong>L2, the counted problem.</strong> <em>Source:</em> ten public threads I picked, on stated dates, with the selection method written next to the number. <em>Halved:</em> two of ten still shows the branch exists, and nothing below rests on it. <em>Who can argue:</em> anyone with twenty minutes and the same kind of public sources, and a reader calling my ten threads unrepresentative is right.</p>
<p><strong>L3, the scale.</strong> <em>Source:</em> nowhere, both figures are mine. In a real project A1 is a monthly count by return reason from the order management system, A2 is cases with no assignee after first contact, from the queue. <em>Halved:</em> 750 EUR a month gross, payback at twenty months rather than seven, still positive but no longer obvious. <em>Who can argue:</em> whoever owns that queue, in ten minutes, with a report they already run. This is the pair I most want destroyed, because destroying it is cheap.</p>
<p><strong>L4, the cost of a stalled case.</strong> <em>Source:</em> me. In a real project it is a small model: contacts per stalled case from the service desk, times a fully loaded cost per contact from finance. Two owners, one number. <em>Halved:</em> same arithmetic as halving volume, twenty months to payback. <em>Who can argue:</em> a finance business partner, and they will, because a cost per contact from outside their model is the fastest thing here to reject. Hand me theirs and the case gets stronger even if the number worsens.</p>
<p><strong>L5, the effect.</strong> <em>Source:</em> judgement, and this is the dangerous one. A4 has no system behind it, because it describes a world that does not exist yet. The only honest sources are a pilot on part of the queue, or a comparable change already made here. <em>Halved:</em> twenty months again, the case still holds. <em>Who can argue:</em> everybody, which is the problem, and only whoever runs that pilot could confirm it. A number nobody can source is one nobody can refute, so it slides through while the room argues about build cost.</p>
<p><strong>L6, the cost of the change.</strong> <em>Source:</em> the delivery team, as an estimate with a range. A7, the horizon, is not mine to pick, and choosing it yourself is a quiet way of setting your own exam. <em>Halved:</em> payback under four months, which tells you the build cost is the line everyone attacks and the one with least influence on the answer. <em>Who can argue:</em> engineering on A5 and A6, finance on A7.</p>
<p><strong>L7, the reversal point.</strong> <em>Source:</em> arithmetic on the four inputs above, done once and written down. <em>Halved:</em> not applicable, which is why the line exists. <em>Who can argue:</em> anyone who thinks two of my four inputs are optimistic at once, a claim they can make in one sentence.</p>
<p>Notice what the walk exposed. A1 to A4 multiply, which makes them one number wearing four labels, so halving any of them does the same thing to the answer. That never shows up in a table of estimates, only when you write what each line does to the decision.</p>
<h2 id="what-happens-when-every-number-is-half">What happens when every number is half?</h2>
<p>Then the case is dead, and the page should say so before the reader gets there.</p>
<p>Halve all four inputs and the monthly return falls to about a tenth of what I claimed, below the assumed running cost, so the change loses money before anybody pays for the build. That is the most useful sentence here: it says how wrong I have to be for the answer to change, and lets a reader judge how likely that is.</p>
<p>A payback figure cannot do this: a single number reads as a promise, and a promise can only be believed or disbelieved. A reversal point reads as a test, and a test can be run by somebody who does not trust you. There is a cost to this, and I would rather name it: a page this full of labels can read as a list of things you failed to find out, which is what L8 answers.</p>
<h2 id="the-assumption-register-you-can-copy">The assumption register you can copy</h2>
<p>Page two, and the artifact worth more than the page in front of it. Copy it, keep the columns, fill the last one first.</p>
<table>
<thead>
<tr>
<th>ID</th>
<th>Assumption, one sentence, number inside it</th>
<th>Type</th>
<th>Where it must come from</th>
<th>Who confirms it</th>
<th>Value used</th>
<th>If it is half</th>
<th>What kills this line</th>
</tr>
</thead>
<tbody>
<tr>
<td>A1</td>
<td>[one sentence, no adjectives]</td>
<td>[count / rate / unit price / effect of the change]</td>
<td>[named system, report or model, never "the business"]</td>
<td>[role that owns the number, blank if your sources name nobody]</td>
<td>[figure and unit]</td>
<td>[what the recommendation does, one clause]</td>
<td>[the observation that would make this line false]</td>
</tr>
<tr>
<td>A2</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>A3</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<p>Three rules for filling it. The last column names something somebody could observe, never "if the assumption is wrong". A row with a blank confirmer gets flagged on the case rather than quietly averaged in. And every row of type "effect of the change" says so, because no system can confirm that number before the change ships, and it is the row that gets waved through.</p>
<p>For the document this page sits inside, there is <a href="https://analify.com/blog/eleven-edits-that-make-a-brd-worth-reading">the BRD piece</a>. The <a href="https://analify.com/scorecard">scorecard</a> holds the checks I run against my own work first. The full returns case, register and review notes included, is in the <a href="https://analify.com/downloads/proof-pack">Proof Pack</a>. The business case above is not in it, on purpose: the one-pager in that pack carries no cost figures at all and says so on its face, because the assumptions I am willing to publish inside an article are not the same as the ones I would put in a decision document with nothing to source them from.</p>
<h2 id="what-can-you-do-with-one-hour">What can you do with one hour?</h2>
<p>Take a business case you have written, or any recommendation you made in writing, and find the numbers that multiply. Give each an owner, a source it would come from in the real world, and a value. Then halve them one at a time and write one clause about what your recommendation does.</p>
<p>Somewhere in that hour you will hit a number you cannot attribute to anybody. That number is the whole meeting, and until now it was the one line nobody could argue with.</p>
<hr />]]></content:encoded>
</item>
<item>
<title>Business Analyst Portfolio: The Six Artifacts I Look For</title>
<link>https://analify.com/blog/business-analyst-portfolio</link>
<guid isPermaLink="true">https://analify.com/blog/business-analyst-portfolio</guid>
<pubDate>Sun, 06 Sep 2026 00:00:00 +0000</pubDate>
<dc:creator>Sebastian Koczyk</dc:creator>
<category>portfolio</category>
<category>requirements</category>
<category>artifacts</category>
<category>hiring</category>
<category>business-analysis</category>
<description>What a business analyst portfolio actually is, the six documents I look for when one lands on my desk in review, and the objections two reviewers raised.</description>
<content:encoded><![CDATA[<p>You finished the course. Maybe you passed ECBA as well, and the certificate is sitting in your downloads folder under a filename you did not choose. Your CV says trained in business analysis, familiar with BPMN, BABOK aligned.</p>
<p>Then an application form asks for a link to your portfolio, and you look at what you actually have. Lecture notes. A completion badge. A folder of slide decks somebody else made.</p>
<p>A business analyst portfolio is a small set of documents, built on a case you are free to publish, that shows how you turned an ambiguous problem into something a team could act on. It is a work sample, not a record of what you were taught.</p>
<p>I run a business analysis training platform in Polish, with paying members, and some version of that message keeps arriving. The wording changes, the shape does not: I know the concepts, I cannot show the work.</p>
<p>I am not a recruiter and I have never run a hiring process, so I am not going to tell you what happens on the other side of the desk. What I do is write these documents on international projects, take other people's apart in review and have mine taken apart in return. So here is the narrower question I can answer. When a document lands on my desk and I have twenty minutes, what makes me believe the person who wrote it knows what they are doing?</p>
<h2 id="in-short">In short</h2>
<ul>
<li>One case taken far enough beats six half-finished ones, and the six artifacts that carry it are a stakeholder map, an as-is and to-be process, a requirements register with acceptance criteria, one business rule with its rationale, a review log and a one-page summary.</li>
<li>Build the case on sources you are free to publish: a published returns policy, help centre articles, public complaint threads and your own attempt to use the process as a customer.</li>
<li>Label what you cannot know from outside, because four of ten complaint threads I picked myself is a count with a method attached, while calling it 40% is the fastest way to lose the reader you were trying to impress.</li>
<li>The review log is the artifact I read first, since a clean final draft is cheap and a document with the objections still visible in it is not.</li>
</ul>
<h2 id="why-is-a-ba-portfolio-harder-to-build-than-a-designers">Why is a BA portfolio harder to build than a designer's?</h2>
<p>A designer shows the screen. A developer shows the repository. We write documents about somebody else's business, and most of them are the sort of thing you cannot show.</p>
<p>The last requirements pack I am proud of has a client name in it, transaction volumes, an internal cost figure and three screenshots of a system that is not public. None of that is mine to publish, and removing the names does not fix it. If a reader recognises the process, your best work sample turns into a reason not to hire you. It takes one reader who was on the other side of that project. The document can be good; that is not the problem.</p>
<p>So: you will not build a portfolio out of your paid work, and if you are new to the field you have no paid work anyway.</p>
<p>Build your own case on public sources instead.</p>
<p>Pick a process you can watch from the outside, as a customer, where the failures are visible and the rules are published somewhere. I use returns and refunds at a mid-size online retailer. Appointment booking at a clinic works. So does airline rebooking after a cancelled flight.</p>
<p>Then collect facts instead of inventing them.</p>
<table>
<thead>
<tr>
<th>Source</th>
<th>What it gives you</th>
<th>What it does not give you</th>
</tr>
</thead>
<tbody>
<tr>
<td>The published returns policy and terms</td>
<td>Real business rules, thresholds, time windows</td>
<td>Why the rules are set that way</td>
</tr>
<tr>
<td>Help centre articles and FAQ</td>
<td>The exception paths staff deal with daily</td>
<td>Volumes</td>
</tr>
<tr>
<td>Public complaint threads and review sites</td>
<td>Where the process breaks and who gets stuck</td>
<td>A representative sample</td>
</tr>
<tr>
<td>Consumer law in the relevant country</td>
<td>Hard constraints you may not design away</td>
<td>Anything about this company specifically</td>
</tr>
<tr>
<td>Your own attempt to use the process</td>
<td>Timings, dead ends, the moment you had to phone someone</td>
<td>Anybody else's experience</td>
</tr>
</tbody>
</table>
<p>Note the right-hand column. It is the more useful half and the half people skip. Write every gap down as an open question with an owner and a date. A case built this way is yours, it is publishable, and you can defend every decision in it.</p>
<p>Six artifacts turn that case into evidence somebody else can judge. Six, from one case, taken far enough that the seams show.</p>
<h2 id="1-the-stakeholder-map">1. The stakeholder map</h2>
<p><strong>What it is.</strong> One page naming everyone who can approve, block or quietly sabotage the change, and what each of them stands to gain or lose.</p>
<p><strong>What it tells me.</strong> Whether you have been in a room or only read about rooms. Anyone can list roles. Very few people write down who holds the decision right.</p>
<p><strong>Bad version.</strong> The org chart with twelve boxes and job titles, or an influence grid with names in quadrants and no explanation of how they got there.</p>
<p><strong>Good version.</strong> Every row carries a decision right and a piece of evidence. Not "Finance, interested", but "Whoever signs off refund policy in Finance: holds the decision right over the partial refund threshold. Evidence: the 40 EUR threshold appears in the published policy and in two help centre articles, always worded as a hard rule. No public source names the person, so the row stays open rather than being filled in with a plausible title."</p>
<p>In my returns case the row worth arguing about is the warehouse, not customer care. Somebody there has to physically receive the item that comes back, and nothing in the published policy suggests that person gets a say when the refund window is shortened. The row is an inference from how the process has to work, and the map says so on its face.</p>
<p><strong>Time.</strong> Sixty to ninety minutes, once I have done the reading.</p>
<p><strong>The one mistake.</strong> Listing who gains and leaving out who pays. The rows that matter are the ones where somebody stands to lose something when this succeeds.</p>
<h2 id="2-the-as-is-and-to-be-process">2. The as-is and to-be process</h2>
<p><strong>What it is.</strong> Two models of the same process. How it runs today, and how you propose it should run.</p>
<p><strong>What it tells me.</strong> Whether you can hold a system in your head and change one part of it on purpose.</p>
<p><strong>Bad version.</strong> An as-is with no failure anywhere in it, followed by a to-be that changes everything and fixes everything. A model of the current state where nothing ever goes wrong is the first thing a reviewer goes after, and mine did.</p>
<p><strong>Good version.</strong> The as-is shows where work stops. In my case there is a branch where nobody owns the outcome: the evidence is incomplete, the case is parked, and from there the customer has to chase it.</p>
<p>I wanted a number for how often that happens. Public sources will not give me one. Four of the first ten complaint threads I read ended there, which is a count of ten threads I picked myself and not a rate, so the model says exactly that on its face: parked branch, frequency unknown, flagged for measurement. Turning that into "40% of cases" would have been the easiest thing in the document for a reviewer to catch.</p>
<p>The to-be then changes as little as possible. Evidence is collected before a human sees the case, and the parked branch gets a named owner and a clock. The branch still exists in the to-be. Pretending it will not is how you lose the first review.</p>
<p>Use BPMN if you know it, plain boxes if you do not. Consistency beats notation purity, and a reviewer who cares more about your gateway symbols than your exception path is telling you something about the team.</p>
<p><strong>Time.</strong> Three to four hours for a process this size, including one full redraw. There is always one full redraw.</p>
<p><strong>The one mistake.</strong> Modelling what should happen instead of what does.</p>
<h2 id="3-the-requirements-register-with-acceptance-criteria">3. The requirements register with acceptance criteria</h2>
<p><strong>What it is.</strong> The numbered list of what the solution must do, each item written so it can be tested and traced back to a rule or a stakeholder need.</p>
<p><strong>What it tells me.</strong> Most of what the job actually is.</p>
<p>Here is a row from the returns case, as it sits in the register after review.</p>
<p><strong>REQ-014 - Refund on damaged delivery</strong></p>
<table>
<thead>
<tr>
<th>Field</th>
<th>Value</th>
</tr>
</thead>
<tbody>
<tr>
<td>Statement</td>
<td>As a customer who received a damaged item, I want to start a refund without calling support, so that I get my money back within the promised window.</td>
</tr>
<tr>
<td>Traces to</td>
<td>BR-04 (damage reported within 14 days of delivery), BR-11 (partial refund threshold), BR-07 (no refund case open longer than 5 working days)</td>
</tr>
<tr>
<td>Source</td>
<td>Published returns policy, section 4; two complaint threads about photo evidence</td>
</tr>
<tr>
<td>Priority</td>
<td>Must have, release 1</td>
</tr>
<tr>
<td>Status</td>
<td>v1.2, changed after review. See the log.</td>
</tr>
</tbody>
</table>
<p>Acceptance criteria:</p>
<ol>
<li>Photo upload accepts up to 3 files, 10 MB each. A fourth file is rejected with a message that names the limit.</li>
<li>A refund decision is recorded within 48 hours of form submission. If it is not, the case escalates automatically to a named owner.</li>
<li>Partial refunds are permitted only when order value is above 40 EUR. At or below 40 EUR the refund is full or refused, never partial.</li>
</ol>
<p>Open questions on this row: OQ-04, whether the duty rota covers weekends given a 48 clock hour window, and OQ-05, whether partial refunds ship in release 1. Both sit with the Head of Customer Care, each with a date and a fallback. The retention question lives one requirement further on, as OQ-01 against REQ-016: 90 days proposed, to be checked against the statutory limits, owner legal, due before build starts, and if it is not confirmed by then, photos default to the shortest defensible period and the decision goes up.</p>
<p><strong>Bad version.</strong> "The system should handle refunds correctly and in a user friendly way." Three criteria that restate the requirement in different words. Anything containing "as appropriate", "if needed" or "etc".</p>
<p><strong>Good version.</strong> Criteria a tester can run without asking what you meant, and every number traceable to somewhere you can name.</p>
<p><strong>Time.</strong> Three to four hours for five requirements written this way. Most of that is not writing. Five, not fifteen: the case this row comes from carries five, and the register says on its own face that five must-haves in one release is a smell.</p>
<p><strong>The one mistake.</strong> If someone has to phone you to know whether the criterion passed, it is a note, not a criterion.</p>
<h2 id="4-the-business-rule-with-its-rationale">4. The business rule with its rationale</h2>
<p><strong>What it is.</strong> A single rule, stated precisely, with the reason behind it and the person who owns it.</p>
<p><strong>What it tells me.</strong> Whether you chase the why or settle for the what. Rules outlive the people who set them. I have sat in a workshop where a threshold nobody could explain survived the redesign, because changing it felt riskier than keeping it.</p>
<p><strong>Bad version.</strong> "BR-11: partial refunds above 40 EUR only." Rule, no reason, no owner. It reads like a law of physics.</p>
<p><strong>Good version.</strong></p>
<blockquote>
<p><strong>BR-11 - Partial refund threshold.</strong> Partial refunds are permitted only above 40 EUR order value.</p>
<p><strong>Established.</strong> The 40 EUR figure and its wording as a hard rule, from the published policy and two help centre articles.</p>
<p><strong>Inferred, not confirmed.</strong> The rationale. Below 40 EUR, the handling cost of a split refund plausibly exceeds the amount recovered. I have no cost data. Flagged for the rule owner to confirm or kill.</p>
<p><strong>Owner.</strong> Whoever signs off refund policy in finance. I could not name a person from public sources, so the row is open rather than blank.</p>
<p><strong>Review trigger.</strong> A change in the payment provider's per-transaction fee.</p>
</blockquote>
<p>Marking your own inference as an inference is not weakness. It is the difference between an analyst and someone who fills the gaps with confident guesses.</p>
<p><strong>Time.</strong> Twenty to thirty minutes per rule, most of it spent chasing the why.</p>
<p><strong>The one mistake.</strong> Accepting "that is our policy" as a rationale and writing it down as though it were one.</p>
<h2 id="5-the-review-log">5. The review log</h2>
<p><strong>What it is.</strong> A short record of what a reviewer objected to, what you changed, and what you deliberately did not change.</p>
<p><strong>What it tells me.</strong> More than the finished document does. Polished final drafts are cheap. A document with visible scars from a real argument is not, and it is the artifact I read first.</p>
<p><strong>Bad version.</strong> No log, only the clean final draft. Or a log that records the objection and stops, so I cannot tell whether you agreed, disagreed or panicked.</p>
<p><strong>Good version.</strong> Three to six entries, each one line of objection and two lines of consequence. At least one where you held your ground and said why.</p>
<p><strong>Time.</strong> Thirty minutes after the review. The review itself costs you one favour from someone competent.</p>
<p><strong>The one mistake.</strong> Publishing only the version that makes you look good. Hiding the objections hides the only proof that you can take feedback without collapsing.</p>
<h2 id="6-the-one-page-summary-for-a-decision-maker">6. The one-page summary for a decision maker</h2>
<p><strong>What it is.</strong> One page, written last, read first, addressed to the person who has to say yes or no.</p>
<p><strong>What it tells me.</strong> Whether you can compress. I read plenty of forty-page documents and very few good one-page ones, and the one-pager is the harder of the two.</p>
<p><strong>Bad version.</strong> "This document describes the current returns process and proposes improvements." That sentence asks for nothing and tells nobody anything.</p>
<p><strong>Good version.</strong> The decision requested, in the first line. Two or three options, each with cost, risk and effect. A recommendation with your name against it. What happens if we do nothing. Decision owner and decision date.</p>
<p>For the returns case the first line reads: "Decision requested. Approve automatic escalation of undecided refund cases after 48 hours, with a named owner per case, and a self-service form that collects photographic evidence before a person sees the case. Cost: one process change and a queue configuration. Effect: cases that currently stall get an owner and a deadline. How many stall cannot be answered from outside the company, and it is the first thing I would measure."</p>
<p><strong>Time.</strong> Forty-five to sixty minutes, plus two rewrites, because the first draft is always half a page too long and one degree too polite.</p>
<p><strong>The one mistake.</strong> If your page has no decision, no owner and no date, it is a covering note.</p>
<h2 id="what-did-the-reviewers-actually-object-to">What did the reviewers actually object to?</h2>
<p>I gave the case to two people and asked for the objections rather than the compliment. A developer
on the delivery side, who reads process models before registers and has spent years being handed
requirements that come apart in build. A business analyst who reviews requirements documents for a
living. Two sessions, five objections. Four changed the case. One I accepted only in part, and the
disagreement is written down instead of quietly dropped. Neither of them works at the retailer, and
nobody there was asked about anything, at any point.</p>
<p><strong>"Your as-is is the happy path, so your to-be looks better than it is."</strong> The first version of the
as-is ran call, evidence, decision, refund, and stopped. It took about forty seconds to spot. If the
as-is only shows the path where things go well, every benefit claimed for the to-be is unearned. The
parked branch went into the model with no owner, no clock and its frequency marked unknown, and two
further pieces fell out of it that had not existed before: an escalation requirement and the rule
behind it.</p>
<p><strong>"Under 48 hours from what moment?"</strong> The first draft said "within 48 hours" and never named the
start event. Two readings both fit the sentence: one counts from the moment the customer presses
submit, the other from the moment an agent opens the case. Between those two readings sits most of a
working day. The clock is now anchored to the timestamp on the submitted form, in the criterion
rather than in a note underneath it. Anchoring it immediately exposed a second decision the vague
version had been hiding, clock hours against working hours, which is now an open question with an
owner.</p>
<p><strong>"Four in ten is a count, not a rate."</strong> An early draft said four in ten damaged-delivery cases end
without an owner. I had ten complaint threads I selected myself, four of which ended that way, and I
had turned that into a statement about all cases, two pages after my own source table said complaint
threads are not a representative sample. Accepted on labelling: every use of the figure now names the
denominator, the selection method and the date. Held on the number, and this is the one I did not
fully accept. The stronger version of the objection was to cut the figure and say only that the
branch exists. A labelled count with a stated method can be rechecked in twenty minutes; a shrug
tells the reader less. The disagreement stands in the log, which is where a future reader should
find it.</p>
<p><strong>"A customer whose parcel never arrived has nothing to photograph."</strong> The to-be routes everything
through a form built around photographic evidence. Somebody whose parcel was stolen or lost has no
photograph, and on the phone they at least got a person who could improvise. The change quietly made
one group worse off, and it was the group least able to argue about it. Non-delivery and lost parcels
are now out of scope, with a reason and an owner. Deliberately not as a fourth acceptance criterion:
an exception you exclude on purpose is a scope decision and belongs where a reviewer will find it.</p>
<p><strong>"Why 40 EUR? Who set that?"</strong> The threshold was published but nothing public said who set it or
why. Chasing the reason produced a rule with a page of its own: the figure and its wording as
established, the rationale written down and labelled as my inference because I have no cost data, the
owner slot left open rather than filled in with a plausible title, and a review trigger naming the
input most likely to move it. The number itself did not change. It is published policy and I cannot
improve on it from outside the company. What I could fix was the silence around it.</p>
<p>Not one of the five is about writing style. All five are about whether somebody can act on the
document without me in the room. That is the standard.</p>
<h2 id="how-do-you-lay-out-a-portfolio-so-it-survives-a-skim">How do you lay out a portfolio so it survives a skim?</h2>
<p>Nobody reads a portfolio the way you wrote it. Assume a skim until something makes the reader stop.</p>
<p><strong>One URL, not a zip file.</strong> A single page with the six artifacts on it, or one PDF. I close anything that needs downloading, unpacking or a login, and I doubt I am unusual.</p>
<p><strong>Say what this is in the first two lines.</strong> "A self-directed case study on returns handling at a mid-size online retailer, built from public sources. Not client work." That sentence protects you and buys you trust at the same time.</p>
<p><strong>Order for the reader, not for the process.</strong> One-page summary first, review log second, then the register, the models, the stakeholder map, the rules. Judgement at the top, diligence underneath, all of it still there for anyone who wants it.</p>
<p><strong>Two sentences of context above each artifact.</strong> What the problem was, and one thing you would do differently now. That second sentence is worth more than the artifact under it.</p>
<p><strong>Cut anything you cannot defend for five minutes.</strong> Every extra document is another surface for a question you cannot answer.</p>
<p>The blank templates for all six artifacts, plus the worked returns case in full, are on the <a href="https://analify.com/downloads">downloads page</a>. The <a href="https://analify.com/downloads/scorecard">scorecard</a> is there too: twenty-five checks across the six artifacts, so you can be unkind to your own work before anybody else gets the chance.</p>
<h2 id="what-can-you-build-this-weekend">What can you build this weekend?</h2>
<p>Not all six. One.</p>
<p>Saturday morning, take something that went wrong for you as a customer in the last month. A return that took three weeks. A booking that made you phone somebody.</p>
<p>Write one requirement from it, in the format above, with three acceptance criteria and the business rule it traces to. Give yourself ninety minutes and stop when the time is up.</p>
<p>Then send it to one person who will tell you it is wrong, and write down what they said.</p>
<p>It is not a portfolio yet. It is the first thing you have made that somebody could read and form an opinion about, which is more than the certificate can do.</p>
<p>Your certificate says you learned. This is how you prove you can.</p>
<hr />]]></content:encoded>
</item>
<item>
<title>As-Is Before To-Be: Modelling the Process That Actually Runs</title>
<link>https://analify.com/blog/as-is-before-to-be</link>
<guid isPermaLink="true">https://analify.com/blog/as-is-before-to-be</guid>
<pubDate>Sun, 06 Sep 2026 00:00:00 +0000</pubDate>
<dc:creator>Sebastian Koczyk</dc:creator>
<category>process</category>
<category>bpmn</category>
<category>modelling</category>
<category>as-is</category>
<category>craft</category>
<description>Two models of the same returns process side by side, and the table of differences between them, with the column most people skip: what each change breaks.</description>
<content:encoded><![CDATA[<p>Most as-is models I am handed run in a straight line. Request, check, decide, done. Five boxes, one lane, not a single branch that goes anywhere unpleasant. Underneath it sits the to-be, with a form at the front and an automated step in the middle, and the document claims a saving.</p>
<p>An as-is model is a picture of a process as it actually runs, including the paths where it stalls, loops back or quietly hands the work to the customer, drawn before anybody proposes changing it. That last clause is the entire discipline.</p>
<p>A straight-line as-is has one consequence that survives every review. If nothing in the current state ever fails, then every benefit claimed for the future state is being measured against a process that already worked, and no reader can tell whether you improved anything or added a form.</p>
<p>The worked example below is returns and refunds at a mid-size online retailer. It is built only from sources I am free to publish: the retailer's published returns policy, its help centre articles, and ten public complaint threads I selected myself. There was no engagement and no client. Nobody at the company was asked about anything, at any point. No interviews, no workshops, no exports, no internal data. Where a branch comes from my reading of how the process has to work rather than from a source, the model says so on the branch.</p>
<h2 id="in-short">In short</h2>
<ul>
<li>An as-is with no failure branch in it makes the to-be look like an improvement to a process that was already fine.</li>
<li>Draw the branch where the case stops before you draw anything you intend to change; here it is the point where evidence is incomplete, the case is parked, and nobody's name is on it.</li>
<li>Four of the ten complaint threads I read ended in that branch, which is a count of threads I chose myself rather than a rate across cases, so the model carries the frequency as unknown and flagged for measurement.</li>
<li>The artifact worth publishing is the table of differences between the two models, and its third column says what each change breaks.</li>
</ul>
<h2 id="why-bother-with-the-as-is-if-you-are-going-to-change-it-anyway">Why bother with the as-is if you are going to change it anyway?</h2>
<p>Because the to-be is an argument, and the as-is is the evidence it rests on. Remove the failure branches and the argument has nothing under it.</p>
<p>There is a second reason, more useful in a room. People who will not read a requirements register will look at seven boxes and tell you the third one is wrong, which is exactly what you wanted. A to-be never gets that reaction, because nobody has lived in it yet.</p>
<p>I do not have that room here. This case has no stakeholders to correct me, and everything below is limited by that. The compensation is labelling, not confidence.</p>
<h2 id="the-as-is-step-by-step">The as-is, step by step</h2>
<p>Damaged delivery, web store order. The customer has the parcel and the item is broken.</p>
<ol>
<li><strong>The customer notices the damage and goes looking for the route.</strong> The published policy treats change-of-mind returns and damaged deliveries as separate cases with separate rules, and the help centre has articles for both. <strong>Where the case can leave the process:</strong> the process has two doors and the customer picks one before knowing which one they need.</li>
<li><strong>First contact.</strong> Phone or a contact form, depending on which help centre article the customer landed on.</li>
<li><strong>Evidence is requested.</strong> Photographs of the item and the packaging, plus the order reference.</li>
<li><strong>The customer supplies the evidence, or supplies part of it.</strong> <strong>Where the case can leave the process:</strong> this is the branch that matters. Evidence arrives incomplete, the case is parked pending more information, and from that point the only person who moves it forward is the customer. Four of my ten threads end here, with the customer chasing and no named person answering. That is a count of ten threads I selected, not a rate, and no public source will give me the real frequency.</li>
<li><strong>An agent assesses the case.</strong> Some decisions cannot be made without the returned item being received and confirmed. <strong>Where the case can leave the process:</strong> that wait is my inference from how the process has to work, not something any source states, and the model says so on the branch. Nothing public tells me whether the wait has an owner or a limit.</li>
<li><strong>A decision is recorded.</strong> The published policy is explicit that a case should not stay open beyond a stated number of working days.</li>
<li><strong>The item is collected or returned, and the refund is posted.</strong></li>
</ol>
<p>Steps 4 and 5 are the shape of the problem: a process with a clear start, a clear end, and two places in the middle where work stops without anybody being accountable for restarting it. Neither appears in a straight-line model, and both are where the customer experience actually happens.</p>
<h2 id="the-to-be-step-by-step">The to-be, step by step</h2>
<ol>
<li><strong>One entry point that asks what happened before it asks what the customer wants.</strong> Damage and change of mind are separated by the answer, not by which article the customer found.</li>
<li><strong>The form states what evidence is required and refuses an incomplete submission</strong> while the customer is still there and can fix it.</li>
<li><strong>A case reaches an agent complete, or it does not reach an agent at all.</strong></li>
<li><strong>The agent assesses it.</strong> Same authority, same rules, same published windows.</li>
<li><strong>The parked branch still exists.</strong> A case that cannot be completed goes to a named person with a deadline attached, rather than to a queue. The escalation window itself belongs in the requirements register, not in this model.</li>
<li><strong>The dependency on the warehouse confirmation is drawn explicitly</strong>, with a state the case sits in and a person it belongs to while it waits.</li>
<li><strong>Decision, collection and refund posting are unchanged.</strong></li>
</ol>
<p>This draft to-be changes five things and leaves the rest alone. That ratio is deliberate. Redraw every box and the first competent reader will ask which of the twelve changes produced the benefit you claimed, and you will not be able to answer. The version I actually recommend in the published case is narrower still, two changes out of these five: evidence collected before a human sees the case, and a named owner with a clock on the parked branch. The other three are drawn here and parked there, because a proposal you can only defend as a set is a proposal nobody can approve in parts.</p>
<h2 id="the-table-of-differences">The table of differences</h2>
<p>This is the artifact. Two models are input; the table is what somebody can actually review.</p>
<table>
<thead>
<tr>
<th>What changed</th>
<th>What I deliberately left alone</th>
<th>What this change breaks</th>
</tr>
</thead>
<tbody>
<tr>
<td>One entry point, routed by what happened</td>
<td>The two policies stay separate, with their own rules and windows</td>
<td>The customer classifies their own case at the door, and a miscategorised case looks well-formed, so it is harder to spot than the visible false start it replaces. Somebody has to own the routing logic, and no public source tells me who.</td>
</tr>
<tr>
<td>Evidence collected by the form before a human sees the case</td>
<td>The phone line stays open and unchanged</td>
<td>The failure moves earlier and out of sight. A customer who cannot satisfy the form never becomes a case, so the parked-case count improves while the same people stay stuck. A parcel that never arrived has nothing to photograph, and that group is now out of scope with a reason rather than quietly worse off.</td>
</tr>
<tr>
<td>Parked cases get a named owner and a deadline</td>
<td>The parked branch itself stays in the model, because it will still happen</td>
<td>One person carries a queue of the worst cases. A deadline also rewards closing cases by refusing them, which would show up as a falling refund rate and read like success. Any measurement here has to watch refusals next to refunds.</td>
</tr>
<tr>
<td>Waiting states made explicit, including the dependency on the returned item</td>
<td>The agent's decision authority is untouched</td>
<td>Two states somebody has to keep accurate by hand. A state field nobody updates is worse than no state field, because within a month there is a report built on it.</td>
</tr>
<tr>
<td>A measurement point on cases with nobody's name against them</td>
<td>The published thresholds, including the partial refund rule, stay exactly as published</td>
<td>People manage to a number as soon as it exists, usually before anyone understands what it counts. The first readings will be bad and mean nothing, and somebody has to say so in advance.</td>
</tr>
</tbody>
</table>
<p>The third column separates this from a list of improvements. Anyone can name what changed. Naming the cost, and naming who pays it, is the part a reviewer cannot fake having thought about. It also protects you: a change with its cost written beside it is a proposal, and a change with only a benefit beside it is a pitch, and readers who take requirements documents apart for a living tell the two apart inside a page.</p>
<p>Row two is the one I got wrong first. My initial to-be moved the evidence check to the front and recorded the benefit, which is real. What it did not record is that the failure had not disappeared, it had relocated to a place where no queue metric can see it.</p>
<h2 id="the-blank-version">The blank version</h2>
<p>Copy this into your own case. The bracketed prompts are what each cell has to answer.</p>
<pre><code>| What changed | What I deliberately left alone | What this change breaks |
|---|---|---|
| [the change, in one clause, naming the step] | [the neighbouring thing you did not touch, and why] | [who is worse off, which metric goes quiet, what new work appears, what perverse incentive it creates] |
| [change 2] | [kept 2] | [cost 2] |
| [change 3] | [kept 3] | [cost 3] |
| [change 4] | [kept 4] | [cost 4] |

Unknowns carried forward:
  [branch] - frequency unknown, measurable at [where], owner [name or open]
</code></pre>
<p>An empty third column means either the change is trivial or you have not finished thinking about it. It is almost always the second, and the missing entry is usually a person whose work increases so that somebody else's decreases.</p>
<h2 id="how-do-you-model-a-process-you-can-only-see-from-outside">How do you model a process you can only see from outside?</h2>
<p>By putting the source on the branch instead of in a footnote. Every path in the as-is above carries one of three labels, visible in the model rather than in an appendix nobody opens.</p>
<p><strong>Observed.</strong> A source states it or a thread demonstrates it. The parked branch is here.</p>
<p><strong>Inferred.</strong> The process cannot work without it, but nothing public says so. The wait on the returned item is here, and calling it observed would be the cheapest way to lose a reviewer.</p>
<p><strong>Unknown.</strong> Frequency, volume, cost. Almost every number about this process falls here, and writing unknown on a branch beats writing a plausible figure, because unknown converts into a measurement task with an owner.</p>
<p>A number appears in the model only if I can name where it came from. Four of ten threads keeps its denominator and its selection method every time it is written, and never becomes a percentage, because the moment it does it is describing cases I have never seen.</p>
<p>Notation matters less than any of this. BPMN if you know it, labelled boxes if you do not. What a reader checks is whether your gateways have both outputs drawn, and whether the unpleasant one leads anywhere other than off the edge of the page.</p>
<h2 id="where-to-start">Where to start</h2>
<p>Take a process you went through as a customer in the last month and draw only the branch where it stopped. One branch, with the point where you had to chase somebody marked on it, and a note saying what you know and what you are guessing.</p>
<p>Then write the three-column row for the one change you would make. If the third column stays empty for more than a few minutes, the change is not ready.</p>
<p>The full returns case, with both models and the review notes left in, is in the <a href="https://analify.com/downloads/proof-pack">Proof Pack</a>. The <a href="https://analify.com/scorecard">scorecard</a> has the process checks in it, so you can go after your own model before anybody else does. How these two models sit alongside the other four documents is in <a href="https://analify.com/blog/business-analyst-portfolio">the six artifacts piece</a>.</p>
<p>A to-be is easy to make look good. It is only worth reading next to an as-is honest enough to make it look necessary.</p>
<hr />]]></content:encoded>
</item>
</channel>
</rss>
