A mechanical gate can’t catch what nobody asked for
payment-events asks for a handler for a payment provider’s webhooks. The vague brief says:
Write createPaymentProcessor. apply(event) updates an order's status from a payment provider's webhook event. It calls onPaid when an order gets paid, so we can ship it.
It doesn’t say that webhooks arrive more than once and out of order. With that brief, 27% of one-shot runs passed, and 33% with the harness. With the right words, 100% and 100%.
Only 2 of its 9 scenarios ever failed, and they are the same situation: a refund arrives, then an older paid event turns up late. The order should stay refunded and not ship. “a late, older paid does not undo a refund” failed 11 of 15 one-shot runs and 10 with the harness. “a late, older paid does not ship” failed 8 and 10.
The mechanical gates had almost nothing to say. Of the 11 broken one-shot runs, types stopped 0 and lint stopped 0, and 9 passed all four gates. The other 2 failed because the agent’s own test about late events disagreed with its own code. Retrying can’t fix what no check mentions: 5 of 15 passed with the harness, against 4 of 15 without.
Reading did better than running, with a catch. The neutral reviewer rejected all 15 vague-brief runs of this task, including the 4 that passed every scenario, and 0 of the 15 worded ones. By a keyword count on the stored text, 10 of the 11 reviews of broken code mention ordering or stale events, but 4 lead with something else: if onPaid throws, the event is already marked as seen, so a retry never ships the order. So do all 4 rejections of the passing runs. That’s a real hazard the holdout never tests, so calling those rejections false alarms is generous to our holdout.
So the line is narrower than it first sounds, which is why the heading says mechanical. A check that only runs what was specified can’t catch what wasn’t. Someone reading the code and thinking about webhooks sometimes can.
Most of the gap comes from this one task. Without it, the one-shot gap between the briefs falls from 10 points to 1, and with the harness on, from 9 points to 1. Dropping a task after seeing the results is a choice too, so read that as a check on how fragile the headline is, and not as the real answer. 3 tasks scored 100% in every cell, so they couldn’t have shown any effect at all.
| Task | Vague, off | Vague, on | Words, off | Words, on |
|---|---|---|---|---|
| split-bill | 93 | 93 | 93 | 100 |
| safe-redirect | 87 | 100 | 100 | 100 |
| resolve-upload | 100 | 100 | 100 | 100 |
| render-comment | 93 | 100 | 93 | 100 |
| memo-async | 100 | 100 | 100 | 100 |
| payment-events | 27 | 33 | 100 | 100 |
| next-billing | 100 | 100 | 100 | 100 |
| search-query | 100 | 100 | 93 | 100 |
Percentages of 15 runs. Off and on mean the harness. Redder means more failures.