Capture harness, fixture verification, CI, and the public README
The site does no live inference. Rollouts are captured once against spark-1 and replayed at their recorded wall-clock — a public demo with no auth cannot hold an API key, and a recorded run can be scrubbed, permalinked, blind-compared and verified in ways a live one cannot. What stops it being a video is that the browser re-derives every number from the recorded moves. verify_fixtures.py is the Python half of that: it replays every committed fixture through the engine and reproduces its own rewards. All 16 land at delta 0.0. A fixture that cannot be regenerated is a claim with no receipt. First real measurement, thinking off, 8 seeds: solved 0/8. The model repeats guesses it has already played, invents words (trape, slith, postt, boomy), and contradicts its own feedback — consistency 0.09 to 0.17. That is the published failure taxonomy showing up in our own data on the first run, and it is why `consistency` is a reward component rather than a footnote. A capture failure is recorded as a turn with a null reply, never dropped. A capture that silently discarded failed turns would be reporting a better model than the one that ran. CI gates both halves and four things that fail silently in production: the word lists must rebuild byte-identically, the prerendered routes must carry their own baked og tags (crawlers do not run JS, so without them every shared link previews as the homepage), no blob: URL may reach the bundle (the site's CSP has no worker-src, so it falls back to default-src 'self' and a blob worker is blocked with no error), and the conformance digest must match across languages. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019mt6sHQHEnEYrJZvoMCJSB
This commit is contained in:
@@ -0,0 +1,68 @@
|
||||
{
|
||||
"runId": "solver-s3",
|
||||
"seed": 3,
|
||||
"model": "entropy-solver",
|
||||
"capturedAt": "2026-08-28",
|
||||
"rewards": {
|
||||
"solved": 1.0,
|
||||
"economy": 1.0,
|
||||
"consistency": 0.6666666666666666
|
||||
},
|
||||
"metrics": {
|
||||
"guesses_used": 3.0,
|
||||
"rejected_replies": 0.0,
|
||||
"reference_depth": 3.0,
|
||||
"turns_granted": 6.0,
|
||||
"inconsistent_guesses": 1.0
|
||||
},
|
||||
"truncated": false,
|
||||
"outcome": "solved",
|
||||
"answer": "toady",
|
||||
"turns": [
|
||||
{
|
||||
"reply": "[tares]",
|
||||
"reasoning": null,
|
||||
"call": {
|
||||
"promptTokens": null,
|
||||
"completionTokens": null,
|
||||
"reasoningTokens": null,
|
||||
"durationMs": null,
|
||||
"finishReason": "generated"
|
||||
},
|
||||
"info": {
|
||||
"guess": "tares",
|
||||
"observation": "T A R E S\nG Y X X X\n\nYou have 5 guesses left."
|
||||
}
|
||||
},
|
||||
{
|
||||
"reply": "[bland]",
|
||||
"reasoning": null,
|
||||
"call": {
|
||||
"promptTokens": null,
|
||||
"completionTokens": null,
|
||||
"reasoningTokens": null,
|
||||
"durationMs": null,
|
||||
"finishReason": "generated"
|
||||
},
|
||||
"info": {
|
||||
"guess": "bland",
|
||||
"observation": "B L A N D\nX X G X Y\n\nYou have 4 guesses left."
|
||||
}
|
||||
},
|
||||
{
|
||||
"reply": "[toady]",
|
||||
"reasoning": null,
|
||||
"call": {
|
||||
"promptTokens": null,
|
||||
"completionTokens": null,
|
||||
"reasoningTokens": null,
|
||||
"durationMs": null,
|
||||
"finishReason": "generated"
|
||||
},
|
||||
"info": {
|
||||
"guess": "toady",
|
||||
"observation": "T O A D Y\nG G G G G\n\nYou have 3 guesses left."
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user