ctxnn1 commited on
Commit
c19bae6
·
verified ·
1 Parent(s): d41d366

Complete v2.1.0: research report, reproducible source bundle and offline verification

Browse files
Files changed (43) hide show
  1. .gitattributes +5 -0
  2. CITATION.cff +2 -2
  3. FILES_SHA256.json +42 -9
  4. README.md +12 -0
  5. RELEASE.json +20 -0
  6. RELEASE_MANIFEST.json +347 -0
  7. REPRODUCE.md +16 -1
  8. RESEARCH_REPORT.pdf +3 -0
  9. docs/RESEARCH_REPRODUCE.md +16 -1
  10. docs/figures/final-confident-errors.png +0 -0
  11. docs/figures/final-confident-errors.svg +344 -0
  12. docs/figures/final-learning-curves.png +3 -0
  13. docs/figures/final-learning-curves.svg +2234 -0
  14. docs/figures/final-paired-nll.png +0 -0
  15. docs/figures/final-paired-nll.svg +716 -0
  16. figures/final-confident-errors.png +0 -0
  17. figures/final-confident-errors.svg +344 -0
  18. figures/final-learning-curves.png +3 -0
  19. figures/final-learning-curves.svg +2234 -0
  20. figures/final-paired-nll.png +0 -0
  21. figures/final-paired-nll.svg +716 -0
  22. loss-lab-v2.1.0.zip +3 -0
  23. loss-lab-v2.1.0.zip.sha256 +1 -0
  24. source/.gitignore +1 -0
  25. source/CITATION.cff +2 -2
  26. source/README.md +10 -0
  27. source/RELEASE_MANIFEST.json +347 -0
  28. source/VERSION +1 -0
  29. source/dashboard.html +0 -0
  30. source/docs/RESEARCH_REPRODUCE.md +16 -1
  31. source/docs/figures/final-confident-errors.png +0 -0
  32. source/docs/figures/final-confident-errors.svg +344 -0
  33. source/docs/figures/final-learning-curves.png +3 -0
  34. source/docs/figures/final-learning-curves.svg +2234 -0
  35. source/docs/figures/final-paired-nll.png +0 -0
  36. source/docs/figures/final-paired-nll.svg +716 -0
  37. source/output/pdf/loss-lab-research-report.pdf +3 -0
  38. source/requirements-report.txt +3 -0
  39. source/results/VERIFICATION.json +295 -0
  40. source/scripts/package_release.py +72 -0
  41. source/scripts/research_report.py +273 -0
  42. source/scripts/verify_results.py +182 -0
  43. source/tests/test_recorded_results.py +31 -0
.gitattributes CHANGED
@@ -51,3 +51,8 @@ source/docs/figures/v2-shakespeare-diagnostics.png filter=lfs diff=lfs merge=lfs
51
  source/docs/figures/v2-shakespeare.png filter=lfs diff=lfs merge=lfs -text
52
  source/docs/figures/v2-tinystories-diagnostics.png filter=lfs diff=lfs merge=lfs -text
53
  source/docs/figures/v2-tinystories.png filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
51
  source/docs/figures/v2-shakespeare.png filter=lfs diff=lfs merge=lfs -text
52
  source/docs/figures/v2-tinystories-diagnostics.png filter=lfs diff=lfs merge=lfs -text
53
  source/docs/figures/v2-tinystories.png filter=lfs diff=lfs merge=lfs -text
54
+ source/docs/figures/final-learning-curves.png filter=lfs diff=lfs merge=lfs -text
55
+ source/output/pdf/loss-lab-research-report.pdf filter=lfs diff=lfs merge=lfs -text
56
+ RESEARCH_REPORT.pdf filter=lfs diff=lfs merge=lfs -text
57
+ docs/figures/final-learning-curves.png filter=lfs diff=lfs merge=lfs -text
58
+ figures/final-learning-curves.png filter=lfs diff=lfs merge=lfs -text
CITATION.cff CHANGED
@@ -4,8 +4,8 @@ title: "Loss Lab: Cross Entropy and Brier in nanoGPT"
4
  authors:
5
  - name: "ctxnn1"
6
  type: software
7
- version: "2.0.0"
8
- date-released: "2026-10-24"
9
  license: MIT
10
  url: "https://huggingface.co/ctxnn1/loss-lab-ce-brier"
11
  repository-code: "https://huggingface.co/ctxnn1/loss-lab-ce-brier"
 
4
  authors:
5
  - name: "ctxnn1"
6
  type: software
7
+ version: "2.1.0"
8
+ date-released: "2026-10-28"
9
  license: MIT
10
  url: "https://huggingface.co/ctxnn1/loss-lab-ce-brier"
11
  repository-code: "https://huggingface.co/ctxnn1/loss-lab-ce-brier"
FILES_SHA256.json CHANGED
@@ -2,9 +2,9 @@
2
  "Dockerfile": "15c3aa315eb4e00aefaad1cdc46864a24e6fc4c626b793a0e6d96be79b40b6f3",
3
  "requirements.txt": "1bbfa2cb9c22d87ec6a6d98b1a0475516be0a5e29ef88865f21622510341ead3",
4
  "LICENSE": "b174e6faf4c63ad0b6f988595deea7dd0bb171b3d922b9f9b0c627e0db38da9d",
5
- "CITATION.cff": "fb2e1ad6004be1e01a60dcf31f978124d3da806c5348f672c01cfe6729b147f6",
6
  "RESEARCH_RESULTS.md": "d11bcf9f6acc8b2fb4b04bed7a1ec4a4f6939017c7f3e621541dddf686a0ddbc",
7
- "README.md": "a9982e8f884d94d51de91a99902d970217f925ac04965fcc10036c61b4cac7fb",
8
  "runs/v1/original/pipeline.json": "183bfd3fee3303bdbb2d7243b76c9bd30c2f202c370ef7d7a32503e6890f8f1f",
9
  "runs/v1/original/datasets/tinystories/train.bin": "55259e6d1f07ddea3ace4d1d422e00e7ddb4faa692d500d2e1fd75a7abef91eb",
10
  "runs/v1/original/datasets/tinystories/val.bin": "425b44179d138c45ee999eb37fed5900dd84d19e94f20db78585dc7453353bd9",
@@ -209,7 +209,7 @@
209
  "runs/research/v2-tinystories/models/ce-seed1337/config.json": "1392a9ff7499ffb84c45016a862a62bd9723f57d98dafbe25488cbae8e89794b",
210
  "runs/research/v2-tinystories/models/ce-seed1337/tokenizer.json": "ba73a66ac59ce93b22cdbef2640ef21b4667acac264161610c76d16a1a6ae933",
211
  "source/LICENSE": "b174e6faf4c63ad0b6f988595deea7dd0bb171b3d922b9f9b0c627e0db38da9d",
212
- "source/CITATION.cff": "fb2e1ad6004be1e01a60dcf31f978124d3da806c5348f672c01cfe6729b147f6",
213
  "source/Dockerfile": "e5698d382aa237b72b2ef83e685b775a3b7c919a97ca6ebab03e17fa66c4c138",
214
  "source/Research.Dockerfile": "610c67cec90b98f9c3fc1a6e5e4f6d50615574e40f3fa06d28199313c583ba07",
215
  "source/requirements.txt": "f54fde6250af67be2c903bc2363344c1e411c53098e356b6c16f80d0070bbb7a",
@@ -258,7 +258,7 @@
258
  "RESEARCH_PROVENANCE.json": "d1513504b23363c6878da324fe7c87557436fd4c681f4e8181a10eaa57375c78",
259
  "dashboard.html": "c747189c03a14b7aeb90271d6a2ba41003fc9ceefa6aeb3a09c1598f697da59a",
260
  "RESEARCH_PLAN.md": "7a19bc6c4f413e352c90fb4a54a46f23a47bfa0cef90f49920781bc933d6333c",
261
- "REPRODUCE.md": "1b4bf1cf45ac55a1c386b925626527c95d612b6a9e1f0c782ef70daae03483c2",
262
  "DATA_LICENSES.md": "eab2c7485fc4558ee1daebc703eeb3c0d746ab7f43e40cc9a7c3b05928e9c8c9",
263
  "metrics/validation-history.csv": "ff0391a427aca28c47f930e752c738913481dd435e264262739595811051db97",
264
  "metrics/learning-rate-trials.csv": "bcda34b70c46886ad1e693b0d3e05c638fd088b850591c67acef6568152bc102",
@@ -266,9 +266,9 @@
266
  "metrics/README.md": "86aa658090bed785b16bf8d15819804a6b364db81c310af5eaabd3cb71464ad5",
267
  "metrics/samples.jsonl": "93d297bad2951670e1f366153869029d3590cf406f15725bfc42ff0b447cfe50",
268
  "source/requirements-research.txt": "1bbfa2cb9c22d87ec6a6d98b1a0475516be0a5e29ef88865f21622510341ead3",
269
- "source/README.md": "e3221364ebe6548ed99699d03566b3bb799209ebae17ad1399b74119b2ca27d5",
270
  "source/.dockerignore": "86028321e99bdf0855642a99556b9255c97f4a61ee2de4e1013d5303fbc10135",
271
- "docs/RESEARCH_REPRODUCE.md": "1b4bf1cf45ac55a1c386b925626527c95d612b6a9e1f0c782ef70daae03483c2",
272
  "docs/OPERATIONS.md": "6cae3020eb3528965931268d00a68dfff9786a0d5fd7766a36effc4fe2328561",
273
  "docs/RESEARCH_RESULTS.md": "d11bcf9f6acc8b2fb4b04bed7a1ec4a4f6939017c7f3e621541dddf686a0ddbc",
274
  "docs/RESEARCH_PLAN.md": "7a19bc6c4f413e352c90fb4a54a46f23a47bfa0cef90f49920781bc933d6333c",
@@ -297,7 +297,7 @@
297
  "source/experiments/sample_safetensors.py": "e6f30461fd8f8515fd47937359237b9d318c9a089d0a9747006fb2f79276d975",
298
  "source/tests/test_publication_report.py": "4fca5153bd183733e9046a57d48bf58fa0bae7adfc92fd09beca142d5f9c33d5",
299
  "source/tests/test_safe_sample.py": "bcdc909533ec694a3a7faf350dcea0845b91a45952decdec04b4b3fedf824826",
300
- "source/docs/RESEARCH_REPRODUCE.md": "1b4bf1cf45ac55a1c386b925626527c95d612b6a9e1f0c782ef70daae03483c2",
301
  "source/docs/RESEARCH_RESULTS.md": "d11bcf9f6acc8b2fb4b04bed7a1ec4a4f6939017c7f3e621541dddf686a0ddbc",
302
  "source/dashboard/src/theme.css": "8f714846965b075868db607dcca3f0bedb8f7057a999d8f1a95d60bbdfcf6980",
303
  "source/dashboard/src/data.json": "c905e0d0b48c846cb2d4c6c7e196db76627060a9589fc466c5107fa16b0e3551",
@@ -326,7 +326,7 @@
326
  "source/docs/figures/v2-shakespeare-diagnostics.png": "05e39c24ec41e2a91083f4a2a3ea8e84cf5469ce612846178e672e1184fbac6f",
327
  "source/docs/figures/v2-shakespeare.svg": "8cdcb1c4e08f421bf72883df3deeb1d8c86c647fb7ce602f7dc779a95819dc41",
328
  ".gitignore": "135bc1e9227d4784839eedcaf54bd465a24c9bc55a96cb7fb55375610d36742c",
329
- "source/.gitignore": "135bc1e9227d4784839eedcaf54bd465a24c9bc55a96cb7fb55375610d36742c",
330
  "source/experiments/archive.py": "ec1dca88f63ac097850f3edf608d304adf33acadfcf93f0b8577e205b0c71861",
331
  "source/experiments/reporting.py": "dc26418b519b9e729622ab0426cce2c64e0818c6f103d3c66bdbfed3a11aefc6",
332
  "source/dashboard/index.html": "314bb3975bdcd7322067d234f99398b06f609c67c2321554eda742f2338b3c5e",
@@ -576,5 +576,38 @@
576
  "source/dashboard/docs/components/bar-presentations.md": "3ec11931b0d05ec75282d3b23f77b348a271fff4dfad3379890cea35fff9309a",
577
  "source/dashboard/docs/components/layout.md": "da9013b89a528bfee18235581de33da73d6aefd5695851f3e808d84b53446bd1",
578
  "source/dashboard/docs/components/filtering.md": "7820b3d916b4c3c74243d98be96e819f7bd0a828e466e9621127a32c2bf6c1b9",
579
- "source/dashboard/docs/components/funnels.md": "bc6f858194ad820b4b62123191d9603847f4f860ca3428d08816457323f79ed3"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
580
  }
 
2
  "Dockerfile": "15c3aa315eb4e00aefaad1cdc46864a24e6fc4c626b793a0e6d96be79b40b6f3",
3
  "requirements.txt": "1bbfa2cb9c22d87ec6a6d98b1a0475516be0a5e29ef88865f21622510341ead3",
4
  "LICENSE": "b174e6faf4c63ad0b6f988595deea7dd0bb171b3d922b9f9b0c627e0db38da9d",
5
+ "CITATION.cff": "65a13fa1797ec905388ef48b0ee2619f790f534a7c6bb0d79e1379d0f2750f00",
6
  "RESEARCH_RESULTS.md": "d11bcf9f6acc8b2fb4b04bed7a1ec4a4f6939017c7f3e621541dddf686a0ddbc",
7
+ "README.md": "21d3182743621252841e8ae2715b1f785ea87e29e5963589772cd8b69b4b86d2",
8
  "runs/v1/original/pipeline.json": "183bfd3fee3303bdbb2d7243b76c9bd30c2f202c370ef7d7a32503e6890f8f1f",
9
  "runs/v1/original/datasets/tinystories/train.bin": "55259e6d1f07ddea3ace4d1d422e00e7ddb4faa692d500d2e1fd75a7abef91eb",
10
  "runs/v1/original/datasets/tinystories/val.bin": "425b44179d138c45ee999eb37fed5900dd84d19e94f20db78585dc7453353bd9",
 
209
  "runs/research/v2-tinystories/models/ce-seed1337/config.json": "1392a9ff7499ffb84c45016a862a62bd9723f57d98dafbe25488cbae8e89794b",
210
  "runs/research/v2-tinystories/models/ce-seed1337/tokenizer.json": "ba73a66ac59ce93b22cdbef2640ef21b4667acac264161610c76d16a1a6ae933",
211
  "source/LICENSE": "b174e6faf4c63ad0b6f988595deea7dd0bb171b3d922b9f9b0c627e0db38da9d",
212
+ "source/CITATION.cff": "65a13fa1797ec905388ef48b0ee2619f790f534a7c6bb0d79e1379d0f2750f00",
213
  "source/Dockerfile": "e5698d382aa237b72b2ef83e685b775a3b7c919a97ca6ebab03e17fa66c4c138",
214
  "source/Research.Dockerfile": "610c67cec90b98f9c3fc1a6e5e4f6d50615574e40f3fa06d28199313c583ba07",
215
  "source/requirements.txt": "f54fde6250af67be2c903bc2363344c1e411c53098e356b6c16f80d0070bbb7a",
 
258
  "RESEARCH_PROVENANCE.json": "d1513504b23363c6878da324fe7c87557436fd4c681f4e8181a10eaa57375c78",
259
  "dashboard.html": "c747189c03a14b7aeb90271d6a2ba41003fc9ceefa6aeb3a09c1598f697da59a",
260
  "RESEARCH_PLAN.md": "7a19bc6c4f413e352c90fb4a54a46f23a47bfa0cef90f49920781bc933d6333c",
261
+ "REPRODUCE.md": "85a36aa7e7822acc1dfee964110cb47882c766cc2258ac494cc2df3302b759e3",
262
  "DATA_LICENSES.md": "eab2c7485fc4558ee1daebc703eeb3c0d746ab7f43e40cc9a7c3b05928e9c8c9",
263
  "metrics/validation-history.csv": "ff0391a427aca28c47f930e752c738913481dd435e264262739595811051db97",
264
  "metrics/learning-rate-trials.csv": "bcda34b70c46886ad1e693b0d3e05c638fd088b850591c67acef6568152bc102",
 
266
  "metrics/README.md": "86aa658090bed785b16bf8d15819804a6b364db81c310af5eaabd3cb71464ad5",
267
  "metrics/samples.jsonl": "93d297bad2951670e1f366153869029d3590cf406f15725bfc42ff0b447cfe50",
268
  "source/requirements-research.txt": "1bbfa2cb9c22d87ec6a6d98b1a0475516be0a5e29ef88865f21622510341ead3",
269
+ "source/README.md": "8e78ba4f9e9e57ad359fb6d67b20f7ec74c68467a1d1bfe1034f713e488a2d71",
270
  "source/.dockerignore": "86028321e99bdf0855642a99556b9255c97f4a61ee2de4e1013d5303fbc10135",
271
+ "docs/RESEARCH_REPRODUCE.md": "85a36aa7e7822acc1dfee964110cb47882c766cc2258ac494cc2df3302b759e3",
272
  "docs/OPERATIONS.md": "6cae3020eb3528965931268d00a68dfff9786a0d5fd7766a36effc4fe2328561",
273
  "docs/RESEARCH_RESULTS.md": "d11bcf9f6acc8b2fb4b04bed7a1ec4a4f6939017c7f3e621541dddf686a0ddbc",
274
  "docs/RESEARCH_PLAN.md": "7a19bc6c4f413e352c90fb4a54a46f23a47bfa0cef90f49920781bc933d6333c",
 
297
  "source/experiments/sample_safetensors.py": "e6f30461fd8f8515fd47937359237b9d318c9a089d0a9747006fb2f79276d975",
298
  "source/tests/test_publication_report.py": "4fca5153bd183733e9046a57d48bf58fa0bae7adfc92fd09beca142d5f9c33d5",
299
  "source/tests/test_safe_sample.py": "bcdc909533ec694a3a7faf350dcea0845b91a45952decdec04b4b3fedf824826",
300
+ "source/docs/RESEARCH_REPRODUCE.md": "85a36aa7e7822acc1dfee964110cb47882c766cc2258ac494cc2df3302b759e3",
301
  "source/docs/RESEARCH_RESULTS.md": "d11bcf9f6acc8b2fb4b04bed7a1ec4a4f6939017c7f3e621541dddf686a0ddbc",
302
  "source/dashboard/src/theme.css": "8f714846965b075868db607dcca3f0bedb8f7057a999d8f1a95d60bbdfcf6980",
303
  "source/dashboard/src/data.json": "c905e0d0b48c846cb2d4c6c7e196db76627060a9589fc466c5107fa16b0e3551",
 
326
  "source/docs/figures/v2-shakespeare-diagnostics.png": "05e39c24ec41e2a91083f4a2a3ea8e84cf5469ce612846178e672e1184fbac6f",
327
  "source/docs/figures/v2-shakespeare.svg": "8cdcb1c4e08f421bf72883df3deeb1d8c86c647fb7ce602f7dc779a95819dc41",
328
  ".gitignore": "135bc1e9227d4784839eedcaf54bd465a24c9bc55a96cb7fb55375610d36742c",
329
+ "source/.gitignore": "971fa38bf06b07f1df61e3f556d60eaabf7eef6c26389f5b24886c47fab92eb6",
330
  "source/experiments/archive.py": "ec1dca88f63ac097850f3edf608d304adf33acadfcf93f0b8577e205b0c71861",
331
  "source/experiments/reporting.py": "dc26418b519b9e729622ab0426cce2c64e0818c6f103d3c66bdbfed3a11aefc6",
332
  "source/dashboard/index.html": "314bb3975bdcd7322067d234f99398b06f609c67c2321554eda742f2338b3c5e",
 
576
  "source/dashboard/docs/components/bar-presentations.md": "3ec11931b0d05ec75282d3b23f77b348a271fff4dfad3379890cea35fff9309a",
577
  "source/dashboard/docs/components/layout.md": "da9013b89a528bfee18235581de33da73d6aefd5695851f3e808d84b53446bd1",
578
  "source/dashboard/docs/components/filtering.md": "7820b3d916b4c3c74243d98be96e819f7bd0a828e466e9621127a32c2bf6c1b9",
579
+ "source/dashboard/docs/components/funnels.md": "bc6f858194ad820b4b62123191d9603847f4f860ca3428d08816457323f79ed3",
580
+ "source/RELEASE_MANIFEST.json": "52d93087a6fddd7fa01f81ce8bd290089a919c3e1bf082b3f609130d3ab8fb91",
581
+ "source/VERSION": "c89b87c262e9d5ffd20e73aac74a1772adcc9f5a21682cc33adcf5086e5fef5c",
582
+ "source/dashboard.html": "c747189c03a14b7aeb90271d6a2ba41003fc9ceefa6aeb3a09c1598f697da59a",
583
+ "source/docs/figures/final-confident-errors.png": "ffa76140ef7859c519ff053b753ee153d35f959e2572f0d6be826ed7dd51bd1f",
584
+ "source/docs/figures/final-confident-errors.svg": "356ff318a968cec194c45963e4a356d29d306c6c3f37adcda9523765709fdf17",
585
+ "source/docs/figures/final-learning-curves.png": "6301a655d11e4c949da132ba0448175f3257b6f50fac0271a19f76c4fb1ba81e",
586
+ "source/docs/figures/final-learning-curves.svg": "6c998ed3cc489fc3de1cf6609ed6cf7f6f97acc6c4ae00aa538e1a1c9893c25f",
587
+ "source/docs/figures/final-paired-nll.png": "dca841b44450a4207c12d51f0b15363e6ed6da861dbaa4e5759799ff77318037",
588
+ "source/docs/figures/final-paired-nll.svg": "4343b101d2098c38f651d72c954833191865b13f5369407acac0533565c5c054",
589
+ "source/output/pdf/loss-lab-research-report.pdf": "aeabb786f1efc3a35cdfeaeb76ba0851e46af55871f955d1f812fa80c0b61ec0",
590
+ "source/requirements-report.txt": "2485480cb9090be564943b86813cb5846ecc7a4d99e412d97ba3e7b561a1adff",
591
+ "source/results/VERIFICATION.json": "849458322833bef9405a9d94b48ae4277c25e20fda1d91a91a80914066dee3d5",
592
+ "source/scripts/package_release.py": "5ca5632c01f96252add70b13c0a593554fa54a18ccbb09ced9cfa70c4b509667",
593
+ "source/scripts/research_report.py": "4f54c9b95fa879233b396f1ae0f2b1ad34309a51b90b69a537de7e809941ce1a",
594
+ "source/scripts/verify_results.py": "4e2955dce8633a26665d5aee2c6ef3336c7e5b8dd7e008dcbf938af64cd76b80",
595
+ "source/tests/test_recorded_results.py": "5c37e2544ad31bf23dacbce6021b46da11af2d5987482beecae065522c704c61",
596
+ "RELEASE_MANIFEST.json": "52d93087a6fddd7fa01f81ce8bd290089a919c3e1bf082b3f609130d3ab8fb91",
597
+ "RESEARCH_REPORT.pdf": "aeabb786f1efc3a35cdfeaeb76ba0851e46af55871f955d1f812fa80c0b61ec0",
598
+ "docs/figures/final-paired-nll.svg": "4343b101d2098c38f651d72c954833191865b13f5369407acac0533565c5c054",
599
+ "docs/figures/final-paired-nll.png": "dca841b44450a4207c12d51f0b15363e6ed6da861dbaa4e5759799ff77318037",
600
+ "docs/figures/final-confident-errors.png": "ffa76140ef7859c519ff053b753ee153d35f959e2572f0d6be826ed7dd51bd1f",
601
+ "docs/figures/final-learning-curves.png": "6301a655d11e4c949da132ba0448175f3257b6f50fac0271a19f76c4fb1ba81e",
602
+ "docs/figures/final-learning-curves.svg": "6c998ed3cc489fc3de1cf6609ed6cf7f6f97acc6c4ae00aa538e1a1c9893c25f",
603
+ "docs/figures/final-confident-errors.svg": "356ff318a968cec194c45963e4a356d29d306c6c3f37adcda9523765709fdf17",
604
+ "figures/final-paired-nll.svg": "4343b101d2098c38f651d72c954833191865b13f5369407acac0533565c5c054",
605
+ "figures/final-paired-nll.png": "dca841b44450a4207c12d51f0b15363e6ed6da861dbaa4e5759799ff77318037",
606
+ "figures/final-confident-errors.png": "ffa76140ef7859c519ff053b753ee153d35f959e2572f0d6be826ed7dd51bd1f",
607
+ "figures/final-learning-curves.png": "6301a655d11e4c949da132ba0448175f3257b6f50fac0271a19f76c4fb1ba81e",
608
+ "figures/final-learning-curves.svg": "6c998ed3cc489fc3de1cf6609ed6cf7f6f97acc6c4ae00aa538e1a1c9893c25f",
609
+ "figures/final-confident-errors.svg": "356ff318a968cec194c45963e4a356d29d306c6c3f37adcda9523765709fdf17",
610
+ "loss-lab-v2.1.0.zip": "9fc5da20f72b0bb584fa260cf642ec9bd476c492d36bde1e48291abea43d1d06",
611
+ "loss-lab-v2.1.0.zip.sha256": "a8591efd76b5520cbe9f9a542290483e45b0a764be445a7ce4d3b75879b338a2",
612
+ "RELEASE.json": "a32b717c03092a2c06c92f9d0a05d5f2ad4da639a5c8c0fcb213a53b1306b8e3"
613
  }
README.md CHANGED
@@ -9,6 +9,18 @@ tags:
9
  - research
10
  ---
11
 
 
 
 
 
 
 
 
 
 
 
 
 
12
  # Full-duration CE versus Brier study
13
 
14
  Exploratory paired nanoGPT experiments. Five main seeds per loss. Learning rates are selected by final validation NLL after a full-duration sweep; test scores never select rates.
 
9
  - research
10
  ---
11
 
