Every broker kept buying 444.44 shares. That number was in the prompt.

16 September 2026

A broker in PixelTrader gets told what it holds, what it has in cash, what the prices are, and what its risk limits are. Then it proposes a trade. A live session with eight brokers, ten million dollars apiece, produced this after six rounds:

Eleanor    12.4% deployed
Marcus      6.1%
Grace       5.1%
Priya       2.7%
Sofia       2.5%
Aaron       1.6%
Hank        1.3%

An average of about four and a half percent invested. The design target is eighty. Six positions at the per-trade cap is what a full book looks like, and at one properly-sized buy per round they should have been there already.

The benchmark line read floor -0.00% for six straight rounds. Not a strategy result — an account sitting in cash next to a benchmark that was fully invested.

Two failure shapes, not one

Most orders were tiny. Ten thousand dollars, fifteen thousand, thirty-five thousand — against a ten million dollar book and a cap of $1,333,333.

And then, occasionally, this:

rejected: BUY 50000.0 COP costs $5,525,000, over the 13.3% limit
rejected: BUY 20000.0 NVDA costs $4,188,500, over the 13.3% limit
rejected: BUY 35777.23 NEM costs $3,860,005, over the 13.3% limit

Tiny or absurd, with almost nothing sensible in between. That bimodal shape is the tell: it is not a model sizing conservatively, it is a model not using the number at all.

Where the numbers were coming from

One rationale read, in full: "target $14,000". Another: "capital working, $14,000 target". A $14,000 target, from a broker with ten million dollars.

The prompt contained this:

"You may buy FRACTIONAL shares ... if your target is $14,000
 and the stock trades at $31.50, buy 444.44 shares rather than 444."

Fourteen thousand dollars. 444.44 shares.

Across the log, 444.44 appears from four different brokers, on four different tickers, at prices from $26 to $296. It is not the result of any division any of them performed. It is the example, copied.

The lesson is narrower than "examples are dangerous". The example was well-intentioned and it demonstrated a real capability — fractional shares — that brokers genuinely needed to know about. The problem is that a worked example with concrete figures is indistinguishable, to a small model, from a worked answer. It read "buy 444.44 shares" and did.

The deeper problem: arithmetic was part of the job

Even without the copying, the task was badly shaped. The broker was told its cash, told to keep a percentage of portfolio value in reserve, told to cap any single trade at another percentage of portfolio value, and then asked for a number of shares. That requires it to compute its equity, take a percentage, subtract a reserve, divide by a price, and emit the quotient.

The share counts in the log are the artifacts of that chain: 142.857 is 1000/7. 153.846 is 2000/13. 1414.28571429 is a quotient printed to full float precision. These are division results, not position sizes.

Arithmetic under a constraint is something a computer does perfectly and a 3.8 billion parameter model does poorly. There was no reason to have asked.

The fix

Ask for a dollar amount. State the ceiling in dollars. Do the division in code.

For THIS trade you may commit up to $1,333,333. That figure
already has your per-trade limit and your cash reserve subtracted
from it, so there is no percentage for you to work out.

That number is computed from the same constants the risk rails enforce, so the figure in the prompt and the figure in the check cannot drift apart. It is the binding constraint of the two — whichever of the per-trade cap and the available-cash-above-reserve is smaller — because that is what the rail will actually test against.

The conversion happens before validation. The rails are completely untouched: they still receive a share count and check it exactly as they did. All that moved is who does the dividing.

And the example now carries the broker's own budget

The worked example in the JSON contract is no longer a made-up figure. It is interpolated with that broker's actual ceiling for that round.

Which means the copying behaviour, if it persists, now produces a legal, correctly-sized, fully-deploying order. Rather than fighting a tendency the model clearly has, the prompt puts the right answer where the model was already looking.

Kept working on purpose: a trade that arrives with an explicit share count is still accepted unchanged. Dollar amounts are read from any of several plausible keys, and parsed whether they arrive as 1333333, "$1,333,333" or "1.3M". A rejected round costs a real API call, and the intent in all of those cases is unambiguous.

What it should look like

Six positions at $1,333,333 is $8,000,000 deployed against a $10,000,000 book — eighty percent invested, twenty percent in reserve, which is exactly what the constants were designed to produce.

Whether the floor makes or loses money from there is a separate question, and one a single ninety-day window cannot answer. But it will at least be holding something while it tries.

Previous: Six real tickers a week, thrown away over a full stop

All devlog posts