<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Blog · bart.consulting</title><description>Thoughts on delivery, product teams, and building software that ships on time.</description><link>https://bart.consulting/</link><language>en</language><atom:link href="https://bart.consulting/rss.xml" rel="self" type="application/rss+xml"/><item><title>Your team was on time. Your roadmap wasn&apos;t.</title><link>https://bart.consulting/blog/on-time-team-late-roadmap/</link><guid isPermaLink="true">https://bart.consulting/blog/on-time-team-late-roadmap/</guid><description>Your team did its usual month. The date you built on it still slipped. Public data from three teams shows how often a promise from past work holds.</description><pubDate>Tue, 20 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Your team shipped almost everything on time this quarter. The roadmap still slipped.&lt;/p&gt;
&lt;p&gt;So you call the client. The team did good work. One piece took longer than expected. The rest is nearly there. All true, and the client hears only one thing: the date moved.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Being right about the usual month doesn&amp;#039;t make you right about the deadline.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;For &lt;a href=&quot;https://bart.consulting/blog/finish-dates-dont-exist/&quot; rel=&quot;noopener noreferrer&quot;&gt;my last article&lt;/a&gt;, I showed that a single task has no finish date, only a range of likely ones. This time I asked the question that matters for a roadmap. If you use your team&amp;#039;s own record to say how much it will finish next month, how often are you right?&lt;/p&gt;
&lt;p&gt;I took three software teams with public records, between four and seven years each, and did what a careful lead would do at the start of a month. From what a team had finished in the month just gone, I forecast what it would finish in the month ahead. I made that forecast at every Monday in the records, treating each one as the start of a month, more than 800 times across the three teams.&lt;/p&gt;
&lt;figure&gt;&lt;picture&gt;&lt;source media=&quot;(max-width: 600px)&quot; srcset=&quot;https://bart.consulting/images/blog/on-time-team-late-roadmap/02-real-year-mobile.webp&quot; /&gt;&lt;img src=&quot;https://bart.consulting/images/blog/on-time-team-late-roadmap/02-real-year.webp&quot; alt=&quot;A real year: MongoDB&amp;#039;s Evergreen team in 2018, each four weeks of finished work set against the four weeks before. Six of thirteen months fell short of it.&quot; loading=&quot;lazy&quot; /&gt;&lt;/picture&gt;&lt;figcaption&gt;A real year: MongoDB&amp;#039;s Evergreen team in 2018, each four weeks of finished work set against the four weeks before. Six of thirteen months fell short of it.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Each forecast gave me two numbers. A safe number: what the team would finish at least, 85 times in 100. And a typical number, the usual month: what it would finish at least, 50 times in 100. In one month for one of the teams, the safe number was 44 tasks and the typical one 55. Higher certainty buys a smaller promise.&lt;/p&gt;
&lt;figure&gt;&lt;picture&gt;&lt;source media=&quot;(max-width: 600px)&quot; srcset=&quot;https://bart.consulting/images/blog/on-time-team-late-roadmap/01-two-numbers-mobile.webp&quot; /&gt;&lt;img src=&quot;https://bart.consulting/images/blog/on-time-team-late-roadmap/01-two-numbers.webp&quot; alt=&quot;One team&amp;#039;s forecast for its next month, drawn as a hundred ways the month could go: at least 55 tasks half the time, at least 44 tasks 85 times in 100.&quot; loading=&quot;lazy&quot; /&gt;&lt;/picture&gt;&lt;figcaption&gt;One team&amp;#039;s forecast for its next month, drawn as a hundred ways the month could go: at least 55 tasks half the time, at least 44 tasks 85 times in 100.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Then I checked every forecast against what the teams actually finished. The typical number was right. The teams beat it in half of their months, as they should. The safe number was not. A promise I would have bet on 85 times in 100 held three times in four, and when it broke, the team finished about 15 percent less than promised, up to almost 40 percent less in the smallest team.&lt;/p&gt;
&lt;p&gt;One month in four, your client would still be waiting.&lt;/p&gt;
&lt;p&gt;Once you&amp;#039;ve had to explain a moved date, you start padding. Your developer says August. Your lead says September. You tell the client October, because you&amp;#039;ve been here before.&lt;/p&gt;
&lt;p&gt;When you turned August into October, how much confidence did you buy? A fixed margin can&amp;#039;t tell you, because it knows nothing about how your team actually works.&lt;/p&gt;
&lt;p&gt;You don&amp;#039;t need to guess. Even a forecast that is too sure of itself knows what a fixed margin never can: how much a month can swing, and how often. Set that against the work still ahead and you can see how likely you are to keep the whole promise before you make it.&lt;/p&gt;
&lt;p&gt;The honest version of October is October plus how sure you are you&amp;#039;ll hit it. October at seven in ten is a different decision from October at nine in ten. Which one you need depends on what hangs on it: an internal target, a launch, a commitment to a client.&lt;/p&gt;
&lt;figure&gt;&lt;picture&gt;&lt;source media=&quot;(max-width: 600px)&quot; srcset=&quot;https://bart.consulting/images/blog/on-time-team-late-roadmap/03-padding-odds-mobile.webp&quot; /&gt;&lt;img src=&quot;https://bart.consulting/images/blog/on-time-team-late-roadmap/03-padding-odds.webp&quot; alt=&quot;In an example forecast, the developer&amp;#039;s August, the lead&amp;#039;s September and the client&amp;#039;s October hold 3, 5 and 7 times in 10. A date that needs to hold 9 times in 10 lands in November.&quot; loading=&quot;lazy&quot; /&gt;&lt;/picture&gt;&lt;figcaption&gt;In an example forecast, the developer&amp;#039;s August, the lead&amp;#039;s September and the client&amp;#039;s October hold 3, 5 and 7 times in 10. A date that needs to hold 9 times in 10 lands in November.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Your client needs a date they can plan around. If the chance of hitting October at seven in ten isn&amp;#039;t good enough, agree on a later date or a smaller first version before they make commitments of their own. That conversation happens while they can still adjust, not when you&amp;#039;re calling to explain a promise that already broke.&lt;/p&gt;
&lt;p&gt;Before you promise the next date, ask your lead what chance the team has of hitting it.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;I work out the chance behind your next roadmap date from the tasks your team has already finished, before you promise it. No workshop, no new estimate.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://bart.consulting/scan/&quot; rel=&quot;noopener noreferrer&quot;&gt;See the chance behind your roadmap&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;The three teams are the Vera C. Rubin Observatory&amp;#039;s Data Management software, MongoDB&amp;#039;s Evergreen system and Appcelerator Studio, from public records collected in the TAWOS dataset, the same projects as in&lt;/em&gt; &lt;a href=&quot;https://bart.consulting/blog/finish-dates-dont-exist/&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;em&gt;Finish dates don&amp;#039;t exist. Odds do.&lt;/em&gt;&lt;/a&gt; &lt;em&gt;At every Monday of their records, between four and seven years per team, I forecast the next four weeks of finished work from the four weeks before, drawing those days at random, and compared the forecast with what happened: 807 forecasts in all. The safe number is the one the forecast puts 85 percent of outcomes at or above. The typical number is the one it puts half at or above. The example pair is one of MongoDB&amp;#039;s months. The safe number held in 76, 74 and 71 percent of forecasts for the three teams, and when it broke, half the misses were larger than 13, 16 and 39 percent of the promise. The typical number was beaten in 53, 53 and 52 percent.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Forecasting from finished software work is described by&lt;/em&gt; &lt;a href=&quot;https://prokanban.org/pdfs/flow-forecasting-pocket-guide.pdf&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;em&gt;Daniel Vacanti and Colleen Johnson&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. The numerical findings here come from my own analysis.&lt;/em&gt;&lt;/p&gt;</content:encoded></item><item><title>The data and methods behind &quot;Finish dates don&apos;t exist. Odds do.&quot;</title><link>https://bart.consulting/blog/finish-dates-methodology/</link><guid isPermaLink="true">https://bart.consulting/blog/finish-dates-methodology/</guid><description>Data provenance, workflow reconstruction, statistical methods, corrections, and limitations behind the finish-date analysis.</description><pubDate>Wed, 07 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Abstract&lt;/h2&gt;
&lt;p&gt;A reasonable estimate can still be followed by a very late finish. In &lt;a href=&quot;https://bart.consulting/blog/finish-dates-dont-exist/&quot; rel=&quot;noopener noreferrer&quot;&gt;&amp;quot;Finish dates don&amp;#039;t exist. Odds do.&amp;quot;&lt;/a&gt;, I examined how widely completion times varied when software work shared the same recorded estimate and followed the same route through a project&amp;#039;s workflow. This article explains the data and methods behind that comparison.&lt;/p&gt;
&lt;p&gt;I used historical records from &lt;a href=&quot;https://github.com/SOLAR-group/TAWOS&quot; rel=&quot;noopener noreferrer&quot;&gt;TAWOS&lt;/a&gt;, a public dataset of Jira issues from open-source software projects, to study Rubin Observatory Data Management, MongoDB&amp;#039;s Evergreen system, and Appcelerator Studio. For each project, I reconstructed the progression from recorded start to completion using status histories, separated delivered work from abandoned work, and built comparison groups around the project&amp;#039;s own workflow. Completion times were measured and compared separately within each project.&lt;/p&gt;
&lt;p&gt;The spread remained substantial. Among 880 one-point Stories following the observatory project&amp;#039;s standard route, half finished within about three days, while roughly five in every hundred took more than four weeks. The two company-operated projects showed the same pattern. In every group of at least a hundred issues, across all three projects, the late finish took at least three and a half times as long as the typical one. For anyone using estimates to set deadlines, the gap matters. A typical duration tells you where the middle was. The later finishes show how much risk that single number leaves out.&lt;/p&gt;
&lt;h2&gt;The question this analysis addressed&lt;/h2&gt;
&lt;p&gt;A missed date often leads to a request for better planning. Development is asked to estimate the work again, add the estimates together and choose a new deadline, usually with some extra margin. Sometimes the deadline comes first, and the estimates decide how much work should fit before it. In both versions, the estimates carry the weight of the deadline.&lt;/p&gt;
&lt;p&gt;I wanted to examine the relationship that calculation depends on: &lt;strong&gt;how much does a task&amp;#039;s estimate tell us about its time to completion?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;For the main comparison, I selected planned development work, leaving bugs out, and compared completed work with the same estimate within each project. I then narrowed the comparison to work that passed through the same stages in the same order.&lt;/p&gt;
&lt;p&gt;I measured elapsed calendar time from the recorded start of development activities to completion. This includes waiting and review as well as development work. A deadline has to account for the whole interval.&lt;/p&gt;
&lt;h2&gt;The dataset and the records available&lt;/h2&gt;
&lt;h3&gt;TAWOS and the version used here&lt;/h3&gt;
&lt;p&gt;I used &lt;a href=&quot;https://github.com/SOLAR-group/TAWOS&quot; rel=&quot;noopener noreferrer&quot;&gt;TAWOS&lt;/a&gt;, a dataset of public Jira records from open-source software projects. Version 1.1 contains 458,232 issues from 39 projects, including recorded estimates and histories of status changes. Those histories let me reconstruct how work moved from start to completion. The records used here run up to 23 October 2020. [1, 6, 7]&lt;/p&gt;
&lt;p&gt;TAWOS was assembled from projects with evidence of Agile practice and at least 200 issues with story-point estimates. The dataset paper describes version 1.0, which also included five Talendforge projects later removed when their tracker ceased to be public. Before the analysis, I audited the imported records against that paper. The data-quality findings from that audit are explained below. [1, 6]&lt;/p&gt;
&lt;h3&gt;Three projects, and why these three&lt;/h3&gt;
&lt;p&gt;I selected three projects with enough estimated, completed work to support substantial comparison groups and workflows I could interpret. Together, they cover scientific software and two tools run by software companies, with different ways of organizing the work. [6, 8-11]&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Rubin Observatory Data Management (DM)&lt;/strong&gt; builds the software that turns the observatory&amp;#039;s sky images into science data. Its published workflow provided a clear starting point for interpreting the records. [9]&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MongoDB Evergreen (EVG)&lt;/strong&gt; is the system MongoDB uses to test software changes across platforms. [10]&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Appcelerator Studio (TISTUD)&lt;/strong&gt; was a tool for building mobile apps. [11]&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I interpreted each project&amp;#039;s records separately. The project-specific sections below explain which work entered the comparisons and which periods were used. [7, 8]&lt;/p&gt;
&lt;h3&gt;How the analysis is put together&lt;/h3&gt;
&lt;p&gt;I kept the imported records unchanged and stored my reconstructions separately. The analysis follows three steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Configuration files&lt;/strong&gt; define what each project&amp;#039;s statuses and resolutions mean, and which work and routes enter the comparison.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The builder&lt;/strong&gt; turns the recorded status changes into a timeline and a route for each issue.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The study script&lt;/strong&gt; selects the comparison groups and calculates their completion-time summaries. [7, 8]&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Jira supplies the status-change timestamps; my reconstruction rules determine the start and completion events. I set each project&amp;#039;s status and route mappings before running the completion-time study. The following sections explain those rules and the corrections needed to make the records usable.&lt;/p&gt;
&lt;h2&gt;What the source papers established&lt;/h2&gt;
&lt;p&gt;The closest prior study compared developers&amp;#039; estimates, recorded as story points, with the time issues spent in progress. The relationship was usually weak or moderate, and issues with the same estimate showed substantial variation in duration. Some took much longer than others, even after the researchers removed very short durations and statistical outliers. [2]&lt;/p&gt;
&lt;p&gt;Two other papers tested methods for predicting the story-point estimate an issue would receive. In both studies, a prediction using the middle value of earlier estimates was competitive with more elaborate methods. Predicting an assigned estimate and predicting a finish date answer different questions. [3-5]&lt;/p&gt;
&lt;p&gt;Alongside the TAWOS dataset paper, these studies informed the data audit and the choice of time measure. [1-4] My comparison focuses on the full interval from development start to completion, including waiting and review, and groups work by both estimate and workflow route. It retains the long durations because those late finishes matter for deadlines. [7, 8]&lt;/p&gt;
&lt;h2&gt;Why the supplied duration columns were insufficient&lt;/h2&gt;
&lt;p&gt;TAWOS includes calculated duration fields, but I needed the elapsed time from development start to completion. The audit showed that the supplied fields did not consistently measure that interval. [6]&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Resolution time often included the backlog.&lt;/strong&gt; For 83 percent of resolved issues with a recorded move into In Progress, the value matched the time from ticket creation to resolution. That includes time before development starts, although the dataset paper describes the field as starting when work begins. [1, 6]&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Time in progress depended on the workflow.&lt;/strong&gt; The supplied value was zero for 76 percent of resolved issues. Almost all of those tickets still had status changes; the zero often reflected a mismatch between the field&amp;#039;s status definition and the project&amp;#039;s workflow. Requiring a positive value would have selected work according to the status names used. [6]&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I therefore reconstructed start and completion from each project&amp;#039;s status history, interpreting its stages separately. The next section explains those rules. [8]&lt;/p&gt;
&lt;h3&gt;What the recorded estimate could establish&lt;/h3&gt;
&lt;p&gt;The supplied estimation date repeated the ticket&amp;#039;s creation time, sometimes one hour earlier. It could not establish whether an estimate had been made before development began. [6]&lt;/p&gt;
&lt;p&gt;For the stable-estimate comparisons, I selected estimates from 1 to 100 and required the revision flag (&lt;code&gt;Story_Point_Changed_After_Estimation&lt;/code&gt;) to be unset. Some issues had several estimate entries in their history despite an unset flag, so I describe this restriction as &amp;quot;no revision recorded by the flag.&amp;quot; [1, 2, 6, 7]&lt;/p&gt;
&lt;h3&gt;Timestamp precision&lt;/h3&gt;
&lt;p&gt;The timestamps showed seasonal one-hour discrepancies consistent with local clock changes, despite the documentation describing them as UTC. I applied no timezone correction and report durations in elapsed calendar days. An interval crossing a daylight-saving change can therefore carry a one-hour discrepancy. This matters most for groups where half the work finished in less than a day, and for completion times close to the whole-day boundaries used in the charts. [1, 6, 8]&lt;/p&gt;
&lt;h2&gt;Reconstructing an issue&amp;#039;s recorded lifecycle&lt;/h2&gt;
&lt;p&gt;I reconstructed each Jira issue&amp;#039;s timeline from its dated status changes to identify the start, completion and route used in the comparison. [8]&lt;/p&gt;
&lt;h3&gt;Start and completion&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Start:&lt;/strong&gt; first entry into a status marking work as under way.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Completion:&lt;/strong&gt; first entry into the final uninterrupted sequence of terminal states, which mark work as ended.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For example, an issue that moves from &lt;code&gt;In Progress&lt;/code&gt; to &lt;code&gt;Resolved&lt;/code&gt; and later to &lt;code&gt;Closed&lt;/code&gt; finishes at the move to &lt;code&gt;Resolved&lt;/code&gt;. The later closure adds no time. If it reopens before finishing again, I use that later completion and include all the time in between. A move out of a terminal state and back within 24 hours, with no active spell in between, is an administrative round trip, not a reopen: it does not interrupt the terminal run, so the issue is dated by its first close. [8]&lt;/p&gt;
&lt;p&gt;I call the interval from recorded start to final completion &lt;strong&gt;cycle time&lt;/strong&gt;. It includes development, review and waiting, plus time spent in earlier terminal states before a reopening. The interval from ticket creation to the first active state is the &lt;strong&gt;pre-start wait&lt;/strong&gt; and sits outside cycle time.&lt;/p&gt;
&lt;p&gt;For the study, I selected delivered issues with a recorded resolution date and a measurable start. Open work and work with no observed active state were outside the completion-time comparison. [7, 8]&lt;/p&gt;
&lt;figure&gt;&lt;picture&gt;&lt;source media=&quot;(max-width: 600px)&quot; srcset=&quot;https://bart.consulting/images/blog/finish-dates-methodology/figure-1-lifecycle-mobile.png&quot; /&gt;&lt;img src=&quot;https://bart.consulting/images/blog/finish-dates-methodology/figure-1-lifecycle.png&quot; alt=&quot;Cycle time runs from the first entry into an active status to the first entry into the final run of terminal statuses. Time before a reopen counts; the pre-start wait and a later administrative closure do not. Status names from Appcelerator Studio; the same rules apply in all three projects.&quot; loading=&quot;lazy&quot; /&gt;&lt;/picture&gt;&lt;figcaption&gt;Cycle time runs from the first entry into an active status to the first entry into the final run of terminal statuses. Time before a reopen counts; the pre-start wait and a later administrative closure do not. Status names from Appcelerator Studio; the same rules apply in all three projects.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h3&gt;Classifying the stages&lt;/h3&gt;
&lt;p&gt;Status names differ between projects, so I mapped them separately to six classes. Each continuous period in an active status is an &lt;strong&gt;active spell&lt;/strong&gt;. [8]&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;active&lt;/strong&gt; — work marked as under way, such as &lt;code&gt;In Progress&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;queue&lt;/strong&gt; — waiting, including backlog states, blocks and waits after review.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;review&lt;/strong&gt; — undergoing review or waiting for a reviewer.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;done&lt;/strong&gt; — the status label marks the work as delivered.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;abandoned&lt;/strong&gt; — the status label marks the work as not delivered.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;terminal&lt;/strong&gt; — neutral closing states, such as &lt;code&gt;Resolved&lt;/code&gt; or &lt;code&gt;Closed&lt;/code&gt;; the recorded resolution determines delivery.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A status such as DM&amp;#039;s &lt;code&gt;Reviewed&lt;/code&gt; means review has finished, so I classed it as queue. An issue in the neutral terminal class is treated as open without a recorded resolution date. An unmapped resolution on a resolved issue in that class stops the build. [8]&lt;/p&gt;
&lt;p&gt;Within a cycle, I summed time in active, review and queue states separately. Earlier time in terminal states before a reopen is stored as &lt;strong&gt;prior terminal dwell&lt;/strong&gt;. These intervals add up to cycle time; the study reports the total elapsed interval. [8]&lt;/p&gt;
&lt;h3&gt;Main flow and standard route&lt;/h3&gt;
&lt;p&gt;A &lt;strong&gt;route&lt;/strong&gt; is the sequence of status classes an issue passed through, with consecutive occurrences of the same class collapsed into one step. For example, &lt;code&gt;queue → active → review → queue → done&lt;/code&gt; means waiting, work, review, another wait and delivery. [8]&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Main flow:&lt;/strong&gt; the routes I accepted for comparison because they ended in delivery and passed through the stages I treated as necessary in that workflow. Rework, requeue and reopen loops remain eligible.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Standard route:&lt;/strong&gt; the most common eligible route in the project. Within that route, grouping by estimate holds both the estimate and stage sequence constant. [7, 8]&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For DM, the handbook&amp;#039;s statuses Todo, In Progress, In Review, Reviewed and Done map onto the standard route. The guide defines one point as an idealised half day of work. I use that current documentation as context; the historical workflow decisions come from the project investigation. [8, 9]&lt;/p&gt;
&lt;h3&gt;Handling history inconsistencies&lt;/h3&gt;
&lt;p&gt;I ordered each issue&amp;#039;s status changes by timestamp, with changelog ID breaking ties. The first genuine status change&amp;#039;s origin status applies from ticket creation. Each later interval uses the destination status of the change that opened it. Without genuine changes, I use the current recorded status from creation. [8]&lt;/p&gt;
&lt;p&gt;Entries such as &lt;code&gt;Closed → Closed&lt;/code&gt; are ignored because they record no change of state. If consecutive events disagree about a state, I retain the label that opened the interval, flag it as disputed and include the interval in the analysis. [8]&lt;/p&gt;
&lt;p&gt;I revised the completion boundary and the rule for unchanged status labels after examining the outcomes, added the round-trip rule after examining the reopens, and applied all three rules to all three projects. The Appcelerator Studio section explains what each rule changed. [8]&lt;/p&gt;
&lt;h2&gt;The project-specific decisions&lt;/h2&gt;
&lt;p&gt;The same comparison needed different selection rules in each project.&lt;/p&gt;
&lt;h3&gt;DM: Stories with recorded work and review&lt;/h3&gt;
&lt;p&gt;I used the full recorded period, from 2014 to October 2020. DM&amp;#039;s Stories included code changes alongside operations, reporting and accounting work, so the issue type alone was not enough to select the process I wanted to compare. I required both an active spell and a recorded review before delivery. [7-9]&lt;/p&gt;
&lt;p&gt;The review requirement excludes the large &lt;code&gt;queue → active → done&lt;/code&gt; route, which included work reviewed on GitHub without entering Jira&amp;#039;s review stage. It also excludes &lt;code&gt;queue → active → queue → done&lt;/code&gt;, including issues that moved through &lt;code&gt;In Progress → Reviewed → Done&lt;/code&gt;: &lt;code&gt;Reviewed&lt;/code&gt; is grouped as queue. [8]&lt;/p&gt;
&lt;p&gt;Epics and Milestones were excluded because their timelines aggregate other issues. I kept Technical tasks separate because missing parent links prevented a check for overlapping parent and child timelines. Bugs and other execution types appear in separate checks. [8]&lt;/p&gt;
&lt;p&gt;I split the results at 1 October 2019, after a workflow change removed the direct move from review to &lt;code&gt;Done&lt;/code&gt;. Era 0 is before that boundary; era 1 starts there. I report both the full period and the eras separately, assigning each issue by its reconstructed completion date. The route &lt;code&gt;queue → active → review → done&lt;/code&gt; stays eligible in the main flow in both eras; the standard route includes a wait after review. [7, 8]&lt;/p&gt;
&lt;h3&gt;EVG: separating delivery from cancellation&lt;/h3&gt;
&lt;p&gt;I selected Task, Improvement and New Feature. I checked that Task was being used for standalone engineering before including it; the result files also show the comparison without Task. Bugs were examined separately. [8]&lt;/p&gt;
&lt;p&gt;Both active work and review were required. I grouped &lt;code&gt;In Progress&lt;/code&gt;, &lt;code&gt;Debugging&lt;/code&gt; and &lt;code&gt;Investigating&lt;/code&gt; as active, and &lt;code&gt;In Code Review&lt;/code&gt; as review. &lt;code&gt;Closed&lt;/code&gt; contained delivered, cancelled and duplicate issues, so the recorded resolution determines delivery. &lt;code&gt;Deployed&lt;/code&gt; is grouped as queue because issues normally moved on from it to closure. The endpoint measures completion of the recorded workflow. [8]&lt;/p&gt;
&lt;p&gt;The comparison uses era 2, from 5 February 2018 onward. This is the period after &lt;code&gt;Closed&lt;/code&gt; replaced &lt;code&gt;Resolved&lt;/code&gt; as the normal ending status. [7, 8]&lt;/p&gt;
&lt;h3&gt;TISTUD: separating completion from later closure&lt;/h3&gt;
&lt;p&gt;I selected Story, Improvement and New Feature over the full period, from March 2011 to October 2020. Review was optional in this workflow, so I required active work and delivery. Bugs and Technical tasks were examined separately. [7, 8]&lt;/p&gt;
&lt;p&gt;The history contained 2,219 &lt;code&gt;Closed → Closed&lt;/code&gt; entries and later administrative moves from &lt;code&gt;Resolved&lt;/code&gt; to &lt;code&gt;Closed&lt;/code&gt;. An earlier rule ended the cycle at the last terminal event. Under that rule, the time by which about 95 percent had finished was near two and a half years. Using the first entry into the final uninterrupted terminal run removed that administrative delay; genuine reopens still extend the measured lifecycle. [7, 8]&lt;/p&gt;
&lt;p&gt;I also ignored repeated-label entries so they could not create extra intervals or route steps. I applied the rules for completion and repeated labels to all three projects. Ignoring repeated-label entries left DM and EVG&amp;#039;s cohort results unchanged to two decimal places. [7, 8]&lt;/p&gt;
&lt;p&gt;The third rule covers administrative round trips. Most of what the history recorded as reopens was a move through &lt;code&gt;Closed → Reopened → Closed&lt;/code&gt; within hours, with no work between; one administrator reopened and re-closed 133 issues on the evening of 19 June 2013. EVG showed the same pattern: 106 issues first closed weeks earlier were re-closed out of &lt;code&gt;In Code Review&lt;/code&gt; within one hour on 1 June 2020. Such a move, out of a terminal state and back within 24 hours with no active spell in between, is absorbed and the issue is dated by its first close; a genuine reopen still extends the lifecycle. The rule catches 749 of TISTUD&amp;#039;s 1,061 delivered issues with a reopen and 220 of EVG&amp;#039;s 422. It applies to all three projects; it left the standard-route cohorts unchanged and is reflected in the main-flow figures reported below. [7, 8]&lt;/p&gt;
&lt;p&gt;I retained the project&amp;#039;s issue-type labels, even where a Story&amp;#039;s title looked like a bug report. No era split was adopted: after repeated-label entries were ignored, the mapped workflow retained the same stage structure. [8]&lt;/p&gt;
&lt;h2&gt;From project records to comparison cohorts&lt;/h2&gt;
&lt;h3&gt;Selecting the comparison groups&lt;/h3&gt;
&lt;p&gt;I built the comparison groups in three steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Keep delivered issues with a recorded resolution date and a measurable cycle time of zero or more minutes. For EVG, use only era 2.&lt;/li&gt;
&lt;li&gt;Apply the project&amp;#039;s selected issue types and main-flow routes.&lt;/li&gt;
&lt;li&gt;Keep estimates from 1 to 100, including fractions within that range, with no revision recorded by the flag. Then select the standard route and group by exact estimate. [6, 7]&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The table starts with delivered issues across all types. DM&amp;#039;s starting count already requires a measurable cycle; EVG&amp;#039;s and TISTUD&amp;#039;s do not. Every later row applies that requirement. [7, 8]&lt;/p&gt;
&lt;div class=&quot;notion-table&quot;&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th scope=&quot;col&quot;&gt;Selection step&lt;/th&gt;&lt;th scope=&quot;col&quot; class=&quot;num&quot;&gt;DM&lt;/th&gt;&lt;th scope=&quot;col&quot; class=&quot;num&quot;&gt;EVG, from 2018&lt;/th&gt;&lt;th scope=&quot;col&quot; class=&quot;num&quot;&gt;TISTUD&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Delivered issues before type and route selection&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;14,127&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;4,200&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;3,433&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Selected types on a main-flow route, with measurable cycle time&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;5,997&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;1,629&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;906&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Same, with estimates from 1 to 100 and the revision flag unset&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;3,778&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;1,428&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;775&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Same, on the standard route&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;3,144&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;1,030&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;414&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Table 1. Counts as each project&amp;#039;s population was narrowed, using the issue types selected in the project-specific sections above. [7, 8]&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The largest reduction came before filtering estimates, when I applied the requirements for issue types, routes and a measurable cycle. Those requirements excluded DM&amp;#039;s skip-review route, EVG issues without a recorded work start or review, and TISTUD issues that closed without a recorded start. [8]&lt;/p&gt;
&lt;p&gt;The standard route was different in each project:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DM:&lt;/strong&gt; &lt;code&gt;queue → active → review → queue → done&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;EVG:&lt;/strong&gt; &lt;code&gt;queue → active → review → terminal&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TISTUD:&lt;/strong&gt; &lt;code&gt;queue → active → terminal&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Within each standard route, I grouped issues by their exact estimate. DM&amp;#039;s groups contain only Stories. EVG and TISTUD combine their selected issue types, so the estimate and route match within a group while the type can differ. [7]&lt;/p&gt;
&lt;h3&gt;How the published counts fit together&lt;/h3&gt;
&lt;p&gt;The route figure in the original article covers 14,210 DM Stories with estimates from 1 to 100, including work that was delivered, abandoned or still open at the cutoff. The completion-time comparison here uses 880 delivered one-point DM Stories with a measurable cycle, no revision recorded by the flag, and the standard route. The 880 are among the 14,210, but the counts came from separate queries for different comparisons. [7, 12]&lt;/p&gt;
&lt;p&gt;DM&amp;#039;s 14,210 estimated Stories followed 176 routes after status labels were grouped into stages, with 4,122 on the standard route. The original route figure reports 3,853 following the handbook&amp;#039;s exact status sequence, but the query behind that stricter count was not retained. [12]&lt;/p&gt;
&lt;h2&gt;How to read the completion times&lt;/h2&gt;
&lt;p&gt;I used percentiles to compare typical and late finishes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;P50 (the median):&lt;/strong&gt; the time by which about half the group had finished.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;P85:&lt;/strong&gt; the time by which about 85 percent had finished.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;P95:&lt;/strong&gt; the time by which about 95 percent had finished.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The ratio P95/P50 expresses the late completion point as a multiple of the median. A ratio of 3.5 means that point was three and a half times the median. [7]&lt;/p&gt;
&lt;p&gt;I calculated percentiles from unrounded durations and report them in elapsed calendar days, including nights and weekends. Durations and ratios are shown to two decimals, with ratios calculated before rounding. Headline comparisons use groups of at least 100 issues. [7]&lt;/p&gt;
&lt;h2&gt;Results and checks&lt;/h2&gt;
&lt;h3&gt;DM: variation remained within point groups&lt;/h3&gt;
&lt;p&gt;Among DM&amp;#039;s 3,778 stable-estimate main-flow Stories, the median was 8.15 days and P95 was 88.13 days, a ratio of 10.81. Restricting to the standard route left 3,144 Stories, with a median of 7.17 days, a P95 of 71.34 days, and a ratio of 9.96. Holding the point value constant as well, the 880 one-point Stories have a ratio of 10.18. Matching the route and then the estimate moved the centre of the distribution but barely touched its shape. [7]&lt;/p&gt;
&lt;figure&gt;&lt;picture&gt;&lt;source media=&quot;(max-width: 600px)&quot; srcset=&quot;https://bart.consulting/images/blog/finish-dates-methodology/figure-2-completion-days-mobile.png&quot; /&gt;&lt;img src=&quot;https://bart.consulting/images/blog/finish-dates-methodology/figure-2-completion-days.png&quot; alt=&quot;Completion times for 880 delivered one-point DM Stories on the standard route, with the revision flag unset, over the full study period. Finishes beyond day 30 are grouped together in the chart and remain in the percentile calculations. [12]&quot; loading=&quot;lazy&quot; /&gt;&lt;/picture&gt;&lt;figcaption&gt;Completion times for 880 delivered one-point DM Stories on the standard route, with the revision flag unset, over the full study period. Finishes beyond day 30 are grouped together in the chart and remain in the percentile calculations. [12]&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Holding the recorded point value constant produces the following groups with at least 100 observations.&lt;/p&gt;
&lt;div class=&quot;notion-table&quot;&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th scope=&quot;col&quot; class=&quot;num&quot;&gt;DM recorded points&lt;/th&gt;&lt;th scope=&quot;col&quot; class=&quot;num&quot;&gt;Issues&lt;/th&gt;&lt;th scope=&quot;col&quot; class=&quot;num&quot;&gt;P50, days&lt;/th&gt;&lt;th scope=&quot;col&quot; class=&quot;num&quot;&gt;P85, days&lt;/th&gt;&lt;th scope=&quot;col&quot; class=&quot;num&quot;&gt;P95, days&lt;/th&gt;&lt;th scope=&quot;col&quot; class=&quot;num&quot;&gt;P95/P50&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;num&quot;&gt;1&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;880&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;2.74&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;12.87&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;27.87&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;10.18&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;num&quot;&gt;2&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;749&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;6.02&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;23.05&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;46.88&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;7.79&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;num&quot;&gt;3&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;264&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;9.98&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;33.93&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;75.52&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;7.57&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;num&quot;&gt;4&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;451&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;9.08&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;32.90&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;60.03&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;6.61&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;num&quot;&gt;5&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;134&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;13.01&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;42.14&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;102.05&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;7.84&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;num&quot;&gt;6&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;218&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;15.25&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;43.01&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;81.01&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;5.31&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;num&quot;&gt;8&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;144&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;23.04&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;54.27&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;88.35&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;3.84&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;num&quot;&gt;10&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;134&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;25.87&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;72.10&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;117.18&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;4.53&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Table 2. DM standard-route point groups, pooled eras. All groups use Story, the stable-estimate restriction, delivered measurable cycles, and the standard route. Ratios use unrounded values. [7]&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The central duration rises with the estimate, except that 4-point Stories had a slightly lower median than 3-point ones. The 95th percentile remains several times the median in every group. The shared estimate and route did not make observed durations tightly concentrated.&lt;/p&gt;
&lt;figure&gt;&lt;picture&gt;&lt;source media=&quot;(max-width: 600px)&quot; srcset=&quot;https://bart.consulting/images/blog/finish-dates-methodology/figure-3-multiples-mobile.png&quot; /&gt;&lt;img src=&quot;https://bart.consulting/images/blog/finish-dates-methodology/figure-3-multiples.png&quot; alt=&quot;The time by which about 95 percent had finished, as a multiple of each group&amp;#039;s median. Each block is one median: for one-point Stories a block is 2.7 days, and the 95 percent point lies just over ten blocks out. Delivered DM Stories on the standard route with the revision flag unset, full study period; every group has at least 100 issues.&quot; loading=&quot;lazy&quot; /&gt;&lt;/picture&gt;&lt;figcaption&gt;The time by which about 95 percent had finished, as a multiple of each group&amp;#039;s median. Each block is one median: for one-point Stories a block is 2.7 days, and the 95 percent point lies just over ten blocks out. Delivered DM Stories on the standard route with the revision flag unset, full study period; every group has at least 100 issues.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h3&gt;Workflow-era checks&lt;/h3&gt;
&lt;p&gt;The obvious objection to the pooled DM result is that it straddles a workflow migration. I therefore split the results at the October 2019 boundary. On the standard route, era 0 holds 1,981 Stories running from a median of 8.84 days to a P95 of 78.41 days, a ratio of 8.87; era 1 holds 1,163 running from 5.25 to 57.63 days, a ratio of 10.98. For the one-point standard-route cohort, era 0 holds 478 issues running from 3.07 to 37.91 days, a ratio of 12.34, and era 1 holds 402 running from 2.02 to 20.09 days, a ratio of 9.94. The spread appears in both eras, not only in the pooled figure. [7]&lt;/p&gt;
&lt;p&gt;The era comparison does not show that the migration caused any change in completion times. Era assignment follows the endpoint, and other conditions could have changed. The check addresses a narrower concern: substantial spread remains when the eras are examined separately.&lt;/p&gt;
&lt;h3&gt;EVG and TISTUD under their own rules&lt;/h3&gt;
&lt;p&gt;The company-operated projects use their own type populations and standard routes. Their point scales are not a shared unit of work across projects.&lt;/p&gt;
&lt;div class=&quot;notion-table&quot;&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th scope=&quot;col&quot;&gt;Project and recorded points&lt;/th&gt;&lt;th scope=&quot;col&quot; class=&quot;num&quot;&gt;Issues&lt;/th&gt;&lt;th scope=&quot;col&quot; class=&quot;num&quot;&gt;P50, days&lt;/th&gt;&lt;th scope=&quot;col&quot; class=&quot;num&quot;&gt;P95, days&lt;/th&gt;&lt;th scope=&quot;col&quot; class=&quot;num&quot;&gt;P95/P50&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;EVG, 1&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;391&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;1.18&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;13.91&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;11.75&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;EVG, 2&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;459&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;2.97&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;15.11&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;5.08&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;EVG, 4&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;145&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;5.18&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;19.36&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;3.74&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TISTUD, 5&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;155&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;0.24&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;4.35&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;17.84&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TISTUD, 8&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;126&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;1.76&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;7.56&lt;/td&gt;&lt;td class=&quot;num&quot;&gt;4.31&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Table 3. Standard-route point groups with at least 100 observations. EVG uses its study era and Task + Improvement + New Feature; TISTUD uses Story + Improvement + New Feature. Separate project results, not pooled estimates. [7]&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;EVG&amp;#039;s 1,428 stable-estimate main-flow issues had a median of 3.80 days and a P95 of 30.00 days. One objection is that the Task type might be driving the result. The sensitivity check excluding Task kept 786 Improvement and New Feature issues, with a median of 4.20 days and a P95 of 33.64 days. The spread was present without Task. [7]&lt;/p&gt;
&lt;p&gt;TISTUD&amp;#039;s main flow contained 775 stable-estimate issues, with a median of 1.06 days and a P95 of 35.27 days. Its standard-route cohort contained 414 issues, with a median of 0.81 days and a P95 of 7.30 days. The two summaries differ because the main flow also admits routes the standard route excludes: routes through the optional review stage, rework loops and reopens. The 93 stable-estimated issues on the reopen route &lt;code&gt;queue → active → terminal → queue → terminal&lt;/code&gt; run from a median of 0.22 days to a P95 of 58.57 days. [7]&lt;/p&gt;
&lt;p&gt;The five-point TISTUD cohort has a sub-day median. Its large ratio is sensitive to a small denominator, and timestamp precision matters more at that scale. The eight-point cohort gives the clearer day-scale comparison: a median of 1.76 days and a P95 of 7.56 days.&lt;/p&gt;
&lt;p&gt;Across all reported comparisons with at least 100 issues, the lowest P95/P50 was 3.53, for DM&amp;#039;s eight-point Stories in era 0. [7]&lt;/p&gt;
&lt;h2&gt;What the results mean for planning&lt;/h2&gt;
&lt;p&gt;Across three projects, matching the estimate and workflow route still left a substantial gap between typical and late finishes. Waiting, review and rework are part of the elapsed interval a deadline has to account for. [7, 8]&lt;/p&gt;
&lt;p&gt;I compared completed issues using recorded estimates and the routes each issue eventually took. I did not test how reliably the historical percentiles predict future completion times. [7, 8]&lt;/p&gt;
&lt;p&gt;For planning, a typical duration is a useful reference. Historical late finishes show the risk that reference leaves out. Asking how likely work is to finish by the date you need makes that risk part of the decision.&lt;/p&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;TAWOS is public. My project mappings, scripts and result files are unpublished working materials, described in references 6–8 and 12.&lt;/em&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Tawosi, V., Al-Subaihin, A., Moussa, R., and Sarro, F. (2022). &lt;a href=&quot;https://arxiv.org/pdf/2202.00979v1&quot; rel=&quot;noopener noreferrer&quot;&gt;A Versatile Dataset of Agile Open Source Software Projects&lt;/a&gt;. MSR 2022, doi:10.1145/3524842.3528029. Dataset provenance and field descriptions, especially §§2.1 and 2.5. The data and its README live in the &lt;a href=&quot;https://github.com/SOLAR-group/TAWOS&quot; rel=&quot;noopener noreferrer&quot;&gt;TAWOS repository&lt;/a&gt;; this analysis uses the version 1.1 database download, doi:10.5522/04/21308124.&lt;/li&gt;
&lt;li&gt;Tawosi, V., Moussa, R., and Sarro, F. (2022). &lt;a href=&quot;https://solar.cs.ucl.ac.uk/pdf/tawosi2022esem.pdf&quot; rel=&quot;noopener noreferrer&quot;&gt;On the Relationship Between Story Points and Development Effort in Agile Open-Source Software&lt;/a&gt;. ESEM 2022. Time definitions in §2.2, sample and filters in §3.3, results in §4.&lt;/li&gt;
&lt;li&gt;Tawosi, V., Moussa, R., and Sarro, F. (2022). &lt;a href=&quot;https://arxiv.org/pdf/2201.05401v2&quot; rel=&quot;noopener noreferrer&quot;&gt;Agile Effort Estimation: Have We Solved the Problem Yet? Insights From A Replication Study&lt;/a&gt;. IEEE Transactions on Software Engineering accepted manuscript, arXiv version 2, 17 December 2022. Experimental results and replication discussion.&lt;/li&gt;
&lt;li&gt;Tawosi, V., Al-Subaihin, A., and Sarro, F. (2022). &lt;a href=&quot;https://discovery.ucl.ac.uk/id/eprint/10143360/1/tawosi2022saner.pdf&quot; rel=&quot;noopener noreferrer&quot;&gt;Investigating the Effectiveness of Clustering for Story Point Estimation&lt;/a&gt;. SANER 2022. Dataset and chronological split in §IV-B, comparisons in §V.&lt;/li&gt;
&lt;li&gt;Choetkiertikul, M., Dam, H. K., Tran, T., Pham, T., Ghose, A., and Menzies, T. (2019). &lt;a href=&quot;https://arxiv.org/abs/1609.00489&quot; rel=&quot;noopener noreferrer&quot;&gt;A Deep Learning Model for Estimating Story Points&lt;/a&gt;. IEEE Transactions on Software Engineering 45(7). The estimator that reference 3 replicates.&lt;/li&gt;
&lt;li&gt;TAWOS import and data-quality investigation, 2026. Unpublished working notes by the author: version reconciliation against the dataset paper, the resolution-time and estimation-date column discrepancies, the timestamp offsets, missing fields, and known data limitations. Investigation records, not a peer-reviewed publication.&lt;/li&gt;
&lt;li&gt;Completion-time study, 2026. Unpublished analysis by the author: a method note, a manifest recording the 23 October 2020 cutoff, the study script, per-project result files for DM, EVG, and TISTUD, and findings notes for each project recording interpretation and earlier checks. Tables 1, 2, and 3 are taken from the result files.&lt;/li&gt;
&lt;li&gt;Workflow reconstruction, 2026. Unpublished analysis by the author: a method note, the builder, and for each of DM, EVG, and TISTUD the adopted status, type, resolution, route, and era configurations with the investigation and validation records behind them.&lt;/li&gt;
&lt;li&gt;LSST Data Management, the Rubin Observatory&amp;#039;s software project under its former name, the Large Synoptic Survey Telescope. &lt;a href=&quot;https://developer.lsst.io/work/flow.html&quot; rel=&quot;noopener noreferrer&quot;&gt;DM Development Workflow&lt;/a&gt; and &lt;a href=&quot;https://dmtn-020.lsst.io/&quot; rel=&quot;noopener noreferrer&quot;&gt;Data Management Project Management Guide, DMTN-020&lt;/a&gt;, both accessed 8 September 2026. Current documentation supplies project context, including the five workflow steps and the idealised half-day story point; the historical workflow interpretations used here come from the investigations in reference 8.&lt;/li&gt;
&lt;li&gt;MongoDB (27 July 2016). &lt;a href=&quot;https://www.mongodb.com/company/blog/engineering/evergreen-continuous-integration-why-we-reinvented-wheel&quot; rel=&quot;noopener noreferrer&quot;&gt;Evergreen Continuous Integration: Why We Reinvented the Wheel&lt;/a&gt;, accessed 8 September 2026. Context for the EVG project.&lt;/li&gt;
&lt;li&gt;Axway. &lt;a href=&quot;https://blog.axway.com/product-insights/discontinued/appcelerator/changes-to-application-development-services&quot; rel=&quot;noopener noreferrer&quot;&gt;Changes to Application Development Services&lt;/a&gt;, accessed 8 September 2026. Context for Appcelerator Studio and its discontinuation after the dataset&amp;#039;s cutoff.&lt;/li&gt;
&lt;li&gt;Figure materials for the original article, 2026. Unpublished, held with the analysis: the completion-day data and its extraction, the bar-figure script, the route figure, the estimate-range figure, and the full listing of the 176 routes taken by the 14,210 estimated Stories.&lt;/li&gt;
&lt;/ol&gt;</content:encoded></item><item><title>Nobody used it. So we built more of it.</title><link>https://bart.consulting/blog/demand-vs-discoverability/</link><guid isPermaLink="true">https://bart.consulting/blog/demand-vs-discoverability/</guid><description>Almost nobody found Spotto&apos;s travel-time search. Almost everyone who typed in a place finished it. Why that meant building more of it, not cutting it.</description><pubDate>Thu, 17 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;You build a feature because a customer asks for it. Months later, almost nobody uses it, and the conversation turns to whether it should stay. The usage chart makes removing it look like the obvious decision.&lt;/p&gt;
&lt;p&gt;But low usage can hide two different problems: people try the feature and leave, or they never get far enough to try it. The total doesn&amp;#039;t tell you which, yet it is often the number deciding what gets cut.&lt;/p&gt;
&lt;p&gt;I was ready to write off a feature on that basis myself. Instead, we spent about a third of the development time we had left for the year building more of it. What changed my mind was looking at where we lost people.&lt;/p&gt;
&lt;figure&gt;&lt;picture&gt;&lt;source media=&quot;(max-width: 600px)&quot; srcset=&quot;https://bart.consulting/images/blog/demand-vs-discoverability/00-the-anomaly-mobile.webp&quot; /&gt;&lt;img src=&quot;https://bart.consulting/images/blog/demand-vs-discoverability/00-the-anomaly.webp&quot; alt=&quot;A phone showing the old travel-time map around Ghent, next to two numbers that did not fit together: of all visitors, a very small share ever found it, and of those who typed in a place, 97 percent finished all four steps.&quot; loading=&quot;lazy&quot; /&gt;&lt;/picture&gt;&lt;figcaption&gt;A phone showing the old travel-time map around Ghent, next to two numbers that did not fit together: of all visitors, a very small share ever found it, and of those who typed in a place, 97 percent finished all four steps.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2&gt;The reading everyone in the room shares&lt;/h2&gt;
&lt;p&gt;For four years I have led product at Spotto, a Belgian real estate marketplace. Somewhere in it lived a search that worked differently from the rest, a unique thing in Belgium. Instead of picking a postcode, you told it where you work and how you travel, and it showed you every home within thirty minutes by bike of that address. Or, if you&amp;#039;re like me, you enter your favorite café and make sure it&amp;#039;s at a bike-friendly distance. That&amp;#039;s our travel-time search.&lt;/p&gt;
&lt;p&gt;The travel-time search sat in its own corner of the site, a room with its own door, and a very small percentage of our visitors ever found it.&lt;/p&gt;
&lt;p&gt;The reading of a number like that is a straight line. Nobody uses it, so nobody wants it, so stop spending on it. Delete it in the next cleanup or, if someone feels generous, redesign it and hope.&lt;/p&gt;
&lt;p&gt;What stopped me was a second number.&lt;/p&gt;
&lt;h2&gt;The number underneath&lt;/h2&gt;
&lt;p&gt;The travel-time search opened with an introduction: a headline, a paragraph of explanation and a Start button. Most people stopped there. Some pressed Start but still left the address box empty.&lt;/p&gt;
&lt;p&gt;Entering a place was where the work began. You then had to choose how you travel, set a maximum travel time and pick a type of home. Four steps before you saw a single result.&lt;/p&gt;
&lt;p&gt;Yet of the people who typed in a place between June and mid-September this year, 97 percent finished all four steps.&lt;/p&gt;
&lt;p&gt;Effort is the signal. When people push through four steps to get one specific answer, they are telling you they want that answer, and they are paying for it in patience.&lt;/p&gt;
&lt;p&gt;That 97 percent is where low usage split in two for me. Low usage can mean people try the thing and leave. Then you need to find out what made them stop before you send more people into it.&lt;/p&gt;
&lt;p&gt;Or it can mean people never reach the thing, and the ones who start for real finish it. Then you have a reason to test a better way in before you write the feature off.&lt;/p&gt;
&lt;p&gt;In your product the first kind is the accounts that open the feature once and never again. The second kind is the feature several clicks deep that the few accounts who know about it use every week.&lt;/p&gt;
&lt;p&gt;On a usage chart those two look identical. They tell you to investigate different problems.&lt;/p&gt;
&lt;figure&gt;&lt;picture&gt;&lt;source media=&quot;(max-width: 600px)&quot; srcset=&quot;https://bart.consulting/images/blog/demand-vs-discoverability/03-two-kinds-mobile.webp&quot; /&gt;&lt;img src=&quot;https://bart.consulting/images/blog/demand-vs-discoverability/03-two-kinds.webp&quot; alt=&quot;Two features with the same small number of people finishing. In one, many people reach it and leave. In the other, almost nobody reaches it and 97 percent of those who start finish.&quot; loading=&quot;lazy&quot; /&gt;&lt;/picture&gt;&lt;figcaption&gt;Two features with the same small number of people finishing. In one, many people reach it and leave. In the other, almost nobody reaches it and 97 percent of those who start finish.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;I have cut a feature on the straight-line reading before. We once had a home dossier that showed you your home and all freely available information about it. I cut it on the usage number alone. I never asked how many people had reached it, and I still don&amp;#039;t know which of the two problems it had.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Low usage is not a verdict. Find where you lose people.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;The fixes we had already tried&lt;/h2&gt;
&lt;p&gt;Once you decide to keep a feature like this, the instinct is to polish it. Shorten the steps. Rewrite the copy. Run an A/B test on the button.&lt;/p&gt;
&lt;p&gt;We had been polishing for years.&lt;/p&gt;
&lt;p&gt;Six weeks after the site launched in 2023, our own review called the travel-time search not intuitive enough. We reworked it and released it again at the end of 2024. In 2025 it got its own homepage, a button on the property pages and a campaign on social media. This year it got its own ad on our results pages.&lt;/p&gt;
&lt;p&gt;We had improved the tool and advertised its door. After both, the search still reached almost nobody.&lt;/p&gt;
&lt;p&gt;Most of the people who did reach the search were already on Spotto. We sent them to a separate screen, and most people who landed on it never got past its first page. So even the door people did find led away from what they were doing.&lt;/p&gt;
&lt;p&gt;Shortening the form would improve the part almost nobody abandoned once they had started. Our biggest loss came before that.&lt;/p&gt;
&lt;p&gt;The homepage, the button, the campaign and the ad all said some version of &amp;quot;search by travel time&amp;quot;. Each advertised another way to search. None put the travel time on the homes people were already browsing.&lt;/p&gt;
&lt;h2&gt;What the people who found it were worth&lt;/h2&gt;
&lt;p&gt;The finish rate gave me a reason to challenge deletion. To judge whether more investment made sense, I compared the people who had used the travel-time search with everyone else.&lt;/p&gt;
&lt;p&gt;Among registered house-hunters who had saved a search, the ones who saved a travel-time search looked at two and a half times as many homes. They kept more favourites, stayed longer and came back more often, weeks and months later. The same pattern of engagement and retention showed up in three separate sets of records, on every measure I had. They contacted estate agents at about the same rate as other people who saved a search.&lt;/p&gt;
&lt;figure&gt;&lt;picture&gt;&lt;source media=&quot;(max-width: 600px)&quot; srcset=&quot;https://bart.consulting/images/blog/demand-vs-discoverability/04-more-homes-mobile.webp&quot; /&gt;&lt;img src=&quot;https://bart.consulting/images/blog/demand-vs-discoverability/04-more-homes.webp&quot; alt=&quot;People who saved a travel-time search, compared with everyone else who saved a search, on eight measures: they looked at two and a half times as many homes, kept about twice as many favourites and came back more often.&quot; loading=&quot;lazy&quot; /&gt;&lt;/picture&gt;&lt;figcaption&gt;People who saved a travel-time search, compared with everyone else who saved a search, on eight measures: they looked at two and a half times as many homes, kept about twice as many favourites and came back more often.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;People who found a hidden tool and saved a search were already committed house-hunters. Was the tool helping them, or were they simply more committed to begin with? To get closer to an answer, I compared similar users. Travel-time users still looked at more homes, but the difference in return visits was less certain.&lt;/p&gt;
&lt;h2&gt;So we built more of it&lt;/h2&gt;
&lt;p&gt;We didn&amp;#039;t polish it and we didn&amp;#039;t cut it. We removed the door.&lt;/p&gt;
&lt;p&gt;Travel time no longer lives only in its own corner of Spotto. We changed it from a separate search people run into something they have: their own saved places. Every home they look at now shows the travel time to those places.&lt;/p&gt;
&lt;figure&gt;&lt;picture&gt;&lt;source media=&quot;(max-width: 600px)&quot; srcset=&quot;https://bart.consulting/images/blog/demand-vs-discoverability/01-door-vs-line-mobile.webp&quot; /&gt;&lt;img src=&quot;https://bart.consulting/images/blog/demand-vs-discoverability/01-door-vs-line.webp&quot; alt=&quot;Spotto&amp;#039;s travel-time search on a phone, before and after: an intro screen on a page of its own, against a listing that shows the travel minutes, with the line &amp;#039;3 min naar Werk&amp;#039; magnified.&quot; loading=&quot;lazy&quot; /&gt;&lt;/picture&gt;&lt;figcaption&gt;Spotto&amp;#039;s travel-time search on a phone, before and after: an intro screen on a page of its own, against a listing that shows the travel minutes, with the line &amp;#039;3 min naar Werk&amp;#039; magnified.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;You add your places, work, school, the sports club, and every listing on the site shows a line with how long it takes you to get there. If you haven&amp;#039;t added a place yet, the listing shows the line anyway, with a question mark where the minutes should be. Tapping it is the way in.&lt;/p&gt;
&lt;p&gt;The question mark on the listing matters. You are looking at a home, and the missing answer is how long it would take you to get to work from there. The reason to use the feature appears inside the decision you are already making.&lt;/p&gt;
&lt;p&gt;The feature works without an account and stays on your device. The account is offered as the way to keep your places everywhere, on all devices.&lt;/p&gt;
&lt;figure&gt;&lt;picture&gt;&lt;source media=&quot;(max-width: 600px)&quot; srcset=&quot;https://bart.consulting/images/blog/demand-vs-discoverability/02-transition-mobile.webp&quot; /&gt;&lt;img src=&quot;https://bart.consulting/images/blog/demand-vs-discoverability/02-transition.webp&quot; alt=&quot;Four steps on a phone: every listing asks with a question mark, one short form, every listing answers with the minutes, and the map shows your reach.&quot; loading=&quot;lazy&quot; /&gt;&lt;/picture&gt;&lt;figcaption&gt;Four steps on a phone: every listing asks with a question mark, one short form, every listing answers with the minutes, and the map shows your reach.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Why something you keep, and not just a better-placed search? A saved workplace makes the next visit useful immediately: new listings already show whether the commute fits. We wanted to give people a reason to return, with a search that already knew what mattered to them.&lt;/p&gt;
&lt;h2&gt;What will tell us we were wrong&lt;/h2&gt;
&lt;p&gt;We wanted to know whether wider use of the feature would translate into more homes viewed and more return visits across the site. We wrote down how we would judge those changes before we saw any results.&lt;/p&gt;
&lt;p&gt;More people adding places is not enough. The investment was meant to change how people use the site and whether they return. If adoption grows without those outcomes improving, we have not made the case for spending more on it.&lt;/p&gt;
&lt;h2&gt;What to do this week&lt;/h2&gt;
&lt;p&gt;Before you write off a feature for low usage, follow people through it. How many reach it, and how many of those who begin actually finish? That tells you where to look next.&lt;/p&gt;
&lt;p&gt;If people start and leave, find out where and why before sending more people in.&lt;/p&gt;
&lt;p&gt;If few people reach the feature but those who start finish, test the way in before you throw the feature away. Look for the moment in the existing product where someone needs its answer. Before you build, write down what outcome would justify the investment. More people finding the feature is only the beginning.&lt;/p&gt;
&lt;p&gt;If you have a feature like this and want to talk through what the two numbers say, I&amp;#039;m happy to spend 30 minutes on it. No pitch. Just an honest look at what you&amp;#039;re dealing with. &lt;a href=&quot;https://calendly.com/bart-pinnock/bart-consulting&quot; rel=&quot;noopener noreferrer&quot;&gt;Book a call here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I spent almost 10 years on the boundary between deciding what to build and actually shipping it, as a product and delivery lead. Now I run a consulting practice around that, and I write about the patterns every week.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;The figures come from Spotto&amp;#039;s own analytics between May and September 2026 and its platform records for the year before, rounded. The comparisons set people who found a hidden tool against everyone else. They say what those people did, not what the tool did to them. Visitor figures are undercounts because of cookie consent.&lt;/em&gt;&lt;/p&gt;</content:encoded></item><item><title>Finish dates don&apos;t exist. Odds do.</title><link>https://bart.consulting/blog/finish-dates-dont-exist/</link><guid isPermaLink="true">https://bart.consulting/blog/finish-dates-dont-exist/</guid><description>A software estimate is not a finish date. Public data from three projects shows why deadlines need probabilities, not promises.</description><pubDate>Wed, 02 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;I checked 14,210 tasks. Then I tried to prove myself wrong.&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;A software feature does not have a finish date. It has a range of possible ones, and a chance attached to each.&lt;/p&gt;
&lt;p&gt;I know because I spent my summer evenings reconstructing all 14,210 tasks from one of the best-documented software projects I could find, which is hard to explain at parties.&lt;/p&gt;
&lt;p&gt;I started because of a question I keep hearing in the companies I work with, usually from sales, sometimes from marketing, always at high volume: why is the development team so slow? A date slips. A deal wobbles. Development is asked for a new estimate, and this time, please, one we can actually rely on.&lt;/p&gt;
&lt;p&gt;Underneath that request sits an assumption: every feature has one correct duration, and a good-enough team can find it.&lt;/p&gt;
&lt;p&gt;It can&amp;#039;t. Not because the team isn&amp;#039;t good enough. Because the duration isn&amp;#039;t there to be found.&lt;/p&gt;
&lt;h2&gt;The cleanest records I could find&lt;/h2&gt;
&lt;p&gt;High in the Chilean Andes stands the Vera C. Rubin Observatory. Its software teams spent more than a decade building the systems that turn a nightly flood of sky images into science. The work had federal funding, formal controls, external scrutiny, and more documentation than most companies will ever produce. Because it is science, the project also left unusually complete public records.&lt;/p&gt;
&lt;p&gt;Its handbook described a simple five-step process: plan the work, build it, review it, approve it, done. I reconstructed six years of its records and checked how the work actually moved.&lt;/p&gt;
&lt;p&gt;Only 3,853 of 14,210 tasks, or 27 percent, followed those five steps in the prescribed order. The others strayed, most of them onto one of 175 other routes. If we cannot even know which route the work will take, an exact arrival time is already suspect.&lt;/p&gt;
&lt;figure&gt;&lt;picture&gt;&lt;source media=&quot;(max-width: 600px)&quot; srcset=&quot;https://bart.consulting/images/blog/finish-dates-dont-exist/routes-handbook-fractures-mobile.webp&quot; /&gt;&lt;img src=&quot;https://bart.consulting/images/blog/finish-dates-dont-exist/routes-handbook-fractures.webp&quot; alt=&quot;The routes taken by 14,210 tasks. The official route accounts for 27 percent when followed step by step.&quot; loading=&quot;lazy&quot; /&gt;&lt;/picture&gt;&lt;figcaption&gt;The routes taken by 14,210 tasks. The official route accounts for 27 percent when followed step by step.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;But that comparison is unfair. These were thousands of different tasks. Some were inevitably larger or stranger than others.&lt;/p&gt;
&lt;p&gt;So I made it stricter.&lt;/p&gt;
&lt;h2&gt;The estimate was the same. The time wasn&amp;#039;t.&lt;/h2&gt;
&lt;p&gt;I looked only at the same kind of development work. Then only at tasks the developers had given exactly the same estimate. Then only at tasks whose estimate was never changed. Finally, only at tasks that followed the handbook&amp;#039;s five steps in order. That left 880 tasks that looked about as comparable as real software work gets.&lt;/p&gt;
&lt;p&gt;More than a third of those 880 tasks were finished within a day, and half within three days. But fourteen in every hundred were still unfinished after thirteen days. Five in every hundred were still unfinished after twenty-eight.&lt;/p&gt;
&lt;p&gt;Same kind of work. Same estimate. Same process. Radically different finish times.&lt;/p&gt;
&lt;figure&gt;&lt;picture&gt;&lt;source media=&quot;(max-width: 600px)&quot; srcset=&quot;https://bart.consulting/images/blog/finish-dates-dont-exist/completion-times-a-dots-race-mobile.webp&quot; /&gt;&lt;img src=&quot;https://bart.consulting/images/blog/finish-dates-dont-exist/completion-times-a-dots-race.webp&quot; alt=&quot;Of every hundred comparable observatory tasks, how many finished on each day: 36 within a day, half by day 3, fourteen still going at day 13, five at day 28.&quot; loading=&quot;lazy&quot; /&gt;&lt;/picture&gt;&lt;figcaption&gt;Of every hundred comparable observatory tasks, how many finished on each day: 36 within a day, half by day 3, fourteen still going at day 13, five at day 28.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;There was an obvious objection. This was scientific software built for an observatory. Maybe ordinary commercial software behaves differently. So I repeated the analysis on two projects run by commercial software companies: the system MongoDB uses to test software changes, and Appcelerator Studio, a tool for building mobile apps. Their teams estimated differently and followed different processes. The exact numbers changed.&lt;/p&gt;
&lt;p&gt;The pattern did not.&lt;/p&gt;
&lt;p&gt;Even when I compared work with the same estimate that followed the same route from start to finish, the slower tasks still took several times longer than the typical one.&lt;/p&gt;
&lt;p&gt;Larger estimates generally did take longer, so the developers were not picking numbers out of a hat. The estimate contained useful information.&lt;/p&gt;
&lt;p&gt;It just wasn&amp;#039;t a finish date.&lt;/p&gt;
&lt;figure&gt;&lt;picture&gt;&lt;source media=&quot;(max-width: 600px)&quot; srcset=&quot;https://bart.consulting/images/blog/finish-dates-dont-exist/same-estimate-weeks-apart-mobile.webp&quot; /&gt;&lt;img src=&quot;https://bart.consulting/images/blog/finish-dates-dont-exist/same-estimate-weeks-apart.webp&quot; alt=&quot;In the observatory data, for recorded sizes from 1 to 10, the halfway point generally moves later but the range to 95 percent finished remains wide.&quot; loading=&quot;lazy&quot; /&gt;&lt;/picture&gt;&lt;figcaption&gt;In the observatory data, for recorded sizes from 1 to 10, the halfway point generally moves later but the range to 95 percent finished remains wide.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2&gt;How a reasonable estimate becomes an unreasonable promise&lt;/h2&gt;
&lt;p&gt;Now scale that up. A feature on the roadmap is a hundred tasks like these, estimated one by one, added together, divided across the team. Twelve weeks, say. The result feels mathematical. It isn&amp;#039;t a forecast.&lt;/p&gt;
&lt;p&gt;A feature is not finished when its typical task is finished. It is finished when its last necessary task is finished. The last tasks are where the range becomes painful. In the observatory data, five in every hundred were still open after twenty-eight days, on work that usually took three.&lt;/p&gt;
&lt;p&gt;That is how a hundred individually reasonable estimates produce one deeply unreliable date. The twelve-week date may be possible. The calculation simply hasn&amp;#039;t told us how likely it is.&lt;/p&gt;
&lt;h2&gt;One date hides the decision&lt;/h2&gt;
&lt;p&gt;This is where development dates go wrong. Development gives its best estimate. Product puts it on the roadmap. Marketing plans a launch. Sales tells a client. Finance starts expecting the revenue.&lt;/p&gt;
&lt;p&gt;At every step, the uncertainty falls away.&lt;/p&gt;
&lt;p&gt;What began as &amp;quot;probably around October&amp;quot; becomes &amp;quot;October&amp;quot; and eventually &amp;quot;promised for October.&amp;quot; When October passes, development is called slow. It wasn&amp;#039;t. The team was asked to be certain about something that was never certain, and then blamed when the odds came due.&lt;/p&gt;
&lt;p&gt;One date never removed the uncertainty. It only hid it.&lt;/p&gt;
&lt;p&gt;The better question is not &amp;quot;When will it be finished?&amp;quot;&lt;/p&gt;
&lt;p&gt;It is &amp;quot;What is the chance it will be finished by the date we need?&amp;quot;&lt;/p&gt;
&lt;p&gt;Development can show that chance. The business must decide whether it is good enough.&lt;/p&gt;
&lt;p&gt;A date used for internal planning can carry more risk than a date written into a client contract. A launch can move. A regulatory deadline cannot. Sometimes the right answer is a later date. Sometimes it is less scope. Sometimes the opportunity is worth the gamble. That is not a decision development should quietly make on behalf of the company.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Development should forecast. The business should commit.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Put the risk back into the conversation&lt;/h2&gt;
&lt;p&gt;I can hear the objection: if development only ever gives a chance, nobody can be held to anything anymore. The opposite is true. A forecast can be checked against what eventually happens. If dates described as highly likely keep failing, either the forecast is bad or the way the team works has changed, and both are visible. That is better accountability than arguing afterwards about who said what in a planning meeting.&lt;/p&gt;
&lt;p&gt;Your current roadmap already contains risk. Your client promise already has a chance of being broken. Your launch date already has a chance of slipping.&lt;/p&gt;
&lt;p&gt;You just cannot see it yet.&lt;/p&gt;
&lt;p&gt;&amp;quot;Why is development so slow?&amp;quot; usually has a better answer than &amp;quot;the developers.&amp;quot; Someone turned a probability into a promise, and the promise broke.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;If you want the chance behind a date you&amp;#039;re about to promise, I compute it from the records your team already keeps. No workshop, no new method, no new estimate.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://bart.consulting/scan/&quot; rel=&quot;noopener noreferrer&quot;&gt;See the chance behind your deadline&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;This analysis uses public records from three software projects: the Vera C. Rubin Observatory&amp;#039;s Data Management software, MongoDB&amp;#039;s Evergreen continuous-integration system, and Appcelerator Studio. The 14,210-task example and figures come from the observatory project. I repeated the completion-time comparison separately on two projects run by commercial software companies after reconstructing how each task moved from start to finish and separating finished tasks from cancelled ones. The conclusion held across all three. These are historical outcomes, not guaranteed future results.&lt;/em&gt;&lt;/p&gt;</content:encoded></item><item><title>The founder is the bottleneck. (Yes, you.)</title><link>https://bart.consulting/blog/founder-is-the-bottleneck/</link><guid isPermaLink="true">https://bart.consulting/blog/founder-is-the-bottleneck/</guid><description>Being the bottleneck feels exactly like being indispensable. A 5-minute audit to find out which one you are.</description><pubDate>Fri, 17 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;If you founded a software company and now spend more time in Jira and meetings than in the product and with your clients, this one is for you.&lt;/p&gt;
&lt;p&gt;If you work at a company you didn&amp;#039;t start, skip it. This isn&amp;#039;t your post.&lt;/p&gt;
&lt;p&gt;Being the bottleneck in your own company feels exactly like being indispensable.&lt;/p&gt;
&lt;p&gt;You&amp;#039;re in every meeting because you&amp;#039;re needed. Copied on every decision because you matter. Asked because your team respects your judgment.&lt;/p&gt;
&lt;p&gt;All of that is also true of a bottleneck.&lt;/p&gt;
&lt;p&gt;A bottleneck is, by definition, the most critical node in the system. That&amp;#039;s what makes it the bottleneck. And for the system to improve, you have to &lt;em&gt;deliberately make yourself less critical&lt;/em&gt;, which isn&amp;#039;t a leadership skill anyone teaches.&lt;/p&gt;
&lt;h3&gt;What&amp;#039;s actually happening&lt;/h3&gt;
&lt;p&gt;In every small tech company I&amp;#039;ve been part of, missed deadlines get blamed on the usual suspects: wrong hires, bad estimates, scope creep, unclear priorities.&lt;/p&gt;
&lt;p&gt;All of those are real. None of them are the root cause.&lt;/p&gt;
&lt;p&gt;The root cause is upstream. The founder is the single point of failure in the delivery system. Every priority call, every &amp;quot;what should I work on next,&amp;quot; every status question routes through them. The team isn&amp;#039;t broken. It&amp;#039;s working exactly as designed.&lt;/p&gt;
&lt;p&gt;And the design isn&amp;#039;t your fault. It grew out of the early days, when you genuinely did need to be in every conversation. That pattern was correct at five people. At twenty-five, it just never got replaced, and now it&amp;#039;s the default for how the company runs.&lt;/p&gt;
&lt;p&gt;Every delivery consultant you&amp;#039;ve hired to fix this has been solving the wrong variable, because the variable is upstream of process. No amount of better standups fixes a routing problem.&lt;/p&gt;
&lt;h3&gt;The 5-minute audit&lt;/h3&gt;
&lt;p&gt;Six questions. Answer them from evidence, not from instinct.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. The Slack test.&lt;/strong&gt; Open your team&amp;#039;s main channel. Scroll your last 20 DMs. How many end with someone waiting on your decision or your input?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. The Friday question.&lt;/strong&gt; This Friday, ask the person most likely to run things if you stepped back: &lt;em&gt;&amp;quot;If I dropped dead tomorrow, what&amp;#039;s the first thing that breaks?&amp;quot;&lt;/em&gt; Their face, in the second before they answer, is the real data.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. The vacation test.&lt;/strong&gt; Think about the last full week you took off. When you came back, was there a pile of decisions waiting for you? Or had the team made them without you?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. The client-email test.&lt;/strong&gt; When a client emails &lt;em&gt;&amp;quot;when will X be ready?&amp;quot;&lt;/em&gt;, does it come to you first? Or does someone on your team feel entitled to answer without forwarding?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5. The calendar test.&lt;/strong&gt; Look at your last 10 working days. How many hours were in meetings where you were the decision the room was waiting on, versus meetings where you were just the context?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;6. The &amp;quot;blocked&amp;quot; test.&lt;/strong&gt; Without asking anyone, can you name the three things currently blocked on your team and who&amp;#039;s unblocking them? If yes, you&amp;#039;re running delivery. If no, nobody is.&lt;/p&gt;
&lt;p&gt;If three or more of these produce uncomfortable answers, the rest of this post is for you.&lt;/p&gt;
&lt;p&gt;If you want the data version of this audit, not gut feel but actual probabilities, that&amp;#039;s what a &lt;a href=&quot;https://bart.consulting/how-the-audit-works/&quot; rel=&quot;noopener noreferrer&quot;&gt;delivery risk scan&lt;/a&gt; does: it reads the work your team has already finished and works out the chance of each deadline landing.&lt;/p&gt;
&lt;h3&gt;Not every founder-hour is a bottleneck-hour&lt;/h3&gt;
&lt;p&gt;Before we talk about the fix, a distinction worth making. There are two kinds of founder-involvement, and they get conflated all the time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Leadership-involvement&lt;/strong&gt; is deliberate. You&amp;#039;re in the meeting because you&amp;#039;re choosing direction, shaping culture, or making a call only you can make. That&amp;#039;s the job.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bottleneck-involvement&lt;/strong&gt; is reactive. You&amp;#039;re in the conversation because the question is in front of you, and nobody else feels empowered to answer. That&amp;#039;s the problem.&lt;/p&gt;
&lt;p&gt;Most founders can&amp;#039;t tell which is which in real time. A simple test: at the end of each conversation, ask yourself. &lt;em&gt;Did I move something that couldn&amp;#039;t have moved without me? Or did I just clear a queue?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;If the honest answer is &amp;quot;cleared a queue&amp;quot; most days, you have your diagnosis.&lt;/p&gt;
&lt;h3&gt;Why the obvious fix makes things worse&lt;/h3&gt;
&lt;p&gt;The most common attempt I&amp;#039;ve seen to solve this is to go dark.&lt;/p&gt;
&lt;p&gt;Turn off notifications. Set &amp;quot;schedule time with me for decisions.&amp;quot; Announce to the team: &lt;em&gt;&amp;quot;I need deep work, don&amp;#039;t ping me unless it&amp;#039;s urgent.&amp;quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;It feels like leadership. Protecting focus. Forcing delegation.&lt;/p&gt;
&lt;p&gt;It isn&amp;#039;t. Here&amp;#039;s what actually happens.&lt;/p&gt;
&lt;p&gt;Questions don&amp;#039;t disappear. They pile up somewhere else, or they die. A new hire has a question, doesn&amp;#039;t want to bother you, guesses instead. A senior engineer hits an ambiguous call, can&amp;#039;t reach you, sits on it for a day. The team stops asking &lt;em&gt;&amp;quot;is this important enough to interrupt him,&amp;quot;&lt;/em&gt; learns that the answer is almost never yes, and stops escalating.&lt;/p&gt;
&lt;p&gt;The bottleneck doesn&amp;#039;t move. It becomes invisible. Things just don&amp;#039;t happen, and nobody can quite say why.&lt;/p&gt;
&lt;p&gt;Going dark doesn&amp;#039;t fix the routing. It breaks it silently.&lt;/p&gt;
&lt;h3&gt;What it looks like on the other side&lt;/h3&gt;
&lt;p&gt;Founders who build companies that outlast them eventually reach a version of this.&lt;/p&gt;
&lt;p&gt;Your team still checks in with you often. You want them to. The difference is &lt;em&gt;how&lt;/em&gt; they check in. They don&amp;#039;t arrive with raw questions. They arrive with a thesis. &lt;em&gt;&amp;quot;We&amp;#039;re missing this piece of information. I think the answer is X. Do you agree?&amp;quot;&lt;/em&gt; You say yes, or no, or &amp;quot;have you considered Y.&amp;quot; Thirty seconds later, they go execute. Something moved.&lt;/p&gt;
&lt;p&gt;Over time, this is also how they learn to think. Every time they bring you a prepared thesis instead of a raw question, they&amp;#039;re practicing the judgment you&amp;#039;d apply yourself. That&amp;#039;s how your best people grow into people you can trust with real calls.&lt;/p&gt;
&lt;p&gt;You spend your week on product, strategy, clients, and the hires that will shape the next two years. Not on routing.&lt;/p&gt;
&lt;p&gt;This takes longer than you want. The first months feel worse, because every time your team brings you a raw question you have to resist answering and coach the pattern instead. It doesn&amp;#039;t flip overnight. I&amp;#039;ve been working on this pattern in my own teams for years. People still drift back to raw questions when things get stressful. The difference isn&amp;#039;t that it becomes automatic. The difference is how fast they correct.&lt;/p&gt;
&lt;h3&gt;What actually works&lt;/h3&gt;
&lt;p&gt;Fixing the bottleneck isn&amp;#039;t about you being less available. It&amp;#039;s about the system being able to route around you, and about shaping how it routes &lt;em&gt;to&lt;/em&gt; you when it does.&lt;/p&gt;
&lt;p&gt;Three changes, in order:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;One person, not you, decides what the team works on next when priorities collide.&lt;/strong&gt; This is a sequencing call, not a strategy call. Most founders conflate the two and own both. Only own the strategy one.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The answer to &amp;quot;what&amp;#039;s the status of X&amp;quot; never comes from you.&lt;/strong&gt; If it does today, it&amp;#039;s because you&amp;#039;re the only one who knows, which is the problem in miniature.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Shape how your team brings you problems.&lt;/strong&gt; You want them to check in. You just don&amp;#039;t want raw questions. Teach them the pattern: &lt;em&gt;here&amp;#039;s what I&amp;#039;m missing, here&amp;#039;s what I think the answer is, do you agree?&lt;/em&gt; You say yes, no, or &amp;quot;consider X.&amp;quot; Thirty seconds, they go execute. Over months, this is how they learn to make the call themselves.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;None of these require new hires. All of them require you to stop doing something you currently do, which is harder than hiring anyone.&lt;/p&gt;
&lt;h3&gt;What to do this week&lt;/h3&gt;
&lt;p&gt;Start with the Friday question.&lt;/p&gt;
&lt;p&gt;Pick the person most likely to run things if you stepped back. Ask them: &lt;em&gt;&amp;quot;If I dropped dead tomorrow, what&amp;#039;s the first thing that breaks?&amp;quot;&lt;/em&gt; Don&amp;#039;t coach the answer. Don&amp;#039;t rebut. Write down what they say, word for word.&lt;/p&gt;
&lt;p&gt;That&amp;#039;s your roadmap for the next 90 days, in priority order.&lt;/p&gt;
&lt;p&gt;If you ran the audit and want to talk through what came up, I&amp;#039;m happy to spend 30 minutes on it. No pitch. Just an honest look at what you&amp;#039;re dealing with. &lt;a href=&quot;https://bart.consulting/contact/&quot; rel=&quot;noopener noreferrer&quot;&gt;Book a call here.&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;I spent almost 10 years inside this problem as a product and delivery lead. Now I&amp;#039;m building a consulting practice around fixing it. I&amp;#039;m writing about the patterns as I go. If you want to follow along come back next week!&lt;/em&gt;&lt;/p&gt;</content:encoded></item></channel></rss>