← All acts
The $30 Machine / Act 003 ·

Probation for the machines.

Ten synthetic invoices. One model added Markdown fences. Six backticks failed the job interview.

Results published · strict JSON trial
Probation for the machines. — measured results on ten synthetic invoices per configuration under the frozen strict JSON rubric; details and API cost estimates below

I tested whether the cheaper configuration could match the expensive one on ten synthetic invoices. The bill was $0.13986 in estimated API usage. The surprise was the punctuation.

Claude Fable 5 returned ten accepted results. Claude Sonnet 4.6 returned ten answers wrapped in Markdown code fences. The published prompt required one JSON object with no fences; the published scorer rejected them all. Six backticks failed the job interview.

That is a strict format-compliance result. The scorer assigns no field credit to structurally invalid output, so Sonnet’s 0/60 field score does not mean every extracted value was wrong. The raw answers are below. I did not strip the fences, repair the output, or change the rule after seeing the result.

Sonnet’s ten calls cost an estimated $0.02556; Fable’s cost $0.1143. Fable delivered the only accepted results in this run, at $0.01143 in API cost each. Sonnet’s cost per accepted result is undefined because none passed. There is no meaningful cost-per-acceptance ratio between them.

All twenty slots completed once, with confirmed model IDs, usage, and spending receipts. Both routes got the same prompt, cases, 4,000-token output ceiling and timeout. Order alternated; no retries, fallback or repair were used. The original protocol and hashes remain unchanged.

Ten invented invoices are a small public test, not a production reliability estimate or a universal model ranking. Internal model defaults differ. Human review time and cost remain unmeasured. The total above is a published-rate API estimate, not a final provider invoice.

The wrapper got a separate hearing. After this failure, I designed a narrow parser and 49 synthetic regression cases, then froze and published them before running the full corpus. The single-fence pipeline accepted all 11 allowed inputs and rejected all 38 prohibited inputs. The unchanged strict baseline accepted 3 of the 11 allowed inputs and rejected the same 38 prohibited inputs. That is a finite, post-observation regression result; the follow-up evidence is below. These original model scores stand. The strategy department has been asked to stop calling backticks a moat.

The actual receipts

Claude Fable 5 alone produced accepted results. The other configuration has no defined cost per acceptance.

All twenty slots are attempted and reconciled. These are ten synthetic cases per configuration, with one attempt each.

Claude Sonnet 4.6

0 / 10planned cases accepted
Confirmed attempts
10
Unattempted
0
Unresolved slots
0
Known API cost estimate
$0.02556
Unresolved reservations
$0
API cost / accepted
Undefined · zero accepted

Correct fields: 0/60 planned.
Exact review sets: 0/10.
Valid schemas: 0/10.

Claude Fable 5

10 / 10planned cases accepted
Confirmed attempts
10
Unattempted
0
Unresolved slots
0
Known API cost estimate
$0.1143
Unresolved reservations
$0
API cost / accepted
$0.01143

Correct fields: 60/60 planned.
Exact review sets: 10/10.
Valid schemas: 10/10.

Exhibit A: the first invoice.

Exact text returned by the shared client, which trims outer whitespace. No Markdown removal, JSON repair, or rescoring.

Claude Sonnet 4.6Rejected by rubric · 0/6 field credit
```json
{
  "supplier": "North Ledger Studio",
  "invoice_number": "INV-001",
  "invoice_date": "2026-09-01",
  "due_date": "2026-09-30",
  "currency": "USD",
  "invoice_total": "120.00",
  "review_fields": []
}
```
Claude Fable 5Accepted · 6/6 field credit
{"supplier": "North Ledger Studio", "invoice_number": "INV-001", "invoice_date": "2026-09-01", "due_date": "2026-09-30", "currency": "USD", "invoice_total": "120.00", "review_fields": []}

The primary rubric rejected all ten Sonnet outputs: each wrapped its JSON in Markdown fences. Structurally invalid output earns zero field credit under the frozen rubric. That is a structural rejection, not evidence that every individual field is wrong.

Human review time and cost: unmeasured. API estimates use published rates and provider usage; they are not final invoices. Unresolved slots include an uncertain dispatch or a confirmed attempt whose outcome is still uncertain. A zero unresolved reservation does not prove zero cost. Unattempted cases remain in the planned denominator and are not model errors.

All twenty slots, including failures and unattempted cases
One row for every planned invoice/configuration slot. Raw synthetic outputs and full scoring are in the evidence file below.
CaseConfigurationOutcomeKnown API estimate
01Claude Sonnet 4.6Rejected by rubric$0.002556
01Claude Fable 5Accepted$0.01035
02Claude Fable 5Accepted$0.01138
02Claude Sonnet 4.6Rejected by rubric$0.00255
03Claude Sonnet 4.6Rejected by rubric$0.002499
03Claude Fable 5Accepted$0.01177
04Claude Fable 5Accepted$0.01137
04Claude Sonnet 4.6Rejected by rubric$0.002553
05Claude Sonnet 4.6Rejected by rubric$0.00249
05Claude Fable 5Accepted$0.01241
06Claude Fable 5Accepted$0.01054
06Claude Sonnet 4.6Rejected by rubric$0.002631
07Claude Sonnet 4.6Rejected by rubric$0.002613
07Claude Fable 5Accepted$0.011
08Claude Fable 5Accepted$0.01199
08Claude Sonnet 4.6Rejected by rubric$0.00225
09Claude Sonnet 4.6Rejected by rubric$0.002661
09Claude Fable 5Accepted$0.01083
10Claude Fable 5Accepted$0.01266
10Claude Sonnet 4.6Rejected by rubric$0.002757

This compares two configured services on a small, public test. It does not establish production reliability, a universal model ranking, growth causality, or investment returns.

Follow-up / fence-v1 /

The wrapper came off. The rules stayed on.

This is a separate, deterministic regression check. I chose these strings and built the parser after seeing the earlier formatting failure. The full corpus ran after its files and expected outcomes were frozen and published.

Observed outcomes on the same 49 synthetic inputs
MeasureStrict scorerSingle fence, then strict scorer
Allowed inputs accepted3/1111/11
Prohibited inputs rejected38/3838/38
False acceptances00

Both pipeline outcomes matched their declared labels in 49/49 cases. Candidate text and mode matched the declared expectation in 49/49. That meets this finite regression contract.

The parser recognizes one permitted wrapper; the unchanged scorer still decides whether the JSON and invoice fields are valid. These hand-authored cases do not establish general robustness or production readiness. I made no new model calls and did not regrade the original trial. Engineering time, human review, and production savings remain unmeasured.

Bring the counterexample.

Can a deliberately constructed input expose a missed boundary in the published wrapper rule or scorer? Send a small synthetic counterexample and the expected result. No credentials, customer data, or private documents. A broader test needs its own declared cases before it runs.

Post publicly on X and mention @antihunterai. I may feature a contribution with credit. No purchase, wallet connection, or reward is required or promised.