fixtures: golden data dir — real records, production read paths

Owner-manufactured teach master (chat_mv27rrra: compaction, subagent-abort,
every teach tool) + practice lifecycle (chat_mv293wv5: the full marker cycle
including the first-ever problem-dismissed), the real graph ledgers, five
jobs across the kind x status matrix, and settings. tests/golden-fixtures
reads all of it through the stores via the LH_DATA_DIR seam and pins the
fixture law: real data parses, flattens to a legal LLM wire, derives the
graph, covers every custom-marker kind, and reads never write.

Fixture law: an intentional format change updates these files in the same
commit; an unintentional one fails the suite.
This commit is contained in:
amosblomqvist
2026-10-10 13:40:39 +03:00
parent 53112d2861
commit bc09ec25e1
18 changed files with 7786 additions and 0 deletions
File diff suppressed because one or more lines are too long
@@ -0,0 +1,14 @@
{
"id": "job_mux5xn7v_b49f3458",
"kind": "research",
"chatId": "chat_mux5xn73_b1ccd21e",
"toolCallId": "call-mid",
"status": "done",
"activity": "delivered",
"createdAt": "2026-10-06T21:00:31.819Z",
"updatedAt": "2026-10-06T21:00:32.122Z",
"result": {
"brief": "Mid-run brief.",
"sources": []
}
}
@@ -0,0 +1,26 @@
{
"id": "job_mv282vv0_e7b89c9b",
"kind": "research",
"chatId": "chat_mv27rrra_feff23b6",
"toolCallId": "call_88535d0b5cb240e488884f29e06fb7a7",
"status": "error",
"activity": "aborted",
"createdAt": "2026-10-10T09:59:26.412Z",
"updatedAt": "2026-10-10T09:59:55.597Z",
"usage": {
"model": "openrouter:deepseek/deepseek-v4.1-flash",
"inputTokens": 6364,
"outputTokens": 712,
"cacheReadTokens": 5120,
"cacheWriteTokens": 0,
"reasoningTokens": 233,
"steps": 4,
"lastStep": {
"inputTokens": 0,
"outputTokens": 0,
"cacheReadTokens": 0,
"cacheWriteTokens": 0
}
},
"error": "Aborted by learner"
}
@@ -0,0 +1,30 @@
{
"id": "job_mv28p0fs_0a16b76e",
"kind": "visual",
"chatId": "chat_mv27rrra_feff23b6",
"toolCallId": "call_03e0d13f91bd47c3b1d1ddc6a5c941fc",
"status": "done",
"activity": "delivered",
"createdAt": "2026-10-10T10:16:38.776Z",
"updatedAt": "2026-10-10T10:17:55.008Z",
"usage": {
"model": "openrouter:qwen/qwen3.8-max-0902",
"inputTokens": 7786,
"outputTokens": 2872,
"cacheReadTokens": 2048,
"cacheWriteTokens": 0,
"reasoningTokens": 1694,
"steps": 3,
"lastStep": {
"inputTokens": 4289,
"outputTokens": 507,
"cacheReadTokens": 0,
"cacheWriteTokens": 0,
"reasoningTokens": 265
}
},
"result": {
"svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"800\" height=\"300\" viewBox=\"0 0 800 300\">\n <rect x=\"0\" y=\"0\" width=\"800\" height=\"300\" fill=\"#ffffff\"/>\n\n <!-- unmastered mass: v = 0.30 (x=280) to v = 1.0 (x=700) -->\n <rect x=\"280\" y=\"88\" width=\"420\" height=\"44\" fill=\"#e9e9e9\" stroke=\"#bdbdbd\" stroke-width=\"1\"/>\n <text x=\"490\" y=\"116\" font-family=\"Helvetica, Arial, sans-serif\" font-size=\"14\" fill=\"#444444\" text-anchor=\"middle\">(1 − p) = unmastered mass</text>\n\n <!-- number line -->\n <line x1=\"100\" y1=\"165\" x2=\"700\" y2=\"165\" stroke=\"#333333\" stroke-width=\"2\"/>\n <line x1=\"100\" y1=\"156\" x2=\"100\" y2=\"174\" stroke=\"#333333\" stroke-width=\"2\"/>\n <line x1=\"700\" y1=\"156\" x2=\"700\" y2=\"174\" stroke=\"#333333\" stroke-width=\"2\"/>\n <text x=\"100\" y=\"196\" font-family=\"Helvetica, Arial, sans-serif\" font-size=\"14\" fill=\"#444444\" text-anchor=\"middle\">0</text>\n <text x=\"700\" y=\"196\" font-family=\"Helvetica, Arial, sans-serif\" font-size=\"14\" fill=\"#444444\" text-anchor=\"middle\">1</text>\n\n <!-- dots -->\n <circle cx=\"280\" cy=\"165\" r=\"5.5\" fill=\"#333333\"/>\n <circle cx=\"364\" cy=\"165\" r=\"5.5\" fill=\"#333333\"/>\n <text x=\"272\" y=\"150\" font-family=\"Helvetica, Arial, sans-serif\" font-size=\"14\" fill=\"#444444\" text-anchor=\"end\">p = 0.30</text>\n <text x=\"372\" y=\"150\" font-family=\"Helvetica, Arial, sans-serif\" font-size=\"14\" fill=\"#444444\" text-anchor=\"start\">p<tspan dy=\"-5\" font-size=\"11\">−</tspan><tspan dy=\"5\"> = 0.44</tspan></text>\n\n <!-- arrow: predict shift -->\n <line x1=\"280\" y1=\"204\" x2=\"352\" y2=\"204\" stroke=\"#2563eb\" stroke-width=\"2.5\"/>\n <polygon points=\"366,204 350,197 350,211\" fill=\"#2563eb\"/>\n <text x=\"323\" y=\"232\" font-family=\"Helvetica, Arial, sans-serif\" font-size=\"14\" fill=\"#2563eb\" text-anchor=\"middle\">+0.16 = (1 − p) × T, with T = 0.20</text>\n\n <!-- caption -->\n <text x=\"400\" y=\"272\" font-family=\"Helvetica, Arial, sans-serif\" font-size=\"14\" fill=\"#555555\" text-anchor=\"middle\">belief that the student has mastered the skill</text>\n</svg>",
"notes": "The figure is correct and clean: the number line spans 0→1 (x=100→700), the shaded unmastered mass runs exactly from x=280 (v=0.30) to x=700 (v=1.0), dots sit at the proportional positions 280 and 364, and the single blue arrow shows the +0.16 predict shift. No overlaps, nothing clipped.\n\n**Notes for the teacher:** The figure shows one number line for belief P(mastered), with the light-gray block marking the unmastered mass (1−p) from 0.30 to 1.0, and a single blue arrow from p=0.30 to p⁻=0.44 illustrating that the predict step moves only that unmastered mass by (1−p)×T = 0.16. Dot positions are exactly proportional to 0.30 and 0.44 on the 0–1 axis; the superscript minus in \"p⁻\" is rendered via a tspan for reliable display."
}
}
@@ -0,0 +1,18 @@
{
"id": "job_mv28tfii_2a54290a",
"kind": "pdf",
"chatId": "chat_mv27rrra_feff23b6",
"toolCallId": "call_63f708f61cec40a9b45c45dafb5af687",
"status": "error",
"activity": "failed",
"createdAt": "2026-10-10T10:20:04.938Z",
"updatedAt": "2026-10-10T10:20:09.331Z",
"error": "Invalid PDF structure.",
"result": {
"path": "/Users/amos/Downloads/test_session/test.txt",
"question": "This is a wiring test, not a real extraction job. There is no PDF involved: the path given points to a plain-text file containing only the word \"test\". Please confirm receipt of the job, say hi, and state plainly that no PDF content was available to read.",
"brief": "PDF failed: Invalid PDF structure.",
"pagesRead": [],
"pagesConsulted": []
}
}