37,800 個機械人壓測 O'BLOCK,揭出 AI 編碼遊戲的金融漏洞
Sweeney wants rockets. 37,800 bots crashed my vibe-coded game
Matt Busel 以 37,800 局機械人測試 O'BLOCK,發現街頭交易模式的 Seeker 有 93% 被逐出,但 TYCOON 模式的 Seeker 資產第 90 百分位達 $14,460.33B。測試在 154 秒內完成,37,800 局均沒有不變條件違規。他也指出,AI 撰寫的測試報告有三項過時的漏洞描述及一項 NaN,並分享以隨機、一般玩家及漏洞搜尋機械人測試遊戲經濟的方法。
Originally published at tensorust.com.
TL;DR: My game O'BLOCK launches free on Steam tomorrow, October 20. An AI coding agent wrote every line of its Rust, including a Wall Street finance layer it built in a single round. Today at 4:11 PM ET I turned 37,800 bots loose on the exact build that ships. The haggling game holds: the bot that hunts exploits gets evicted 93% of the time. The finance layer does not. The cheat bot ends tycoon mode 16x richer than an honest player, at $14.46 trillion. Tim Sweeney says AI is a race between cars and rockets. Fine. Here is what a rocket looks like when nobody crash-tests it, and the 154-second test that caught it.
If you came here from Google asking about vibe coded games on Steam: yes, they are already on the store, Valve makes developers disclose AI use on the store page, and O'BLOCK carries that disclosure. "Vibe coded" means the developer describes what they want and an AI writes the code. The question nobody on X is asking is the only one that matters: did anyone test it? Below is the test, the code, the six money printers still in the game tomorrow, and the harness you can copy into your own project tonight.

One reader-bot run replayed day by day with OB_BALANCE_ONE, 4:13 PM ET Oct 19 2026. Static frame: trace.png.
"Release your vibe coded game and let people be the judge." OK.
On October 17, under one of Tim Sweeney's posts about AI coding, the artist account @IsThisA3DModel wrote the most reasonable dare of the whole fight: "If GenAI was so good you wouldn't have to spend so much time yapping trying to convince people. Release your vibe coded game and let people be the judge."
Deal. O'BLOCK goes live on its Steam page tomorrow at 1 PM Eastern. It is a sneaker-flipping game set on an early-2010s Chicago block. You start with a $300 shoebox and one verb: name a price. Every buyer and seller has a hidden number they will not cross, and you climb from the block to billionaires by reading them.

@IsThisA3DModel on X, Oct 17 2026, captured 4:20 PM ET Oct 19 2026, real and unedited.
Here is how it was built, with no spin. I did not type the Rust. An AI coding agent (Claude Code) wrote about 40,000 lines in 54 files over 26 numbered rounds of my notes plus a release push, starting September 15. I designed it, played it, wrote the feedback, and said no a lot. The Steam page says so. It runs on my own Rust engine, Proof Engine.
But before strangers judge it tomorrow, I wanted a jury that does not get tired. So I let the bots judge it first.
37,800 games in 154 seconds, on the build that ships
O'BLOCK has a balance harness built into the executable. Set one environment variable and the game skips the window, plays whole runs headless with bots, and writes a report. I ran it at 4:11 PM ET today on steam/content-i18n/oblock.exe, the build live on Steam's default branch, with 300 seeds per cell:
- 37,800 full runs in 154 seconds on 2 threads.
- 4 modes: THE BILLION (reach $1 billion), ONE SUMMER (30 days), the DAILY, and TYCOON (the post-game, where the finance layer lives).
- 6 starting origins, heat levels 0, 5 and 10, every unlockable "angle" (a perk that bends the rules) available.
- 0 invariant violations: no NaN cash, no spending into the red, no empty stacks, across all 37,800.
The harness plays three kinds of bot. This is the real enum from src/balance.rs:
/// How a bot plays.
pub enum Policy {
/// Mashes buttons: random walk-ups, random numbers, random choices.
Random,
/// A decent player: anchors on the street band, reads the tells,
/// takes a fair counter, keeps rent money back.
Reader,
/// Hunts for loops: slicing lots, list-at-max, favours on a thin shelf,
/// connects every day, envelope rerolls, copied multipliers.
Seeker,
}
The rule that makes it honest: a bot only does what a player can. It sees the same street price band, the same tells and counters, and it is held to the same slider limits and cash checks the screens enforce. The Seeker is the speedrunner who reads Reddit. The Reader is a good player. Random is your cat on the keyboard.
The haggle core holds. The cheat bot gets evicted 93% of the time
This was the result I cared about most, and it is good news. On THE BILLION, out of 5,400 runs per bot:
- Random: evicted 100%. Mashing buttons loses. Good.
- Reader: won 81%, median $1 billion on day 43, evicted 19% (775 of those 1,019 evictions at heat 10, the hardest setting).
- Seeker: evicted 93%, won 7%.

