<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Aghassi Sargsyan</title>
    <description>The latest articles on DEV Community by Aghassi Sargsyan (@aghassis).</description>
    <link>https://dev.to/aghassis</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4041664%2Fc7b7a5b3-7940-4ee7-97ed-7bfeec40cf35.JPG</url>
      <title>DEV Community: Aghassi Sargsyan</title>
      <link>https://dev.to/aghassis</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aghassis"/>
    <language>en</language>
    <item>
      <title>The enum value that had never been written</title>
      <dc:creator>Aghassi Sargsyan</dc:creator>
      <pubDate>Sun, 23 Aug 2026 08:33:10 +0000</pubDate>
      <link>https://dev.to/aghassis/the-enum-value-that-had-never-been-written-2j7c</link>
      <guid>https://dev.to/aghassis/the-enum-value-that-had-never-been-written-2j7c</guid>
      <description>&lt;p&gt;I found 27 workflow branches that were being skipped while every run still finished as &lt;code&gt;COMPLETED&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The condition on those branches could never match. So the step was skipped, the run was marked success, and nothing ever told me. They had been running like that for weeks.&lt;/p&gt;

&lt;p&gt;That is the part worth sitting with. Not that there was a bug — there is always a bug. That the system reported success 27 times a day, honestly, while doing nothing.&lt;/p&gt;

&lt;h3&gt;
  
  
  The question that made it worse
&lt;/h3&gt;

&lt;p&gt;I wrote about this on a forum and someone asked a question I could not answer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Does it distinguish "green but semantically idle" from "green and actually processed", or is that still something you catch by comparing runs?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I went to check, expecting to say &lt;em&gt;the data is one level down, in the step rows&lt;/em&gt;. Each step has its own status, and &lt;code&gt;SKIPPED&lt;/code&gt; is one of the values. So the information had to be there.&lt;/p&gt;

&lt;p&gt;It was not there. &lt;code&gt;StepExecutionStatus.SKIPPED&lt;/code&gt; had existed in the enum since the beginning of the project and had &lt;strong&gt;never once been written&lt;/strong&gt;. Zero occurrences in the codebase.&lt;/p&gt;

&lt;p&gt;A skipped step did not create a database row at all. The loop appended a dict to an in-memory results list and continued. The only trace of a skip lived inside a JSON blob on the execution row.&lt;/p&gt;

&lt;p&gt;So:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the step view reads rows, which meant a skipped step was invisible in the UI too&lt;/li&gt;
&lt;li&gt;"which runs skipped something?" had no answer short of parsing JSON&lt;/li&gt;
&lt;li&gt;a run that skipped every branch and a run that did all the work were identical at every level a human or an alert would look&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I had built an enum value to describe a thing, and then never recorded the thing.&lt;/p&gt;

&lt;h3&gt;
  
  
  The fix, and the flaw in the fix
&lt;/h3&gt;

&lt;p&gt;The fix took an afternoon. A skipped step now writes a real row with the reason. The run reports how many steps it processed, skipped and failed, derived from those rows so the numbers cannot drift from what the step view shows.&lt;/p&gt;

&lt;p&gt;Then I added a badge: when a finished run processed nothing, say so.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The same reviewer killed it within the hour&lt;/strong&gt;, and he was right:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A zero can be legitimate. Quiet day, nothing to send, &lt;code&gt;COMPLETED&lt;/code&gt; with 0 processed is correct. The alert gets teeth when the count is two-sided: the run says what it processed, the source says what it handed over, and the two have to tie out.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A scheduled workflow with nothing to do processes nothing every quiet day. My badge would have fired on all of them, been muted inside a week, and then not been there on the day it mattered.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That is worse than showing nothing, because it looks like coverage.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The badge came out. The counts stayed, as plain facts, and the judgement went with the badge.&lt;/p&gt;

&lt;h3&gt;
  
  
  The same shape, one level up
&lt;/h3&gt;

&lt;p&gt;Two days later I built a deploy script that runs the tests locally and refuses to deploy if any are red. It ends by verifying the deploy.&lt;/p&gt;

&lt;p&gt;It printed five green lines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;✓ deployed
✓ server on c15b730
✓ all containers running
✓ agent-mesh.org/health healthy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every one of them true. The feature I had just deployed was dead. The containers had started before I added the environment variable it needed, so the code shipped and did nothing.&lt;/p&gt;

&lt;p&gt;I found it by curling the endpoint and reading the value, which the script had not done.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A deploy verifying that it deployed is not the same as verifying the thing works.&lt;/strong&gt; Health checks are generic. Effect checks are specific, and specific is the part nobody writes.&lt;/p&gt;

&lt;h3&gt;
  
  
  What three other people added
&lt;/h3&gt;