12
+ # Loss Lab - completed research release v2.1.0
13
+
14
+ [Research report (PDF)](RESEARCH_REPORT.pdf) · [Download the portable project](https://huggingface.co/ctxnn1/loss-lab-ce-brier/resolve/v2.1.0/loss-lab-v2.1.0.zip?download=true) · [Interactive dashboard](dashboard.html?download=true) · [Complete source](source/)
15
+
16
+ The final release retains 42 main models, 42 tuning runs and all 1,248 samples. The portable project needs no GPU, credentials or ML dependencies to verify its records: run `python3 scripts/verify_results.py` after extracting it. Its clean copy passes all 27 public tests. Large weights are indexed separately. Pin downloads to v2.1.0 or an exact commit.
17
+
18
+ ![Every expanded paired NLL difference favors cross entropy](figures/final-paired-nll.png)
19
+
20
+ The six-page report explains methods, secondary metrics, gradient measurements, the original ranking reversal and the limits of the conclusions. Personal cloud scripts and deployment state are excluded.
21
+
22
+ ---
23
+
24
  # Full-duration CE versus Brier study
25
 
26
  Exploratory paired nanoGPT experiments. Five main seeds per loss. Learning rates are selected by final validation NLL after a full-duration sweep; test scores never select rates.
RELEASE.json ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "version": "2.1.0",
3
+ "status": "complete",
4
+ "source_commit": "d9297fd625122051b759e25c4dcf4a883a37502a",
5
+ "portable_bundle": {
6
+ "file": "loss-lab-v2.1.0.zip",
7
+ "sha256": "9fc5da20f72b0bb584fa260cf642ec9bd476c492d36bde1e48291abea43d1d06",
8
+ "bytes": 6753705,
9
+ "weights_included": false
10
+ },
11
+ "report": "RESEARCH_REPORT.pdf",
12
+ "source_manifest": "source/RELEASE_MANIFEST.json",
13
+ "main_models": 42,
14
+ "tuning_runs": 42,
15
+ "saved_samples": 1248,
16
+ "public_tests_passed": 27,
17
+ "offline_integrity_verification": true,
18
+ "remote_native_and_tensor_hashes_verified": 84,
19
+ "new_gpu_training_required": false
20
+ }
RELEASE_MANIFEST.json ADDED
@@ -0,0 +1,347 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema_version": 1,
3
+ "version": "2.1.0",
4
+ "scope": "Portable project and source bundle. Hub source lives under source/; published model hashes are in FILES_SHA256.json.",
5
+ "files": {
6
+ ".dockerignore": "86028321e99bdf0855642a99556b9255c97f4a61ee2de4e1013d5303fbc10135",
7
+ ".gitignore": "971fa38bf06b07f1df61e3f556d60eaabf7eef6c26389f5b24886c47fab92eb6",
8
+ "CITATION.cff": "65a13fa1797ec905388ef48b0ee2619f790f534a7c6bb0d79e1379d0f2750f00",
9
+ "Dockerfile": "e5698d382aa237b72b2ef83e685b775a3b7c919a97ca6ebab03e17fa66c4c138",
10
+ "LICENSE": "b174e6faf4c63ad0b6f988595deea7dd0bb171b3d922b9f9b0c627e0db38da9d",
11
+ "README.md": "8e78ba4f9e9e57ad359fb6d67b20f7ec74c68467a1d1bfe1034f713e488a2d71",
12
+ "Research.Dockerfile": "610c67cec90b98f9c3fc1a6e5e4f6d50615574e40f3fa06d28199313c583ba07",
13
+ "VERSION": "c89b87c262e9d5ffd20e73aac74a1772adcc9f5a21682cc33adcf5086e5fef5c",
14
+ "configs/comparison.json": "886698567ab39bf9f447bdef2b12f39ac3d76ce34eeffe18ce98b555468ecf13",
15
+ "configs/research-plan.json": "d0d8bebf96ad6ae3bf97177ca863011ccf2aa839f4369d8c373f61942677bba3",
16
+ "configs/smoke.json": "252221b8663bb2ad61c4f8aa9276bec7a32a179a1cb3a2821231b9f012f36fe7",
17
+ "configs/tinystories.json": "c10e9c38e7ad7472c85333f14198dffc366877b462c6d031ec49efb42bd05a97",
18
+ "dashboard.html": "c747189c03a14b7aeb90271d6a2ba41003fc9ceefa6aeb3a09c1598f697da59a",
19
+ "dashboard/AGENTS.md": "215baf947a82508f9aa349acce5fb747e43aaf874ddf7b9b11436b80fab50240",
20
+ "dashboard/docs/components/README.md": "c24c56d48a2b491a0a648ec0beee10f43d12c8d7fe2b5e74d89879fd31879419",
21
+ "dashboard/docs/components/async-data.md": "ddd293d4e1200a3c4814e520443dd9e22c1214b102deef877e0eb7da132cfb7d",
22
+ "dashboard/docs/components/bar-presentations.md": "3ec11931b0d05ec75282d3b23f77b348a271fff4dfad3379890cea35fff9309a",
23
+ "dashboard/docs/components/charts.md": "85f8c4106b1693994590f11d2fc4ef557c8ee00502c3bef1d831171b2cd74217",
24
+ "dashboard/docs/components/comparison-formatting.md": "35faa7cc51b5e7f3a00ee2b155343589b62c645cf9ae4f053118c72c528959e9",
25
+ "dashboard/docs/components/controls.md": "697c4e56b377e535c263220acbf4a4b4c05f8b072a47126051aa85dff8f3ea99",
26
+ "dashboard/docs/components/filtering.md": "7820b3d916b4c3c74243d98be96e819f7bd0a828e466e9621127a32c2bf6c1b9",
27
+ "dashboard/docs/components/funnels.md": "bc6f858194ad820b4b62123191d9603847f4f860ca3428d08816457323f79ed3",
28
+ "dashboard/docs/components/layout.md": "da9013b89a528bfee18235581de33da73d6aefd5695851f3e808d84b53446bd1",
29
+ "dashboard/docs/components/reports.md": "a698727d6993ce703ca4b33749cce9313aece525ce91132f2433f39fe3894cf0",
30
+ "dashboard/docs/components/sortable-layout.md": "fd0f9bfae34a9aa1563e17699a8591f1c24f7579303c176dcb27f45e6dc7bf96",
31
+ "dashboard/docs/components/sources.md": "2e6efcd576ec195c64895ded0aa29d629d94154fcc437828d2288a9440c31202",
32
+ "dashboard/docs/components/tables.md": "bad26c41789c621c24e25748111e20c6a100533477ef582c175a1edca12380f3",
33
+ "dashboard/index.html": "314bb3975bdcd7322067d234f99398b06f609c67c2321554eda742f2338b3c5e",
34
+ "dashboard/package-lock.json": "a018dca90e5f5893c698b9b41ee53f64e91cf0533f5ab3dc86c51b5a95dedf4b",
35
+ "dashboard/package.json": "6ee23dabbf22d64b8091a07b9dc857ff1ce2770e02886baaf68716595db8f14c",
36
+ "dashboard/protected-runtime.json": "5dc277c945090cc81cdc337e48e1b99e98f82c7d99a6c5e23e81bfb206ff5f06",
37
+ "dashboard/scripts/authorize-protected-change.mjs": "9b9f012d65c34a1f9ac4d107ba226f82aadabde72980c2d393c63e9d68eff6a3",
38
+ "dashboard/scripts/protected-file-digest.mjs": "2583e42fafb0d0fab7342b8dca163fe0d6771928dc41c830fbdfdee3af821822",
39
+ "dashboard/scripts/verify-protected-runtime.mjs": "47d95847a9135cd125581a4b994208adc3822cbef4a2c8bfaf562f0d2ef3a9af",
40
+ "dashboard/src/App.jsx": "2f4b8f28c24ee9498c8de670a7f9c7fb79a584c67f67d88b782ec301838cc54b",
41
+ "dashboard/src/DataAppContext.jsx": "309d971e9fd4494b2f704087c81ded8837ec955ae4a57898f54dd776c8fca30f",
42
+ "dashboard/src/DataAppRuntime.jsx": "3008a08c2a79c90a5ea5cb3f91b7f77113dfca1e8c4578bf47c34bd9932bd088",
43
+ "dashboard/src/DataAppShell.jsx": "004aa988679e158e668b8dd8c151869e9b6106cd31eeb33de0b51fc51c107259",
44
+ "dashboard/src/block-layout.js": "385da9c5081f9a24ee3eb8948b87aa7a6c6b0f1b7b37d26c91ae07fb01a81c8b",
45
+ "dashboard/src/build-state.js": "1fe7e56e5e8173e0da5d432600f385b13d9133cbeb243ef26edd97985babf6d8",
46
+ "dashboard/src/card-image.js": "b91c236f6e3b1c1bf5d7ca8085a4378770336b671dc3e36e403efa91995e851c",
47
+ "dashboard/src/chart-export.js": "f3eecf07f28799612c5e5b246e0cbd83d20850eac66599d29a72df7db92a69a3",
48
+ "dashboard/src/chart-image.js": "c48da8343b765813bc1294bcd81967fcd0b2bfe94f18174a1e3d4db6c44d1936",
49
+ "dashboard/src/chart-permalink.js": "de7b01a00bc0d2b478a63f50c0716272af7567283b793d908e2d8750a59a8458",
50
+ "dashboard/src/charting/BarFamilyRenderer.jsx": "235811f05967f5a1931c020b65e9a9ed6faf950c50e3c71a9868d4167a9c52c2",
51
+ "dashboard/src/charting/CategoryAxisTick.jsx": "e9f70ac3997d76125a58221dc0778a3437781947f2ef27722a171f2ea0a66561",
52
+ "dashboard/src/charting/ChartAnnotations.jsx": "8da6f704a1e8850873e99a4f778ebec29215a6df329bbdb11b46b01c09f8a022",
53
+ "dashboard/src/charting/ChartFrame.jsx": "bb0925854283f32cc398144a79e69113e4874018375ddf4e241d3f5fd06ddcf0",
54
+ "dashboard/src/charting/ChartMark.jsx": "bad3bfefaef82395ea67aaef44c75941d6087eb45137214bb78d04b2978565b1",
55
+ "dashboard/src/charting/ChartRenderer.jsx": "2335f9e8a29c38a017d154a14b9149700e5084997791b6756fcae29933978551",
56
+ "dashboard/src/charting/ChartState.jsx": "ad5b28521894d219e36027fcfc2640d0c0b8b290f55b4f6d1215ef2c9f2a7d46",
57
+ "dashboard/src/charting/ChartTooltip.jsx": "51303b729ff7adbf0405e67523a09c6aa89e40e144b61e717103b71b7c39a8bb",
58
+ "dashboard/src/charting/FunnelRenderer.jsx": "1103ec5a1a88f1a14622d5e6e30cf2e9b58d03d9cb6f21f973c62c6e7cd1309f",
59
+ "dashboard/src/charting/HeatmapRenderer.jsx": "2034e2e3d9a6d3c86256de1abbd73da7473401232e777e12d9d2de23c79a84b2",
60
+ "dashboard/src/charting/MetricSparkline.jsx": "9a5aae5cbd27b96baecc406bb69f91fc76cc9d5fc2aaa9e7e356d68d8c7ac08d",
61
+ "dashboard/src/charting/NumericAxes.jsx": "5eb37be4711efdb03eaa70225089fd6c4f4f597d3aa7faf81c3a55793d1aa883",
62
+ "dashboard/src/charting/PieRenderer.jsx": "fc1265bf867154c239ddb14b539c63751ab7716fb19903b535ccd9c06ca8a0cc",
63
+ "dashboard/src/charting/SankeyRenderer.jsx": "48c412a1e6394f152ae6bf8fef5023f76d6347844abb0a3710aa0f48f748a9c2",
64
+ "dashboard/src/charting/SelectedChartRegion.jsx": "1717361a56edb81e2f00bbdc57db66be844d02de43d5ce27cae7cd8f5722b0e7",
65
+ "dashboard/src/charting/TableSparkline.jsx": "466d91f5de2fab7f1fd8654e2ad800c56d0b6d6a71adc058405985a59a918da1",
66
+ "dashboard/src/charting/TemporalXAxis.jsx": "ef2ba3b476b1887416ede87fb577450ec0d54524b54c3cec3e2dbbc659c752d6",
67
+ "dashboard/src/charting/bar-family.js": "c31e44122f8d2e14b3f09bbeabe26fadea115a5488be2311720ff2bc54e7fbda",
68
+ "dashboard/src/charting/chart-annotation-layout.js": "09cd7715da2191c0257ccce4f900141dc4f3c5bf62a83bb5bec04ad23e4e96d2",
69
+ "dashboard/src/charting/chart-annotations.js": "bf8fd4fc8f5d586daa18c315855d9f67083ea2978860b7a5d64b7f713352098c",
70
+ "dashboard/src/charting/chart-data-shape.js": "4c1dea15118a8dffd68bfa3c0b6291a691d1929862a32a02edb8c711dc1fcedc",
71
+ "dashboard/src/charting/chart-editor-state.js": "57e1439926bff4e9aab3847b3e1bf92f1ab5554f53688112da56344c5a9cc0b8",
72
+ "dashboard/src/charting/chart-extrema.js": "ab4bd4a9adb25d2648ac95f8bf6388c5fe9eadbf7115a545925dedd7611a1850",
73
+ "dashboard/src/charting/chart-mark-interactions.js": "d93877eb6ef8324f0109277754e04affac135769a18f2d2d99d51d8382abb726",
74
+ "dashboard/src/charting/chart-overrides.js": "09e15338c86d93f7fb9845757d0ba223f71705d540ec467c18d32df7b10bb8f9",
75
+ "dashboard/src/charting/chart-spec-validation.js": "a293a06bc346734f25742f79d100ce45c45d107ec5c368965f931bf2d7b5c5f8",
76
+ "dashboard/src/charting/chart-theme.js": "21367c8f24bd4122e85efe4bac43e2e6fa8567a0d098cf8d03158dd183342cb9",
77
+ "dashboard/src/charting/chart-transforms.js": "782d55023ec8dddfb99e7c5584c39cc23e102317aa3ca1e4668043c8814c3e86",
78
+ "dashboard/src/charting/experimental-bar-chart.css": "b9117bdd6cd0f441f23b82a6d79fd17fc3e13e2f2003d631afc0827b2cf8174e",
79
+ "dashboard/src/charting/table-data.js": "2e61118fccdba5c565e1995fab213da44750817d9a7da85593776d5793234ef2",
80
+ "dashboard/src/chrome-contrast.js": "f18b05b03ec11c1f405527216ac1dc9c403074c22208bc7534008b8e4062d2e6",
81
+ "dashboard/src/chrome-layout.js": "3027c569c6266762f6d90268df1650768777b1b5cecb1405820d22bbd8588fb7",
82
+ "dashboard/src/components/Chart.jsx": "bb3193138a46e22fa0c3e3bc342fdfa539f03371cf1d628bef624a6a357e7e52",
83
+ "dashboard/src/components/ChartEditor.jsx": "485f6b405d310b11e6e784893971ae78e38d2fa68cd8f8be16a2c459c5be7208",
84
+ "dashboard/src/components/ChartExplorer.jsx": "e23683cddd6efe4d323844fa97cc5a6fdfef665cd7312c5fece80618696c56d3",
85
+ "dashboard/src/components/ChartExportDialog.jsx": "d54792a80ac79f67249d4332b80ef71b3b320d55cc3256b15532bf011dd6045e",
86
+ "dashboard/src/components/Controls.jsx": "d9077aac0dd095dcc26f8accb904ce834db130c4d6700a73ab6732c30c815602",
87
+ "dashboard/src/components/CustomBlockHost.jsx": "b7bfec00a46435291b07d32ff39a2ec65e309aa532902fd94e9b1c72a8994a32",
88
+ "dashboard/src/components/DashboardAsk.jsx": "5664289776e4ed8544ffb45474691908e2bff1c520e88a467b288a26822ac94d",
89
+ "dashboard/src/components/DashboardTabs.jsx": "5490439c56960f12f62cc99bdadcb8d24e60707a0aa901b3225346fb8b1f5f5b",
90
+ "dashboard/src/components/DataAppChrome.jsx": "6eae567b93a5f5c1ca4eccecfbdf3d85398f181e2e7d2f3e3447b6f5ade50233",
91
+ "dashboard/src/components/DataAppHandoffDialog.jsx": "3bd1db7e4c0a5804d2dbed3625b096f3b25b1d4dc8441e8817a278355faea2bb",
92
+ "dashboard/src/components/DataAppLoadingContent.jsx": "bcfec0818ea0c90f75697f35a0f8e5d3b649314ad9daaadaabfecb945d6a3483",
93
+ "dashboard/src/components/DataAppToast.jsx": "1c80d8723f951755c132c5b1e51fab8dafd38cd6312ad7bc9e5a98d4403c2213",
94
+ "dashboard/src/components/DataComponent.jsx": "8b4c886d78d833ca621e9c2d7eaa14e80df550306aa224f936682713a90a96bf",
95
+ "dashboard/src/components/DataTable.jsx": "dbaa4b2de52daefdbe288032efca399fedf9e03f53313746553077e21465adde",
96
+ "dashboard/src/components/DateRangePicker.jsx": "8a2d61e55b89e7b994433d8ca4b2f8ddd86769d741d3b4ccd5d886e55e7d42a2",
97
+ "dashboard/src/components/Dropdown.jsx": "e7761601666fd1a948541502e1ccc1985ebd30673237aecb865208e927533299",
98
+ "dashboard/src/components/EditableText.jsx": "d86a22e16e067f284bd51ae7b96a6d5b0af51b8098f267a0790b0962dfe38ad0",
99
+ "dashboard/src/components/EvidenceChart.jsx": "3b836656e696325fc402535fe7a8dcd95b5e0ada6c3363aa64fc1cb3e1da79c5",
100
+ "dashboard/src/components/ExecutiveSummary.jsx": "375a8bc90881e493690d55838e677877a6ff27b6c585dad9af5dfbf0705c4e38",
101
+ "dashboard/src/components/Icon.jsx": "3181d5f82f887b5a7cf4a1c5b1fcb50d6ffc1a06d082ce9f3f569bc26b4341a6",
102
+ "dashboard/src/components/MetricCard.jsx": "d12e774297ff9e002dc243cfbf3541c54469da98dc24d77c093ad34b326745ac",
103
+ "dashboard/src/components/PublishReviewDialog.jsx": "02894bfb21d21f8605e92230f8553007b2c843c17560bc852375a62c57363d8b",
104
+ "dashboard/src/components/QueryDataBoundary.jsx": "a5229b8f6142652f6ac16bcf35ba10b0753206a54fff2cc74e21565620aec2e0",
105
+ "dashboard/src/components/RefreshSetupCoachmark.jsx": "5007f4f0878b0e6c9c924c47625386ba922aec57dd69c8633996b7d67ca7fc77",
106
+ "dashboard/src/components/RichMarkdown.jsx": "d0afa8e119b0cc3cad380757bb80d6180effee84caa380f415c94d6db8fdb43f",
107
+ "dashboard/src/components/RichTextFormatToolbar.jsx": "3ee14b50554fee37d94e28a9c208188affb4ac66d3c4b33b60fcb49008e2e11b",
108
+ "dashboard/src/components/Section.jsx": "bee8342892fe825b1e208a81b85dfc0f32811698dfb5cf11bc7b7aed46c7c708",
109
+ "dashboard/src/components/SectionNavigator.jsx": "d25fde954fb369abb828872ae842ced37c4713a18908ad80c2e63cb58e57bea3",
110
+ "dashboard/src/components/SegmentedControl.jsx": "34bcc4601dc3538a2c5dae36be7d0b6d81d0059c2b1c53626024cda9feaf2b10",
111
+ "dashboard/src/components/Slider.jsx": "2db4c7b93269d2c80f6ad7b49cefedd02f824e83c4f7dbf5191f48c2b743ee5d",
112
+ "dashboard/src/components/SmoothCardSurface.jsx": "ed917e8cc1f0f59ba49c2085bbc719ce85da62d4c9d0e3aa632f38a1b941cdd1",
113
+ "dashboard/src/components/SortableRegion.jsx": "5a2f9f62f2c3505a4806946f96b48458fe3c158e4b54b8265867bd01721aeffd",
114
+ "dashboard/src/components/SourceInspector.jsx": "7f29201a5cf83472fb62b99b55a192b3ac723c1a7e230553e4c52331c3c225cb",
115
+ "dashboard/src/components/SourcePreviewCardContent.jsx": "0422f3d1bcbc82a72718c75a5dfc5094e87f5698a2c73eafb6568f188902f23a",
116
+ "dashboard/src/components/SourcePreviewLink.jsx": "46e0121daa5ef023774b04ad035e6bb0e59c02efe8cf752400fcc2631244f5c2",
117
+ "dashboard/src/components/SourceProviderIcon.jsx": "fb4ea0956e8410c9820cbb41fcbdc187a9b1a0e8323e643bc24521302ea4b73a",
118
+ "dashboard/src/components/SourcesReceipt.jsx": "9485a522cf62c4ed35e89dcf500344d0ba6618ee41147564d0c6cc46b5174a3d",
119
+ "dashboard/src/components/Switch.jsx": "38010aef242d32133274db12e1d91323204630b47875af874b68cb81bc19b23d",
120
+ "dashboard/src/components/chart-color-utils.js": "87402e606a497cf3d2bbe4262640988f9a2ed70f25c029b2f41fc108e663c2dd",
121
+ "dashboard/src/components/chart-export.css": "5169a041e8e7de337915d5b39f3d6c7208c0c587ef15744f8813308476fa1c4f",
122
+ "dashboard/src/components/contained-ui.jsx": "da4daa991f8df9421a4290ca33709fb8bb055280c0558a4de1153b698472a789",
123
+ "dashboard/src/components/data-app-handoff.css": "6edd7a036016ba2c80c122f1322f3f1f3a01bf333e36c5ebbab79313c870ba05",
124
+ "dashboard/src/components/data-app-loading.css": "8ce37185b00f9a9c12563cec73ebafcd4612230a7f4d5afc09736b6f9c468074",
125
+ "dashboard/src/components/dropdown-model.js": "c70414249e31d44177bdf2c81deb93ae564ccb2833f01e4fefbe37df5d597177",
126
+ "dashboard/src/components/executive-summary.css": "70205776df61151a771da83d7a87dfbc24c4128fc9978270a43d2cbd160911c7",
127
+ "dashboard/src/components/form-controls.css": "4cd65b3a53eef43d1f9b32dd62ebf44555c887ed92aee484dc080ba384349f7b",
128
+ "dashboard/src/components/icons/convert-icon-google-docs.svg": "c5f417c7896dde4a45cf61778f1d66053825bc5fbc75252ebae63b7c0ea48987",
129
+ "dashboard/src/components/icons/convert-icon-google-slides.svg": "233363b561f4152765bdc78a8386ad6f4a4f0afc1e504cedb9962f68a561ccbd",
130
+ "dashboard/src/components/icons/convert-icon-jupyter.svg": "58938f5b71c10a73982ef00caa43a01ceae35b2817df547012e4ae8ed25d2fb6",
131
+ "dashboard/src/components/icons/convert-icon-pdf.svg": "63b5fda9c3657b7b7fb4af31c3d2f16fc19ce8b1ceed2cddf5e4fe12947beae6",
132
+ "dashboard/src/components/icons/convert-icon-powerpoint.svg": "71a7a6a82eda7e671a66cd6c25b5814e39cc5be7a3db8365b0237398eef30978",
133
+ "dashboard/src/components/icons/convert-icon-word.svg": "6db6f1fdfc0805fdf017c319affe5a9b91bf337b52b0bd6a0bec4ecfed3c6b7c",
134
+ "dashboard/src/components/icons/dashboard-icon-alertBell.svg": "bbd96bd8458604bee4ffcaa2a33655cb0aba521f0608d9a02625e80e372e924b",
135
+ "dashboard/src/components/icons/dashboard-icon-arrowDown.svg": "ac89a7e1fd41d146e34d7c15be393a7b829774ffb8fbaa1df378f16bdb3d29e1",
136
+ "dashboard/src/components/icons/dashboard-icon-arrowUp.svg": "14ac5376283ecac668371746948f1dbcc14c1db3d811c81dcd334416ca1d7e1a",
137
+ "dashboard/src/components/icons/dashboard-icon-arrowUpRight.svg": "bcf1918ca943a7b982458fbd0be0c2feb3a517cce3debc551c0afbe2b25617a0",
138
+ "dashboard/src/components/icons/dashboard-icon-bold.svg": "91ca0e11fdacbf2db830a6d613da09788056b6ea7c9b5fa17851d575dc695feb",
139
+ "dashboard/src/components/icons/dashboard-icon-building.svg": "489056608adf36a9f512821518af60e80b9f8089d498b82121875b3090496f34",
140
+ "dashboard/src/components/icons/dashboard-icon-calendar.svg": "b6e0e5a4f8220c2e5c0d460f9aae103d757fac724f079cfa0e4c9b555ec24aa2",
141
+ "dashboard/src/components/icons/dashboard-icon-chatBubble.svg": "e9258804a30e890a6f66154115bd0fb5ee168c5073db54ca7e232c719fbfdf7c",
142
+ "dashboard/src/components/icons/dashboard-icon-chatgpt.svg": "cba78c1e4e72b24a7db4fc0778cb1cb9e1564850997a43e25735ef75c35b68c4",
143
+ "dashboard/src/components/icons/dashboard-icon-check.svg": "fa1dbd3611b7b9381d473f5fc5aafcaef17480e13d9afcba8138b10262e43fee",
144
+ "dashboard/src/components/icons/dashboard-icon-checkboxChecked.svg": "fff85250d9f1edbac7a61d23e5a780b348c76bc58d70fbb2343223876823e69d",
145
+ "dashboard/src/components/icons/dashboard-icon-checkboxUnchecked.svg": "e202fd75b51a08be2bc3ff7e47fe883c0b8f45d9eb877d7684f19660223795b5",
146
+ "dashboard/src/components/icons/dashboard-icon-chevronDown.svg": "d0e76111ab03cc7790eda06a1184e6622a458d4058baef39c19e3f21c70f601d",
147
+ "dashboard/src/components/icons/dashboard-icon-chevronLeft.svg": "8ee2e9be16b5aaf8523b0cb2f45266262d14a808c61d8bd4f073ccfa5a5dc948",
148
+ "dashboard/src/components/icons/dashboard-icon-chevronRight.svg": "b140e7a8852d56e0734ffc5d795dd4c62bfdd158c5ff3b6579dcb1bf9916baea",
149
+ "dashboard/src/components/icons/dashboard-icon-close.svg": "5ed5dea467dc8f02cb9d95627d300af8e9e1c7ddac1a117e3d37978732bd7acf",
150
+ "dashboard/src/components/icons/dashboard-icon-convert.svg": "4a76b31c0a2621b5980e5a024b9a0128b30a8e39c4113232ddda295739ddccbc",
151
+ "dashboard/src/components/icons/dashboard-icon-copy.svg": "ce35441b3c8b98cb51a73b3720cf970a2f707aa629cba1a9a8e36c0901e92afb",
152
+ "dashboard/src/components/icons/dashboard-icon-cross.svg": "85f94b605c8e61ab57ce2cc7a9118233c68299594055c86db531d3e3731ba0e5",
153
+ "dashboard/src/components/icons/dashboard-icon-database.svg": "efede7507d2f9dc2efc2f970ba44635f6de45a94860e111652fe27c549eebcf2",
154
+ "dashboard/src/components/icons/dashboard-icon-documentRefresh.svg": "917f75208b97799fa0ead171601b476640bf39cef8abfb4595c4afdd41cb1822",
155
+ "dashboard/src/components/icons/dashboard-icon-download.svg": "1a36951ac27c386de68db6e8fea94b10f94c7b18a8c78078acf3d1cbf3dd5122",
156
+ "dashboard/src/components/icons/dashboard-icon-edit.svg": "6d87e17048723e18d025a78578cbe9bb6c7ae0678d384ab314a4ba4cb30e652a",
157
+ "dashboard/src/components/icons/dashboard-icon-eye.svg": "d4bd76a4bbaaacbbd88ed2b9bbc29c1e510c8c1e591b35b7ea34dec701b9f6b4",
158
+ "dashboard/src/components/icons/dashboard-icon-globe.svg": "6b0d8c4310da06e63f2d9933a4d4d09dbdf5c59736f9c7a9929bd8e2c4cc184f",
159
+ "dashboard/src/components/icons/dashboard-icon-info.svg": "f5bdae0061d89fb8ebe61b99e56afeb74c2eb16acc529735fcd0b432b9f88e70",
160
+ "dashboard/src/components/icons/dashboard-icon-italic.svg": "7bc323dabc86a5a4804df4343228c83d98f844833f9a51949fe4986b2faca2e3",
161
+ "dashboard/src/components/icons/dashboard-icon-link.svg": "eee0f5946f827869adff8b4a7844dcf0f804aeed678f9bb4bce71f8c71cab796",
162
+ "dashboard/src/components/icons/dashboard-icon-lock.svg": "3e29a543cd126e32581fe676f447c51552599cf39d23a898c66145d10afdbe10",
163
+ "dashboard/src/components/icons/dashboard-icon-monitor.svg": "f72107e48efee8a64f9617fff594b4e3a3834793e6b6fe2e9d70f53cd03192eb",
164
+ "dashboard/src/components/icons/dashboard-icon-moon.svg": "fd4904e4b3b937ab24e126d856fbea4c36e1dbc7598702289316640b01c1cfc4",
165
+ "dashboard/src/components/icons/dashboard-icon-more.svg": "6239574c52f752c2f56798078c707e7fb13b11b28d6ba3702d3f01444fb8744e",
166
+ "dashboard/src/components/icons/dashboard-icon-palette.svg": "29b4e9c8dd944d6cd597204a02d38cada61b53efd8f192bde0e5e5ca93837aeb",
167
+ "dashboard/src/components/icons/dashboard-icon-plus.svg": "6be74c224110551d27eaeb946e3230ea6f873fc183694fb2f029a98e029d6002",
168
+ "dashboard/src/components/icons/dashboard-icon-refresh.svg": "917f75208b97799fa0ead171601b476640bf39cef8abfb4595c4afdd41cb1822",
169
+ "dashboard/src/components/icons/dashboard-icon-remix.svg": "b15cea131c81cc4bf22389ec4d9af1c509e8e5a3b6cf6bd3efd2517dfb19c580",
170
+ "dashboard/src/components/icons/dashboard-icon-search.svg": "50f34bb3c31c88f067ddef77ee905d169c174115f3902efb96714385d03a1365",
171
+ "dashboard/src/components/icons/dashboard-icon-sendUp.svg": "01bab7cee85f6f8d10792872b240854f1a3f1ae43166440395229b0fe74abd3b",
172
+ "dashboard/src/components/icons/dashboard-icon-settings.svg": "6167badd421c478ab855eeca26d3ea4762af36cc1ee091829140690bb202ac23",
173
+ "dashboard/src/components/icons/dashboard-icon-shieldCheck.svg": "914d474f40a27479ce1277685509d47a1b31d5e9cf46b20304b1240ce426817e",
174
+ "dashboard/src/components/icons/dashboard-icon-sites.svg": "200345e38648750c5a3943bbca030e25c82b0162a4d22e2525e5be485a07f02f",
175
+ "dashboard/src/components/icons/dashboard-icon-sliders.svg": "7155043b9fc09130b06da1e2f11c54f0fbdff7ba026c0bb1851fff67ff045549",
176
+ "dashboard/src/components/icons/dashboard-icon-spinner.svg": "922606ecce4da0d88f02e09d1c1b1c4e954bcdd78a2abed56b9c791f3f7807be",
177
+ "dashboard/src/components/icons/dashboard-icon-stop.svg": "bbf3a955167cbe58a8e89c4b9c169015567e3396bbd5ad0425499aa5b5171f67",
178
+ "dashboard/src/components/icons/dashboard-icon-summaryBubble.svg": "b3e045b3418a4ba33c20c785dc7eb3073887e4eb67b7b84976912fd2e886a4b0",
179
+ "dashboard/src/components/icons/dashboard-icon-sun.svg": "744c94ee224f3fa62344164927d56719de26590b32498f0ca13ed297c0fc3b7a",
180
+ "dashboard/src/components/icons/dashboard-icon-textDocument.svg": "a4f7ccc2425115911af1cddddbff83864045aa7cc0add8d22f8135b27a9085f0",
181
+ "dashboard/src/components/icons/dashboard-icon-theme.svg": "29b4e9c8dd944d6cd597204a02d38cada61b53efd8f192bde0e5e5ca93837aeb",
182
+ "dashboard/src/components/icons/dashboard-icon-trash.svg": "3ee541a3937fe1f1d41b607da8e602ecbbfe8a5f60333b82ce8ab67bd7461f8b",
183
+ "dashboard/src/components/icons/dashboard-icon-undo.svg": "bebef36b99f928445155a3f1b2e8b331ca215fafbcb025c2c83ef32d9dd196e3",
184
+ "dashboard/src/components/icons/receipt-icon-chart.svg": "f0a5cc90d98ed7252b6deabb38384303f0014e6f98862616e00645148a2d6872",
185
+ "dashboard/src/components/icons/receipt-icon-document.svg": "3eb5b50ae68bb2b591259f15dfac0c932da21ad848035a0dff5f276fc4aa672c",
186
+ "dashboard/src/components/icons/receipt-icon-file-audio.svg": "d10f139b197624b2ac005606db4800da745c07c2001d890bba41d3f3671cd15d",
187
+ "dashboard/src/components/icons/receipt-icon-file-code.svg": "72c6a797ed6dd0e3a8650e4c978982912505483f919359480afa8ee3d99ef780",
188
+ "dashboard/src/components/icons/receipt-icon-file-image.svg": "5d7f10c0d06473434b93fd8f993728733ad649d9d374830ce2b6b03116066b23",
189
+ "dashboard/src/components/icons/receipt-icon-file-presentation.svg": "d66a94e724adffac73374312f5bacb4c28910bb85669876192df9ffcda66bc78",
190
+ "dashboard/src/components/icons/receipt-icon-file-video.svg": "ebc49ae92ea9ed8484f6d52080b0f205f31e56b993f7a052a14967a38d134b27",
191
+ "dashboard/src/components/icons/receipt-icon-file.svg": "58a0f5a1ea78a0c114fc74c44160c0708c92e41ffd6f14e829173f5fe047b71a",
192
+ "dashboard/src/components/icons/receipt-icon-link.svg": "61b98747b27424feca44c0ff694c445e2ad74228e483b953fea722c55e706acf",
193
+ "dashboard/src/components/icons/receipt-icon-table.svg": "cba9c8de3a1dd0546cad18b09b6907f82bf68ec28d65513219308c40f3d60742",
194
+ "dashboard/src/components/icons/source-icon-github.svg": "1a6f230a6debcc742730be9d8419766eb670b96f454fbefb71ecac89cf64e081",
195
+ "dashboard/src/components/icons/source-icon-google-drive.svg": "4b413acdf0642e710741d531a3c19582a9bec50de64b398b17f3cb7b0ce0fa06",
196
+ "dashboard/src/components/icons/source-icon-google-sheets.svg": "165b4c145808a18f4052dd51bf0e84b68901cd41a89099dbb5a57cfe639bbecf",
197
+ "dashboard/src/components/icons/source-icon-notion.svg": "eef8f46b63fb120abd63ca2e58e7f4be0a230c3e30276e6e438897b66b695508",
198
+ "dashboard/src/components/icons/source-icon-slack.svg": "b5a8d11655966384c3884e011232a2c83ab5f813187e3c0e49d4410b145b65f1",
199
+ "dashboard/src/components/publish-review.css": "0483af589681e7e22b58dbc41d0c39dba4ff6e04f350b04109c14fac0bbd8c9d",
200
+ "dashboard/src/components/section-navigator.css": "841d9893a1b70b3740f548d1a1b535eb707b8152c9ece8854a75e505e0ed3ba7",
201
+ "dashboard/src/components/slider-math.js": "91e4d29a312e30ef03474fff062e8d12310a112d623d3c2cf13c7f8aa20c0320",
202
+ "dashboard/src/components/source-inspector.css": "8f33b97393bbf736360e6b7998af38078d94b23181cc85d7652fee8635813c86",
203
+ "dashboard/src/components/topbar-mode-controls.css": "1b7c542c1fedbd6a469a2ebd5eb445eb39412f7cc1e19b192792c2af3d6829d8",
204
+ "dashboard/src/components/touch-release-trigger.js": "5269c96d07196290c9eaa91397b78aba7f662740a4bc1917479ef0bdb8beafdc",
205
+ "dashboard/src/components/ui.jsx": "d07d561a0876bb899eb16ac68a70781a96fcd6a6427c34b1bc023091eaa472c8",
206
+ "dashboard/src/content/assets/README.md": "1a17117302d00a4301c95b0562c12a244e38efe35aa508831ea404e7051556d7",
207
+ "dashboard/src/content/dashboard/DashboardContent.jsx": "1275b159f7798adcca787e9198fb03715738326dff299fea6e567905aea370b3",
208
+ "dashboard/src/content/dashboard/dashboard.css": "43bc77f582d4ffbb99edc7a84bac8f8405bf6689cdeb4e87f2749a69da392bab",
209
+ "dashboard/src/content/dashboard/loss-lab.css": "30f2f748f09208a942427abb78e18b81596123d727bc96be7ad1aee95d26e9a7",
210
+ "dashboard/src/content/report/ReportContent.jsx": "0af29196a6714b72f895de4acbb70205fddda8ed7fde05245ff7103e86f0fe40",
211
+ "dashboard/src/content/report/report.css": "b0aed6d085aa46b2b4bace26ebcf4120d0c267a74fa5dcc87bdba2a2dff4f88e",
212
+ "dashboard/src/content/shared/README.md": "36ae02985b054edb3e526dd75d89d019c4ac6ec14d70f58b40c83d439c6dbf8f",
213
+ "dashboard/src/content/shared/ReportDisclosure.jsx": "f559abc00fbd4e01f8276d9df8ed2c7db3ea001a0068119c0d82b4243991b746",
214
+ "dashboard/src/content/shared/ReportTaskLink.jsx": "7fc3cabbab44aee60a98b22038842704f7b097d9cb417f38be58133ea4305f88",
215
+ "dashboard/src/content/shared/SortableDashboardLayout.jsx": "e072e1e11812bfc3cac5ebd040f2c0cebbe22f04a9034ce84e3d49e7271f3a99",
216
+ "dashboard/src/content/shared/report-disclosure.css": "64e07e80151cd95e175185510f1c5e20331223bd786f1f12a56c51cc8c6841bd",
217
+ "dashboard/src/content/shared/report-task-link.css": "708b794f8f635ea9328b93d5ed5cdc8a6cca7b04215390ac6eb5616532f7a747",
218
+ "dashboard/src/dashboard-ask.js": "8155067359e92c805691a2d01845b84cd49f15a62fe156b00d9eae85cb3e6a9f",
219
+ "dashboard/src/dashboard-url-state.js": "7548d0752f11d003255649bc7bdb57062c97f6b82014a86c349b06e86355e932",
220
+ "dashboard/src/dashboard-view-state.js": "4c1ad1fc94e563a64716f0587477ba40b0e8c84e92836f7a75a0cfe864a8c225",
221
+ "dashboard/src/data-app-actions.js": "4c9e470ab9a5424168fb64f18ef8d8352035b56a6c79d5043d041b52eb536637",
222
+ "dashboard/src/data-app-context-tools.js": "614a1e5877cac998929ba38cb3c0d703fe3da28c8d11f350e00001bdf816d322",
223
+ "dashboard/src/data-app-handoff.js": "c99ca50617f37efd5171381a2ea126817ecd9c73c6c59283e4ac4e8921250b37",
224
+ "dashboard/src/data-app-image-tools.js": "9201f93c3cfc884ee6573f93eaa6fd5db5d1a48087a8459c220fb92a5500eb5e",
225
+ "dashboard/src/data-app-owner.js": "1d20906e87792e64f7df9ba1aaf95243746bb7528bc244e139407c07d17aad40",
226
+ "dashboard/src/data-app-public.jsx": "57a22be28ed6172c7f0a1f9f2881d3afa3069cd4da9128fdfada8c803ddbba94",
227
+ "dashboard/src/data-app-schedule.js": "fd7bd84121f2e4eeac1a8b5b11b44b181c91a8aa1d91a9ce490f8bd5514ca275",
228
+ "dashboard/src/data-app-worker.js": "acabf5aaa262e38c4f8157aecb9c40e4a810d6e7433cfadca84676b68afcf38f",
229
+ "dashboard/src/data.json": "c905e0d0b48c846cb2d4c6c7e196db76627060a9589fc466c5107fa16b0e3551",
230
+ "dashboard/src/date-range.js": "d6cfe752cd461c32556e3644f780628274e664282f94c434b49a540c979f461c",
231
+ "dashboard/src/foundation.css": "9b503667f9e8451c53940cede8a8855fefe74cb4ea8ad0e0accc8d9584721836",
232
+ "dashboard/src/handoff-preference.js": "521a83c4f57ac7ef55bdb02e45758e7cd4fbd0dee5e7983dc2791d944c6efb5a",
233
+ "dashboard/src/hosted-query-bootstrap.js": "ef1c0d0f8cdce0e1efc0892375283d38d505a2b13ed659859c2cd4e2e6fc77b9",
234
+ "dashboard/src/main.jsx": "cbb6a40a785d8c9a867a7684cdba60c930ff6a3d8eda3137cee458c4bc3a43cc",
235
+ "dashboard/src/object-snapshot-storage.js": "f4b2838453460b409ea080410d549d6f4fe5896fea94cd6be16ea235470dd734",
236
+ "dashboard/src/owner-email.js": "4bf602cf4a5fc05bebbadc0202366c8dec28fc3df621df29efa40a7dd43ac1d2",
237
+ "dashboard/src/prebuilt-runtime-entry.jsx": "821610a53bbbaaee8adccab9a9ab09ee1f2ca859db7346fae0de6c6ba5890f42",
238
+ "dashboard/src/presentation-state.js": "9aafd1df54b454d3b141c46caef320750d2ef733b0570776e3e7676c6581e6f6",
239
+ "dashboard/src/print.css": "8a3f83b3d4b453bc660d87027684e70ce053401c0d327e72247fc90f848966ac",
240
+ "dashboard/src/publish-review.js": "a2de03b6d885f33e6ac4bdaf13a7d5770e37b9d94595a844dd53d72c1121540a",
241
+ "dashboard/src/query-data-store.js": "0dc9edc7302359ee54b8b9c92a8adc7f15694e986461b8046b8b427a9e1ecc65",
242
+ "dashboard/src/refresh-coachmark.js": "07700a3ac6d8e8204982479b35f5b9fd958c7876f7c8cd651cc662f856ee61d6",
243
+ "dashboard/src/report-date.js": "7a29073e2f4498fb81af321c39344952cc08b9c3fe3caee020a908d3914aaed1",
244
+ "dashboard/src/report-follow-up.js": "81f4fee1f7300a10167946a1f430900f92e708c6c0b768790e152b29e54b8aad",
245
+ "dashboard/src/runtime-environment.js": "6f568c79bff45a67571681c0d8ed5f2e6f7450e1af6a01f0dfeaa75ef00d3e4d",
246
+ "dashboard/src/snapshot-storage.js": "58a7a4f0d405a0d1f6bdabdf50e5fe0877ee202354a2f8225bf1ece421a229e1",
247
+ "dashboard/src/source-preview.css": "92b71fb63191feb8a11c788aa76f1c00a1c1f36603dc57b3590384f8adce0690",
248
+ "dashboard/src/source-preview.js": "46be983664c5219ad84c2a8f507bc6aa959d3e9bef308961ddde145ede23f001",
249
+ "dashboard/src/source-provenance.js": "0cc0f174aa47eecbdb9e15bd473432280c880f547f9756e9bd03153f43b4210b",
250
+ "dashboard/src/streaming-json.js": "5fa4ab801f008c755d1d956034b82af9df8ad0ffe8d0178a67d006fa5573a7ce",
251
+ "dashboard/src/styles-foundation.css": "6f29f5247d6b45ed8bec0d4ad9f11f7d571698dec6bbef7e6189b637d9db7b08",
252
+ "dashboard/src/styles.css": "12a2ca74a48280d066eba6c77efe184afbc6c96c6b598782ebb80ae61dd13b03",
253
+ "dashboard/src/theme-picker.css": "b22f11215761446109be855f9d3afcfab80a7da8209c1eba4c48e57b3a20232f",
254
+ "dashboard/src/theme-presets.js": "3eebb82ee338aa0949be479c6ca86bf7c483d5a0e8dcd7ad0935f157aa8b2876",
255
+ "dashboard/src/theme-runtime.js": "e5ffd0fb34db599a30425e43a871312145f9f332a16f6b8d43facbd7466848f0",
256
+ "dashboard/src/theme.css": "8f714846965b075868db607dcca3f0bedb8f7057a999d8f1a95d60bbdfcf6980",
257
+ "dashboard/src/use-data-app-context-tools.js": "98110fa97f332df8e244944416e776a3398df73826885f46e1997b9d30735504",
258
+ "dashboard/src/use-data-app-image-tools.js": "1bff800a840b2771e0f130aad22e5732db2ef34e5b542f822cbb9ed70e3a8fa7",
259
+ "dashboard/src/use-data-app.js": "699f86eabcd0bb506162862e76b81951e4e0c875a1e78c276d39843bc3bb7702",
260
+ "dashboard/src/use-inline-editing.js": "4c4e250b34fcc57299d7c892bededbec648df7b221cc5004b85ae39f72ebf25e",
261
+ "dashboard/src/use-presentation.js": "d8f4a92a74807b6cd9a130927423b0361d6f62f118c71e8aee21bb9826d2d544",
262
+ "dashboard/src/use-section-filters.js": "271e18f770a642064277ddc0d52523acacebc21a35b99788e14778c8dd5193f3",
263
+ "dashboard/src/use-sortable-blocks.js": "5462804b0f62fcfc7fad6a581b1025057f827a368a0c528d218000c7928ba666",
264
+ "dashboard/src/verification-reminder.js": "9c135c75d15ef1a43aa98efd5db51aed44afbacb86206d073608cdb764957bc0",
265
+ "dashboard/src/worker.js": "bc859b3fcb14dc269367d5aecbbea5f6d307a477a607b3e376f992a8748b30f7",
266
+ "dashboard/vite.config.js": "da62d7d91fbf0e75f234a3f8e6d5adf91914babe53926972eeff6ac0f9544e1b",
267
+ "data/LICENSE-TinyStories-CDLA.html": "8fa35e8f27982bdfdb0ba1b099f259801baad2deeb08813aa715d944fbb33bcf",
268
+ "data/manifest.json": "e0f26161595eb9fe4c77880497931e8d85d71216302e200da834aec97a3eb333",
269
+ "data/tinyshakespeare.txt": "86c4e6aa9db7c042ec79f339dcb96d42b0075e16b8fc2e86bf0ca57e2dc565ed",
270
+ "data/tinystories-source.json": "b92764889a7afea621f2094424f92f2ee5c9604b611d505eb1dab93e871945c1",
271
+ "docs/DATA_LICENSES.md": "eab2c7485fc4558ee1daebc703eeb3c0d746ab7f43e40cc9a7c3b05928e9c8c9",
272
+ "docs/OPERATIONS.md": "6cae3020eb3528965931268d00a68dfff9786a0d5fd7766a36effc4fe2328561",
273
+ "docs/PROTOCOL.md": "1b6476e0dfbf3f4cff239415bff5eabd98c8a5ab71a068fb558b5fc1026e9400",
274
+ "docs/REPRODUCE.md": "92c24da765313fd34a14cdc1d16c7005b3fff8116191a07cd79801331e98cc37",
275
+ "docs/RESEARCH_PLAN.md": "7a19bc6c4f413e352c90fb4a54a46f23a47bfa0cef90f49920781bc933d6333c",
276
+ "docs/RESEARCH_REPRODUCE.md": "85a36aa7e7822acc1dfee964110cb47882c766cc2258ac494cc2df3302b759e3",
277
+ "docs/RESEARCH_RESULTS.md": "d11bcf9f6acc8b2fb4b04bed7a1ec4a4f6939017c7f3e621541dddf686a0ddbc",
278
+ "docs/RESULTS.md": "62bf8c94073e6f3d6dcbeb65c587f2b4831605b0933e03800f2006854c4c3878",
279
+ "docs/figures/final-confident-errors.png": "ffa76140ef7859c519ff053b753ee153d35f959e2572f0d6be826ed7dd51bd1f",
280
+ "docs/figures/final-confident-errors.svg": "356ff318a968cec194c45963e4a356d29d306c6c3f37adcda9523765709fdf17",
281
+ "docs/figures/final-learning-curves.png": "6301a655d11e4c949da132ba0448175f3257b6f50fac0271a19f76c4fb1ba81e",
282
+ "docs/figures/final-learning-curves.svg": "6c998ed3cc489fc3de1cf6609ed6cf7f6f97acc6c4ae00aa538e1a1c9893c25f",
283
+ "docs/figures/final-paired-nll.png": "dca841b44450a4207c12d51f0b15363e6ed6da861dbaa4e5759799ff77318037",
284
+ "docs/figures/final-paired-nll.svg": "4343b101d2098c38f651d72c954833191865b13f5369407acac0533565c5c054",
285
+ "docs/figures/scale-tinystories-diagnostics.png": "fd185444d6a9e67de291387145818eff971ec2240104ff03c11b95d019eac18a",
286
+ "docs/figures/scale-tinystories-diagnostics.svg": "9080a418122f7484e6cadf1c302d2b524fb3672f79c8d6325cdd98de05220422",
287
+ "docs/figures/scale-tinystories.png": "8ca07bed2c7ee93001a3954bb52752072ee743b85c9cf67f99860243378609d6",
288
+ "docs/figures/scale-tinystories.svg": "983a6ca961667e4b9604ef769bfe83b86457079c178f7608e50f9796db4cd824",
289
+ "docs/figures/v2-shakespeare-diagnostics.png": "05e39c24ec41e2a91083f4a2a3ea8e84cf5469ce612846178e672e1184fbac6f",
290
+ "docs/figures/v2-shakespeare-diagnostics.svg": "1f4f877fd93b0218ddd234e16d08f1d259092ecf4f1e254554ac1eb6618010c2",
291
+ "docs/figures/v2-shakespeare.png": "d9a8c215c07f14647e9bcdb501a51728f7b4d66d9761e30ddc937816253307fc",
292
+ "docs/figures/v2-shakespeare.svg": "8cdcb1c4e08f421bf72883df3deeb1d8c86c647fb7ce602f7dc779a95819dc41",
293
+ "docs/figures/v2-tinystories-diagnostics.png": "2e1d847decd0f8f4635f412a58dbec2737ec9f72411fb7c2fd9f506752308c4a",
294
+ "docs/figures/v2-tinystories-diagnostics.svg": "2d9a0a18976eb5da643ff705bef1ff5d9491aa398cfa9ac951253119dff0a033",
295
+ "docs/figures/v2-tinystories.png": "4e96941dc925d0ab7b56f9d1377bee6cd7bf158bc4b42f35568c6745f6e4be67",
296
+ "docs/figures/v2-tinystories.svg": "a3888b3595a0b57244788f8cd58f54fc91bf47cfcee1f2b927d66cdd3c6f7c54",
297
+ "experiments/__init__.py": "76fed41f773983690b4e7e54a031cd15990120ec0d3ffcdc4d70bc849ea8ee36",
298
+ "experiments/archive.py": "ec1dca88f63ac097850f3edf608d304adf33acadfcf93f0b8577e205b0c71861",
299
+ "experiments/diagnostics.py": "2d2a07a6a383e233420b865337a145ce8483e0bb60d75834ca40cc416b6aa012",
300
+ "experiments/io.py": "80b00225a4d71693d6ae7e5057bfd978515b76b576fcbbe0fc7b38edf1d23ff8",
301
+ "experiments/losses.py": "9896990b6882b698129ab3d0b2825f7ba5146e33433aefcde4158d2b45326970",
302
+ "experiments/pipeline.py": "a76dbde0a53dce6b9ef4b3121b38e1ac80dce52a5579139bf8c211b5dd42575a",
303
+ "experiments/prepare_stories.py": "26095106261fbc739d92920d49e65eec77b3828ca72ef0515a6c3df85e5d5bc2",
304
+ "experiments/reporting.py": "dc26418b519b9e729622ab0426cce2c64e0818c6f103d3c66bdbfed3a11aefc6",
305
+ "experiments/research.py": "6b94c64f553a5e8f2d9d936d5d85e0974c4dc0b60f72d826cc1cc0ad8903936f",
306
+ "experiments/sample.py": "dc6ed2815de0f3e67cbd777e60a5f9c52633ac77d8f173f1755342db04d5e6d2",
307
+ "experiments/sample_safetensors.py": "e6f30461fd8f8515fd47937359237b9d318c9a089d0a9747006fb2f79276d975",
308
+ "experiments/train.py": "0c2d4bd0cf708a659ab299cb3d294521655bfefb280ddaeb351164c40446c55b",
309
+ "output/pdf/loss-lab-research-report.pdf": "aeabb786f1efc3a35cdfeaeb76ba0851e46af55871f955d1f812fa80c0b61ec0",
310
+ "requirements-report.txt": "2485480cb9090be564943b86813cb5846ecc7a4d99e412d97ba3e7b561a1adff",
311
+ "requirements-research.txt": "1bbfa2cb9c22d87ec6a6d98b1a0475516be0a5e29ef88865f21622510341ead3",
312
+ "requirements.txt": "f54fde6250af67be2c903bc2363344c1e411c53098e356b6c16f80d0070bbb7a",
313
+ "results/.gitkeep": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
314
+ "results/MODEL_INDEX.json": "e57c1fe5caa0927967b98935648bd73365f9f144dfd6d66bfea92d1691775a3a",
315
+ "results/PROVENANCE.json": "d1513504b23363c6878da324fe7c87557436fd4c681f4e8181a10eaa57375c78",
316
+ "results/VERIFICATION.json": "849458322833bef9405a9d94b48ae4277c25e20fda1d91a91a80914066dee3d5",
317
+ "results/metrics/README.md": "86aa658090bed785b16bf8d15819804a6b364db81c310af5eaabd3cb71464ad5",
318
+ "results/metrics/final-scores.csv": "e469c2b62dbaca3a6ae8463f3c4dc48dc33ff370ab390eb6dbf94fee4feac89f",
319
+ "results/metrics/learning-rate-trials.csv": "bcda34b70c46886ad1e693b0d3e05c638fd088b850591c67acef6568152bc102",
320
+ "results/metrics/samples.jsonl": "93d297bad2951670e1f366153869029d3590cf406f15725bfc42ff0b447cfe50",
321
+ "results/metrics/validation-history.csv": "ff0391a427aca28c47f930e752c738913481dd435e264262739595811051db97",
322
+ "results/records/scale-tinystories/results.json": "9d20376bf112ed1f759e862426f0fb2e19bd28ba5a8e1395ddedc0522323f996",
323
+ "results/records/shakespeare/results.json": "f168fc0c3ecf2135f79fb569df1c69956f3f7014376f69526f92f140afb51854",
324
+ "results/records/tinystories/results.json": "b2a8ae61d7a0d5b6213955967b26248c0302f9ba19a378c4245a8ec19956aac0",
325
+ "results/records/v2-shakespeare/results.json": "b790992d002dd64eb971b5e89f9cd8c2d1801409633bd9a614aebb4f43e48680",
326
+ "results/records/v2-tinystories/results.json": "016fbc73e6a8f6cf7cf2ee952923ec59fe4647eff88e00772c2bf82b3ff68a14",
327
+ "scripts/build_dashboard.py": "a64123e6e0bf8a7912b81ced6643a353869761a822c487541e55c09b7e8bcf7c",
328
+ "scripts/export_figures.py": "99a4e1c4c0127ec178f94268f8beaad0d64e1ea9c3e89c17d2f46616163db129",
329
+ "scripts/package_release.py": "5ca5632c01f96252add70b13c0a593554fa54a18ccbb09ced9cfa70c4b509667",
330
+ "scripts/read_artifact.py": "23f36f8b046f7ca5dfc8938b28a1aaade916cf2f22cbbb621e8784d68e93397a",
331
+ "scripts/research_report.py": "4f54c9b95fa879233b396f1ae0f2b1ad34309a51b90b69a537de7e809941ce1a",
332
+ "scripts/serve.py": "454410bd2bf6486619f2178e931312b65febb843552020462a1c79cb5723f8d8",
333
+ "scripts/verify_results.py": "4e2955dce8633a26665d5aee2c6ef3336c7e5b8dd7e008dcbf938af64cd76b80",
334
+ "tests/test_diagnostics.py": "9effb4c56b28081366f23efc778672e9d19a598a3d92394843ab45463b040125",
335
+ "tests/test_io.py": "f2dfa187327277134e1393d6536f7bf26fd948f113e9e6a4ca603173d5262998",
336
+ "tests/test_losses.py": "d00c6dc9f077b73ce6c4cdef98070a3e3e66f1e9d57f9585af32c161c8b999bc",
337
+ "tests/test_publication_report.py": "4fca5153bd183733e9046a57d48bf58fa0bae7adfc92fd09beca142d5f9c33d5",
338
+ "tests/test_recorded_results.py": "5c37e2544ad31bf23dacbce6021b46da11af2d5987482beecae065522c704c61",
339
+ "tests/test_research.py": "27e9476b7caa5fba7bd0494a47e0c4de40bf18badb65a5494de6813c78da81c4",
340
+ "tests/test_resume.py": "1b728feb426f926ba72c0d18a821fc2f5e0fef9c819e7a1fa12be935be8f0633",
341
+ "tests/test_safe_sample.py": "bcdc909533ec694a3a7faf350dcea0845b91a45952decdec04b4b3fedf824826",
342
+ "tests/test_stories.py": "4fff9f4371f8ccca83fcf09ad17df4cc937bf02821ea23cd1ea74422c2c29ff1",
343
+ "tests/test_sync.py": "91d784c6abbe29b14b7b2a3e0c3e14fdb24b49b474ec3cbab837c10da609ff2c",
344
+ "vendor/nanogpt/LICENSE": "a59ec5cdb1c1e447e5266a014b3e7ded511f8d6e5a08931e931c87490ff821fe",
345
+ "vendor/nanogpt/model.py": "7c01703240dbec5d554527dc666e35b3df8391d0b117fddc07afcf325a21d11c"
346
+ }
347
+ }
REPRODUCE.md CHANGED
@@ -24,12 +24,25 @@ To reproduce the original short-pilot baseline, build Dockerfile and run experim
24
 