O'BLOCK balance harness, Steam build shipping Oct 20, run 4:11 PM ET Oct 19 2026, 300 seeds per cell.
The exploit hunter loses because the street punishes cheese. Lowball people and they remember. Hold a thin shelf to bait favours and the rent eats you. Slice lots and you still pay holding costs. The thing an AI-hater would bet on, "the AI made a game you can trivially break", is false for the core loop. The bots tried 5,400 times and mostly went broke.
The heart of it is about 90 lines in src/deal.rs. Every person gets a hidden limit built from what the pair is really worth, how well they know that, their greed, their mood and your history with them. Trimmed, but real:
// What they think it is worth: sharp people know, the rest guess
let guess_noise = (rand01(&mut rng) * 2.0 - 1.0) * (1.0 - who.sharp) * 0.45;
let their_value = value * (1.0 + guess_noise);
let want = mood * 0.04 + rep_with * 0.06;
let (buy_gap, sell_gap) = if who.outlet {
(0.22 + who.greed * 0.22, 0.10 + who.greed * 0.24)
} else {
(0.08 + who.greed * 0.30, 0.04 + who.greed * 0.16)
};
let limit = match side {
Side::Buy => their_value * (1.0 - buy_gap + want * 0.5).clamp(0.3, 0.98),
Side::Sell => their_value * (1.0 - sell_gap + want).clamp(0.3, 1.02),
};
// Their anchor, said out loud: on their own side of the limit,
// so a number they said is always a number they will take.
let ask = match side {
Side::Buy => limit * (1.15 + who.greed * 0.35),
Side::Sell => limit * (0.8 + who.greed * 0.15),
};
That last comment exists because a human playtester caught a bug the AI shipped before round 20: sellers said a price out loud that was below their own hidden floor, so the number they named got refused. "Sellers suggest a price then raise it," the tester wrote. Seven out of ten. The AI fixed it in one round. Remember that pattern. It comes back.

Real in-game capture of the shipping build: one verb, name a price.
Sweeney's "cars and rockets" line is a sales pitch
On October 18, after he told Kenney "Up yours!" on 3.1 million views, Sweeney posted the sober version: "The velocity of development of it is the force to be reckoned with here. It really is becoming a race between cars and rockets." Kenney had posted that morning: "Don't let billionaires convince you slop is the future."

@TimSweeneyEpic and @KenneyNL on X, Oct 18 2026, captured 4:20 PM ET Oct 19 2026, real and unedited.
I already said Kenney is right about the billionaire part. Now I can tell you what the velocity actually buys, because I have the receipt. On September 29, in round 26, I asked for "PhD-level finance". In one round the agent wrote finance.rs (2,185 lines) and banks.rs (713 lines): a Nelson-Siegel Treasury curve, a GARCH(1,1) VIX, SOFR and repo plumbing, Black-Scholes options on a skewed surface, covenants, Chapter 11 under absolute priority, and six banks that can die the way Silicon Valley Bank died: uninsured deposits, a hole in the held-to-maturity book, a run on a Friday.
No human writes that in a day. Sweeney is right that it is a rocket. What he never says, because Epic is selling the rocket, is that velocity is also how fast you create surface area nobody has played. A tycoon layer with nine tabs of real financial instruments is thousands of button orders deep. No human plays that many orders by hand. The bots played it 1,800 times this afternoon.

Real in-game capture: the finance layer the AI wrote in one round on Sep 29 2026.
Velocity is how fast you build things nobody has played. A rocket with no crash test is just a faster way to hit the ground.
In the finance layer, the cheat bot wins by $13.5 trillion
Every TYCOON run starts with $1 billion and runs 90 days. Here is net worth at the end, 600 runs per bot:
- Random: median $3.41B, p90 $21.48B.
- Reader: median $383.84B, p90 $914.62B.
- Seeker: median $742.29B, p90 $14,460.33B. That is $14.46 trillion.