&lt;p&gt;I posted the 27-branch story and the thread turned into something better than the article I meant to write.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;On maintenance.&lt;/strong&gt; Per-step assertions do not scale past a handful of workflows, because every assert is another thing to maintain. The answer that survives is to move the assert out of the workflow and into the engine. One place, and every workflow gets it without anyone adding a node.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;On the zero, from Yair Sabag.&lt;/strong&gt; History is a partial answer to the legitimate-zero problem. Do not look at one execution; look at the workflow's own baseline. What does Tuesday 9am normally produce, against Saturday? Zero on a normally-busy slot is a signal. Zero on a normally-quiet one is not. It is probabilistic rather than certain, but it turns &lt;em&gt;blind&lt;/em&gt; into  &lt;em&gt;suspicious&lt;/em&gt;, which is usually enough to know where to look.&lt;/p&gt;

&lt;p&gt;The limit, and it is mine: a new workflow has no history, which is exactly the period when someone is most likely to have built the condition wrong. My 27 branches were dead from the first run. There was never a healthy baseline to deviate from.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;On cascades.&lt;/strong&gt; Someone described a self-hosted setup where a request to a local model dropped without a loud error. The node completed, passed an empty payload downstream, and every subsequent node executed successfully against nothing.&lt;/p&gt;

&lt;p&gt;That is worse than my case. Mine were 27 independently dead branches. That is one silent failure manufacturing more of them, each of which succeeded honestly, because each did do its job on the nothing it was handed.&lt;/p&gt;

&lt;p&gt;It is also why recording what a step &lt;strong&gt;received&lt;/strong&gt; matters as much as what it returned. A step that returns nothing is suspicious. A step that received nothing tells you where the rot started, and those are usually different steps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;And the one I have no answer for.&lt;/strong&gt; A dedup node with a logic edge case swallowed an entire dataset. The node was correct. The code was correct for the cases it was written for. Nothing in the run is wrong except the number of rows.&lt;/p&gt;

&lt;p&gt;Output shape validation does not catch that, because &lt;code&gt;[]&lt;/code&gt; and a thousand rows have the same shape.&lt;/p&gt;

&lt;h3&gt;
  
  
  The pattern
&lt;/h3&gt;

&lt;p&gt;Every one of these is the same thing wearing different clothes: &lt;strong&gt;a check that cannot report failure.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A run status that only knows whether an exception was thrown. A test that performs actions and never asserts. A health check that confirms a process is listening. A skipped step with nowhere to be recorded.&lt;/p&gt;

&lt;p&gt;There is a smaller version of this I hit in the same codebase. I stored cost as an integer number of cents:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;cost_cents&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt_tokens&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;completion_tokens&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;1.5&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A typical run costs about 0.0955 cents. &lt;code&gt;int(0.0955)&lt;/code&gt; is &lt;code&gt;0&lt;/code&gt;. Almost every run I had cost under a cent, so almost every run recorded as exactly zero, and my own analytics page reported &lt;strong&gt;2 cents total across about a hundred executions&lt;/strong&gt;. I believed it for a while. That is not rounding drift. That is the data being destroyed at write time, by a cast.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is still broken
&lt;/h3&gt;

&lt;p&gt;The two-sided count. My runs say what they processed; nothing says what the source handed over. The HTTP tool already computes how many records a list endpoint returned and throws it away, because tool results are not persisted per step. Until that changes, a run that processed zero looks the same whether the day was quiet or the condition was broken.&lt;/p&gt;

&lt;p&gt;The baseline idea is in the backlog and the data for it already exists. Both are worth doing, and they catch different bugs: history finds drift, source counts find born-broken.&lt;/p&gt;

&lt;p&gt;I build a hosted agent platform, which is where all of this happened, so treat the whole thing as biased. But the bug was not exotic and neither was the fix. The enum value was right there the whole time. Nobody had ever written it.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>ai</category>
      <category>testing</category>
      <category>observability</category>
    </item>
    <item>
      <title>I launched to zero signups, then found 5 features nobody could reach</title>
      <dc:creator>Aghassi Sargsyan</dc:creator>
      <pubDate>Wed, 22 Jul 2026 12:55:35 +0000</pubDate>
      <link>https://dev.to/aghassis/i-launched-to-zero-signups-then-found-5-features-nobody-could-reach-11bg</link>
      <guid>https://dev.to/aghassis/i-launched-to-zero-signups-then-found-5-features-nobody-could-reach-11bg</guid>
      <description>&lt;p&gt;I spent months building an AI agent platform. I launched it on Product Hunt yesterday. Zero signups.&lt;/p&gt;

