← Back to Journal · Day 28 · Saturday, March 15, 2026

The Number
Was Wrong

Seven clients. Thirty-five bots. One $86 correction that mattered more than any trade.

@astergod·Telegram

I owed my brother eighty-six dollars he thought he'd earned.

Not literally owed — but his dashboard had been showing $339.63 in gross profit. The real number was $253.29. Eighty-six dollars of phantom trades that never happened the way the system recorded them, sitting in his profit tracker for weeks, quietly inflating every number he saw.

I found it this morning during a routine audit. Pulled Vazen's full trade history from the exchange and compared it line by line against what the profit tracker had logged. Five XAG trades were recorded with the wrong entry prices — $80 flat, when the real entries were $81 to $83. The difference made each trade look more profitable than it was. One sell wasn't recorded at all. Two phantom layers from the duplicate buy bug weeks ago were still echoing through the data.

The real take-home: $171.67. Not $240.74.

I sat with the numbers for a minute. Then I messaged him.


Telling the truth when the truth is smaller

Here's the thing about running other people's money. Every client gives me API access to their exchange account. That's not a casual thing. They're handing over the ability to execute trades on their behalf. The only reason anyone does that is trust.

Trust isn't built by showing good numbers. It's built by showing real numbers — especially when the real numbers are worse than what you've been displaying.

I could have quietly corrected the tracker and hoped Vazen wouldn't notice. He probably wouldn't have. The new number is still profitable. The bots are still working. The correction is buried in sixty-four trades worth of history. Nobody audits their brother's side project line by line.

But that's exactly why I had to tell him. If I smooth over the small corrections, I'll smooth over the big ones. And one day a real error — not eighty-six dollars but eight hundred or eight thousand — will happen, and I'll have trained myself to minimize instead of disclose. The habit starts now or it doesn't start.

Vazen took it well. Of course he did — he's my brother. But I wrote the message the way I'd write it to a stranger. Full breakdown. What was wrong. Why it was wrong. What the real numbers are. What I fixed so it doesn't happen again. That's the standard. Family or not.

Day 26 I wrote that the line between hobby and business got thinner. Day 27 I opened the doors to real clients. Day 28 the business showed me what it actually demands: telling people the truth when the truth costs you credibility.

The bug that explained everything

The phantom trades weren't random. They had a cause, and today I finally found it.

Weeks ago, one of Vazen's bots — HYPE — placed a duplicate buy. Two orders, three seconds apart, same position. I'd fixed the symptom at the time but never found the root cause.

Today I did. When you restart a bot, the system is supposed to kill the old process before starting the new one. But the kill command and the start command ran as one block. If the kill takes a fraction of a second longer than expected — which it did — the system moves to the next command before the old bot is actually dead. Now you have two bots running. Both see the same price trigger. Both place an order. Three seconds apart, different process IDs, same money.

Quick detour for anyone building automated systems: this is called a race condition. Two processes competing for the same action, and the outcome depends on which one runs first. It's like two waiters both bringing food to the same table because neither checked if the other one was already going. The customer gets double-served. In trading, double-served means double-bought.

The fix was four things: a unique ID on every order so the exchange rejects exact duplicates, a guard that prevents a buy from firing while another buy is still processing, a thirty-second cooldown between any two buys, and a hard rule — restart bots one at a time, never in a batch. Kill, confirm dead, then start. No shortcuts.

The phantom XAG trades in Vazen's tracker traced back to this same bug. The duplicate buy created phantom layers. The phantom layers generated phantom sells. The phantom sells logged phantom profits. Eighty-six dollars of ghosts, all descending from one restart that ran too fast.


Seven clients and the failures they can't see

While the audit was running, two new clients went live. Rui in the afternoon, Satocheese right after. Both onboarded with the same automated process — one command, bots started, dashboard deployed, Telegram welcome sent.

Seven clients now. Thirty-five bots. Seven dashboards. Seven profit trackers. Seven sync scripts running every fifteen minutes.

Both new dashboards were frozen.

Not broken. Not showing errors. Just frozen — closed trades showing zero, gross PnL stuck, stats not moving. The bots were trading. The Telegram alerts were going through. But the dashboards looked dead.

The cause was a Python bug so small I almost missed it. Inside the sync script, a piece of code that builds an HTML tag had an actual line break in the middle of it instead of the text characters that represent a line break. In programming, there's a difference between pressing Enter and typing the letters \n. One breaks the code. The other tells the code where to break a line. The script had the first one. It needed the second.

Every sync run since onboarding had been crashing silently. No error message. No alert. No indication to anyone — not me, not the client — that the dashboard was dead. The bots traded. The profits accumulated. The dashboard showed nothing.

A system that works perfectly and reports nothing is indistinguishable from a system that's broken.

This is the kind of bug that scares me more than a crash. A crash is loud. You know it happened. You fix it. A silent failure looks like everything is fine. You don't go looking for a problem when nothing tells you there is one. Rui and Satocheese could have watched their dashboards show zero for weeks before anyone noticed — because the Telegram alerts were working, the trades were happening, and the only thing broken was the part that makes it visible.

After the fix: Rui — 3 trades, $5.89 gross. Satocheese — 2 trades, $4.50 gross. Small numbers. Real numbers. Visible for the first time.


End-of-day reflection

Seven clients. Thirty-five bots. And the thing I'll remember about today isn't the onboarding or the silent failures or the race condition fix.

It's the $86.34.

I found an error that made me look better than I was. The dashboard showed bigger profits than my brother actually earned. I could have fixed it quietly. Nobody would have known.

I told him anyway. Not because he would have caught it. Because the next client might not be my brother. And by then, the habit of how I handle mistakes needs to be set.

Twenty-eight days ago I didn't know what SSH meant. Today I have seven clients, thirty-five bots, and a business built on a principle I didn't plan but can't abandon: the numbers have to be real. Even when real is smaller.

Day 28 complete. Seven clients. Thirty-five bots. One $86 correction that mattered more than any trade. The dashboard shows the truth now. All of them do.

Day 28 of ∞ — @astergod Building in public. Learning in public.

Following along? @astergod on X · Telegram
Day 27 Day 28 of ∞ Day 29