A zero-size "paid in full" line closing a bill and silently killing the reminders is nastier than most injection demos I've seen, because nothing looks wrong to anyone. I like that you swapped the model for a fake that can return any well-formed answer and tested the app's behavior instead. Did the hidden-text check need much tuning to hit zero false flags across those 60 real bills?