25
  ## Verify and regenerate analysis
26
 
 
 
 
 
 
 
27
  python3 -m venv .venv
28
  .venv/bin/python -m pip install -r requirements-research.txt
29
  .venv/bin/python -m pytest tests -q
30
  .venv/bin/python -m experiments.reporting --records results/records --output results/report
31
  .venv/bin/python scripts/export_figures.py
32
 
 
 
 
 
 
 
 
33
  The checks cover proper scores, analytic logit gradients, native resume, dataset preparation, bounded archive reads and report calculations. GPU trajectories can vary between hardware placements despite paired seeds.
34
 
35
  results/records/ retains the complete five study records. results/metrics/ contains final scores, tuning trials, validation histories and every saved generation. results/MODEL_INDEX.json maps all 42 main models to published files and hashes. Deployment routing metadata has been removed without changing numerical metrics, sample text or model files.
@@ -38,7 +51,7 @@ results/records/ retains the complete five study records. results/metrics/ conta
38
 
39
  From source/ after installing the research requirements, download only one model directory:
40
 
41
- hf download ctxnn1/loss-lab-ce-brier \
42
  --include 'runs/research/v2-tinystories/models/ce-seed42/*' \
43
  --local-dir downloaded
44
  python -m experiments.sample_safetensors \
@@ -47,6 +60,8 @@ From source/ after installing the research requirements, download only one model
47
 
