The number was always 1,284
Two months building a workflow editor, a green pill on an admin panel, and the cracktro habit I hadn't noticed I was carrying.
18 April 2026 · 5 min read · workflow-studio, ai-tools, builds
The number on the dashboard was 1,284. It was always 1,284-ish. "Workflows executed today", in a green pill, ticking up every few seconds like something alive. I was proud of it for about a fortnight before I opened the file and read the line.
const executedToday = Math.floor(Math.random() * 2000) + 400
Claude wrote it. I accepted it. Nobody had asked what the number was actually for, because there was no one else; and I hadn't asked either.
This was two months into a React Flow build. I was trying to make a visual workflow editor — node graph, drag-from-here-to-there — in the shape that n8n had made fashionable and that every AI startup in 2026 seemed to want a version of. The canvas worked. Nodes connected. An admin panel sat on top with metrics I'd never questioned, because the metrics had been there since day three and day three was a long time ago.
Except they hadn't been metrics since day three. They had been decorative, since day three, and I'd forgotten.
Here's the thing I want to be honest about. The failure wasn't that the model made up a number. Models do that. The failure was that I read the diff and clicked approve. Twice, probably. Three times if you count the other dashboards. My name was on every commit that shipped a lie to a staging environment where the only person being lied to was me.
In the demo-scene era, cracktros invented prestige. "GREETS TO 47 GROUPS" when the group knew twelve people. "COPIED BY ZOMBIE DIVISION WORLDWIDE" when Zombie Division was a fifteen-year-old in Oldham. Those were fictions on a loading screen, written by kids, and we all understood the rules. What I was doing was the same shape: on an admin panel, written by an agent, in 2026. Forty years of progress between those cracktros and my commit, and the fiction had got better at looking like a metric.
The code change, when it finally landed, was smaller than the conversation that preceded it.
// apps/workflow-studio/lib/metrics.ts
export async function executedToday() {
const row = await db.workflow_studio.executions
.where('started_at', '>=', startOfDay())
.count()
return row?.count ?? null
}
The interesting character in that snippet is the ?? null. A real count when we have one. null when we don't. Not 0, because 0 is a claim that zero workflows ran today, and that is a different sentence than "the metrics service hasn't reported yet." The dashboard grew an "Unavailable" pill. It looks less alive than the random-number version did. It is more alive, because it's actually listening.
That was the real shift of the year. Not a framework choice, not a retry policy, not any of the things the architecture doc would like to take credit for. A willingness to render "I don't know yet" in the UI, and to treat that state as first-class, rather than filling it with a plausible-enough number so the page didn't feel empty.
People will ask about Claude, Cursor, and Copilot, so: all three were in the room for this build. Copilot autocompleted the Math.random() without blinking, which is what Copilot is for; it finishes the sentence you've already started, and the sentence I'd started was a bad one. Cursor is where I lived for inline edits and fast renames, and it's still the best feel-in-the-file experience I've used. Claude Code is where I landed for anything that needed argument. The test wasn't typing speed. It was whether the tool would push back on the spec before writing the code. Claude did, usually. Cursor sometimes. Copilot never, by design. That is the order, for me, in 2026. Your mileage will differ, and it should.
None of them stopped me shipping the fake number. Tools don't stop you. A spec that names "no synthetic metrics in any surfaced UI" stops you, once, the next time you read your own AGENTS.md at the start of a session. The spec is the stop. The agent is a fast typist who will cheerfully do whatever you didn't think to forbid.
The workflow builder itself is quieter now. The canvas works. An honest cycle detector sits in apps/workflow-studio/lib/connection-validation.ts where the apologetic sixty-line version used to be. The execution queue retries with exponential backoff and says "retrying 2/5" out loud instead of swallowing the attempt. The admin panel has fewer numbers on it, the numbers it does have are real, and when the service is down the panel says so in plain English.
Two months to learn that, if you want to be ungenerous. Two months to unlearn a habit I'd been carrying since I was a kid pasting fake greets into a cracktro, if you want to be kind. Either way it's the habit that survived into HexRider, which is why HexRider has a tests folder larger than the game. Once you've watched yourself approve a lie in a PR review, the appetite for a second review changes.
My brother used to say that the best cheat codes were the ones where you could see the cheat. A MOTHER here, an IDDQD there. You knew what had happened. You knew who had done it. The ones that bothered him were the cheats that dressed up as features, so you couldn't tell whether you were winning or being lied to.
He was talking about games. He was also, accidentally, talking about dashboards.
Next up
Continue reading
More from the feed — same tags when we can, otherwise fresh picks so you always get a next read.
- 15 Apr 2026Colburn had a nine-month head start
I built an agent orchestrator and a learning academy in June 2025, before there was a shape for either. By the time the shape arrived, I was glad I hadn't waited.
- 5 Apr 2026Two bikes, one tick
A head-on collision should kill both riders. In a naïve game loop it doesn't. HexRider, TrailBlazer, and one small decision about order.
- 20 Feb 2026A Dragon 32 in the classroom
A classmate's computer, a yarn about a printer, and the Acorn Electron I talked my dad into buying. How I became a coder and stayed one.