O'BLOCK balance harness, Steam build shipping Oct 20, run 4:11 PM ET Oct 19 2026.
On the street, cheese loses. Up here it wins, by about 16x at the 90th percentile. The money-flow table says where it comes from. The average Seeker tycoon run took in $840.45B from connects (your trusted contacts) while paying them only $2.62B. It paid $2.43 trillion in tax and still finished ahead. When your exploit bot's tax bill is bigger than most countries' GDP, the economy is not balanced. It is a printer with a story attached.
And the honest player is not innocent either. The single best flip in the whole run was a Reader, not a cheater: $680.16 billion of profit on one deal, on day 30 of a summer run (seed 1007052, if you want to replay it). The GIF at the top is another Reader run, replayed day by day with OB_BALANCE_ONE: worth went negative on day 31 (-$313,254), then hit $1.70 billion on day 37. That is x2,050 in a week. The reason is a mechanic called the mark.
The worst offenders: six money printers shipping tomorrow
The harness also runs targeted probes. Ranked by dollars back per dollar in, on the shipping build:
- The mark, 27.1x. Read people well several times in a row and your "mark" climbs, so buyers pay more. The cap is x12 at the billionaire rung and x30 at the top rung. A single pair sold to a plain street buyer at the cap goes for 27.10x street. Half of all Reader runs on THE BILLION (2,698 of 5,400) hit the x12 cap. This is the engine behind that day-37 billion.
- Same-day buy and resell, +1,763.8%. 9,812 sales of pairs bought that same day, mean return. That is 18.6x.
- Stacked angles, x12. COPYCAT plus VANTA'S CHAIR plus FRONT MAN multiply a single sale's edge to 12x by hand. Adding more does nothing, so at least the cap works.
- Lot slicing, 6.55x. Take part of a multi-stack lot and the seller's number does not scale right: one probe paid $157 for $1,028 of street value.
- Connects, both ways, 6.34x. A connect buys from you at 1.63x street and sells to you at 0.43x. Round trip 3.77x, or 6.34x with the CONNECTED angle.
- Outlet pallets relisted at 150%, 2.49x per pair that sells.

