START WITH LUNA.
It tied Sol without breaking the field contract. DeepSeek was 63% cheaper than Luna and much faster, but the six incorrect records make that saving a false economy under this prompt.
On this 12-record synthetic fixture, Luna matched Sol exactly at one twenty-fifth of the cost. A later DeepSeek V4 Flash supplement was even cheaper and faster—but returned only 6 of 12 records exactly.
Luna and Sol returned all five fields correctly on all 12 records. Supplemental DeepSeek V4 Flash returned valid JSON every time, but only seven outputs used the exact five-field contract and only six records were fully correct.
| ROUTE | MODEL | EXACT | FIELD CONTRACT | MEDIAN | MEASURED COST |
|---|---|---|---|---|---|
| DEFAULT CHEAP HOSTED | GPT-5.6 LUNA | 12/12 | 12/12 | 1.36s | $0.00123 |
| POST-RESULT SUPPLEMENT | DEEPSEEK V4 FLASH | 6/12 | 7/12 | 0.28s | $0.00046 |
| FRONTIER HOSTED | GPT-5.6 SOL | 12/12 | 12/12 | 1.58s | $0.03070 |
| LOCAL OPEN WEIGHT | GEMMA4 12B · Q4 | 11/12 | 12/12 | 3.79s | $0 API* |
LATER SUPPLEMENT: DeepSeek was locked and run after the original results were known. It used the same cases and scorer, one attempt per case, thinking disabled, and no retries. JSON-object mode produced 12/12 parseable JSON; “field contract” requires the exact five property names.
* The local route had no per-call API bill. Hardware, energy, maintenance, and concurrency were not measured. Its first request also incurred a 67.45-second cold load.
Rates locked 10 Aug 2026 per 1M tokens: Luna $0.20 input / $1.20 output; Sol $5 input / $30 output; DeepSeek V4 Flash $0.0028 cached input / $0.14 uncached input / $0.28 output. Luna source ↗ Sol source ↗ DeepSeek source ↗
It tied Sol without breaking the field contract. DeepSeek was 63% cheaper than Luna and much faster, but the six incorrect records make that saving a false economy under this prompt.
Five outputs renamed total_amount to amount_due or amount_payable. One selected the Japanese legal name instead of the expected English trading name. The values themselves were otherwise correct.
Gemma4 read the spaced UK date 03/08/2026 as 8 March instead of 3 August. Supplier, invoice number, currency, and amount were correct.
The official 17 GB Muse Glimmer 30B build targets 24 GB of VRAM. This laptop has 8,151 MiB, and its installed Ollama 0.32.7 runtime predates the non-MLX release path.
That is exactly why “open weights” is not the same as “runs well on my laptop.” The model was excluded before download; a 16.76 GB transfer outside the vendor hardware target would not be a credible scored comparison.
Meta GGUF model card ↗Ollama release-status issue ↗
Run Muse Glimmer when a supported runtime and at least the vendor-target 24 GB memory envelope are available. Until then, it stays a candidate—not a result.
The workload is deliberately narrow: return supplier name, invoice number, issue date, currency, and total amount from OCR-like text as valid JSON.
The fixture excludes image rendering and OCR quality. All invoices are synthetic. Twelve cases are enough to test the harness and expose repeated DeepSeek contract failures plus a local-model date failure—not enough to establish production readiness.
No operational error budget or pass threshold exists yet. The result identifies Luna as the next hosted candidate for this narrow fixture; it does not prove that Luna, Sol, DeepSeek, or the local model is reliable on production invoices.
The original package and later DeepSeek supplement retain every request, response, prediction, usage count, latency, and failure—not only the aggregate scores.
All five normalised fields must match the gold record.
Field exact match, exact-property validity, JSON syntax, and missing predictions expose how a model failed.
Candidate version, provider or runtime, quantisation, raw output, retry, token cost, and latency must travel with the result.
node score.mjs cases.jsonl predictions.jsonl