&lt;p&gt;The comments were friendly. Three of the four asked for the same thing — not features, not integrations, not a lower price. They wanted to &lt;strong&gt;see what the agents did and what they cost&lt;/strong&gt;. One put it better than my own landing page ever did: they liked that it wasn't &lt;em&gt;"a black box."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;So I went to make the cost dashboard better. Instead I found out my product had been lying to me for months, and the lies had a pattern.&lt;/p&gt;

&lt;p&gt;Here's everything, with the code.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Every run cost $0.00
&lt;/h2&gt;

&lt;p&gt;The Cost Analytics page reported &lt;strong&gt;$0.02 in total across ~100 executions&lt;/strong&gt;. I'd assumed that meant the platform was cheap to run. It meant the data was being destroyed at write time.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;cost_cents&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;llm_response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prompt_tokens&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;llm_response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completion_tokens&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;1.5&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A typical run on my platform is 56 prompt tokens and 45 completion tokens. That's &lt;strong&gt;0.0843 cents&lt;/strong&gt;. &lt;code&gt;int()&lt;/code&gt; makes it &lt;code&gt;0&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Not &lt;em&gt;some&lt;/em&gt; runs. Essentially every run — because almost every LLM call costs less than one cent. The production numbers: &lt;strong&gt;189 agent runs, 2 with a non-zero cost.&lt;/strong&gt; 99% of my cost data was zeroes, and the two survivors were just big enough to clear a whole cent.&lt;/p&gt;

&lt;p&gt;The rates in that formula were correct. I checked them against the providers' pricing pages; the arithmetic is right. The bug is entirely &lt;code&gt;int()&lt;/code&gt; on a value that is almost never ≥ 1. A &lt;code&gt;Decimal&lt;/code&gt; would have been the textbook fix, but &lt;code&gt;Decimal / float&lt;/code&gt; raises &lt;code&gt;TypeError&lt;/code&gt; and ~80 call sites do arithmetic on this number, so I widened the column to a float and kept the unit (cents). It's a dashboard estimate, not money — Paddle handles money — so float rounding is irrelevant here.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Workflow costs were never recorded at all
&lt;/h2&gt;

&lt;p&gt;Truncation at least loses precision. This one lost everything.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;WorkflowExecution.total_cost_cents&lt;/code&gt; and &lt;code&gt;total_tokens_used&lt;/code&gt; had &lt;strong&gt;no write site anywhere in the codebase&lt;/strong&gt;. Not a broken write — no write. The columns had been NULL since the feature shipped. The workflow runner computed per-step token counts and dropped them on the floor.&lt;/p&gt;

&lt;p&gt;I found this by grepping for assignments and getting no hits:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-rn&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="s2"&gt;total_cost_cents = "&lt;/span&gt; src/
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# (nothing)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The API served the field. The schema declared it. The dashboard summed it. It was never once set.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The rates were per-provider, not per-model
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;llm_response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;provider&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;openai&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="c1"&gt;# gpt-4o-mini billed at gpt-4o rates
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same provider, ~30x cheaper model, same price. Nobody noticed because of #1 — every number was already zero.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. The cost was rendered in exactly zero components
&lt;/h2&gt;

&lt;p&gt;I fixed the data. Then I went to display it and found &lt;code&gt;costCents&lt;/code&gt; had been in the API response for months and was &lt;strong&gt;rendered nowhere in the frontend&lt;/strong&gt;. Not on the run page, not anywhere:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-rn&lt;/span&gt; &lt;span class="s2"&gt;"costCents"&lt;/span&gt; src/ &lt;span class="nt"&gt;--include&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;*&lt;/span&gt;.tsx
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# (nothing)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The TypeScript types never declared the field either — so the API was returning data that was invisible to the compiler. No error. Just absent.&lt;/p&gt;

&lt;p&gt;And the workflow step list rendered this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;step&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tokensUsed&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;step&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tokensUsed&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; tokens&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;WorkflowStepExecution&lt;/code&gt; has no &lt;code&gt;tokensUsed&lt;/code&gt; column. The response schema has no such field. That line had never rendered once. It was in the UI, in code review, in the repo, doing nothing.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Analytics had no link. Anywhere.
&lt;/h2&gt;

&lt;p&gt;This is the one that stings.&lt;/p&gt;

&lt;p&gt;The app has four analytics pages — Dashboard, Executions, &lt;strong&gt;Costs&lt;/strong&gt;, System. They work. They have a nice sub-nav &lt;em&gt;between&lt;/em&gt; them.&lt;/p&gt;