48
  Use the matching Brier directory for the other arm. Pin --revision to an exact Hub commit for archival reproduction. New local generations may differ from the original GPU samples; the stored generation records remain available. These are custom nanoGPT weights, not Transformers AutoModel checkpoints.
49
 
 
 
50
  ## Dashboard
51
 
52
  Open the delivered dashboard.html for the complete embedded snapshot. Keep docs/ beside it for documentation links. The authored UI, theme and reviewed JSON are in dashboard/src/. Rebuilding the editing shell requires the pinned installed Data authoring runtime; training, metrics, standalone figures and the portable HTML do not depend on that editor.
 
24
 
25
  ## Verify and regenerate analysis
26
 
27
+ From the portable project root, the following command uses only Python's standard library. It reconciles every run, tuning choice, CSV, saved sample, model-index entry and dashboard final score; it also checks RELEASE_MANIFEST.json when present:
28
+
29
+ python3 scripts/verify_results.py
30
+
31
+ To run the numerical tests and regenerate figures:
32
+
33
  python3 -m venv .venv
34
  .venv/bin/python -m pip install -r requirements-research.txt
35
  .venv/bin/python -m pytest tests -q
36
  .venv/bin/python -m experiments.reporting --records results/records --output results/report
37
  .venv/bin/python scripts/export_figures.py
38
 
39
+ To rebuild the six-page research report and its three figures:
40
+
41
+ .venv/bin/python -m pip install -r requirements-report.txt
42
+ .venv/bin/python scripts/research_report.py
43
+
44
+ The result is output/pdf/loss-lab-research-report.pdf. Report creation is local and does not start a GPU job.
45
+
46
  The checks cover proper scores, analytic logit gradients, native resume, dataset preparation, bounded archive reads and report calculations. GPU trajectories can vary between hardware placements despite paired seeds.
47
 
48
  results/records/ retains the complete five study records. results/metrics/ contains final scores, tuning trials, validation histories and every saved generation. results/MODEL_INDEX.json maps all 42 main models to published files and hashes. Deployment routing metadata has been removed without changing numerical metrics, sample text or model files.
 
51
 
52
  From source/ after installing the research requirements, download only one model directory:
53
 
54
+ hf download ctxnn1/loss-lab-ce-brier --revision v2.1.0 \
55
  --include 'runs/research/v2-tinystories/models/ce-seed42/*' \
56
  --local-dir downloaded
57
  python -m experiments.sample_safetensors \
 
60
 
61
  Use the matching Brier directory for the other arm. Pin --revision to an exact Hub commit for archival reproduction. New local generations may differ from the original GPU samples; the stored generation records remain available. These are custom nanoGPT weights, not Transformers AutoModel checkpoints.
62
 
63
+ The v2.1.0 release tag pins all published model and source files. The portable loss-lab-v2.1.0.zip download excludes large weights and prepared TinyStories files; its SHA-256 sidecar checks the download. Extract it, enter the loss-lab-v2.1.0 directory, and run scripts/verify_results.py before installing dependencies. To rebuild the same source-only bundle from a Git checkout, use scripts/package_release.py; refreshing its manifest is an explicit maintainer action.
64
+
65
  ## Dashboard
66
 
67
  Open the delivered dashboard.html for the complete embedded snapshot. Keep docs/ beside it for documentation links. The authored UI, theme and reviewed JSON are in dashboard/src/. Rebuilding the editing shell requires the pinned installed Data authoring runtime; training, metrics, standalone figures and the portable HTML do not depend on that editor.
RESEARCH_REPORT.pdf ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:aeabb786f1efc3a35cdfeaeb76ba0851e46af55871f955d1f812fa80c0b61ec0
3
+ size 603411
docs/RESEARCH_REPRODUCE.md CHANGED
@@ -24,12 +24,25 @@ To reproduce the original short-pilot baseline, build Dockerfile and run experim
24
 
25
  ## Verify and regenerate analysis
26
 
 
 
 
 
 
 
27
  python3 -m venv .venv
28
  .venv/bin/python -m pip install -r requirements-research.txt
29
  .venv/bin/python -m pytest tests -q
30
  .venv/bin/python -m experiments.reporting --records results/records --output results/report
31
  .venv/bin/python scripts/export_figures.py
32
 
 
 
 
 
 
 
 
33
  The checks cover proper scores, analytic logit gradients, native resume, dataset preparation, bounded archive reads and report calculations. GPU trajectories can vary between hardware placements despite paired seeds.
34
 
35
  results/records/ retains the complete five study records. results/metrics/ contains final scores, tuning trials, validation histories and every saved generation. results/MODEL_INDEX.json maps all 42 main models to published files and hashes. Deployment routing metadata has been removed without changing numerical metrics, sample text or model files.
@@ -38,7 +51,7 @@ results/records/ retains the complete five study records. results/metrics/ conta
38
 
39
  From source/ after installing the research requirements, download only one model directory:
40
 
41
- hf download ctxnn1/loss-lab-ce-brier \
42
  --include 'runs/research/v2-tinystories/models/ce-seed42/*' \
43
  --local-dir downloaded
44
  python -m experiments.sample_safetensors \
@@ -47,6 +60,8 @@ From source/ after installing the research requirements, download only one model
47
 
48
  Use the matching Brier directory for the other arm. Pin --revision to an exact Hub commit for archival reproduction. New local generations may differ from the original GPU samples; the stored generation records remain available. These are custom nanoGPT weights, not Transformers AutoModel checkpoints.
49
 
 
 
50
  ## Dashboard
51
 
52
  Open the delivered dashboard.html for the complete embedded snapshot. Keep docs/ beside it for documentation links. The authored UI, theme and reviewed JSON are in dashboard/src/. Rebuilding the editing shell requires the pinned installed Data authoring runtime; training, metrics, standalone figures and the portable HTML do not depend on that editor.
 
24
 
25
  ## Verify and regenerate analysis
26
 
27
+ From the portable project root, the following command uses only Python's standard library. It reconciles every run, tuning choice, CSV, saved sample, model-index entry and dashboard final score; it also checks RELEASE_MANIFEST.json when present:
28
+
29
+ python3 scripts/verify_results.py
30
+
31
+ To run the numerical tests and regenerate figures:
32
+
33
  python3 -m venv .venv
34
  .venv/bin/python -m pip install -r requirements-research.txt
35
  .venv/bin/python -m pytest tests -q
36
  .venv/bin/python -m experiments.reporting --records results/records --output results/report
37
  .venv/bin/python scripts/export_figures.py
38
 
39
+ To rebuild the six-page research report and its three figures:
40
+
41
+ .venv/bin/python -m pip install -r requirements-report.txt
42
+ .venv/bin/python scripts/research_report.py
43
+
44
+ The result is output/pdf/loss-lab-research-report.pdf. Report creation is local and does not start a GPU job.
45
+
46
  The checks cover proper scores, analytic logit gradients, native resume, dataset preparation, bounded archive reads and report calculations. GPU trajectories can vary between hardware placements despite paired seeds.
47
 
48
  results/records/ retains the complete five study records. results/metrics/ contains final scores, tuning trials, validation histories and every saved generation. results/MODEL_INDEX.json maps all 42 main models to published files and hashes. Deployment routing metadata has been removed without changing numerical metrics, sample text or model files.
 
51
 
52
  From source/ after installing the research requirements, download only one model directory:
53
 
54
+ hf download ctxnn1/loss-lab-ce-brier --revision v2.1.0 \
55
  --include 'runs/research/v2-tinystories/models/ce-seed42/*' \
56
  --local-dir downloaded
57
  python -m experiments.sample_safetensors \
 
60
 
61
  Use the matching Brier directory for the other arm. Pin --revision to an exact Hub commit for archival reproduction. New local generations may differ from the original GPU samples; the stored generation records remain available. These are custom nanoGPT weights, not Transformers AutoModel checkpoints.
62
 
63
+ The v2.1.0 release tag pins all published model and source files. The portable loss-lab-v2.1.0.zip download excludes large weights and prepared TinyStories files; its SHA-256 sidecar checks the download. Extract it, enter the loss-lab-v2.1.0 directory, and run scripts/verify_results.py before installing dependencies. To rebuild the same source-only bundle from a Git checkout, use scripts/package_release.py; refreshing its manifest is an explicit maintainer action.
64
+
65
  ## Dashboard
66
 
67
  Open the delivered dashboard.html for the complete embedded snapshot. Keep docs/ beside it for documentation links. The authored UI, theme and reviewed JSON are in dashboard/src/. Rebuilding the editing shell requires the pinned installed Data authoring runtime; training, metrics, standalone figures and the portable HTML do not depend on that editor.
docs/figures/final-confident-errors.png ADDED
docs/figures/final-confident-errors.svg ADDED
docs/figures/final-learning-curves.png ADDED

Git LFS Details

  • SHA256: 6301a655d11e4c949da132ba0448175f3257b6f50fac0271a19f76c4fb1ba81e
  • Pointer size: 131 Bytes
  • Size of remote file: 350 kB
docs/figures/final-learning-curves.svg ADDED
docs/figures/final-paired-nll.png ADDED
docs/figures/final-paired-nll.svg ADDED
figures/final-confident-errors.png ADDED
figures/final-confident-errors.svg ADDED
figures/final-learning-curves.png ADDED

Git LFS Details

  • SHA256: 6301a655d11e4c949da132ba0448175f3257b6f50fac0271a19f76c4fb1ba81e
  • Pointer size: 131 Bytes
  • Size of remote file: 350 kB