O'BLOCK balance harness, Steam build shipping Oct 20, run 4:11 PM ET Oct 19 2026, probes section.
Bonus roast: the rival bots, the five hustlers who race you to the billion, beat the player in 2 of 37,800 runs. They are scenery. And three of the nine one-use tips (BURNER PHONE, HYPE POST, RESTOCK RUMOR) were bought zero times by any bot, so the harness has never tested them at all.
The AI-written test report lies. The numbers don't
This is the part that should worry Sweeney's fans more than the trillions. The harness was also written by the AI, on October 6. Its report prints three exploits as still live: "quitting and relaunching rerolls the street", "sell_building pays the loan shortfall out of cash with no check", and a call-save-reload loop that "has no limit".
Its own numbers, in the same paragraphs, say all three are fixed. The street came back 18 of 18 walk-ups the same after a reload. The reload loop produced 0 extra deals. The underwater building sale left cash exactly where it was, because the fix landed in src/empire.rs the same day:
// Underwater: the bank wants the shortfall at closing. No cash, no sale.
if net - gain < 0.0 && self.cash + net - gain < 0.0 {
return Err(format!("It's underwater: the sale leaves {} owing on the loan. Have the cash first.", money(-(net - gain))));
}
The AI fixed the bug and never updated the sentence describing the bug. Then one probe went blind: the favour test now finds 0 favours and prints "NaN%", most likely because the favour rework changed when favours trigger and nobody touched the probe. Same pattern as the seller-price bug: the code moved, the words did not.
That is the real lesson of vibe coding, and it is not "AI slop". The AI is fast at code and lazy about prose that describes code. If you only read its summary, you would chase three ghosts and miss the NaN. The CSV does not lie. Read the numbers, never the paragraph. I wrote about the same failure in AI agents that passed 866,000 SQL tests and then failed ROLLBACK.
The AI fixed 85% of the cheese in one afternoon
Credit where due. The first harness report on October 6 flagged 493 of 4,200 Seeker runs as past the sane bound (twice the honest Reader's 95th-percentile growth, or a billion sooner than any honest run). Four passes later the same afternoon it was 73. The fixes: a cap on the connect bonus, a cap of 5 on violet envelopes, a floor on listings, favours that sting, no underwater sales, and the street saved so reloads cannot reroll it.

qa/balance to balance4 summaries (Oct 6 2026) and today's run, 246 of 12,600 scaled to 4,200.
Then the last report on disk is dated October 6. Thirteen days of new features later, today's run at 3x the seeds lands at 82 per 4,200: no regression, no progress. Nobody ran it again because nobody had to. That is my fault, not the model's. The harness takes 154 seconds.
What I think is really going on with AI and game economies
Here is my read, and I will say it plainly. The fight between Sweeney and Kenney is about the wrong thing. "Who typed it" is not what makes a game slop. Untested is what makes a game slop. And my bet is that most hand-tuned indie economies have never been played 100 times by anything, let alone 37,800 times. They get balanced by a developer playing five runs and a Discord finding the rest after launch. Nobody calls that slop because a human made it.
The other thing nobody will say out loud, and I would bet on it: big studios are already using AI to write tuning code and balance sims, and the only reason you know about indies like me is Valve's disclosure checkbox. Epic posted "Is this bad boy faster? Yes. Will it have some bugs? Yes." about its vibe-coded launcher, and within a day a user test clocked the updated Steam at 5.23 seconds against Epic's claimed 5.47. Fast is easy to brag about. Tested is boring, so nobody posts it.
And to @LiquidHbox, who wrote on October 17 that he had said "AI has no place in gaming", got "educated severely" by developer friends, and asked his peers to chime in (742K views): here is one developer chiming in. The AI wrote the code. It did not decide what is fun, it did not notice the mark makes the top rung trivial, and it did not run its own tests twice. The judgment is still the job. AI just makes the job bigger, faster.
@Grummz predicted "the first 300,000 concurrent vibe coded game made in a weekend." Maybe. My prediction: the first viral vibe-coded hit gets its economy broken by a speedrunner within 48 hours, because nobody ran the bots.
Am I fixing the $14 trillion before launch? No
I am shipping it tomorrow as is, on purpose. TYCOON is the post-game; the billion is the tutorial. Finding the printer is half the fun of a game like this, the way Balatro players hunt broken combos. If you find the $14 trillion route, post the seed. That is the next patch.
The street game is the part that has to be fair on day one, and 37,800 runs say it is: honest play wins 81%, cheese gets evicted 93%, and nothing ever went NaN.
Do this in your own game this week
- Put the harness inside the shipping binary. One env var, no window, quits when done. Then you test the exact build players get, not a debug build that drifted.
- Write three bots, not one. Random proves the floor (mashing must lose). A good-player bot sets the honest curve. An exploit bot finds the printers. If the exploit bot beats the good one, you have a bug, not a strategy.
- Bound outliers against your own honest bot, not a number you made up. "Twice the honest p95" adapts as you rebalance.
- Make every run replayable from a seed. A flag is useless if you cannot watch the run day by day.
- Check invariants every action: finite money, no negative stock, no free sales. Ours caught nothing today, which is the point.
- Trust the CSV, not the report text. If an AI wrote your harness, diff its sentences against its numbers. Ours had three stale claims and one NaN.
- Run it on every build. It is 154 seconds. I skipped it for 13 days.
If you are building on Rust, the shape is std::thread::scope with two workers pulling jobs off an atomic counter, each run wrapped in std::panic::catch_unwind so one bad seed records "PANIC" instead of killing the batch. More on shipping Rust game code in what Balatro's save file taught me about trusting game data and the Steam Next Fest launch log.
The numbers
- Runs: 37,800 in 154 s, shipping build, 4:11 PM ET Oct 19 2026
- Reader wins THE BILLION: 81%, median day 43
- Seeker evicted on THE BILLION: 93%
- Tycoon p90 worth: Reader $914.62B, Seeker $14.46T
- Best single flip: $680.16B
- Mark at the top rung: 27.1x street
- Rival bot beat the player: 2 of 37,800
- Invariant violations: 0
- Stale claims in the AI-written report: 3, plus 1 NaN
O'BLOCK launches free on Steam tomorrow, October 20, at 1 PM ET. Be the judge @IsThisA3DModel asked for: play it here. If you want to back the experiment, the $4.99 Complete Supporter Pack is the only thing it sells.
One question for the comments, and especially for @TimSweeneyEpic and @KenneyNL: would you rather play an economy a human tuned by feel and never stress-tested, or one an AI wrote and 37,800 bots tried to break? Pick one.
來源:DEV Community · dev.to