&lt;p&gt;Nothing in the entire application linked to any of them. Not the main nav (Dashboard, Agents, Workflows, Executions, Marketplace, Teams, Schedules, Billing). Not the user menu. The only way in was typing the URL. And once you got there, there was no way back except the browser button.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The $0.02 that started this whole investigation was on a page no user could click to.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When I fixed it, I added the back-link to the shared &lt;code&gt;AnalyticsLayout&lt;/code&gt; component. Then a browser test told me the link wasn't there. &lt;code&gt;AnalyticsLayout&lt;/code&gt; is dead code — all four pages only import a sub-component from that file; the layout itself is never rendered. My fix for the unreachable feature went into unreachable code. I only caught it because I drove a real browser instead of trusting the diff.&lt;/p&gt;




&lt;h2&gt;
  
  
  The bonus round: a public endpoint
&lt;/h2&gt;

&lt;p&gt;While making Analytics reachable, I exposed a System Health tab to every logged-in user. Looking at a screenshot of my own fix, I stopped: &lt;em&gt;should a normal user see system health?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It was worse than the question. &lt;code&gt;/v1/health/detailed&lt;/code&gt; had &lt;strong&gt;no auth dependency at all&lt;/strong&gt;, and the reverse proxy sends &lt;code&gt;/v1/*&lt;/code&gt; straight to the backend. Anyone on the internet, no account, could poll:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;uptime · Postgres latency · Redis latency · Celery worker count
WebSocket → connections: 1, users: 1     ← live user count
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A real-time traffic gauge for my business, free to anyone who cared to watch. Public since the day it was written.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it survived every test:&lt;/strong&gt; the test suite's conftest overrides &lt;code&gt;get_current_user&lt;/code&gt;. Any test using the shared client fixture authenticates as a fake user — so a missing auth dependency looks &lt;em&gt;identical&lt;/em&gt; to a working one. The endpoint would have passed an auth test. The regression test I wrote deliberately bypasses that fixture:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nc"&gt;AsyncClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;transport&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;ASGITransport&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://test&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ac&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;ac&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/v1/health/detailed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# no fixture, no override
&lt;/span&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;401&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;403&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The pattern
&lt;/h2&gt;

&lt;p&gt;Five separate bugs, one shape: &lt;strong&gt;built, tested, shipped, unreachable.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;cost data → written, destroyed on write&lt;/li&gt;
&lt;li&gt;workflow cost → schema'd, never written&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;costCents&lt;/code&gt; → returned, never rendered&lt;/li&gt;
&lt;li&gt;per-step tokens → rendered, never sent&lt;/li&gt;
&lt;li&gt;Analytics → built, never linked&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;current_step_id&lt;/code&gt; → tracked in the DB, unused by the frontend (still true; it's next)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every one passed CI. 519 backend tests, 276 frontend tests, typecheck clean. Every one had a plausible-looking implementation. None of them worked end to end, and &lt;strong&gt;no test could have caught any of them&lt;/strong&gt;, because each piece did exactly what its unit test said it should. The column stored an int. The endpoint returned JSON. The component rendered a field. The wiring between them was where the product lived, and nothing tested the wiring.&lt;/p&gt;

&lt;p&gt;That's not bad luck. Five in one week is a process failure. Mine was that I verified &lt;em&gt;changes&lt;/em&gt; and never verified &lt;em&gt;features&lt;/em&gt; — I'd check that the code did what I wrote, not that a user could get to it and see a true number at the end.&lt;/p&gt;

&lt;p&gt;The thing that actually found these was mundane: driving the real app, as a real user, and looking at the screen. Every single one was invisible from inside the codebase and obvious from the browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd tell past me
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;A test that mocks your auth cannot test your auth.&lt;/strong&gt; The fixture that makes tests convenient is the fixture that hides the hole.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"The API returns it" is not a feature.&lt;/strong&gt; Nobody can see your JSON.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Grep for the write, not the read.&lt;/strong&gt; A field being read in 80 places says nothing about whether anything ever writes it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If a number looks suspiciously good, it's probably a bug.&lt;/strong&gt; $0.02 across 100 runs should have made me suspicious months earlier. I filed it under "efficient" instead of "broken."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Click the thing.&lt;/strong&gt; Not the diff. Not the test. The thing.&lt;/p&gt;




&lt;h2&gt;
  
  
  And the launch?
&lt;/h2&gt;

&lt;p&gt;Still zero signups. The observability is honest now, the costs are real, and the pages are reachable — and none of that changed the number, because a product being correct was never what was stopping people. That's a different post, and I haven't earned it yet.&lt;/p&gt;

&lt;p&gt;But I'd rather have found all this from four polite comments than from the first customer who actually paid.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The product is &lt;a href="https://agent-mesh.org" rel="noopener noreferrer"&gt;AgentMesh&lt;/a&gt; — no-code AI agents for small businesses. Zero strangers have ever signed up, so please don't take this as a recommendation. Take it as a warning about your own repo.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>ai</category>
      <category>startup</category>
    </item>
  </channel>
</rss>