figures/final-learning-curves.svg ADDED
figures/final-paired-nll.png ADDED
figures/final-paired-nll.svg ADDED
loss-lab-v2.1.0.zip ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:9fc5da20f72b0bb584fa260cf642ec9bd476c492d36bde1e48291abea43d1d06
3
+ size 6753705
loss-lab-v2.1.0.zip.sha256 ADDED
@@ -0,0 +1 @@
 
 
1
+ 9fc5da20f72b0bb584fa260cf642ec9bd476c492d36bde1e48291abea43d1d06 loss-lab-v2.1.0.zip
source/.gitignore CHANGED
@@ -48,4 +48,5 @@ data/*.bin
48
  !results/metrics/**
49
  !results/MODEL_INDEX.json
50
  !results/PROVENANCE.json
 
51
  dashboard/.data-app-prebuilt/
 
48
  !results/metrics/**
49
  !results/MODEL_INDEX.json
50
  !results/PROVENANCE.json
51
+ !results/VERIFICATION.json
52
  dashboard/.data-app-prebuilt/
source/CITATION.cff CHANGED
@@ -4,8 +4,8 @@ title: "Loss Lab: Cross Entropy and Brier in nanoGPT"
4
  authors:
5
  - name: "ctxnn1"
6
  type: software
7
- version: "2.0.0"
8
- date-released: "2026-10-24"
9
  license: MIT
10
  url: "https://huggingface.co/ctxnn1/loss-lab-ce-brier"
11
  repository-code: "https://huggingface.co/ctxnn1/loss-lab-ce-brier"
 
4
  authors:
5
  - name: "ctxnn1"
6
  type: software
7
+ version: "2.1.0"
8
+ date-released: "2026-10-28"
9
  license: MIT
10
  url: "https://huggingface.co/ctxnn1/loss-lab-ce-brier"
11
  repository-code: "https://huggingface.co/ctxnn1/loss-lab-ce-brier"
source/README.md CHANGED
@@ -4,6 +4,8 @@ Reproducible nanoGPT experiments comparing cross entropy and vocabulary-summed B
4
 
5
  [Public research release](https://huggingface.co/ctxnn1/loss-lab-ce-brier) · [Expanded results](docs/RESEARCH_RESULTS.md) · [Protocol](docs/PROTOCOL.md)
6
 
 
 
7
  The completed project includes 42 main models, 42 learning-rate trials and 1,248 saved samples across Tiny Shakespeare and two TinyStories settings. Expanded studies use full-duration loss-specific tuning and five paired seeds. CE has lower test NLL in all 15 expanded seed pairs; Brier has slightly higher Shakespeare token accuracy. These are exploratory small-model results.
8
 
9
  ## Explore
@@ -14,12 +16,20 @@ Small recorded JSON and machine-readable tables live in results/records/ and res
14
 
15
  ## Reproduce
16
 
 
 
 
 
 
 
17
  python3 -m venv .venv
18
  .venv/bin/python -m pip install -r requirements-research.txt
19
  .venv/bin/python -m pytest tests -q
20
 
21
  See [reproduction commands](docs/RESEARCH_REPRODUCE.md), [the expanded plan](docs/RESEARCH_PLAN.md), [dataset licenses](docs/DATA_LICENSES.md), and the short [cloud workflow note](docs/OPERATIONS.md).
22
 
 
 
23
  The vendored nanoGPT model is pinned to commit 3adf61e154c3fe3fca428ad6bc3818b27a3b8291. Shakespeare uses character tokens; TinyStories uses UTF-8 bytes. Compare losses within a study.
24
 
25
  ## Repository scope
 
4
 
5
  [Public research release](https://huggingface.co/ctxnn1/loss-lab-ce-brier) · [Expanded results](docs/RESEARCH_RESULTS.md) · [Protocol](docs/PROTOCOL.md)
6
 
7
+ **Completed release: v2.1.0.** [Research report](output/pdf/loss-lab-research-report.pdf) · [Portable project download](https://huggingface.co/ctxnn1/loss-lab-ce-brier/resolve/v2.1.0/loss-lab-v2.1.0.zip?download=true)
8
+
9
  The completed project includes 42 main models, 42 learning-rate trials and 1,248 saved samples across Tiny Shakespeare and two TinyStories settings. Expanded studies use full-duration loss-specific tuning and five paired seeds. CE has lower test NLL in all 15 expanded seed pairs; Brier has slightly higher Shakespeare token accuracy. These are exploratory small-model results.
10
 
11
  ## Explore
 
16
 
17
  ## Reproduce
18
 
19
+ Verify the delivered records and file integrity using Python's standard library, with no GPU, account or installed ML dependencies:
20
+
21
+ python3 scripts/verify_results.py
22
+
23
+ To run the tests or reproduce training:
24
+
25
  python3 -m venv .venv
26
  .venv/bin/python -m pip install -r requirements-research.txt
27
  .venv/bin/python -m pytest tests -q
28
 
29
  See [reproduction commands](docs/RESEARCH_REPRODUCE.md), [the expanded plan](docs/RESEARCH_PLAN.md), [dataset licenses](docs/DATA_LICENSES.md), and the short [cloud workflow note](docs/OPERATIONS.md).
30
 
31
+ The portable download includes the report, complete source, interactive dashboard, figures and small recorded results. Large weights remain in the public release. Pin downloads to the v2.1.0 tag; RELEASE_MANIFEST.json checks the portable project and FILES_SHA256.json in the Hub release checks its published artifacts.
32
+
33
  The vendored nanoGPT model is pinned to commit 3adf61e154c3fe3fca428ad6bc3818b27a3b8291. Shakespeare uses character tokens; TinyStories uses UTF-8 bytes. Compare losses within a study.
34
 
35
  ## Repository scope
source/RELEASE_MANIFEST.json ADDED
@@ -0,0 +1,347 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema_version": 1,
3
+ "version": "2.1.0",
4
+ "scope": "Portable project and source bundle. Hub source lives under source/; published model hashes are in FILES_SHA256.json.",
5
+ "files": {
6
+ ".dockerignore": "86028321e99bdf0855642a99556b9255c97f4a61ee2de4e1013d5303fbc10135",
7
+ ".gitignore": "971fa38bf06b07f1df61e3f556d60eaabf7eef6c26389f5b24886c47fab92eb6",
8
+ "CITATION.cff": "65a13fa1797ec905388ef48b0ee2619f790f534a7c6bb0d79e1379d0f2750f00",
9
+ "Dockerfile": "e5698d382aa237b72b2ef83e685b775a3b7c919a97ca6ebab03e17fa66c4c138",
10
+ "LICENSE": "b174e6faf4c63ad0b6f988595deea7dd0bb171b3d922b9f9b0c627e0db38da9d",
11
+ "README.md": "8e78ba4f9e9e57ad359fb6d67b20f7ec74c68467a1d1bfe1034f713e488a2d71",
12
+ "Research.Dockerfile": "610c67cec90b98f9c3fc1a6e5e4f6d50615574e40f3fa06d28199313c583ba07",
13
+ "VERSION": "c89b87c262e9d5ffd20e73aac74a1772adcc9f5a21682cc33adcf5086e5fef5c",
14
+ "configs/comparison.json": "886698567ab39bf9f447bdef2b12f39ac3d76ce34eeffe18ce98b555468ecf13",
15
+ "configs/research-plan.json": "d0d8bebf96ad6ae3bf97177ca863011ccf2aa839f4369d8c373f61942677bba3",
16
+ "configs/smoke.json": "252221b8663bb2ad61c4f8aa9276bec7a32a179a1cb3a2821231b9f012f36fe7",
17
+ "configs/tinystories.json": "c10e9c38e7ad7472c85333f14198dffc366877b462c6d031ec49efb42bd05a97",
18
+ "dashboard.html": "c747189c03a14b7aeb90271d6a2ba41003fc9ceefa6aeb3a09c1598f697da59a",
19
+ "dashboard/AGENTS.md": "215baf947a82508f9aa349acce5fb747e43aaf874ddf7b9b11436b80fab50240",
20
+ "dashboard/docs/components/README.md": "c24c56d48a2b491a0a648ec0beee10f43d12c8d7fe2b5e74d89879fd31879419",
21
+ "dashboard/docs/components/async-data.md": "ddd293d4e1200a3c4814e520443dd9e22c1214b102deef877e0eb7da132cfb7d",
22
+ "dashboard/docs/components/bar-presentations.md": "3ec11931b0d05ec75282d3b23f77b348a271fff4dfad3379890cea35fff9309a",
23
+ "dashboard/docs/components/charts.md": "85f8c4106b1693994590f11d2fc4ef557c8ee00502c3bef1d831171b2cd74217",
24
+ "dashboard/docs/components/comparison-formatting.md": "35faa7cc51b5e7f3a00ee2b155343589b62c645cf9ae4f053118c72c528959e9",
25
+ "dashboard/docs/components/controls.md": "697c4e56b377e535c263220acbf4a4b4c05f8b072a47126051aa85dff8f3ea99",
26
+ "dashboard/docs/components/filtering.md": "7820b3d916b4c3c74243d98be96e819f7bd0a828e466e9621127a32c2bf6c1b9",
27
+ "dashboard/docs/components/funnels.md": "bc6f858194ad820b4b62123191d9603847f4f860ca3428d08816457323f79ed3",
28
+ "dashboard/docs/components/layout.md": "da9013b89a528bfee18235581de33da73d6aefd5695851f3e808d84b53446bd1",
29
+ "dashboard/docs/components/reports.md": "a698727d6993ce703ca4b33749cce9313aece525ce91132f2433f39fe3894cf0",
30
+ "dashboard/docs/components/sortable-layout.md": "fd0f9bfae34a9aa1563e17699a8591f1c24f7579303c176dcb27f45e6dc7bf96",
31
+ "dashboard/docs/components/sources.md": "2e6efcd576ec195c64895ded0aa29d629d94154fcc437828d2288a9440c31202",
32
+ "dashboard/docs/components/tables.md": "bad26c41789c621c24e25748111e20c6a100533477ef582c175a1edca12380f3",
33
+ "dashboard/index.html": "314bb3975bdcd7322067d234f99398b06f609c67c2321554eda742f2338b3c5e",
34
+ "dashboard/package-lock.json": "a018dca90e5f5893c698b9b41ee53f64e91cf0533f5ab3dc86c51b5a95dedf4b",
35
+ "dashboard/package.json": "6ee23dabbf22d64b8091a07b9dc857ff1ce2770e02886baaf68716595db8f14c",
36
+ "dashboard/protected-runtime.json": "5dc277c945090cc81cdc337e48e1b99e98f82c7d99a6c5e23e81bfb206ff5f06",
37
+ "dashboard/scripts/authorize-protected-change.mjs": "9b9f012d65c34a1f9ac4d107ba226f82aadabde72980c2d393c63e9d68eff6a3",
38
+ "dashboard/scripts/protected-file-digest.mjs": "2583e42fafb0d0fab7342b8dca163fe0d6771928dc41c830fbdfdee3af821822",
39
+ "dashboard/scripts/verify-protected-runtime.mjs": "47d95847a9135cd125581a4b994208adc3822cbef4a2c8bfaf562f0d2ef3a9af",
40
+ "dashboard/src/App.jsx": "2f4b8f28c24ee9498c8de670a7f9c7fb79a584c67f67d88b782ec301838cc54b",
41
+ "dashboard/src/DataAppContext.jsx": "309d971e9fd4494b2f704087c81ded8837ec955ae4a57898f54dd776c8fca30f",
42
+ "dashboard/src/DataAppRuntime.jsx": "3008a08c2a79c90a5ea5cb3f91b7f77113dfca1e8c4578bf47c34bd9932bd088",
43
+ "dashboard/src/DataAppShell.jsx": "004aa988679e158e668b8dd8c151869e9b6106cd31eeb33de0b51fc51c107259",
44
+ "dashboard/src/block-layout.js": "385da9c5081f9a24ee3eb8948b87aa7a6c6b0f1b7b37d26c91ae07fb01a81c8b",
45
+ "dashboard/src/build-state.js": "1fe7e56e5e8173e0da5d432600f385b13d9133cbeb243ef26edd97985babf6d8",
46
+ "dashboard/src/card-image.js": "b91c236f6e3b1c1bf5d7ca8085a4378770336b671dc3e36e403efa91995e851c",
47
+ "dashboard/src/chart-export.js": "f3eecf07f28799612c5e5b246e0cbd83d20850eac66599d29a72df7db92a69a3",
48
+ "dashboard/src/chart-image.js": "c48da8343b765813bc1294bcd81967fcd0b2bfe94f18174a1e3d4db6c44d1936",
49
+ "dashboard/src/chart-permalink.js": "de7b01a00bc0d2b478a63f50c0716272af7567283b793d908e2d8750a59a8458",
50
+ "dashboard/src/charting/BarFamilyRenderer.jsx": "235811f05967f5a1931c020b65e9a9ed6faf950c50e3c71a9868d4167a9c52c2",
51
+ "dashboard/src/charting/CategoryAxisTick.jsx": "e9f70ac3997d76125a58221dc0778a3437781947f2ef27722a171f2ea0a66561",
52
+ "dashboard/src/charting/ChartAnnotations.jsx": "8da6f704a1e8850873e99a4f778ebec29215a6df329bbdb11b46b01c09f8a022",
53
+ "dashboard/src/charting/ChartFrame.jsx": "bb0925854283f32cc398144a79e69113e4874018375ddf4e241d3f5fd06ddcf0",
54
+ "dashboard/src/charting/ChartMark.jsx": "bad3bfefaef82395ea67aaef44c75941d6087eb45137214bb78d04b2978565b1",
55
+ "dashboard/src/charting/ChartRenderer.jsx": "2335f9e8a29c38a017d154a14b9149700e5084997791b6756fcae29933978551",
56
+ "dashboard/src/charting/ChartState.jsx": "ad5b28521894d219e36027fcfc2640d0c0b8b290f55b4f6d1215ef2c9f2a7d46",
57
+ "dashboard/src/charting/ChartTooltip.jsx": "51303b729ff7adbf0405e67523a09c6aa89e40e144b61e717103b71b7c39a8bb",
58
+ "dashboard/src/charting/FunnelRenderer.jsx": "1103ec5a1a88f1a14622d5e6e30cf2e9b58d03d9cb6f21f973c62c6e7cd1309f",
59
+ "dashboard/src/charting/HeatmapRenderer.jsx": "2034e2e3d9a6d3c86256de1abbd73da7473401232e777e12d9d2de23c79a84b2",
60
+ "dashboard/src/charting/MetricSparkline.jsx": "9a5aae5cbd27b96baecc406bb69f91fc76cc9d5fc2aaa9e7e356d68d8c7ac08d",
61
+ "dashboard/src/charting/NumericAxes.jsx": "5eb37be4711efdb03eaa70225089fd6c4f4f597d3aa7faf81c3a55793d1aa883",
62
+ "dashboard/src/charting/PieRenderer.jsx": "fc1265bf867154c239ddb14b539c63751ab7716fb19903b535ccd9c06ca8a0cc",
63
+ "dashboard/src/charting/SankeyRenderer.jsx": "48c412a1e6394f152ae6bf8fef5023f76d6347844abb0a3710aa0f48f748a9c2",
64
+ "dashboard/src/charting/SelectedChartRegion.jsx": "1717361a56edb81e2f00bbdc57db66be844d02de43d5ce27cae7cd8f5722b0e7",
65
+ "dashboard/src/charting/TableSparkline.jsx": "466d91f5de2fab7f1fd8654e2ad800c56d0b6d6a71adc058405985a59a918da1",
66
+ "dashboard/src/charting/TemporalXAxis.jsx": "ef2ba3b476b1887416ede87fb577450ec0d54524b54c3cec3e2dbbc659c752d6",
67
+ "dashboard/src/charting/bar-family.js": "c31e44122f8d2e14b3f09bbeabe26fadea115a5488be2311720ff2bc54e7fbda",
68
+ "dashboard/src/charting/chart-annotation-layout.js": "09cd7715da2191c0257ccce4f900141dc4f3c5bf62a83bb5bec04ad23e4e96d2",
69
+ "dashboard/src/charting/chart-annotations.js": "bf8fd4fc8f5d586daa18c315855d9f67083ea2978860b7a5d64b7f713352098c",
70
+ "dashboard/src/charting/chart-data-shape.js": "4c1dea15118a8dffd68bfa3c0b6291a691d1929862a32a02edb8c711dc1fcedc",
71
+ "dashboard/src/charting/chart-editor-state.js": "57e1439926bff4e9aab3847b3e1bf92f1ab5554f53688112da56344c5a9cc0b8",
72
+ "dashboard/src/charting/chart-extrema.js": "ab4bd4a9adb25d2648ac95f8bf6388c5fe9eadbf7115a545925dedd7611a1850",
73
+ "dashboard/src/charting/chart-mark-interactions.js": "d93877eb6ef8324f0109277754e04affac135769a18f2d2d99d51d8382abb726",
74
+ "dashboard/src/charting/chart-overrides.js": "09e15338c86d93f7fb9845757d0ba223f71705d540ec467c18d32df7b10bb8f9",
75
+ "dashboard/src/charting/chart-spec-validation.js": "a293a06bc346734f25742f79d100ce45c45d107ec5c368965f931bf2d7b5c5f8",
76
+ "dashboard/src/charting/chart-theme.js": "21367c8f24bd4122e85efe4bac43e2e6fa8567a0d098cf8d03158dd183342cb9",
77
+ "dashboard/src/charting/chart-transforms.js": "782d55023ec8dddfb99e7c5584c39cc23e102317aa3ca1e4668043c8814c3e86",
78
+ "dashboard/src/charting/experimental-bar-chart.css": "b9117bdd6cd0f441f23b82a6d79fd17fc3e13e2f2003d631afc0827b2cf8174e",
79
+ "dashboard/src/charting/table-data.js": "2e61118fccdba5c565e1995fab213da44750817d9a7da85593776d5793234ef2",
80
+ "dashboard/src/chrome-contrast.js": "f18b05b03ec11c1f405527216ac1dc9c403074c22208bc7534008b8e4062d2e6",
81
+ "dashboard/src/chrome-layout.js": "3027c569c6266762f6d90268df1650768777b1b5cecb1405820d22bbd8588fb7",
82
+ "dashboard/src/components/Chart.jsx": "bb3193138a46e22fa0c3e3bc342fdfa539f03371cf1d628bef624a6a357e7e52",
83
+ "dashboard/src/components/ChartEditor.jsx": "485f6b405d310b11e6e784893971ae78e38d2fa68cd8f8be16a2c459c5be7208",
84
+ "dashboard/src/components/ChartExplorer.jsx": "e23683cddd6efe4d323844fa97cc5a6fdfef665cd7312c5fece80618696c56d3",
85
+ "dashboard/src/components/ChartExportDialog.jsx": "d54792a80ac79f67249d4332b80ef71b3b320d55cc3256b15532bf011dd6045e",
86
+ "dashboard/src/components/Controls.jsx": "d9077aac0dd095dcc26f8accb904ce834db130c4d6700a73ab6732c30c815602",
87
+ "dashboard/src/components/CustomBlockHost.jsx": "b7bfec00a46435291b07d32ff39a2ec65e309aa532902fd94e9b1c72a8994a32",
88
+ "dashboard/src/components/DashboardAsk.jsx": "5664289776e4ed8544ffb45474691908e2bff1c520e88a467b288a26822ac94d",
89
+ "dashboard/src/components/DashboardTabs.jsx": "5490439c56960f12f62cc99bdadcb8d24e60707a0aa901b3225346fb8b1f5f5b",
90
+ "dashboard/src/components/DataAppChrome.jsx": "6eae567b93a5f5c1ca4eccecfbdf3d85398f181e2e7d2f3e3447b6f5ade50233",
91
+ "dashboard/src/components/DataAppHandoffDialog.jsx": "3bd1db7e4c0a5804d2dbed3625b096f3b25b1d4dc8441e8817a278355faea2bb",
92
+ "dashboard/src/components/DataAppLoadingContent.jsx": "bcfec0818ea0c90f75697f35a0f8e5d3b649314ad9daaadaabfecb945d6a3483",
93
+ "dashboard/src/components/DataAppToast.jsx": "1c80d8723f951755c132c5b1e51fab8dafd38cd6312ad7bc9e5a98d4403c2213",
94
+ "dashboard/src/components/DataComponent.jsx": "8b4c886d78d833ca621e9c2d7eaa14e80df550306aa224f936682713a90a96bf",
95
+ "dashboard/src/components/DataTable.jsx": "dbaa4b2de52daefdbe288032efca399fedf9e03f53313746553077e21465adde",
96
+ "dashboard/src/components/DateRangePicker.jsx": "8a2d61e55b89e7b994433d8ca4b2f8ddd86769d741d3b4ccd5d886e55e7d42a2",
97
+ "dashboard/src/components/Dropdown.jsx": "e7761601666fd1a948541502e1ccc1985ebd30673237aecb865208e927533299",
98
+ "dashboard/src/components/EditableText.jsx": "d86a22e16e067f284bd51ae7b96a6d5b0af51b8098f267a0790b0962dfe38ad0",
99
+ "dashboard/src/components/EvidenceChart.jsx": "3b836656e696325fc402535fe7a8dcd95b5e0ada6c3363aa64fc1cb3e1da79c5",
100
+ "dashboard/src/components/ExecutiveSummary.jsx": "375a8bc90881e493690d55838e677877a6ff27b6c585dad9af5dfbf0705c4e38",
101
+ "dashboard/src/components/Icon.jsx": "3181d5f82f887b5a7cf4a1c5b1fcb50d6ffc1a06d082ce9f3f569bc26b4341a6",
102
+ "dashboard/src/components/MetricCard.jsx": "d12e774297ff9e002dc243cfbf3541c54469da98dc24d77c093ad34b326745ac",
103
+ "dashboard/src/components/PublishReviewDialog.jsx": "02894bfb21d21f8605e92230f8553007b2c843c17560bc852375a62c57363d8b",
104
+ "dashboard/src/components/QueryDataBoundary.jsx": "a5229b8f6142652f6ac16bcf35ba10b0753206a54fff2cc74e21565620aec2e0",
105
+ "dashboard/src/components/RefreshSetupCoachmark.jsx": "5007f4f0878b0e6c9c924c47625386ba922aec57dd69c8633996b7d67ca7fc77",
106
+ "dashboard/src/components/RichMarkdown.jsx": "d0afa8e119b0cc3cad380757bb80d6180effee84caa380f415c94d6db8fdb43f",
107
+ "dashboard/src/components/RichTextFormatToolbar.jsx": "3ee14b50554fee37d94e28a9c208188affb4ac66d3c4b33b60fcb49008e2e11b",
108
+ "dashboard/src/components/Section.jsx": "bee8342892fe825b1e208a81b85dfc0f32811698dfb5cf11bc7b7aed46c7c708",
109
+ "dashboard/src/components/SectionNavigator.jsx": "d25fde954fb369abb828872ae842ced37c4713a18908ad80c2e63cb58e57bea3",
110
+ "dashboard/src/components/SegmentedControl.jsx": "34bcc4601dc3538a2c5dae36be7d0b6d81d0059c2b1c53626024cda9feaf2b10",
111
+ "dashboard/src/components/Slider.jsx": "2db4c7b93269d2c80f6ad7b49cefedd02f824e83c4f7dbf5191f48c2b743ee5d",
112
+ "dashboard/src/components/SmoothCardSurface.jsx": "ed917e8cc1f0f59ba49c2085bbc719ce85da62d4c9d0e3aa632f38a1b941cdd1",
113
+ "dashboard/src/components/SortableRegion.jsx": "5a2f9f62f2c3505a4806946f96b48458fe3c158e4b54b8265867bd01721aeffd",
114
+ "dashboard/src/components/SourceInspector.jsx": "7f29201a5cf83472fb62b99b55a192b3ac723c1a7e230553e4c52331c3c225cb",
115
+ "dashboard/src/components/SourcePreviewCardContent.jsx": "0422f3d1bcbc82a72718c75a5dfc5094e87f5698a2c73eafb6568f188902f23a",
116
+ "dashboard/src/components/SourcePreviewLink.jsx": "46e0121daa5ef023774b04ad035e6bb0e59c02efe8cf752400fcc2631244f5c2",
117
+ "dashboard/src/components/SourceProviderIcon.jsx": "fb4ea0956e8410c9820cbb41fcbdc187a9b1a0e8323e643bc24521302ea4b73a",
118
+ "dashboard/src/components/SourcesReceipt.jsx": "9485a522cf62c4ed35e89dcf500344d0ba6618ee41147564d0c6cc46b5174a3d",
119
+ "dashboard/src/components/Switch.jsx": "38010aef242d32133274db12e1d91323204630b47875af874b68cb81bc19b23d",
120
+ "dashboard/src/components/chart-color-utils.js": "87402e606a497cf3d2bbe4262640988f9a2ed70f25c029b2f41fc108e663c2dd",
121
+ "dashboard/src/components/chart-export.css": "5169a041e8e7de337915d5b39f3d6c7208c0c587ef15744f8813308476fa1c4f",
122
+ "dashboard/src/components/contained-ui.jsx": "da4daa991f8df9421a4290ca33709fb8bb055280c0558a4de1153b698472a789",
123
+ "dashboard/src/components/data-app-handoff.css": "6edd7a036016ba2c80c122f1322f3f1f3a01bf333e36c5ebbab79313c870ba05",
124
+ "dashboard/src/components/data-app-loading.css": "8ce37185b00f9a9c12563cec73ebafcd4612230a7f4d5afc09736b6f9c468074",
125
+ "dashboard/src/components/dropdown-model.js": "c70414249e31d44177bdf2c81deb93ae564ccb2833f01e4fefbe37df5d597177",
126
+ "dashboard/src/components/executive-summary.css": "70205776df61151a771da83d7a87dfbc24c4128fc9978270a43d2cbd160911c7",
127
+ "dashboard/src/components/form-controls.css": "4cd65b3a53eef43d1f9b32dd62ebf44555c887ed92aee484dc080ba384349f7b",
128
+ "dashboard/src/components/icons/convert-icon-google-docs.svg": "c5f417c7896dde4a45cf61778f1d66053825bc5fbc75252ebae63b7c0ea48987",
129
+ "dashboard/src/components/icons/convert-icon-google-slides.svg": "233363b561f4152765bdc78a8386ad6f4a4f0afc1e504cedb9962f68a561ccbd",
130
+ "dashboard/src/components/icons/convert-icon-jupyter.svg": "58938f5b71c10a73982ef00caa43a01ceae35b2817df547012e4ae8ed25d2fb6",
131
+ "dashboard/src/components/icons/convert-icon-pdf.svg": "63b5fda9c3657b7b7fb4af31c3d2f16fc19ce8b1ceed2cddf5e4fe12947beae6",
132
+ "dashboard/src/components/icons/convert-icon-powerpoint.svg": "71a7a6a82eda7e671a66cd6c25b5814e39cc5be7a3db8365b0237398eef30978",
133
+ "dashboard/src/components/icons/convert-icon-word.svg": "6db6f1fdfc0805fdf017c319affe5a9b91bf337b52b0bd6a0bec4ecfed3c6b7c",
134
+ "dashboard/src/components/icons/dashboard-icon-alertBell.svg": "bbd96bd8458604bee4ffcaa2a33655cb0aba521f0608d9a02625e80e372e924b",
135
+ "dashboard/src/components/icons/dashboard-icon-arrowDown.svg": "ac89a7e1fd41d146e34d7c15be393a7b829774ffb8fbaa1df378f16bdb3d29e1",
136
+ "dashboard/src/components/icons/dashboard-icon-arrowUp.svg": "14ac5376283ecac668371746948f1dbcc14c1db3d811c81dcd334416ca1d7e1a",
137
+ "dashboard/src/components/icons/dashboard-icon-arrowUpRight.svg": "bcf1918ca943a7b982458fbd0be0c2feb3a517cce3debc551c0afbe2b25617a0",
138
+ "dashboard/src/components/icons/dashboard-icon-bold.svg": "91ca0e11fdacbf2db830a6d613da09788056b6ea7c9b5fa17851d575dc695feb",
139
+ "dashboard/src/components/icons/dashboard-icon-building.svg": "489056608adf36a9f512821518af60e80b9f8089d498b82121875b3090496f34",
140
+ "dashboard/src/components/icons/dashboard-icon-calendar.svg": "b6e0e5a4f8220c2e5c0d460f9aae103d757fac724f079cfa0e4c9b555ec24aa2",
141
+ "dashboard/src/components/icons/dashboard-icon-chatBubble.svg": "e9258804a30e890a6f66154115bd0fb5ee168c5073db54ca7e232c719fbfdf7c",
142
+ "dashboard/src/components/icons/dashboard-icon-chatgpt.svg": "cba78c1e4e72b24a7db4fc0778cb1cb9e1564850997a43e25735ef75c35b68c4",
143
+ "dashboard/src/components/icons/dashboard-icon-check.svg": "fa1dbd3611b7b9381d473f5fc5aafcaef17480e13d9afcba8138b10262e43fee",
144
+ "dashboard/src/components/icons/dashboard-icon-checkboxChecked.svg": "fff85250d9f1edbac7a61d23e5a780b348c76bc58d70fbb2343223876823e69d",
145
+ "dashboard/src/components/icons/dashboard-icon-checkboxUnchecked.svg": "e202fd75b51a08be2bc3ff7e47fe883c0b8f45d9eb877d7684f19660223795b5",
146
+ "dashboard/src/components/icons/dashboard-icon-chevronDown.svg": "d0e76111ab03cc7790eda06a1184e6622a458d4058baef39c19e3f21c70f601d",
147
+ "dashboard/src/components/icons/dashboard-icon-chevronLeft.svg": "8ee2e9be16b5aaf8523b0cb2f45266262d14a808c61d8bd4f073ccfa5a5dc948",
148
+ "dashboard/src/components/icons/dashboard-icon-chevronRight.svg": "b140e7a8852d56e0734ffc5d795dd4c62bfdd158c5ff3b6579dcb1bf9916baea",
149
+ "dashboard/src/components/icons/dashboard-icon-close.svg": "5ed5dea467dc8f02cb9d95627d300af8e9e1c7ddac1a117e3d37978732bd7acf",
150
+ "dashboard/src/components/icons/dashboard-icon-convert.svg": "4a76b31c0a2621b5980e5a024b9a0128b30a8e39c4113232ddda295739ddccbc",
151
+ "dashboard/src/components/icons/dashboard-icon-copy.svg": "ce35441b3c8b98cb51a73b3720cf970a2f707aa629cba1a9a8e36c0901e92afb",
152
+ "dashboard/src/components/icons/dashboard-icon-cross.svg": "85f94b605c8e61ab57ce2cc7a9118233c68299594055c86db531d3e3731ba0e5",
153
+ "dashboard/src/components/icons/dashboard-icon-database.svg": "efede7507d2f9dc2efc2f970ba44635f6de45a94860e111652fe27c549eebcf2",
154
+ "dashboard/src/components/icons/dashboard-icon-documentRefresh.svg": "917f75208b97799fa0ead171601b476640bf39cef8abfb4595c4afdd41cb1822",
155
+ "dashboard/src/components/icons/dashboard-icon-download.svg": "1a36951ac27c386de68db6e8fea94b10f94c7b18a8c78078acf3d1cbf3dd5122",
156
+ "dashboard/src/components/icons/dashboard-icon-edit.svg": "6d87e17048723e18d025a78578cbe9bb6c7ae0678d384ab314a4ba4cb30e652a",
157
+ "dashboard/src/components/icons/dashboard-icon-eye.svg": "d4bd76a4bbaaacbbd88ed2b9bbc29c1e510c8c1e591b35b7ea34dec701b9f6b4",
158
+ "dashboard/src/components/icons/dashboard-icon-globe.svg": "6b0d8c4310da06e63f2d9933a4d4d09dbdf5c59736f9c7a9929bd8e2c4cc184f",
159
+ "dashboard/src/components/icons/dashboard-icon-info.svg": "f5bdae0061d89fb8ebe61b99e56afeb74c2eb16acc529735fcd0b432b9f88e70",
160
+ "dashboard/src/components/icons/dashboard-icon-italic.svg": "7bc323dabc86a5a4804df4343228c83d98f844833f9a51949fe4986b2faca2e3",
161
+ "dashboard/src/components/icons/dashboard-icon-link.svg": "eee0f5946f827869adff8b4a7844dcf0f804aeed678f9bb4bce71f8c71cab796",
162
+ "dashboard/src/components/icons/dashboard-icon-lock.svg": "3e29a543cd126e32581fe676f447c51552599cf39d23a898c66145d10afdbe10",
163
+ "dashboard/src/components/icons/dashboard-icon-monitor.svg": "f72107e48efee8a64f9617fff594b4e3a3834793e6b6fe2e9d70f53cd03192eb",
164
+ "dashboard/src/components/icons/dashboard-icon-moon.svg": "fd4904e4b3b937ab24e126d856fbea4c36e1dbc7598702289316640b01c1cfc4",
165
+ "dashboard/src/components/icons/dashboard-icon-more.svg": "6239574c52f752c2f56798078c707e7fb13b11b28d6ba3702d3f01444fb8744e",
166
+ "dashboard/src/components/icons/dashboard-icon-palette.svg": "29b4e9c8dd944d6cd597204a02d38cada61b53efd8f192bde0e5e5ca93837aeb",
167
+ "dashboard/src/components/icons/dashboard-icon-plus.svg": "6be74c224110551d27eaeb946e3230ea6f873fc183694fb2f029a98e029d6002",
168
+ "dashboard/src/components/icons/dashboard-icon-refresh.svg": "917f75208b97799fa0ead171601b476640bf39cef8abfb4595c4afdd41cb1822",
169
+ "dashboard/src/components/icons/dashboard-icon-remix.svg": "b15cea131c81cc4bf22389ec4d9af1c509e8e5a3b6cf6bd3efd2517dfb19c580",
170
+ "dashboard/src/components/icons/dashboard-icon-search.svg": "50f34bb3c31c88f067ddef77ee905d169c174115f3902efb96714385d03a1365",
171
+ "dashboard/src/components/icons/dashboard-icon-sendUp.svg": "01bab7cee85f6f8d10792872b240854f1a3f1ae43166440395229b0fe74abd3b",
172
+ "dashboard/src/components/icons/dashboard-icon-settings.svg": "6167badd421c478ab855eeca26d3ea4762af36cc1ee091829140690bb202ac23",
173
+ "dashboard/src/components/icons/dashboard-icon-shieldCheck.svg": "914d474f40a27479ce1277685509d47a1b31d5e9cf46b20304b1240ce426817e",
174
+ "dashboard/src/components/icons/dashboard-icon-sites.svg": "200345e38648750c5a3943bbca030e25c82b0162a4d22e2525e5be485a07f02f",
175
+ "dashboard/src/components/icons/dashboard-icon-sliders.svg": "7155043b9fc09130b06da1e2f11c54f0fbdff7ba026c0bb1851fff67ff045549",
176
+ "dashboard/src/components/icons/dashboard-icon-spinner.svg": "922606ecce4da0d88f02e09d1c1b1c4e954bcdd78a2abed56b9c791f3f7807be",
177
+ "dashboard/src/components/icons/dashboard-icon-stop.svg": "bbf3a955167cbe58a8e89c4b9c169015567e3396bbd5ad0425499aa5b5171f67",
178
+ "dashboard/src/components/icons/dashboard-icon-summaryBubble.svg": "b3e045b3418a4ba33c20c785dc7eb3073887e4eb67b7b84976912fd2e886a4b0",
179
+ "dashboard/src/components/icons/dashboard-icon-sun.svg": "744c94ee224f3fa62344164927d56719de26590b32498f0ca13ed297c0fc3b7a",
180
+ "dashboard/src/components/icons/dashboard-icon-textDocument.svg": "a4f7ccc2425115911af1cddddbff83864045aa7cc0add8d22f8135b27a9085f0",
181
+ "dashboard/src/components/icons/dashboard-icon-theme.svg": "29b4e9c8dd944d6cd597204a02d38cada61b53efd8f192bde0e5e5ca93837aeb",
182
+ "dashboard/src/components/icons/dashboard-icon-trash.svg": "3ee541a3937fe1f1d41b607da8e602ecbbfe8a5f60333b82ce8ab67bd7461f8b",
183
+ "dashboard/src/components/icons/dashboard-icon-undo.svg": "bebef36b99f928445155a3f1b2e8b331ca215fafbcb025c2c83ef32d9dd196e3",
184
+ "dashboard/src/components/icons/receipt-icon-chart.svg": "f0a5cc90d98ed7252b6deabb38384303f0014e6f98862616e00645148a2d6872",
185
+ "dashboard/src/components/icons/receipt-icon-document.svg": "3eb5b50ae68bb2b591259f15dfac0c932da21ad848035a0dff5f276fc4aa672c",
186
+ "dashboard/src/components/icons/receipt-icon-file-audio.svg": "d10f139b197624b2ac005606db4800da745c07c2001d890bba41d3f3671cd15d",
187
+ "dashboard/src/components/icons/receipt-icon-file-code.svg": "72c6a797ed6dd0e3a8650e4c978982912505483f919359480afa8ee3d99ef780",
188
+ "dashboard/src/components/icons/receipt-icon-file-image.svg": "5d7f10c0d06473434b93fd8f993728733ad649d9d374830ce2b6b03116066b23",
189
+ "dashboard/src/components/icons/receipt-icon-file-presentation.svg": "d66a94e724adffac73374312f5bacb4c28910bb85669876192df9ffcda66bc78",
190
+ "dashboard/src/components/icons/receipt-icon-file-video.svg": "ebc49ae92ea9ed8484f6d52080b0f205f31e56b993f7a052a14967a38d134b27",
191
+ "dashboard/src/components/icons/receipt-icon-file.svg": "58a0f5a1ea78a0c114fc74c44160c0708c92e41ffd6f14e829173f5fe047b71a",
192
+ "dashboard/src/components/icons/receipt-icon-link.svg": "61b98747b27424feca44c0ff694c445e2ad74228e483b953fea722c55e706acf",
193
+ "dashboard/src/components/icons/receipt-icon-table.svg": "cba9c8de3a1dd0546cad18b09b6907f82bf68ec28d65513219308c40f3d60742",
194
+ "dashboard/src/components/icons/source-icon-github.svg": "1a6f230a6debcc742730be9d8419766eb670b96f454fbefb71ecac89cf64e081",
195
+ "dashboard/src/components/icons/source-icon-google-drive.svg": "4b413acdf0642e710741d531a3c19582a9bec50de64b398b17f3cb7b0ce0fa06",
196
+ "dashboard/src/components/icons/source-icon-google-sheets.svg": "165b4c145808a18f4052dd51bf0e84b68901cd41a89099dbb5a57cfe639bbecf",
197
+ "dashboard/src/components/icons/source-icon-notion.svg": "eef8f46b63fb120abd63ca2e58e7f4be0a230c3e30276e6e438897b66b695508",
198
+ "dashboard/src/components/icons/source-icon-slack.svg": "b5a8d11655966384c3884e011232a2c83ab5f813187e3c0e49d4410b145b65f1",
199
+ "dashboard/src/components/publish-review.css": "0483af589681e7e22b58dbc41d0c39dba4ff6e04f350b04109c14fac0bbd8c9d",
200
+ "dashboard/src/components/section-navigator.css": "841d9893a1b70b3740f548d1a1b535eb707b8152c9ece8854a75e505e0ed3ba7",
201
+ "dashboard/src/components/slider-math.js": "91e4d29a312e30ef03474fff062e8d12310a112d623d3c2cf13c7f8aa20c0320",
202
+ "dashboard/src/components/source-inspector.css": "8f33b97393bbf736360e6b7998af38078d94b23181cc85d7652fee8635813c86",
203
+ "dashboard/src/components/topbar-mode-controls.css": "1b7c542c1fedbd6a469a2ebd5eb445eb39412f7cc1e19b192792c2af3d6829d8",
204
+ "dashboard/src/components/touch-release-trigger.js": "5269c96d07196290c9eaa91397b78aba7f662740a4bc1917479ef0bdb8beafdc",
205
+ "dashboard/src/components/ui.jsx": "d07d561a0876bb899eb16ac68a70781a96fcd6a6427c34b1bc023091eaa472c8",
206
+ "dashboard/src/content/assets/README.md": "1a17117302d00a4301c95b0562c12a244e38efe35aa508831ea404e7051556d7",
207
+ "dashboard/src/content/dashboard/DashboardContent.jsx": "1275b159f7798adcca787e9198fb03715738326dff299fea6e567905aea370b3",
208
+ "dashboard/src/content/dashboard/dashboard.css": "43bc77f582d4ffbb99edc7a84bac8f8405bf6689cdeb4e87f2749a69da392bab",
209
+ "dashboard/src/content/dashboard/loss-lab.css": "30f2f748f09208a942427abb78e18b81596123d727bc96be7ad1aee95d26e9a7",
210
+ "dashboard/src/content/report/ReportContent.jsx": "0af29196a6714b72f895de4acbb70205fddda8ed7fde05245ff7103e86f0fe40",
211
+ "dashboard/src/content/report/report.css": "b0aed6d085aa46b2b4bace26ebcf4120d0c267a74fa5dcc87bdba2a2dff4f88e",
212
+ "dashboard/src/content/shared/README.md": "36ae02985b054edb3e526dd75d89d019c4ac6ec14d70f58b40c83d439c6dbf8f",
213
+ "dashboard/src/content/shared/ReportDisclosure.jsx": "f559abc00fbd4e01f8276d9df8ed2c7db3ea001a0068119c0d82b4243991b746",
214
+ "dashboard/src/content/shared/ReportTaskLink.jsx": "7fc3cabbab44aee60a98b22038842704f7b097d9cb417f38be58133ea4305f88",
215
+ "dashboard/src/content/shared/SortableDashboardLayout.jsx": "e072e1e11812bfc3cac5ebd040f2c0cebbe22f04a9034ce84e3d49e7271f3a99",
216
+ "dashboard/src/content/shared/report-disclosure.css": "64e07e80151cd95e175185510f1c5e20331223bd786f1f12a56c51cc8c6841bd",
217
+ "dashboard/src/content/shared/report-task-link.css": "708b794f8f635ea9328b93d5ed5cdc8a6cca7b04215390ac6eb5616532f7a747",
218
+ "dashboard/src/dashboard-ask.js": "8155067359e92c805691a2d01845b84cd49f15a62fe156b00d9eae85cb3e6a9f",
219
+ "dashboard/src/dashboard-url-state.js": "7548d0752f11d003255649bc7bdb57062c97f6b82014a86c349b06e86355e932",
220
+ "dashboard/src/dashboard-view-state.js": "4c1ad1fc94e563a64716f0587477ba40b0e8c84e92836f7a75a0cfe864a8c225",
221
+ "dashboard/src/data-app-actions.js": "4c9e470ab9a5424168fb64f18ef8d8352035b56a6c79d5043d041b52eb536637",
222
+ "dashboard/src/data-app-context-tools.js": "614a1e5877cac998929ba38cb3c0d703fe3da28c8d11f350e00001bdf816d322",
223
+ "dashboard/src/data-app-handoff.js": "c99ca50617f37efd5171381a2ea126817ecd9c73c6c59283e4ac4e8921250b37",
224
+ "dashboard/src/data-app-image-tools.js": "9201f93c3cfc884ee6573f93eaa6fd5db5d1a48087a8459c220fb92a5500eb5e",
225
+ "dashboard/src/data-app-owner.js": "1d20906e87792e64f7df9ba1aaf95243746bb7528bc244e139407c07d17aad40",
226
+ "dashboard/src/data-app-public.jsx": "57a22be28ed6172c7f0a1f9f2881d3afa3069cd4da9128fdfada8c803ddbba94",
227
+ "dashboard/src/data-app-schedule.js": "fd7bd84121f2e4eeac1a8b5b11b44b181c91a8aa1d91a9ce490f8bd5514ca275",
228
+ "dashboard/src/data-app-worker.js": "acabf5aaa262e38c4f8157aecb9c40e4a810d6e7433cfadca84676b68afcf38f",
229
+ "dashboard/src/data.json": "c905e0d0b48c846cb2d4c6c7e196db76627060a9589fc466c5107fa16b0e3551",
230
+ "dashboard/src/date-range.js": "d6cfe752cd461c32556e3644f780628274e664282f94c434b49a540c979f461c",
231
+ "dashboard/src/foundation.css": "9b503667f9e8451c53940cede8a8855fefe74cb4ea8ad0e0accc8d9584721836",
232
+ "dashboard/src/handoff-preference.js": "521a83c4f57ac7ef55bdb02e45758e7cd4fbd0dee5e7983dc2791d944c6efb5a",
233
+ "dashboard/src/hosted-query-bootstrap.js": "ef1c0d0f8cdce0e1efc0892375283d38d505a2b13ed659859c2cd4e2e6fc77b9",
234
+ "dashboard/src/main.jsx": "cbb6a40a785d8c9a867a7684cdba60c930ff6a3d8eda3137cee458c4bc3a43cc",
235
+ "dashboard/src/object-snapshot-storage.js": "f4b2838453460b409ea080410d549d6f4fe5896fea94cd6be16ea235470dd734",
236
+ "dashboard/src/owner-email.js": "4bf602cf4a5fc05bebbadc0202366c8dec28fc3df621df29efa40a7dd43ac1d2",
237
+ "dashboard/src/prebuilt-runtime-entry.jsx": "821610a53bbbaaee8adccab9a9ab09ee1f2ca859db7346fae0de6c6ba5890f42",
238
+ "dashboard/src/presentation-state.js": "9aafd1df54b454d3b141c46caef320750d2ef733b0570776e3e7676c6581e6f6",
239
+ "dashboard/src/print.css": "8a3f83b3d4b453bc660d87027684e70ce053401c0d327e72247fc90f848966ac",
240
+ "dashboard/src/publish-review.js": "a2de03b6d885f33e6ac4bdaf13a7d5770e37b9d94595a844dd53d72c1121540a",
241
+ "dashboard/src/query-data-store.js": "0dc9edc7302359ee54b8b9c92a8adc7f15694e986461b8046b8b427a9e1ecc65",
242
+ "dashboard/src/refresh-coachmark.js": "07700a3ac6d8e8204982479b35f5b9fd958c7876f7c8cd651cc662f856ee61d6",
243
+ "dashboard/src/report-date.js": "7a29073e2f4498fb81af321c39344952cc08b9c3fe3caee020a908d3914aaed1",
244
+ "dashboard/src/report-follow-up.js": "81f4fee1f7300a10167946a1f430900f92e708c6c0b768790e152b29e54b8aad",
245
+ "dashboard/src/runtime-environment.js": "6f568c79bff45a67571681c0d8ed5f2e6f7450e1af6a01f0dfeaa75ef00d3e4d",
246
+ "dashboard/src/snapshot-storage.js": "58a7a4f0d405a0d1f6bdabdf50e5fe0877ee202354a2f8225bf1ece421a229e1",
247
+ "dashboard/src/source-preview.css": "92b71fb63191feb8a11c788aa76f1c00a1c1f36603dc57b3590384f8adce0690",
248
+ "dashboard/src/source-preview.js": "46be983664c5219ad84c2a8f507bc6aa959d3e9bef308961ddde145ede23f001",
249
+ "dashboard/src/source-provenance.js": "0cc0f174aa47eecbdb9e15bd473432280c880f547f9756e9bd03153f43b4210b",
250
+ "dashboard/src/streaming-json.js": "5fa4ab801f008c755d1d956034b82af9df8ad0ffe8d0178a67d006fa5573a7ce",
251
+ "dashboard/src/styles-foundation.css": "6f29f5247d6b45ed8bec0d4ad9f11f7d571698dec6bbef7e6189b637d9db7b08",
252
+ "dashboard/src/styles.css": "12a2ca74a48280d066eba6c77efe184afbc6c96c6b598782ebb80ae61dd13b03",
253
+ "dashboard/src/theme-picker.css": "b22f11215761446109be855f9d3afcfab80a7da8209c1eba4c48e57b3a20232f",
254
+ "dashboard/src/theme-presets.js": "3eebb82ee338aa0949be479c6ca86bf7c483d5a0e8dcd7ad0935f157aa8b2876",
255
+ "dashboard/src/theme-runtime.js": "e5ffd0fb34db599a30425e43a871312145f9f332a16f6b8d43facbd7466848f0",
256
+ "dashboard/src/theme.css": "8f714846965b075868db607dcca3f0bedb8f7057a999d8f1a95d60bbdfcf6980",
257
+ "dashboard/src/use-data-app-context-tools.js": "98110fa97f332df8e244944416e776a3398df73826885f46e1997b9d30735504",
258
+ "dashboard/src/use-data-app-image-tools.js": "1bff800a840b2771e0f130aad22e5732db2ef34e5b542f822cbb9ed70e3a8fa7",
259
+ "dashboard/src/use-data-app.js": "699f86eabcd0bb506162862e76b81951e4e0c875a1e78c276d39843bc3bb7702",
260
+ "dashboard/src/use-inline-editing.js": "4c4e250b34fcc57299d7c892bededbec648df7b221cc5004b85ae39f72ebf25e",
261
+ "dashboard/src/use-presentation.js": "d8f4a92a74807b6cd9a130927423b0361d6f62f118c71e8aee21bb9826d2d544",
262
+ "dashboard/src/use-section-filters.js": "271e18f770a642064277ddc0d52523acacebc21a35b99788e14778c8dd5193f3",
263
+ "dashboard/src/use-sortable-blocks.js": "5462804b0f62fcfc7fad6a581b1025057f827a368a0c528d218000c7928ba666",
264
+ "dashboard/src/verification-reminder.js": "9c135c75d15ef1a43aa98efd5db51aed44afbacb86206d073608cdb764957bc0",
265
+ "dashboard/src/worker.js": "bc859b3fcb14dc269367d5aecbbea5f6d307a477a607b3e376f992a8748b30f7",
266
+ "dashboard/vite.config.js": "da62d7d91fbf0e75f234a3f8e6d5adf91914babe53926972eeff6ac0f9544e1b",
267
+ "data/LICENSE-TinyStories-CDLA.html": "8fa35e8f27982bdfdb0ba1b099f259801baad2deeb08813aa715d944fbb33bcf",
268
+ "data/manifest.json": "e0f26161595eb9fe4c77880497931e8d85d71216302e200da834aec97a3eb333",
269
+ "data/tinyshakespeare.txt": "86c4e6aa9db7c042ec79f339dcb96d42b0075e16b8fc2e86bf0ca57e2dc565ed",
270
+ "data/tinystories-source.json": "b92764889a7afea621f2094424f92f2ee5c9604b611d505eb1dab93e871945c1",
271
+ "docs/DATA_LICENSES.md": "eab2c7485fc4558ee1daebc703eeb3c0d746ab7f43e40cc9a7c3b05928e9c8c9",
272
+ "docs/OPERATIONS.md": "6cae3020eb3528965931268d00a68dfff9786a0d5fd7766a36effc4fe2328561",
273
+ "docs/PROTOCOL.md": "1b6476e0dfbf3f4cff239415bff5eabd98c8a5ab71a068fb558b5fc1026e9400",
274
+ "docs/REPRODUCE.md": "92c24da765313fd34a14cdc1d16c7005b3fff8116191a07cd79801331e98cc37",
275
+ "docs/RESEARCH_PLAN.md": "7a19bc6c4f413e352c90fb4a54a46f23a47bfa0cef90f49920781bc933d6333c",
276
+ "docs/RESEARCH_REPRODUCE.md": "85a36aa7e7822acc1dfee964110cb47882c766cc2258ac494cc2df3302b759e3",
277
+ "docs/RESEARCH_RESULTS.md": "d11bcf9f6acc8b2fb4b04bed7a1ec4a4f6939017c7f3e621541dddf686a0ddbc",
278
+ "docs/RESULTS.md": "62bf8c94073e6f3d6dcbeb65c587f2b4831605b0933e03800f2006854c4c3878",
279
+ "docs/figures/final-confident-errors.png": "ffa76140ef7859c519ff053b753ee153d35f959e2572f0d6be826ed7dd51bd1f",
280
+ "docs/figures/final-confident-errors.svg": "356ff318a968cec194c45963e4a356d29d306c6c3f37adcda9523765709fdf17",
281
+ "docs/figures/final-learning-curves.png": "6301a655d11e4c949da132ba0448175f3257b6f50fac0271a19f76c4fb1ba81e",
282
+ "docs/figures/final-learning-curves.svg": "6c998ed3cc489fc3de1cf6609ed6cf7f6f97acc6c4ae00aa538e1a1c9893c25f",
283
+ "docs/figures/final-paired-nll.png": "dca841b44450a4207c12d51f0b15363e6ed6da861dbaa4e5759799ff77318037",
284
+ "docs/figures/final-paired-nll.svg": "4343b101d2098c38f651d72c954833191865b13f5369407acac0533565c5c054",
285
+ "docs/figures/scale-tinystories-diagnostics.png": "fd185444d6a9e67de291387145818eff971ec2240104ff03c11b95d019eac18a",
286
+ "docs/figures/scale-tinystories-diagnostics.svg": "9080a418122f7484e6cadf1c302d2b524fb3672f79c8d6325cdd98de05220422",
287
+ "docs/figures/scale-tinystories.png": "8ca07bed2c7ee93001a3954bb52752072ee743b85c9cf67f99860243378609d6",
288
+ "docs/figures/scale-tinystories.svg": "983a6ca961667e4b9604ef769bfe83b86457079c178f7608e50f9796db4cd824",
289
+ "docs/figures/v2-shakespeare-diagnostics.png": "05e39c24ec41e2a91083f4a2a3ea8e84cf5469ce612846178e672e1184fbac6f",
290
+ "docs/figures/v2-shakespeare-diagnostics.svg": "1f4f877fd93b0218ddd234e16d08f1d259092ecf4f1e254554ac1eb6618010c2",
291
+ "docs/figures/v2-shakespeare.png": "d9a8c215c07f14647e9bcdb501a51728f7b4d66d9761e30ddc937816253307fc",
292
+ "docs/figures/v2-shakespeare.svg": "8cdcb1c4e08f421bf72883df3deeb1d8c86c647fb7ce602f7dc779a95819dc41",
293
+ "docs/figures/v2-tinystories-diagnostics.png": "2e1d847decd0f8f4635f412a58dbec2737ec9f72411fb7c2fd9f506752308c4a",
294
+ "docs/figures/v2-tinystories-diagnostics.svg": "2d9a0a18976eb5da643ff705bef1ff5d9491aa398cfa9ac951253119dff0a033",
295
+ "docs/figures/v2-tinystories.png": "4e96941dc925d0ab7b56f9d1377bee6cd7bf158bc4b42f35568c6745f6e4be67",
296
+ "docs/figures/v2-tinystories.svg": "a3888b3595a0b57244788f8cd58f54fc91bf47cfcee1f2b927d66cdd3c6f7c54",
297
+ "experiments/__init__.py": "76fed41f773983690b4e7e54a031cd15990120ec0d3ffcdc4d70bc849ea8ee36",
298
+ "experiments/archive.py": "ec1dca88f63ac097850f3edf608d304adf33acadfcf93f0b8577e205b0c71861",
299
+ "experiments/diagnostics.py": "2d2a07a6a383e233420b865337a145ce8483e0bb60d75834ca40cc416b6aa012",
300
+ "experiments/io.py": "80b00225a4d71693d6ae7e5057bfd978515b76b576fcbbe0fc7b38edf1d23ff8",
301
+ "experiments/losses.py": "9896990b6882b698129ab3d0b2825f7ba5146e33433aefcde4158d2b45326970",
302
+ "experiments/pipeline.py": "a76dbde0a53dce6b9ef4b3121b38e1ac80dce52a5579139bf8c211b5dd42575a",
303
+ "experiments/prepare_stories.py": "26095106261fbc739d92920d49e65eec77b3828ca72ef0515a6c3df85e5d5bc2",
304
+ "experiments/reporting.py": "dc26418b519b9e729622ab0426cce2c64e0818c6f103d3c66bdbfed3a11aefc6",
305
+ "experiments/research.py": "6b94c64f553a5e8f2d9d936d5d85e0974c4dc0b60f72d826cc1cc0ad8903936f",
306
+ "experiments/sample.py": "dc6ed2815de0f3e67cbd777e60a5f9c52633ac77d8f173f1755342db04d5e6d2",
307
+ "experiments/sample_safetensors.py": "e6f30461fd8f8515fd47937359237b9d318c9a089d0a9747006fb2f79276d975",
308
+ "experiments/train.py": "0c2d4bd0cf708a659ab299cb3d294521655bfefb280ddaeb351164c40446c55b",
309
+ "output/pdf/loss-lab-research-report.pdf": "aeabb786f1efc3a35cdfeaeb76ba0851e46af55871f955d1f812fa80c0b61ec0",
310
+ "requirements-report.txt": "2485480cb9090be564943b86813cb5846ecc7a4d99e412d97ba3e7b561a1adff",
311
+ "requirements-research.txt": "1bbfa2cb9c22d87ec6a6d98b1a0475516be0a5e29ef88865f21622510341ead3",
312
+ "requirements.txt": "f54fde6250af67be2c903bc2363344c1e411c53098e356b6c16f80d0070bbb7a",
313
+ "results/.gitkeep": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
314
+ "results/MODEL_INDEX.json": "e57c1fe5caa0927967b98935648bd73365f9f144dfd6d66bfea92d1691775a3a",
315
+ "results/PROVENANCE.json": "d1513504b23363c6878da324fe7c87557436fd4c681f4e8181a10eaa57375c78",
316
+ "results/VERIFICATION.json": "849458322833bef9405a9d94b48ae4277c25e20fda1d91a91a80914066dee3d5",
317
+ "results/metrics/README.md": "86aa658090bed785b16bf8d15819804a6b364db81c310af5eaabd3cb71464ad5",
318
+ "results/metrics/final-scores.csv": "e469c2b62dbaca3a6ae8463f3c4dc48dc33ff370ab390eb6dbf94fee4feac89f",
319
+ "results/metrics/learning-rate-trials.csv": "bcda34b70c46886ad1e693b0d3e05c638fd088b850591c67acef6568152bc102",
320
+ "results/metrics/samples.jsonl": "93d297bad2951670e1f366153869029d3590cf406f15725bfc42ff0b447cfe50",
321
+ "results/metrics/validation-history.csv": "ff0391a427aca28c47f930e752c738913481dd435e264262739595811051db97",
322
+ "results/records/scale-tinystories/results.json": "9d20376bf112ed1f759e862426f0fb2e19bd28ba5a8e1395ddedc0522323f996",
323
+ "results/records/shakespeare/results.json": "f168fc0c3ecf2135f79fb569df1c69956f3f7014376f69526f92f140afb51854",
324
+ "results/records/tinystories/results.json": "b2a8ae61d7a0d5b6213955967b26248c0302f9ba19a378c4245a8ec19956aac0",
325
+ "results/records/v2-shakespeare/results.json": "b790992d002dd64eb971b5e89f9cd8c2d1801409633bd9a614aebb4f43e48680",
326
+ "results/records/v2-tinystories/results.json": "016fbc73e6a8f6cf7cf2ee952923ec59fe4647eff88e00772c2bf82b3ff68a14",
327
+ "scripts/build_dashboard.py": "a64123e6e0bf8a7912b81ced6643a353869761a822c487541e55c09b7e8bcf7c",
328
+ "scripts/export_figures.py": "99a4e1c4c0127ec178f94268f8beaad0d64e1ea9c3e89c17d2f46616163db129",
329
+ "scripts/package_release.py": "5ca5632c01f96252add70b13c0a593554fa54a18ccbb09ced9cfa70c4b509667",
330
+ "scripts/read_artifact.py": "23f36f8b046f7ca5dfc8938b28a1aaade916cf2f22cbbb621e8784d68e93397a",
331
+ "scripts/research_report.py": "4f54c9b95fa879233b396f1ae0f2b1ad34309a51b90b69a537de7e809941ce1a",
332
+ "scripts/serve.py": "454410bd2bf6486619f2178e931312b65febb843552020462a1c79cb5723f8d8",
333
+ "scripts/verify_results.py": "4e2955dce8633a26665d5aee2c6ef3336c7e5b8dd7e008dcbf938af64cd76b80",
334
+ "tests/test_diagnostics.py": "9effb4c56b28081366f23efc778672e9d19a598a3d92394843ab45463b040125",
335
+ "tests/test_io.py": "f2dfa187327277134e1393d6536f7bf26fd948f113e9e6a4ca603173d5262998",
336
+ "tests/test_losses.py": "d00c6dc9f077b73ce6c4cdef98070a3e3e66f1e9d57f9585af32c161c8b999bc",
337
+ "tests/test_publication_report.py": "4fca5153bd183733e9046a57d48bf58fa0bae7adfc92fd09beca142d5f9c33d5",
338
+ "tests/test_recorded_results.py": "5c37e2544ad31bf23dacbce6021b46da11af2d5987482beecae065522c704c61",
339
+ "tests/test_research.py": "27e9476b7caa5fba7bd0494a47e0c4de40bf18badb65a5494de6813c78da81c4",
340
+ "tests/test_resume.py": "1b728feb426f926ba72c0d18a821fc2f5e0fef9c819e7a1fa12be935be8f0633",
341
+ "tests/test_safe_sample.py": "bcdc909533ec694a3a7faf350dcea0845b91a45952decdec04b4b3fedf824826",
342
+ "tests/test_stories.py": "4fff9f4371f8ccca83fcf09ad17df4cc937bf02821ea23cd1ea74422c2c29ff1",
343
+ "tests/test_sync.py": "91d784c6abbe29b14b7b2a3e0c3e14fdb24b49b474ec3cbab837c10da609ff2c",
344
+ "vendor/nanogpt/LICENSE": "a59ec5cdb1c1e447e5266a014b3e7ded511f8d6e5a08931e931c87490ff821fe",
345
+ "vendor/nanogpt/model.py": "7c01703240dbec5d554527dc666e35b3df8391d0b117fddc07afcf325a21d11c"
346
+ }
347
+ }
source/VERSION ADDED
@@ -0,0 +1 @@
 
 
1
+ 2.1.0
source/dashboard.html ADDED
The diff for this file is too large to render. See raw diff
 
source/docs/RESEARCH_REPRODUCE.md CHANGED
@@ -24,12 +24,25 @@ To reproduce the original short-pilot baseline, build Dockerfile and run experim
24
 
25
  ## Verify and regenerate analysis
26
 
 
 
 
 
 
 
27
  python3 -m venv .venv
28
  .venv/bin/python -m pip install -r requirements-research.txt
29
  .venv/bin/python -m pytest tests -q
30
  .venv/bin/python -m experiments.reporting --records results/records --output results/report
31
  .venv/bin/python scripts/export_figures.py
32
 
 
 
 
 
 
 
 
33
  The checks cover proper scores, analytic logit gradients, native resume, dataset preparation, bounded archive reads and report calculations. GPU trajectories can vary between hardware placements despite paired seeds.
34
 
35
  results/records/ retains the complete five study records. results/metrics/ contains final scores, tuning trials, validation histories and every saved generation. results/MODEL_INDEX.json maps all 42 main models to published files and hashes. Deployment routing metadata has been removed without changing numerical metrics, sample text or model files.
@@ -38,7 +51,7 @@ results/records/ retains the complete five study records. results/metrics/ conta
38
 
39
  From source/ after installing the research requirements, download only one model directory:
40
 
41
- hf download ctxnn1/loss-lab-ce-brier \
42
  --include 'runs/research/v2-tinystories/models/ce-seed42/*' \
43
  --local-dir downloaded
44
  python -m experiments.sample_safetensors \
@@ -47,6 +60,8 @@ From source/ after installing the research requirements, download only one model
47
 
48
  Use the matching Brier directory for the other arm. Pin --revision to an exact Hub commit for archival reproduction. New local generations may differ from the original GPU samples; the stored generation records remain available. These are custom nanoGPT weights, not Transformers AutoModel checkpoints.
49
 
 
 
50
  ## Dashboard
51
 
52
  Open the delivered dashboard.html for the complete embedded snapshot. Keep docs/ beside it for documentation links. The authored UI, theme and reviewed JSON are in dashboard/src/. Rebuilding the editing shell requires the pinned installed Data authoring runtime; training, metrics, standalone figures and the portable HTML do not depend on that editor.
 
24
 
25
  ## Verify and regenerate analysis
26
 
27
+ From the portable project root, the following command uses only Python's standard library. It reconciles every run, tuning choice, CSV, saved sample, model-index entry and dashboard final score; it also checks RELEASE_MANIFEST.json when present:
28
+
29
+ python3 scripts/verify_results.py
30
+
31
+ To run the numerical tests and regenerate figures:
32
+
33
  python3 -m venv .venv
34
  .venv/bin/python -m pip install -r requirements-research.txt
35
  .venv/bin/python -m pytest tests -q
36
  .venv/bin/python -m experiments.reporting --records results/records --output results/report
37
  .venv/bin/python scripts/export_figures.py
38
 
39
+ To rebuild the six-page research report and its three figures:
40
+
41
+ .venv/bin/python -m pip install -r requirements-report.txt
42
+ .venv/bin/python scripts/research_report.py
43
+
44
+ The result is output/pdf/loss-lab-research-report.pdf. Report creation is local and does not start a GPU job.
45
+
46
  The checks cover proper scores, analytic logit gradients, native resume, dataset preparation, bounded archive reads and report calculations. GPU trajectories can vary between hardware placements despite paired seeds.
47
 
48
  results/records/ retains the complete five study records. results/metrics/ contains final scores, tuning trials, validation histories and every saved generation. results/MODEL_INDEX.json maps all 42 main models to published files and hashes. Deployment routing metadata has been removed without changing numerical metrics, sample text or model files.
 
51
 
52
  From source/ after installing the research requirements, download only one model directory:
53
 
54
+ hf download ctxnn1/loss-lab-ce-brier --revision v2.1.0 \
55
  --include 'runs/research/v2-tinystories/models/ce-seed42/*' \
56
  --local-dir downloaded
57
  python -m experiments.sample_safetensors \
 
60
 
61
  Use the matching Brier directory for the other arm. Pin --revision to an exact Hub commit for archival reproduction. New local generations may differ from the original GPU samples; the stored generation records remain available. These are custom nanoGPT weights, not Transformers AutoModel checkpoints.
62
 
63
+ The v2.1.0 release tag pins all published model and source files. The portable loss-lab-v2.1.0.zip download excludes large weights and prepared TinyStories files; its SHA-256 sidecar checks the download. Extract it, enter the loss-lab-v2.1.0 directory, and run scripts/verify_results.py before installing dependencies. To rebuild the same source-only bundle from a Git checkout, use scripts/package_release.py; refreshing its manifest is an explicit maintainer action.
64
+
65
  ## Dashboard
66
 
67
  Open the delivered dashboard.html for the complete embedded snapshot. Keep docs/ beside it for documentation links. The authored UI, theme and reviewed JSON are in dashboard/src/. Rebuilding the editing shell requires the pinned installed Data authoring runtime; training, metrics, standalone figures and the portable HTML do not depend on that editor.
source/docs/figures/final-confident-errors.png ADDED
source/docs/figures/final-confident-errors.svg ADDED
source/docs/figures/final-learning-curves.png ADDED

Git LFS Details

  • SHA256: 6301a655d11e4c949da132ba0448175f3257b6f50fac0271a19f76c4fb1ba81e
  • Pointer size: 131 Bytes
  • Size of remote file: 350 kB
source/docs/figures/final-learning-curves.svg ADDED
source/docs/figures/final-paired-nll.png ADDED
source/docs/figures/final-paired-nll.svg ADDED
source/output/pdf/loss-lab-research-report.pdf ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:aeabb786f1efc3a35cdfeaeb76ba0851e46af55871f955d1f812fa80c0b61ec0
3
+ size 603411
source/requirements-report.txt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ -r requirements-research.txt
2
+ reportlab==4.4.9
3
+ pypdf==6.10.0
source/results/VERIFICATION.json ADDED
@@ -0,0 +1,295 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema_version": 1,
3
+ "release_version": "2.1.0",
4
+ "ok": true,
5
+ "main_models": 42,
6
+ "tuning_runs": 42,
7
+ "training_runs": 84,
8
+ "saved_samples": 1248,
9
+ "validation_records": 1212,
10
+ "expanded_ce_lower_nll_pairs": 15,
11
+ "studies": {
12
+ "shakespeare": {
13
+ "seeds_per_loss": 3,
14
+ "steps": 3000,
15
+ "pilot_steps": 300,
16
+ "unit": "character",
17
+ "selected_learning_rates": {
18
+ "ce": 0.003,
19
+ "brier": 0.001
20
+ },
21
+ "paired_nll_differences": [
22
+ -0.040891035087115,
23
+ -0.07703939280402983,
24
+ -0.09543347791158507
25
+ ],
26
+ "paired_nll_mean": -0.0711213019342433,
27
+ "ce_lower_nll_pairs": 0,
28
+ "metrics": {
29
+ "ce": {
30
+ "nll": {
31
+ "mean": 1.7689468973723783,
32
+ "sample_sd": 0.019594316099764218
33
+ },
34
+ "brier": {
35
+ "mean": 0.5955837475495004,
36
+ "sample_sd": 0.002047717360154703
37
+ },
38
+ "accuracy": {
39
+ "mean": 0.5574356758832565,
40
+ "sample_sd": 0.001229405326897443
41
+ },
42
+ "ece": {
43
+ "mean": 0.1465979823562783,
44
+ "sample_sd": 0.004311786561447637
45
+ }
46
+ },
47
+ "brier": {
48
+ "nll": {
49
+ "mean": 1.6978255954381352,
50
+ "sample_sd": 0.008174024052695898
51
+ },
52
+ "brier": {
53
+ "mean": 0.5900582065330118,
54
+ "sample_sd": 0.0006547766508392325
55
+ },
56
+ "accuracy": {
57
+ "mean": 0.5549635176651305,
58
+ "sample_sd": 0.0005867197468279228
59
+ },
60
+ "ece": {
61
+ "mean": 0.12231965395290234,
62
+ "sample_sd": 0.0017560299513301938
63
+ }
64
+ }
65
+ }
66
+ },
67
+ "tinystories": {
68
+ "seeds_per_loss": 3,
69
+ "steps": 3000,
70
+ "pilot_steps": 300,
71
+ "unit": "UTF-8 byte",
72
+ "selected_learning_rates": {
73
+ "ce": 0.003,
74
+ "brier": 0.001
75
+ },
76
+ "paired_nll_differences": [
77
+ 0.07343195264683222,
78
+ 0.06771696616793177,
79
+ 0.0628220526782367
80
+ ],
81
+ "paired_nll_mean": 0.06799032383100023,
82
+ "ce_lower_nll_pairs": 3,
83
+ "metrics": {
84
+ "ce": {
85
+ "nll": {
86
+ "mean": 0.6682189277573801,
87
+ "sample_sd": 0.0041052506867668434
88
+ },
89
+ "brier": {
90
+ "mean": 0.28152773529072256,
91
+ "sample_sd": 0.0013534167094511355
92
+ },
93
+ "accuracy": {
94
+ "mean": 0.7872145432692308,
95
+ "sample_sd": 0.0007805434222604225
96
+ },
97
+ "ece": {
98
+ "mean": 0.008419533708825823,
99
+ "sample_sd": 0.0009443544385507369
100
+ }
101
+ },
102
+ "brier": {
103
+ "nll": {
104
+ "mean": 0.7362092515883804,
105
+ "sample_sd": 0.0016854930610361192
106
+ },
107
+ "brier": {
108
+ "mean": 0.28437879477422606,
109
+ "sample_sd": 0.0006947109500440312
110
+ },
111
+ "accuracy": {
112
+ "mean": 0.7873230502136752,
113
+ "sample_sd": 0.0009759116694954518
114
+ },
115
+ "ece": {
116
+ "mean": 0.0124069764938547,
117
+ "sample_sd": 0.0017084594138647687
118
+ }
119
+ }
120
+ }
121
+ },
122
+ "v2-shakespeare": {
123
+ "seeds_per_loss": 5,
124
+ "steps": 3000,
125
+ "pilot_steps": 3000,
126
+ "unit": "character",
127
+ "selected_learning_rates": {
128
+ "ce": 0.0003,
129
+ "brier": 0.002
130
+ },
131
+ "paired_nll_differences": [
132
+ 0.13322782821872048,
133
+ 0.1069290629537134,
134
+ 0.09488664912012212,
135
+ 0.13477718075726464,
136
+ 0.11693181778624973
137
+ ],
138
+ "paired_nll_mean": 0.11735050776721408,
139
+ "ce_lower_nll_pairs": 5,
140
+ "metrics": {
141
+ "ce": {
142
+ "nll": {
143
+ "mean": 1.5637859763979678,
144
+ "sample_sd": 0.011654032333840027
145
+ },
146
+ "brier": {
147
+ "mean": 0.5784239581236744,
148
+ "sample_sd": 0.0007457970539479121
149
+ },
150
+ "accuracy": {
151
+ "mean": 0.5528153801843319,
152
+ "sample_sd": 0.0007425338856798578
153
+ },
154
+ "ece": {
155
+ "mean": 0.08483824757773274,
156
+ "sample_sd": 0.0017860099762222151
157
+ }
158
+ },
159
+ "brier": {
160
+ "nll": {
161
+ "mean": 1.681136484165182,
162
+ "sample_sd": 0.009236958551681444
163
+ },
164
+ "brier": {
165
+ "mean": 0.5859976530090095,
166
+ "sample_sd": 0.0024151379847103167
167
+ },
168
+ "accuracy": {
169
+ "mean": 0.5568656394009217,
170
+ "sample_sd": 0.0013798208913225745
171
+ },
172
+ "ece": {
173
+ "mean": 0.11393599177786892,
174
+ "sample_sd": 0.0035112504044219305
175
+ }
176
+ }
177
+ }
178
+ },
179
+ "v2-tinystories": {
180
+ "seeds_per_loss": 5,
181
+ "steps": 3000,
182
+ "pilot_steps": 3000,
183
+ "unit": "UTF-8 byte",
184
+ "selected_learning_rates": {
185
+ "ce": 0.001,
186
+ "brier": 0.001
187
+ },
188
+ "paired_nll_differences": [
189
+ 0.10847842903593252,
190
+ 0.10894760423079686,
191
+ 0.11731689254777833,
192
+ 0.12020073073893112,
193
+ 0.11019709232454511
194
+ ],
195
+ "paired_nll_mean": 0.11302814977559679,
196
+ "ce_lower_nll_pairs": 5,
197
+ "metrics": {
198
+ "ce": {
199
+ "nll": {
200
+ "mean": 0.6248011450461305,
201
+ "sample_sd": 0.002090470544375812
202
+ },
203
+ "brier": {
204
+ "mean": 0.2644443678152031,
205
+ "sample_sd": 0.000793626066429446
206
+ },
207
+ "accuracy": {
208
+ "mean": 0.8014833733974359,
209
+ "sample_sd": 0.0007005617469015655
210
+ },
211
+ "ece": {
212
+ "mean": 0.009101713022108202,
213
+ "sample_sd": 0.0003585957709725121
214
+ }
215
+ },
216
+ "brier": {
217
+ "nll": {
218
+ "mean": 0.7378292948217272,
219
+ "sample_sd": 0.005117114281099909
220
+ },
221
+ "brier": {
222
+ "mean": 0.2847987379332503,
223
+ "sample_sd": 0.0011952616021325135
224
+ },
225
+ "accuracy": {
226
+ "mean": 0.7871925080128205,
227
+ "sample_sd": 0.0011821594331386626
228
+ },
229
+ "ece": {
230
+ "mean": 0.012437610929973277,
231
+ "sample_sd": 0.0013493219245199195
232
+ }
233
+ }
234
+ }
235
+ },
236
+ "scale-tinystories": {
237
+ "seeds_per_loss": 5,
238
+ "steps": 6000,
239
+ "pilot_steps": 6000,
240
+ "unit": "UTF-8 byte",
241
+ "selected_learning_rates": {
242
+ "ce": 0.001,
243
+ "brier": 0.001
244
+ },
245
+ "paired_nll_differences": [
246
+ 0.08257979378075231,
247
+ 0.07834481366798185,
248
+ 0.08558378573401781,
249
+ 0.07915952007232685,
250
+ 0.08243812965888175
251
+ ],
252
+ "paired_nll_mean": 0.08162120858279212,
253
+ "ce_lower_nll_pairs": 5,
254
+ "metrics": {
255
+ "ce": {
256
+ "nll": {
257
+ "mean": 0.554432105478963,
258
+ "sample_sd": 0.001235368834922302
259
+ },
260
+ "brier": {
261
+ "mean": 0.237371782773437,
262
+ "sample_sd": 0.0002255373511480055
263
+ },
264
+ "accuracy": {
265
+ "mean": 0.8229076522435897,
266
+ "sample_sd": 0.00014028694516760552
267
+ },
268
+ "ece": {
269
+ "mean": 0.009006771796699375,
270
+ "sample_sd": 0.0010081384819452827
271
+ }
272
+ },
273
+ "brier": {
274
+ "nll": {
275
+ "mean": 0.6360533140617552,
276
+ "sample_sd": 0.0022464291715020967
277
+ },
278
+ "brier": {
279
+ "mean": 0.251661273534947,
280
+ "sample_sd": 0.0008282166414229327
281
+ },
282
+ "accuracy": {
283
+ "mean": 0.8133804086538462,
284
+ "sample_sd": 0.0007472720388563424
285
+ },
286
+ "ece": {
287
+ "mean": 0.010041667950811246,
288
+ "sample_sd": 0.0008460008148457641
289
+ }
290
+ }
291
+ }
292
+ }
293
+ },
294
+ "scope": "Recorded metrics, samples, model index and dashboard reconciled. Remote weight bytes are checked separately; no weights downloaded by this command."
295
+ }
source/scripts/package_release.py ADDED
@@ -0,0 +1,72 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Package the verified portable project. No models, network or cloud actions."""
2
+ import argparse
3
+ import hashlib
4
+ import json
5
+ from pathlib import Path, PurePosixPath
6
+ import subprocess
7
+ import sys
8
+ import zipfile
9
+
10
+ ROOT = Path(__file__).resolve().parents[1]
11
+ sys.path.insert(0, str(ROOT))
12
+ from scripts.verify_results import require, verify, verify_manifest
13
+
14
+
15
+ def digest(path):
16
+ return hashlib.sha256(Path(path).read_bytes()).hexdigest()
17
+
18
+
19
+ def write_manifest(root):
20
+ files = subprocess.check_output(["git", "ls-files", "-z"], cwd=root).decode().split("\0")
21
+ ignored = subprocess.check_output(["git", "ls-files", "-ci", "--exclude-standard", "-z"], cwd=root).decode()
22
+ require(not ignored, "Tracked files match private/generated ignore rules")
23
+ mapping = {}
24
+ for name in sorted(filter(None, files)):
25
+ if name == "RELEASE_MANIFEST.json":
26
+ continue
27
+ path = root / name
28
+ require(not path.is_symlink() and path.is_file(), "Missing or linked release file: " + name)
29
+ require(not name.startswith(("artifacts/", ".git/", ".venv/")), "Private release path")
30
+ require(path.suffix not in {".pt", ".safetensors", ".bin", ".zip", ".tar"}, "Large training artifact in source release")
31
+ mapping[name] = digest(path)
32
+ manifest = {"schema_version": 1, "version": (root / "VERSION").read_text().strip(),
33
+ "scope": "Portable project and source bundle. Hub source lives under source/; published model hashes are in FILES_SHA256.json.",
34
+ "files": mapping}
35
+ (root / "RELEASE_MANIFEST.json").write_text(json.dumps(manifest, indent=2) + "\n")
36
+
37
+
38
+ def package(root=ROOT, refresh_manifest=False):
39
+ root = Path(root)
40
+ evidence = verify(root)
41
+ if refresh_manifest:
42
+ write_manifest(root)
43
+ count = verify_manifest(root)
44
+ require(count is not None, "No release manifest. A maintainer must generate it with --refresh-manifest after staging public files.")
45
+ manifest = json.loads((root / "RELEASE_MANIFEST.json").read_text())
46
+ version = manifest["version"]
47
+ require(version == evidence["release_version"], "Release version mismatch")
48
+ target = root / "results/delivery" / ("loss-lab-v" + version + ".zip")
49
+ target.parent.mkdir(parents=True, exist_ok=True)
50
+ prefix = "loss-lab-v" + version + "/"
51
+ with zipfile.ZipFile(target, "w", compression=zipfile.ZIP_DEFLATED, compresslevel=7) as archive:
52
+ for name in sorted([*manifest["files"], "RELEASE_MANIFEST.json"]):
53
+ rel = PurePosixPath(name)
54
+ require(not rel.is_absolute() and ".." not in rel.parts, "Unsafe archive path")
55
+ entry = zipfile.ZipInfo(prefix + name, date_time=(2026, 10, 28, 0, 0, 0))
56
+ entry.create_system = 3
57
+ entry.compress_type = zipfile.ZIP_DEFLATED
58
+ entry.external_attr = 0o100644 << 16
59
+ archive.writestr(entry, (root / name).read_bytes(), compresslevel=7)
60
+ with zipfile.ZipFile(target) as archive:
61
+ require(archive.testzip() is None, "Archive CRC check failed")
62
+ checksum = target.with_suffix(".zip.sha256")
63
+ checksum.write_text(digest(target) + " " + target.name + "\n")
64
+ return {"path": str(target), "bytes": target.stat().st_size, "sha256": digest(target),
65
+ "portable_files": count + 1, "models_indexed": evidence["main_models"], "weights_included": False}
66
+
67
+
68
+ if __name__ == "__main__":
69
+ parser = argparse.ArgumentParser(description=__doc__)
70
+ parser.add_argument("--refresh-manifest", action="store_true")
71
+ args = parser.parse_args()
72
+ print(json.dumps(package(refresh_manifest=args.refresh_manifest)))
source/scripts/research_report.py ADDED
@@ -0,0 +1,273 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Create the final research PDF and original figures from verified records."""
2
+ import json
3
+ import os
4
+ from pathlib import Path
5
+ from statistics import mean
6
+ import sys
7
+
8
+ ROOT = Path(__file__).resolve().parents[1]
9
+ sys.path.insert(0, str(ROOT))
10
+ os.environ.setdefault("MPLCONFIGDIR", str(ROOT / "artifacts/matplotlib"))
11
+ os.environ.setdefault("XDG_CACHE_HOME", str(ROOT / "artifacts/cache"))
12
+ from scripts.verify_results import verify
13
+
14
+ import matplotlib
15
+ matplotlib.use("Agg")
16
+ import matplotlib.pyplot as plt
17
+ import numpy as np
18
+ from reportlab.lib import colors
19
+ from reportlab.lib.enums import TA_LEFT, TA_RIGHT
20
+ from reportlab.lib.styles import ParagraphStyle
21
+ from reportlab.pdfbase import pdfmetrics
22
+ from reportlab.pdfbase.ttfonts import TTFont
23
+ from reportlab.pdfgen.canvas import Canvas
24
+ from reportlab.platypus import Paragraph, Table, TableStyle
25
+ from xml.sax.saxutils import escape
26
+
27
+ EXPANDED = ("v2-shakespeare", "v2-tinystories", "scale-tinystories")
28
+ NAMES = {"v2-shakespeare": "Shakespeare", "v2-tinystories": "TinyStories 32 MiB", "scale-tinystories": "TinyStories 64 MiB"}
29
+ CE, BR, INK, MUTED = "#346b98", "#c77d43", "#202b38", "#647182"
30
+ FIGURES = ROOT / "docs/figures"
31
+ OUTPUT = ROOT / "output/pdf/loss-lab-research-report.pdf"
32
+
33
+
34
+ def load_records():
35
+ return {s: json.loads((ROOT / "results/records" / s / "results.json").read_text()) for s in EXPANDED}
36
+
37
+
38
+ def figures(data, evidence):
39
+ FIGURES.mkdir(parents=True, exist_ok=True)
40
+ plt.rcParams.update({"font.family": "DejaVu Sans", "font.size": 10, "axes.spines.top": False,
41
+ "axes.spines.right": False, "axes.labelcolor": MUTED, "text.color": INK,
42
+ "axes.edgecolor": "#ccd4dc", "xtick.color": MUTED, "ytick.color": MUTED,
43
+ "figure.facecolor": "white", "axes.facecolor": "white", "svg.fonttype": "none"})
44
+ fig, axes = plt.subplots(1, 3, figsize=(10.4, 2.5), constrained_layout=True)
45
+ for ax, study in zip(axes, EXPANDED):
46
+ values = evidence["studies"][study]["paired_nll_differences"]
47
+ ax.axvline(0, color="#94a0ac", lw=1, ls=":")
48
+ ax.scatter(values, np.arange(5), color=CE, s=28, zorder=3)
49
+ ax.scatter([mean(values)], [5.3], color=INK, marker="D", s=36, zorder=3)
50
+ ax.set(yticks=[0, 1, 2, 3, 4, 5.3], yticklabels=["42", "1337", "2026", "31415", "27182", "Mean"],
51
+ title=NAMES[study], xlim=(-.008, .155), ylim=(-.5, 5.8))
52
+ ax.invert_yaxis()
53
+ unit = "character" if "shakespeare" in study else "byte"
54
+ ax.set_xlabel("Brier - CE NLL (nats/" + unit + ")", fontsize=8)
55
+ ax.tick_params(axis="both", labelsize=8)
56
+ ax.grid(axis="x", alpha=.15)
57
+ for ext in ["png", "svg"]:
58
+ fig.savefig(FIGURES / ("final-paired-nll." + ext), dpi=200)
59
+ plt.close(fig)
60
+ fig, axes = plt.subplots(3, 2, figsize=(10.3, 9.5), constrained_layout=True)
61
+ for index, study in enumerate(EXPANDED):
62
+ for loss, color, style in [("ce", CE, "-"), ("brier", BR, "--")]:
63
+ runs = [r for r in data[study]["runs"] if r["phase"] == "main" and r["loss"] == loss]
64
+ history = [[h for h in r["history"] if h["step"] > 0] for r in runs]
65
+ x = [h["step"] for h in history[0]]
66
+ for column, metric in enumerate(["nll", "accuracy"]):
67
+ values = np.array([[h[metric] for h in rows] for rows in history])
68
+ if metric == "accuracy":
69
+ values *= 100
70
+ avg, spread = values.mean(0), values.std(0, ddof=1)
71
+ ax = axes[index, column]
72
+ ax.plot(x, avg, color=color, ls=style, lw=2, label="Cross entropy" if loss == "ce" else "Brier")
73
+ ax.fill_between(x, avg - spread, avg + spread, color=color, alpha=.13)
74
+ unit = "character" if "shakespeare" in study else "byte"
75
+ axes[index, 0].set_title(NAMES[study] + " - validation NLL", loc="left")
76
+ axes[index, 0].set_ylabel("Nats / " + unit)
77
+ axes[index, 1].set_title(NAMES[study] + " - token accuracy", loc="left")
78
+ axes[index, 1].set_ylabel("Accuracy (%)")
79
+ for ax in axes[index]:
80
+ ax.set_xlabel("Optimizer updates")
81
+ ax.grid(alpha=.15)
82
+ ax.legend(frameon=False, fontsize=8)
83
+ for ext in ["png", "svg"]:
84
+ fig.savefig(FIGURES / ("final-learning-curves." + ext), dpi=190)
85
+ plt.close(fig)
86
+ fig, ax = plt.subplots(figsize=(9.8, 2.8), constrained_layout=True)
87
+ ratios, counts = {}, {}
88
+ for loss, color, shift, label in [("ce", CE, -.17, "CE-trained model"), ("brier", BR, .17, "Brier-trained model")]:
89
+ values = []
90
+ for study in EXPANDED:
91
+ records = [g for r in data[study]["runs"] if r["phase"] == "main" and r["loss"] == loss
92
+ for g in r["test"]["gradient_diagnostics"] if g["group"] == "confidently_wrong"]
93
+ n = sum(g["count"] for g in records)
94
+ denominator = sum(g["count"] * g["ce_logit_gradient_l2"] for g in records)
95
+ numerator = sum(g["count"] * g["brier_logit_gradient_l2"] for g in records)
96
+ value = numerator / denominator
97
+ ratios[(study, loss)], counts[(study, loss)] = value, n
98
+ values.append(value)
99
+ ax.barh(np.arange(3) + shift, values, height=.29, color=color, label=label)
100
+ for y, value in zip(np.arange(3) + shift, values):
101
+ ax.text(value + .003, y, f"{value:.3f}", va="center", fontsize=9)
102
+ ax.set(yticks=np.arange(3), yticklabels=[NAMES[s] for s in EXPANDED], xlim=(0, .18),
103
+ xlabel="Brier / CE logit-gradient norm (ratio of token-weighted means)")
104
+ ax.invert_yaxis()
105
+ ax.legend(frameon=False, loc="lower right", fontsize=8)
106
+ ax.grid(axis="x", alpha=.15)
107
+ for ext in ["png", "svg"]:
108
+ fig.savefig(FIGURES / ("final-confident-errors." + ext), dpi=200)
109
+ plt.close(fig)
110
+ return ratios, counts
111
+
112
+
113
+ class Report:
114
+ def __init__(self):
115
+ fontroot = Path(matplotlib.get_data_path()) / "fonts/ttf"
116
+ for name, filename in [("Lab", "DejaVuSans.ttf"), ("LabBold", "DejaVuSans-Bold.ttf"), ("LabMono", "DejaVuSansMono.ttf")]:
117
+ pdfmetrics.registerFont(TTFont(name, str(fontroot / filename)))
118
+ pdfmetrics.registerFontFamily("Lab", normal="Lab", bold="LabBold", italic="Lab", boldItalic="LabBold")
119
+ OUTPUT.parent.mkdir(parents=True, exist_ok=True)
120
+ self.c = Canvas(str(OUTPUT), pagesize=(612, 792), invariant=1, pageCompression=1)
121
+ self.c.setTitle("Loss Lab: Cross Entropy and Brier in nanoGPT")
122
+ self.c.setAuthor("ctxnn1")
123
+ self.page_number = 0
124
+ self.body = ParagraphStyle("body", fontName="Lab", fontSize=9.3, leading=14, textColor=colors.HexColor(INK))
125
+ self.small = ParagraphStyle("small", parent=self.body, fontSize=7.9, leading=11, textColor=colors.HexColor(MUTED))
126
+ self.code = ParagraphStyle("code", parent=self.body, fontName="LabMono", fontSize=8, leading=12)
127
+
128
+ def page(self, title, kicker):
129
+ if self.page_number:
130
+ self.c.showPage()
131
+ self.page_number += 1
132
+ self.y = 721
133
+ self.c.setFillColor(colors.HexColor(CE))
134
+ self.c.rect(44, 745, 26, 3, fill=1, stroke=0)
135
+ self.c.setFont("LabBold", 8)
136
+ self.c.drawString(79, 743, "LOSS LAB / RESEARCH REPORT")
137
+ self.c.setFillColor(colors.HexColor(MUTED))
138
+ self.c.setFont("Lab", 7.5)
139
+ self.c.drawRightString(568, 743, "v2.1.0 / 28 OCTOBER 2026")
140
+ self.c.setStrokeColor(colors.HexColor("#d9dfe5"))
141
+ self.c.line(44, 43, 568, 43)
142
+ self.c.setFont("Lab", 7)
143
+ self.c.drawString(44, 29, "ctxnn1 | Exploratory small-model study | Experiments completed 24 October 2026 (IST)")
144
+ self.c.drawRightString(568, 29, str(self.page_number))
145
+ self.para(title, ParagraphStyle("title", parent=self.body, fontName="LabBold", fontSize=22, leading=28), gap=7)
146
+ self.para(kicker, self.small, gap=18)
147
+
148
+ def para(self, text, style=None, gap=10, width=524, x=44):
149
+ p = Paragraph(text, style or self.body)
150
+ _, height = p.wrap(width, 700)
151
+ if self.y - height < 57:
152
+ raise RuntimeError(f"Page {self.page_number} text overflow at {text[:65]}")
153
+ p.drawOn(self.c, x, self.y - height)
154
+ self.y -= height + gap
155
+
156
+ def heading(self, text):
157
+ self.para(text, ParagraphStyle("heading", parent=self.body, fontName="LabBold", fontSize=12, leading=17), gap=7)
158
+
159
+ def table(self, rows, widths, font=8.1):
160
+ cellstyle = ParagraphStyle("cell", parent=self.body, fontSize=font, leading=12)
161
+ formatted = [[Paragraph(str(value), cellstyle) for value in row] for row in rows]
162
+ table = Table(formatted, colWidths=widths, hAlign="LEFT")
163
+ table.setStyle(TableStyle([("BACKGROUND", (0, 0), (-1, 0), colors.HexColor("#edf2f6")),
164
+ ("VALIGN", (0, 0), (-1, -1), "TOP"), ("LEFTPADDING", (0, 0), (-1, -1), 7),
165
+ ("RIGHTPADDING", (0, 0), (-1, -1), 7), ("TOPPADDING", (0, 0), (-1, -1), 7),
166
+ ("BOTTOMPADDING", (0, 0), (-1, -1), 7),
167
+ ("LINEBELOW", (0, 0), (-1, 0), .6, colors.HexColor("#bfcbd5")),
168
+ ("LINEBELOW", (0, 1), (-1, -1), .3, colors.HexColor("#e1e5e9"))]))
169
+ _, height = table.wrap(524, 700)
170
+ if self.y - height < 57:
171
+ raise RuntimeError(f"Page {self.page_number} table overflow")
172
+ table.drawOn(self.c, 44, self.y - height)
173
+ self.y -= height + 12
174
+
175
+ def image(self, name, height):
176
+ if self.y - height < 57:
177
+ raise RuntimeError(f"Page {self.page_number} image overflow")
178
+ self.c.drawImage(str(FIGURES / name), 44, self.y - height, width=524, height=height, preserveAspectRatio=True, anchor="c", mask="auto")
179
+ self.y -= height + 9
180
+
181
+ def finish(self):
182
+ self.c.save()
183
+
184
+
185
+ def build():
186
+ evidence = verify(ROOT)
187
+ data = load_records()
188
+ ratios, counts = figures(data, evidence)
189
+ r = Report()
190
+ r.page("Cross entropy wins held-out NLL<br/>under the expanded protocol", "Cross entropy and Brier score in small autoregressive language models")
191
+ r.heading("Abstract")
192
+ r.para("We compare softmax cross entropy with the vocabulary-summed Brier score using the same nanoGPT architecture and paired training seeds. Three expanded studies use loss-specific, full-duration learning-rate sweeps and five main seeds per loss. Cross entropy achieves lower final held-out negative log likelihood (NLL) in every expanded seed pair. The earlier Shakespeare ranking reverses under the expanded tuning protocol. Brier retains slightly higher Shakespeare token accuracy, illustrating that the metrics answer different questions.")
193
+ r.table([["Expanded study", "CE test NLL", "Brier test NLL", "Brier - CE"], *[
194
+ [NAMES[s], f"{evidence['studies'][s]['metrics']['ce']['nll']['mean']:.5f} +/- {evidence['studies'][s]['metrics']['ce']['nll']['sample_sd']:.5f}",
195
+ f"{evidence['studies'][s]['metrics']['brier']['nll']['mean']:.5f} +/- {evidence['studies'][s]['metrics']['brier']['nll']['sample_sd']:.5f}",
196
+ f"+{evidence['studies'][s]['paired_nll_mean']:.5f}"] for s in EXPANDED]], [132, 143, 143, 106], font=7.5)
197
+ r.para("Mean +/- sample SD across five seeds. NLL is nats per character for Shakespeare and nats per UTF-8 byte for TinyStories. Compare losses within a study; the tokenizations differ.", r.small)
198
+ r.image("final-paired-nll.png", 147)
199
+ r.para("Figure 1. All 15 paired differences are positive. Circles are predeclared main seeds; diamonds are within-study means. Positive values favor cross entropy. No significance threshold or universal LLM claim is inferred.", r.small)
200
+ r.para("The completed release includes 42 main models, 42 learning-rate trials and 1,248 predeclared text samples across the original baseline and expanded studies. Raw metrics, tensor-only weights, source, figures and the interactive dashboard are retained.")
201
+
202
+ r.page("The comparison holds the model fixed", "Methods and the frozen experimental design")
203
+ r.para("The experiment is motivated by Su Jianlin's discussion of alternatives to cross entropy [1]. Both arms apply softmax to the same model logits. The scores are computed in float32; the transformer uses bfloat16 on an H100. Native objective magnitudes are not compared against each other.")
204
+ r.para("L_CE(p, y) = -log p_y<br/>L_Brier(p, y) = sum_v (p_v - 1[v=y])^2", r.code)
205
+ r.table([["Control", "Setting"], ["Architecture", "6 transformer layers, 6 heads, width 384; dropout 0.1; no bias"],
206
+ ["Model size and vocabulary", "10,745,088 parameters / 65 characters; 10,916,736 parameters / 256 bytes"],
207
+ ["Context and update size", "256 character or 512 byte tokens; 16,384 training tokens per update"],
208
+ ["Optimizer", "AdamW: betas (0.9, 0.95), weight decay 0.1, gradient clipping 1.0"],
209
+ ["Schedule", "100-update warmup, then cosine decay to 10% of peak learning rate"],
210
+ ["Pairing", "Same initial seed and minibatch stream within each CE/Brier main pair"],
211
+ ["Selection", "Final validation NLL selects each loss's peak LR; test never selects rates"]], [146, 378])
212
+ r.table([["Expanded study", "Train tokens", "Pilot / main updates", "CE / Brier peak LR"], *[
213
+ [NAMES[s], f"{data[s]['dataset']['split_characters']['train']:,}", f"{data[s]['config']['pilot_steps']:,} / {data[s]['config']['steps']:,}",
214
+ f"{data[s]['selected_learning_rates']['ce']:g} / {data[s]['selected_learning_rates']['brier']:g}"] for s in EXPANDED]], [132, 110, 148, 134], font=7.8)
215
+ r.para("Each expanded loss tests peak rates 0.0003, 0.0006, 0.001, 0.002 and 0.003 using pilot seed 991 for the full duration. Main seeds are 42, 1337, 2026, 31415 and 27182. Each main model is trained from scratch to a fixed final checkpoint.")
216
+ r.para("Shakespeare uses contiguous 90% / 5% / 5% partitions and a training-only vocabulary. TinyStories [2] uses pinned, source-order, complete-story subsets; 32 MiB and 64 MiB denote preparation targets, so the final story can exceed the target slightly. Validation and test story selections remain fixed. Final test evaluations record 55,552 character or 199,680 byte token predictions per model in block-aligned windows.", r.small)
217
+
218
+ r.page("Learning dynamics differ by metric", "Validation trajectories for the three expanded studies")
219
+ r.image("final-learning-curves.png", 486)
220
+ r.para("Figure 2. Lines show five-seed means; bands show +/- one sample SD. Curves begin at the first 250-update validation checkpoint to make later learning visible; the complete histories, including initialization, are published. Solid blue is CE; dashed orange is Brier.", r.small)
221
+ r.para("Shakespeare's character accuracy is slightly higher for Brier even though CE has lower NLL. Both TinyStories studies favor CE on these two validation measures. The 64 MiB study also doubles the update budget, so its improvement cannot isolate the effect of more data from the effect of more optimization.")
222
+
223
+ r.page("Score geometry is measurable", "Secondary held-out outcomes and conditional logit gradients")
224
+ secondary = [["Study / trained with", "Test Brier", "Accuracy (%)", "ECE (%)"]]
225
+ for s in EXPANDED:
226
+ for loss in ["ce", "brier"]:
227
+ m = evidence["studies"][s]["metrics"][loss]
228
+ cell = lambda key, scale=1: (f"{m[key]['mean']*scale:.4f} +/- {m[key]['sample_sd']*scale:.4f}" if key == "brier" else f"{m[key]['mean']*scale:.3f} +/- {m[key]['sample_sd']*scale:.3f}")
229
+ secondary.append([NAMES[s] + " / " + ("CE" if loss == "ce" else "Brier"), cell("brier"), cell("accuracy", 100), cell("ece", 100)])
230
+ r.table(secondary, [176, 112, 118, 118], font=7.5)
231
+ r.para("ECE uses ten equal-width confidence bins. Lower Brier/ECE and higher accuracy are favorable. All reported uncertainty here is sample SD across training seeds, not a confidence interval.", r.small)
232
+ r.para("g_CE = p - e_y<br/>g_Brier = 2 (diag(p) - p p^T) (p - e_y)", r.code)
233
+ r.para("The additional softmax Jacobian can suppress Brier's logit gradient at confident errors [1]. Our analytic gradients of each unreduced per-token score are checked against autograd and evaluated on the same logits within each model. The following group has incorrect argmax and maximum predicted probability at least 0.9.")
234
+ r.image("final-confident-errors.png", 145)
235
+ r.para("Figure 3. For confidently wrong predictions, Brier's mean logit-gradient norm is roughly 8-13% of CE's on the same logits. These are ratios of token-weighted means. The groups contain different predictions for CE-trained and Brier-trained models; pooled occurrences across seeds are not independent test examples. This measures score geometry, not full parameter gradients or a causal explanation of every training difference.", r.small)
236
+
237
+ r.page("Samples and limits remain visible", "Qualitative evidence without sample selection by prose quality")
238
+ r.para("The fixed example below uses the larger TinyStories study, training seed 42, final step 6,000, temperature 0.7, sampling seed 12345 and the first predeclared prompt. The first 480 characters of each continuation are shown; complete text and every other predeclared sample remain in the dashboard and JSONL file.")
239
+ for loss, label in [("ce", "Cross entropy"), ("brier", "Brier")]:
240
+ run = next(x for x in data["scale-tinystories"]["runs"] if x["phase"] == "main" and x["loss"] == loss and x["seed"] == 42)
241
+ sample = next(x for x in run["samples"] if x["step"] == 6000 and x["temperature"] == .7 and x["prompt"] == data["scale-tinystories"]["config"]["prompts"][0])
242
+ r.heading(label)
243
+ r.para(escape(sample["prompt"] + sample["text"][:480]).replace("\n", "<br/>") + "<br/>[continuation truncated]", gap=14)
244
+ r.heading("What the evidence establishes")
245
+ r.para("The expanded protocol consistently favors CE for final test NLL in these small models. The original Shakespeare baseline favored Brier (CE 1.76895; Brier 1.69783), while the expanded study favors CE (1.56379 versus 1.68114). The expanded protocol changes pilot duration, LR grid and main-seed count together: the reversal shows sensitivity to tuning, without isolating one causal change.")
246
+ r.heading("Limits")
247
+ r.para("Five seeds describe this protocol, not all language models. The primary selection metric is validation NLL; choosing rates by another score could change the comparison. Source-order story subsets, short character/byte contexts, fixed final checkpoints and late Shakespeare overfitting limit generalization. No human or automated story-quality ranking was performed. Noise robustness, alternative output activations, other proper scores and larger models were not tested.", r.small)
248
+
249
+ r.page("A complete, reproducible release", "Artifact map, access and references")
250
+ r.table([["Artifact", "What it provides"], ["dashboard.html", "Interactive recorded comparison, samples, protocol and diagnostics"],
251
+ ["results/records/", "All five study records, including every tuning and main run"],
252
+ ["results/metrics/", "42 final scores, 42 trials, 1,212 validation records and 1,248 generations"],
253
+ ["results/MODEL_INDEX.json", "42 native and tensor-only model paths, configurations, tokenizers and hashes"],
254
+ ["RELEASE_MANIFEST.json", "SHA-256 identities of the portable project files"],
255
+ ["scripts/verify_results.py", "Offline reconciliation of records, CSVs, samples, model index and dashboard"],
256
+ ["Research.Dockerfile", "Pinned CUDA training environment; model and data paths are ordinary mounts"]], [170, 354])
257
+ r.heading("Verify without a GPU or cloud account")
258
+ r.para("python3 scripts/verify_results.py<br/>python3 -m venv .venv<br/>.venv/bin/python -m pip install -r requirements-research.txt<br/>.venv/bin/python -m pytest tests -q", r.code)
259
+ r.para("The portable download omits large model and prepared-data files. Download individual tensor-only model directories using MODEL_INDEX.json, then use experiments.sample_safetensors. The weights are custom nanoGPT checkpoints, not Transformers AutoModel checkpoints. Sampling examples and full training commands are in docs/RESEARCH_REPRODUCE.md.")
260
+ r.para('Public release: <link href="https://huggingface.co/ctxnn1/loss-lab-ce-brier/tree/v2.1.0" color="#346b98">huggingface.co/ctxnn1/loss-lab-ce-brier / v2.1.0</link><br/>Code: MIT. Dataset terms and attribution: docs/DATA_LICENSES.md. Citation metadata: CITATION.cff.', r.small)
261
+ r.heading("References")
262
+ for text in [
263
+ '[1] Su Jianlin. What alternatives to cross-entropy exist for LM loss? Scientific Spaces. <link href="https://spaces.ac.cn/archives/11854" color="#346b98">spaces.ac.cn/archives/11854</link>. Motivation and proper-score / softmax-gradient discussion.',
264
+ '[2] Ronen Eldan and Yuanzhi Li. TinyStories: How Small Can Language Models Be and Still Speak Coherent English? 2023. <link href="https://arxiv.org/abs/2305.07759" color="#346b98">arXiv:2305.07759</link>. Dataset revision and license are pinned in data/tinystories-source.json.',
265
+ '[3] Andrej Karpathy. nanoGPT. Vendored model at commit 3adf61e154c3fe3fca428ad6bc3818b27a3b8291. <link href="https://github.com/karpathy/nanoGPT/tree/3adf61e154c3fe3fca428ad6bc3818b27a3b8291" color="#346b98">Pinned source</link>.'
266
+ ]:
267
+ r.para(text, r.small)
268
+ r.finish()
269
+ print(json.dumps({"pdf": str(OUTPUT), "pages": r.page_number, "figures": 3, "verified_main_models": evidence["main_models"]}))
270
+
271
+
272
+ if __name__ == "__main__":
273
+ build()
source/scripts/verify_results.py ADDED
@@ -0,0 +1,182 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Reconcile the complete recorded study without GPU, network or credentials."""
2
+ import argparse
3
+ from collections import Counter
4
+ import csv
5
+ import hashlib
6
+ import json
7
+ import math
8
+ from pathlib import Path, PurePosixPath
9
+ import re
10
+ from statistics import mean, stdev
11
+
12
+ ROOT = Path(__file__).resolve().parents[1]
13
+ STUDIES = ("shakespeare", "tinystories", "v2-shakespeare", "v2-tinystories", "scale-tinystories")
14
+ PRIVATE_KEYS = {"job_id", "workspace", "bucket", "artifact_uri", "bundle_uri", "access_token", "secret_access_key"}
15
+
16
+
17
+ def require(condition, message):
18
+ if not condition:
19
+ raise ValueError(message)
20
+
21
+
22
+ def no_account_state(value):
23
+ if isinstance(value, dict):
24
+ require(not PRIVATE_KEYS.intersection(value), "Account-specific state in scientific records")
25
+ for item in value.values():
26
+ no_account_state(item)
27
+ elif isinstance(value, list):
28
+ for item in value:
29
+ no_account_state(item)
30
+
31
+
32
+ def reconcile_table(path, expected, key):
33
+ with path.open(newline="") as stream:
34
+ rows = list(csv.DictReader(stream))
35
+ index = {tuple(str(row[k]) for k in key): row for row in expected}
36
+ require(len(index) == len(expected), f"Duplicate expected rows: {path.name}")
37
+ require(len(rows) == len(expected), f"Wrong row count: {path.name}")
38
+ seen = set()
39
+ for row in rows:
40
+ identity = tuple(row[k] for k in key)
41
+ require(identity in index and identity not in seen, f"Duplicate or unknown row: {path.name} {identity}")
42
+ seen.add(identity)
43
+ for field, value in index[identity].items():
44
+ if isinstance(value, (float, int)) and not isinstance(value, bool):
45
+ actual = float(row[field])
46
+ require(math.isfinite(actual) and math.isclose(actual, value, rel_tol=1e-12, abs_tol=1e-12),
47
+ f"Value mismatch: {path.name} {identity} {field}")
48
+ else:
49
+ require(row[field] == str(value), f"Value mismatch: {path.name} {identity} {field}")
50
+
51
+
52
+ def verify(root=ROOT):
53
+ root = Path(root)
54
+ models = json.loads((root / "results/MODEL_INDEX.json").read_text())
55
+ model_index = {(m["study"], m["run_id"]): m for m in models}
56
+ require(len(model_index) == len(models) == 42, "Expected 42 unique indexed models")
57
+ finals, pilots, histories, samples, summaries = [], [], [], [], {}
58
+ checkpoint_paths, tensor_paths = set(), set()
59
+ data_by_study = {}
60
+ for study in STUDIES:
61
+ data = json.loads((root / "results/records" / study / "results.json").read_text())
62
+ no_account_state(data)
63
+ data_by_study[study] = data
64
+ cfg = data["config"]
65
+ require(data["status"] == "complete" and not data.get("active"), f"Incomplete study: {study}")
66
+ expected = {("pilot", loss, cfg["pilot_seed"], lr, cfg["pilot_steps"])
67
+ for loss in cfg["losses"] for lr in cfg["learning_rates"]}
68
+ expected |= {("main", loss, seed, data["selected_learning_rates"][loss], cfg["steps"])
69
+ for loss in cfg["losses"] for seed in cfg["seeds"]}
70
+ actual = [(r["phase"], r["loss"], r["seed"], r["lr"], r["steps"]) for r in data["runs"]]
71
+ require(len(actual) == len(expected) and set(actual) == expected, f"Task coverage mismatch: {study}")
72
+ for loss in cfg["losses"]:
73
+ trials = [r for r in data["runs"] if r["phase"] == "pilot" and r["loss"] == loss]
74
+ selected = min(trials, key=lambda r: r["final_validation"]["nll"])
75
+ require(selected["lr"] == data["selected_learning_rates"][loss], f"Validation LR selection mismatch: {study} {loss}")
76
+ for run in data["runs"]:
77
+ require(run["status"] == "complete", f"Incomplete run: {study} {run['id']}")
78
+ identity = dict(study=study, run_id=run["id"], phase=run["phase"], loss=run["loss"],
79
+ seed=run["seed"], learning_rate=run["lr"], steps=run["steps"])
80
+ history = run["history"]
81
+ require(history[-1]["step"] == run["steps"], f"Missing final validation: {study} {run['id']}")
82
+ require(len({h["step"] for h in history}) == len(history), "Duplicate validation step")
83
+ require(history[-1]["nll"] == run["final_validation"]["nll"], "Final validation mismatch")
84
+ for row in history:
85
+ histories.append({**identity, "step": row["step"], "tokens": row["tokens"],
86
+ **{k: row[k] for k in ["nll", "brier", "accuracy", "ece"]}})
87
+ if run["phase"] == "pilot":
88
+ require(not run.get("test") and not run.get("samples"), "Tuning must not use test scores or main samples")
89
+ pilots.append({**identity, "validation_nll": run["final_validation"]["nll"],
90
+ "selected": run["lr"] == data["selected_learning_rates"][run["loss"]]})
91
+ continue
92
+ require(run.get("test"), f"Missing held-out test: {study} {run['id']}")
93
+ finals.append({**identity, **{k: run["test"][k] for k in
94
+ ["nll", "bpc", "perplexity", "brier", "accuracy", "ece", "eval_tokens"]}})
95
+ expected_samples = {(step, prompt, temperature, cfg["sample_seed"])
96
+ for step in range(cfg["sample_interval"], cfg["steps"] + 1, cfg["sample_interval"])
97
+ for prompt in cfg["prompts"] for temperature in cfg["temperatures"]}
98
+ actual_samples = [(s["step"], s["prompt"], s["temperature"], s["sample_seed"]) for s in run["samples"]]
99
+ require(len(actual_samples) == len(expected_samples) and set(actual_samples) == expected_samples,
100
+ f"Sample coverage mismatch: {study} {run['id']}")
101
+ samples.extend({"study": study, **sample} for sample in run["samples"])
102
+ model = model_index[(study, run["id"])]
103
+ require(model["native_sha256"] == run["checkpoint"]["sha256"], "Checkpoint hash mismatch")
104
+ require(model["loss"] == run["loss"] and model["seed"] == run["seed"] and
105
+ model["learning_rate"] == run["lr"] and model["steps"] == run["steps"], "Model index protocol mismatch")
106
+ for field in ["native_checkpoint", "safetensors", "config", "tokenizer"]:
107
+ rel = PurePosixPath(model[field])
108
+ require(not rel.is_absolute() and ".." not in rel.parts and rel.parts[0] == "runs", "Invalid model path")
109
+ require(re.fullmatch(r"[0-9a-f]{64}", model["safetensors_sha256"]), "Invalid tensor hash")
110
+ checkpoint_paths.add(model["native_checkpoint"])
111
+ tensor_paths.add(model["safetensors"])
112
+ main = [r for r in data["runs"] if r["phase"] == "main"]
113
+ paired = [next(r["test"]["nll"] for r in main if r["seed"] == seed and r["loss"] == "brier") -
114
+ next(r["test"]["nll"] for r in main if r["seed"] == seed and r["loss"] == "ce") for seed in cfg["seeds"]]
115
+ summaries[study] = {"seeds_per_loss": len(cfg["seeds"]), "steps": cfg["steps"],
116
+ "pilot_steps": cfg["pilot_steps"], "unit": data["dataset"]["unit"],
117
+ "selected_learning_rates": data["selected_learning_rates"],
118
+ "paired_nll_differences": paired, "paired_nll_mean": mean(paired),
119
+ "ce_lower_nll_pairs": sum(x > 0 for x in paired), "metrics": {}}
120
+ for loss in cfg["losses"]:
121
+ group = [r for r in main if r["loss"] == loss]
122
+ summaries[study]["metrics"][loss] = {metric: {"mean": mean(r["test"][metric] for r in group),
123
+ "sample_sd": stdev(r["test"][metric] for r in group)} for metric in ["nll", "brier", "accuracy", "ece"]}
124
+ require(len(checkpoint_paths) == len(tensor_paths) == 42, "Duplicate model paths")
125
+ require(len(finals) == len(pilots) == 42 and len(samples) == 1248, "Incomplete frozen experiment")
126
+ reconcile_table(root / "results/metrics/final-scores.csv", finals, ["study", "run_id"])
127
+ reconcile_table(root / "results/metrics/learning-rate-trials.csv", pilots, ["study", "run_id"])
128
+ reconcile_table(root / "results/metrics/validation-history.csv", histories, ["study", "run_id", "step"])
129
+ actual = [json.loads(line) for line in (root / "results/metrics/samples.jsonl").read_text().splitlines()]
130
+ signature = lambda row: json.dumps(row, sort_keys=True, ensure_ascii=False)
131
+ require(Counter(map(signature, actual)) == Counter(map(signature, samples)), "Stored sample text mismatch")
132
+ dashboard = json.loads((root / "dashboard/src/data.json").read_text())
133
+ require(dashboard["buildStatus"] == "complete", "Dashboard snapshot is unfinished")
134
+ queries = dashboard["queries"]
135
+ for query, count in [("finals", 42), ("samples", 1248), ("history", 666), ("pilots", 546), ("protocol", 5)]:
136
+ require(len(queries[query]["rows"]) == count, f"Dashboard coverage mismatch: {query}")
137
+ for row in queries["finals"]["rows"]:
138
+ expected = next(r for r in finals if r["study"] == row["dataset"] and r["run_id"] == row["run_id"])
139
+ for metric in ["nll", "brier", "accuracy", "ece"]:
140
+ require(expected[metric] == row[metric], f"Dashboard final score mismatch: {metric}")
141
+ for file in [root / "dashboard/src/data.json", root / "dashboard.html"]:
142
+ require(not any(key in file.read_bytes() for key in [b'"workspace":', b'"bucket":', b'"job_id":']),
143
+ "Deployment identifiers in delivered dashboard")
144
+ expanded = [summaries[s] for s in STUDIES if s.startswith(("v2-", "scale-"))]
145
+ return {"schema_version": 1, "release_version": (root / "VERSION").read_text().strip(), "ok": True,
146
+ "main_models": len(finals), "tuning_runs": len(pilots), "training_runs": len(finals) + len(pilots),
147
+ "saved_samples": len(samples), "validation_records": len(histories),
148
+ "expanded_ce_lower_nll_pairs": sum(s["ce_lower_nll_pairs"] for s in expanded),
149
+ "studies": summaries,
150
+ "scope": "Recorded metrics, samples, model index and dashboard reconciled. Remote weight bytes are checked separately; no weights downloaded by this command."}
151
+
152
+
153
+ def verify_manifest(root=ROOT):
154
+ root = Path(root)
155
+ path = root / "RELEASE_MANIFEST.json"
156
+ if not path.exists():
157
+ return None
158
+ manifest = json.loads(path.read_text())
159
+ for name, digest in manifest["files"].items():
160
+ rel = PurePosixPath(name)
161
+ require(not rel.is_absolute() and ".." not in rel.parts, "Unsafe release path")
162
+ file = root / name
163
+ require(file.is_file() and hashlib.sha256(file.read_bytes()).hexdigest() == digest,
164
+ "Release integrity mismatch: " + name)
165
+ return len(manifest["files"])
166
+
167
+
168
+ if __name__ == "__main__":
169
+ parser = argparse.ArgumentParser(description=__doc__)
170
+ parser.add_argument("--root", type=Path, default=ROOT)
171
+ parser.add_argument("--write-summary", type=Path)
172
+ args = parser.parse_args()
173
+ try:
174
+ result = verify(args.root)
175
+ count = verify_manifest(args.root)
176
+ if args.write_summary:
177
+ args.write_summary.parent.mkdir(parents=True, exist_ok=True)
178
+ args.write_summary.write_text(json.dumps(result, indent=2, allow_nan=False) + "\n")
179
+ print(json.dumps({"ok": True, "main_models": result["main_models"], "tuning_runs": result["tuning_runs"],
180
+ "saved_samples": result["saved_samples"], "release_files_verified": count}))
181
+ except (ValueError, KeyError, OSError) as error:
182
+ parser.exit(1, "Verification failed: " + str(error) + "\n")
source/tests/test_recorded_results.py ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import csv
2
+ from pathlib import Path
3
+ import shutil
4
+
5
+ import pytest
6
+
7
+ from scripts.verify_results import ROOT, verify
8
+
9
+
10
+ def test_published_evidence_reconciles_without_models_or_cloud_access():
11
+ result = verify(ROOT)
12
+ assert (result["main_models"], result["tuning_runs"], result["saved_samples"]) == (42, 42, 1248)
13
+ assert result["expanded_ce_lower_nll_pairs"] == 15
14
+ assert result["validation_records"] == 1212
15
+
16
+
17
+ def test_a_changed_export_cannot_pass_as_the_recorded_experiment(tmp_path):
18
+ for folder in ["results/records", "results/metrics"]:
19
+ shutil.copytree(ROOT / folder, tmp_path / folder)
20
+ shutil.copy2(ROOT / "results/MODEL_INDEX.json", tmp_path / "results/MODEL_INDEX.json")
21
+ path = tmp_path / "results/metrics/final-scores.csv"
22
+ with path.open(newline="") as stream:
23
+ reader = csv.DictReader(stream)
24
+ fields, rows = reader.fieldnames, list(reader)
25
+ rows[0]["nll"] = str(float(rows[0]["nll"]) + 0.1)
26
+ with path.open("w", newline="") as stream:
27
+ writer = csv.DictWriter(stream, fieldnames=fields)
28
+ writer.writeheader()
29
+ writer.writerows(rows)
30
+ with pytest.raises(ValueError, match="final-scores.csv.*nll"):
31
+ verify(tmp_path)