The save file told me the jar was empty
Two bugs in Barrelhouse that every test missed and the real save file showed. Closing the app on an empty stage wiped the tip jar, and a save field that no save ever wrote left a feature dead in play while its tests passed.
Written up later from the repo's history and dated to the days it describes.
Barrelhouse is an idle blues RPG. You play for tips in a roadhouse, recruit a band, and eventually run the place. Two bugs that I found in August were invisible to the test suite, because each one lived in a place where the tests built their own data. The real save file was the only place either one showed.
The jar that went to zero
On August 10 I reconciled the real save file, not a test, and found tips missing. The cause was in how the game handles a band going home. When a show ends with members on the stage, the walk-off pays out a Reputation reward. That payout is gated on the stage not being empty. The line that resets the tip jar to zero sat outside the gate and ran every time.
A collapse empties the stage, so every dollar earned between a collapse and the next recruit was destroyed when I closed the app, with nothing paid for it. I measured roughly 17 minutes of baseline tips lost that way.
The obvious fix was a persistent wallet. I decided against it. A wallet that survives the walk-off would make the third recruit free within a few sessions and remove the tension of drafting a band. And an empty walk-off paying nothing is what stops the collapse floor from being farmed. The harm was never the rule. It was the silence.
So the rule stays and the game says what happened. One new save field, jarWhenBandWentHome, holds the figure. The away panel now reads "The band went home. $N stayed in the jar." A static line explaining the mechanic was rejected, since it describes the rule without accounting for the loss you actually took. I confirmed it persisting on the real save, with an in-game figure of $134.09.
One tail is left open. Nothing clears that field, and on Android a swipe away sends no close notification, so an autosave may still hold a previous session's figure. It is tracked in the smoke ledger as not owed yet.
Closing the app now sends the band home, which retired an earlier acceptance criterion and its tests. I deleted them and wrote down why. A test guarding a state the game can no longer reach reads as coverage and is worse than no test.
The feature no save ever fed
The second one turned up on August 21, late in the day, while a different task was reading the save code. A crowd-smoothing feature from an earlier task had shipped a save field that no real save ever wrote. The save's initializer never set the smoothed crowd energy, so every save wrote 0.0, and loading clamped it up to the crowd floor. The payout basis reset after every reload and re-smoothed over about thirty seconds. In play, the feature was inert, and its tests passed.
The tests passed because every one of them built a saved show by hand and round-tripped it. A comment five lines above the omission had warned about exactly this for a different field, the encore flag. Nobody had made the leap from a warning about one field to a check on all of them.
The fix set the field. It also generalized the comment, which now names the incident, and added the first test that goes the other direction, from a live show to a saved one. I ruled it in scope because save version 9 had not been released. The test's own rule is written next to it. Anyone adding a seventh save field has to extend that test, because the hand-built round trip will keep passing regardless.
What is left
The jar rule stands as a ruling and the save fields are covered in both directions now. The open Android case is tracked.