From 219cb919118d2087b22c1b2f1bd24482d6a50e15 Mon Sep 17 00:00:00 2001 From: Panshul Arora <170356171+panshularora@users.noreply.github.com> Date: Thu, 29 Oct 2026 18:58:48 +0530 Subject: [PATCH 01/75] feat(site): pinned evidence data pipeline and claim ledger sync build-data.py derives site-data.json from the HF dataset at 96dc282a and the GitHub docs at 1049d2a7; every value carries its source row. --check fails on any drift. --- frontend/data/raw/manifest.json | 86 + .../preparation.json | 1 + .../data/raw/release/simple-run/README.md | 142 + .../release/simple-run/anchor.digicert.tsr | Bin 0 -> 6007 bytes .../raw/release/simple-run/anchor.freetsa.tsr | Bin 0 -> 4644 bytes .../data/raw/release/simple-run/anchor.json | 13 + .../data/raw/release/simple-run/recipe.json | 25 + .../raw/release/simple-run/release-hashes.txt | 42 + .../raw/release/unlearning-3i-atlas/README.md | 60 + .../unlearning-3i-atlas/loo-results.json | 49 + .../release/unlearning-3i-atlas/recipe.json | 25 + .../unlearning-3i-atlas/release-hashes.txt | 13 + frontend/data/upstream/1049d2a7/README.md | 219 + .../1049d2a7/docs/design/simple_run.md | 228 + .../1049d2a7/docs/guides/check_a_segment.md | 98 + .../upstream/1049d2a7/docs/guides/ollama.md | 50 + .../upstream/1049d2a7/docs/project/roadmap.md | 58 + .../data/upstream/github-release-v1.0.1.json | 20 + frontend/data/upstream/manifest.json | 26 + frontend/public/data/site-data.json | 4864 +++++++++++++++++ frontend/scripts/build-data.py | 378 ++ frontend/scripts/fetch-evidence.py | 20 + frontend/scripts/sync-claims.mjs | 31 + frontend/src/content/claims.json | 2074 +++++++ frontend/src/content/copy.json | 286 + 25 files changed, 8808 insertions(+) create mode 100644 frontend/data/raw/manifest.json create mode 100644 frontend/data/raw/prepared/8de1d60065b1e8e084c31c202e47367f28c8b89f11b4e895873f775bc0f7ba68/preparation.json create mode 100644 frontend/data/raw/release/simple-run/README.md create mode 100644 frontend/data/raw/release/simple-run/anchor.digicert.tsr create mode 100644 frontend/data/raw/release/simple-run/anchor.freetsa.tsr create mode 100644 frontend/data/raw/release/simple-run/anchor.json create mode 100644 frontend/data/raw/release/simple-run/recipe.json create mode 100644 frontend/data/raw/release/simple-run/release-hashes.txt create mode 100644 frontend/data/raw/release/unlearning-3i-atlas/README.md create mode 100644 frontend/data/raw/release/unlearning-3i-atlas/loo-results.json create mode 100644 frontend/data/raw/release/unlearning-3i-atlas/recipe.json create mode 100644 frontend/data/raw/release/unlearning-3i-atlas/release-hashes.txt create mode 100644 frontend/data/upstream/1049d2a7/README.md create mode 100644 frontend/data/upstream/1049d2a7/docs/design/simple_run.md create mode 100644 frontend/data/upstream/1049d2a7/docs/guides/check_a_segment.md create mode 100644 frontend/data/upstream/1049d2a7/docs/guides/ollama.md create mode 100644 frontend/data/upstream/1049d2a7/docs/project/roadmap.md create mode 100644 frontend/data/upstream/github-release-v1.0.1.json create mode 100644 frontend/data/upstream/manifest.json create mode 100644 frontend/public/data/site-data.json create mode 100644 frontend/scripts/build-data.py create mode 100644 frontend/scripts/fetch-evidence.py create mode 100644 frontend/scripts/sync-claims.mjs create mode 100644 frontend/src/content/claims.json create mode 100644 frontend/src/content/copy.json diff --git a/frontend/data/raw/manifest.json b/frontend/data/raw/manifest.json new file mode 100644 index 00000000..09761e8f --- /dev/null +++ b/frontend/data/raw/manifest.json @@ -0,0 +1,86 @@ +{ + "repo": "AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence", + "revision": "96dc282a9803616c6b30bb31bfc3a0b91a7191e6", + "files": { + "release/simple-run/chain.jsonl": { + "sha256": "c1f867e16d0660c611186183863cc5626e3510b046d52e617c3953beb8f8a327", + "bytes": 19686, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/chain.jsonl" + }, + "release/simple-run/verifications.jsonl": { + "sha256": "ec73fe8fdce56eb075783c37383dbb5afaa23fac168fbd6619c01240de41b770", + "bytes": 7355, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl" + }, + "release/simple-run/hardware-map.jsonl": { + "sha256": "5116f365398795a5e79513a3709d48995cc72a059ae9c69c653e324e723884e4", + "bytes": 956, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/hardware-map.jsonl" + }, + "release/simple-run/release-hashes.txt": { + "sha256": "479ce030fa8022f0f92262849f88dfde4c9cf2a0748b8830357f3aa277080e8d", + "bytes": 3364, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/release-hashes.txt" + }, + "release/simple-run/anchor.json": { + "sha256": "2adaea4cae25439199ec2396c0e6e94d1d14188c070f217ed7e360ce10c1c18d", + "bytes": 689, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/anchor.json" + }, + "release/simple-run/anchor.digicert.tsr": { + "sha256": "26a643321802ec92eb67f842d770c1d0b69aee66d3e9c3b58f84380a65d08564", + "bytes": 6007, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/anchor.digicert.tsr" + }, + "release/simple-run/anchor.freetsa.tsr": { + "sha256": "4c1cc74f8596fff22125f285899d50b3ab50b69a6a1023baf3d68139f32cba6f", + "bytes": 4644, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/anchor.freetsa.tsr" + }, + "release/simple-run/README.md": { + "sha256": "d3a4a5b221d9d1bd9318e8e414b44adc75f66155d03cd356b489165243e932e9", + "bytes": 8250, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/README.md" + }, + "release/simple-run/recipe.json": { + "sha256": "28a2fb407a5582ae95c9e9b0bba2c14df946e87bba037800399c6059256b6e6d", + "bytes": 458, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/recipe.json" + }, + "release/unlearning-3i-atlas/chain.jsonl": { + "sha256": "98ffe339f9a0e20458b2615597fdb9ca23b0b12a5bac3873c9327893e724e6c1", + "bytes": 20725, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/chain.jsonl" + }, + "release/unlearning-3i-atlas/verifications.jsonl": { + "sha256": "6f23946c7bcb7413a7f8b7fa322f5fa6b3240caa93c6d4d63c5a7133cbc9e7ec", + "bytes": 1788, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/verifications.jsonl" + }, + "release/unlearning-3i-atlas/loo-results.json": { + "sha256": "c926c965d1e040ab23c591c9dcdd007e5ece75a57ecfa100fd69515d190ead69", + "bytes": 2158, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/loo-results.json" + }, + "release/unlearning-3i-atlas/release-hashes.txt": { + "sha256": "8b5800df8a3f88622d9cd91beb72949b37762e3e0b5f42253cd78c99c54ea508", + "bytes": 1044, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/release-hashes.txt" + }, + "release/unlearning-3i-atlas/README.md": { + "sha256": "499eb00a91699fa785c94fcbf3d8e96f0ad71d390752ee4523d2b019a010f560", + "bytes": 3744, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/README.md" + }, + "release/unlearning-3i-atlas/recipe.json": { + "sha256": "28a2fb407a5582ae95c9e9b0bba2c14df946e87bba037800399c6059256b6e6d", + "bytes": 458, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/recipe.json" + }, + "prepared/8de1d60065b1e8e084c31c202e47367f28c8b89f11b4e895873f775bc0f7ba68/preparation.json": { + "sha256": "8de1d60065b1e8e084c31c202e47367f28c8b89f11b4e895873f775bc0f7ba68", + "bytes": 7985, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/prepared/8de1d60065b1e8e084c31c202e47367f28c8b89f11b4e895873f775bc0f7ba68/preparation.json" + } + } +} \ No newline at end of file diff --git a/frontend/data/raw/prepared/8de1d60065b1e8e084c31c202e47367f28c8b89f11b4e895873f775bc0f7ba68/preparation.json b/frontend/data/raw/prepared/8de1d60065b1e8e084c31c202e47367f28c8b89f11b4e895873f775bc0f7ba68/preparation.json new file mode 100644 index 00000000..e7f8054c --- /dev/null +++ b/frontend/data/raw/prepared/8de1d60065b1e8e084c31c202e47367f28c8b89f11b4e895873f775bc0f7ba68/preparation.json @@ -0,0 +1 @@ +{"code":[{"bytes":4498,"path":".github/workflows/anchor-pipeline.yml","sha256":"e016c58132c51a1753ae96756ee5bb53cc5f4cf958f6efbd607689612a44ebbb"},{"bytes":416,"path":"requirements/preparation.in","sha256":"4b0a637aaaa61787a78f053263536b4ac0a7f4abd53978bc1103c8905db7e78e"},{"bytes":73127,"path":"requirements/preparation.lock","sha256":"e284b2f4c393943e8d28a8ac6875b97634ffbe7c50356ba7aa90cd2ce5218f74"},{"bytes":74,"path":"src/ovl_pipeline/__init__.py","sha256":"0e60ca9603d569e977ae6f7b55d308384e7d864b65f9a2e3eb00f2afea9fbffb"},{"bytes":12024,"path":"src/ovl_pipeline/acquisition.py","sha256":"389153c4e6a76f66586a26e530b6f5defd9d9e4c6140dc46c702c74fc3fa8392"},{"bytes":7865,"path":"src/ovl_pipeline/anchoring.py","sha256":"e23d14c090c8152ff65506c5e1c15b16da060b82dde860714c2396e7f4e097d2"},{"bytes":6618,"path":"src/ovl_pipeline/canonical.py","sha256":"2de9c77a6d7414b9802a8b26b95d7fe9effdfd241df1e751ab3fb17475bcb1b1"},{"bytes":8630,"path":"src/ovl_pipeline/conversations.py","sha256":"1233029c70b69a0dcc9067938ea4e20bcda3aa6ae6609df728ee5c49403f407a"},{"bytes":17928,"path":"src/ovl_pipeline/data.py","sha256":"2b5c6898a8473f600aaf07868bd1bc495f206c2c2c1c2ba2b13cc215cb6063ab"},{"bytes":4300,"path":"src/ovl_pipeline/extraction_workers.py","sha256":"969d06c76bbd13129beb1af6fb3d9a2a09fbc5ec0d84a62e46a098b3f1a0e7e7"},{"bytes":20817,"path":"src/ovl_pipeline/preparation.py","sha256":"e368c228254c05fd59ff593ceddd6393b6a192fbb70953b8b3af5c14b48d12fa"},{"bytes":9675,"path":"src/ovl_pipeline/preparation_stages.py","sha256":"2206849e62ff957937783284ef9e018cf8c79ab15a42783479be807611fda242"},{"bytes":4526,"path":"src/ovl_pipeline/schema.py","sha256":"6255f646fb441d350ca7d79ac2441edf42af9b1047ab3c7ad6061743299e090c"},{"bytes":9894,"path":"src/ovl_pipeline/source_commitment.py","sha256":"de00be05627f7556c62a3437470d816e4d3235ad51f162a61751f7b4af3df108"}],"conversation_selection":{"conversations":{"train":3481,"validation":188},"counts":{"train":{"deleted":1485,"non_english":44006,"not_approved":1163,"selected":10252,"unselected_branch_or_unanswered_prompt":27507,"unusable_ancestor":24},"validation":{"deleted":68,"non_english":2321,"not_approved":76,"selected":550,"unselected_branch_or_unanswered_prompt":1386}},"files":[{"bytes":35542562,"path":"selection.jsonl","sha256":"43297d859bbdd1b29d28cf9cb20aa73fd330654e24132a25f7d78c4534ef052d"},{"bytes":6978579,"path":"train.jsonl","sha256":"b460ff323dd76ec00c23b3cb1c1a364cc9e4c4b9424941d730844ad69e036e55"},{"bytes":376180,"path":"validation.jsonl","sha256":"bd3f4d392bdc90c23bfc64d3562460fcf5a4aad73fc0e20ed60edb00bf07db40"}],"messages":88838,"policy":"oasst-en-preferred-path-v1","projection_columns":["message_id","parent_id","text","role","lang","review_result","deleted","rank","message_tree_id"],"schema":"ovl.conversation-selection.v1","selection_root":"e94202ed19145028de35c28aae49c320aad5195f264951fc6c9a44edad191d8b","source_inventory_root":"a0047b229629298b87d25baacb0230ff23b30006c820e97e5d42badd9ae8f253","split_filenames":{"train":"data/train-00000-of-00001-b42a775f407cee45.parquet","validation":"data/validation-00000-of-00001-134b8fd0c89408b6.parquet"}},"corpus":{"counts":{"empty_extracted_text":2166,"included":7232582,"non_main_namespace":6597190,"redirect":12027806},"files":[{"bytes":33012803655,"path":"articles.jsonl","sha256":"4f7abe772231bcb29573796ce4f1412a38ea751135323180ad3119c19260523f"},{"bytes":15583458438,"path":"ledger.jsonl","sha256":"60a11cb9974cdbe254e63476c5c4f5c6df91d9446a4c917c59a93d49b94f101b"}],"ledger_root":"60076f336fd9bb6c5d20a1f4eaf2635c1587568ae9a50fdfb74a8fa6f68655be","policy":"main-nonredirect-stripcode-v1","record_count":25859744,"schema":"ovl.corpus.v1","sources":["859cf6cc1d13007d165025247cacaf463ff8a4ad700b19e476f7626e24169116"]},"environment":{"dependency_lock_sha256":"e284b2f4c393943e8d28a8ac6875b97634ffbe7c50356ba7aa90cd2ce5218f74","machine":"x86_64","packages":{"annotated-types":"0.8.0","anyio":"4.15.1","certifi":"2026.7.22","cffi":"2.1.1","charset-normalizer":"3.5.1","click":"8.5.0","cryptography":"50.0.1","defusedxml":"0.7.1","dnspython":"2.8.0","email-validator":"2.3.0","filelock":"3.32.3","fsspec":"2026.7.0","h11":"0.16.0","hf-xet":"1.6.0","httpcore":"1.0.9","httpx":"0.28.1","huggingface-hub":"1.32.0","id":"1.6.1","idna":"3.20","jinja2":"3.1.6","markdown-it-py":"4.2.0","markupsafe":"3.0.3","mdurl":"0.1.2","mpmath":"1.3.0","mwparserfromhell":"0.7.2","networkx":"3.6.1","numpy":"2.5.3","packaging":"26.3","platformdirs":"4.11.9","pyarrow":"25.0.1","pyasn1":"0.6.4","pycparser":"3.0","pydantic":"2.13.5","pydantic-core":"2.46.5","pygments":"2.21.0","pyjwt":"2.14.0","pyopenssl":"26.4.0","pyyaml":"6.0.3","requests":"2.34.2","rfc3161-client":"1.0.9","rfc8785":"0.1.4","rich":"15.0.0","securesystemslib":"1.5.1","setuptools":"78.1.0","sigstore":"4.5.0","sigstore-models":"0.0.6","sigstore-rekor-types":"0.0.18","sympy":"1.14.0","tokenizers":"0.23.2","torch":"2.14.0+cpu","tqdm":"4.70.1","tuf":"7.0.1","typing-extensions":"4.16.0","typing-inspection":"0.4.4","urllib3":"2.8.0"},"python":"3.12.14","python_recursion_limit":1000,"system":"Linux","tokenizers_parallelism":"false","wikitext_parser_backend":"c"},"schema":"ovl.complete-preparation.v1","source_commitment_sha256":"ec263b5c3914fd1a8bd25e97fa377b4f8416c38a9ef216d27c203252948b9129","streams":{"conversation":{"documents":3481,"files":[{"bytes":849666,"path":"documents.jsonl","sha256":"124ffaa61f20cde74c7758a1b654d1c1f1e2f917d3c36ff31001189f0c383672"},{"bytes":1468127,"path":"mask.u8","sha256":"f17aec31ab9da79db70a4e2f2128b5807cae668a9b05b7d1f6805dc35efbc097"},{"bytes":2936254,"path":"tokens.u16","sha256":"c56bb83e6ff43f571745f42276b3274a624110f622ad9f8099e0b905c3c4b043"}],"index_root":"8afb54fd8ef3cf82bbbd9b2ae866f54c1b8a1253d48c988e5cd137d12516aa8c","phase":"conversation","schema":"ovl.stream.v1","targets":1278137,"token_dtype":"uint16-le","tokenizer_sha256":"6eab0d9bcd5736cee484992b24e7a84459bee1cc3024c0e958a76842a57728c0","tokens":1468127,"window_policy":"per-document-overlap-one-v1"},"conversation-validation":{"documents":188,"files":[{"bytes":46168,"path":"documents.jsonl","sha256":"cd8d14cfb0a265161bde8604a8d15dc089b6e33992c07af5a4c1f6ffc7778af7"},{"bytes":77654,"path":"mask.u8","sha256":"9170dd6e28d8dd328eed0a7804c05eba26f7b0dafc6b7127a26cbae86becb037"},{"bytes":155308,"path":"tokens.u16","sha256":"be62756cf5ea9e28d13f1379b6cbf3174a5ee6b0b5121fb7e0f33defd2547918"}],"index_root":"67d3d1bc85e686de84050a4c7aa8cb4c16466898584511d75796adf5f21239af","phase":"conversation","schema":"ovl.stream.v1","targets":65355,"token_dtype":"uint16-le","tokenizer_sha256":"6eab0d9bcd5736cee484992b24e7a84459bee1cc3024c0e958a76842a57728c0","tokens":77654,"window_policy":"per-document-overlap-one-v1"},"wikipedia":{"documents":7232582,"files":[{"bytes":1293950757,"path":"documents.jsonl","sha256":"63704cfe04e221cf36f70f5df99d1336c592f202a894f581854d3d509fc876c7"},{"bytes":7118121139,"path":"mask.u8","sha256":"9a058493c2603e8e892ec8c5147e6f9097987e79c4af79cf1e6fc67961df0dd9"},{"bytes":14236242278,"path":"tokens.u16","sha256":"1d468ba5d5cada2aef125428241bdf8960cade6d5b236df39cdf1eace607cee7"}],"index_root":"24650037ea2a19718dd13f4ed9e632bfe731961ccd5b9431e57f3c89b788f17f","phase":"wikipedia","schema":"ovl.stream.v1","targets":7118121139,"token_dtype":"uint16-le","tokenizer_sha256":"6eab0d9bcd5736cee484992b24e7a84459bee1cc3024c0e958a76842a57728c0","tokens":7118121139,"window_policy":"per-document-overlap-one-v1"}},"tokenizer":{"backend":"tokenizers-bytelevel-bpe","controls":{"assistant":4,"bos":1,"eos":2,"pad":0,"user":3},"files":[{"bytes":991312,"path":"tokenizer.json","sha256":"6eab0d9bcd5736cee484992b24e7a84459bee1cc3024c0e958a76842a57728c0"}],"sample_actual_bytes":15979682,"sample_articles":628,"sample_byte_budget":16000000,"sample_policy":"ordered-whole-article-prefix-v1","sample_root":"3fb0298adc53ff1a797f8fd83ee7cf25846b8098816088b37870ca0d41495072","schema":"ovl.tokenizer.v1","text_id_offset":5,"vocab_size":32000},"validation_used_for_training":false} \ No newline at end of file diff --git a/frontend/data/raw/release/simple-run/README.md b/frontend/data/raw/release/simple-run/README.md new file mode 100644 index 00000000..0d0c7826 --- /dev/null +++ b/frontend/data/raw/release/simple-run/README.md @@ -0,0 +1,142 @@ +# OpenVerifiableLLM simple run: a small language model you can check yourself + +A 23-million-parameter GPT trained from a seeded random start on one exact pass over English +Wikipedia (2026-09-01 dump), then three passes over a pinned OpenAssistant conversation +selection. Every training checkpoint is published, so anyone can recompute any part of the +training bit for bit and confirm it matches the published record. + +Source code: [AOSSIE-Org/OpenVerifiableLLM](https://github.com/AOSSIE-Org/OpenVerifiableLLM) +(the exact code used is also in `code/` here). + +## What is in this folder + +| File | What it is | +|---|---| +| `conversation-model.pt` | Final model (after the conversation phase) | +| `base-model.pt` | Model after the Wikipedia pass, before the conversation phase | +| `chain.jsonl` | Hash-linked training record: one entry per boundary with the training position, a digest of the full model and optimizer state, and the hash of the previous entry | +| `recipe.json` | Model, batch, learning-rate schedule and seed | +| `ckpt-XXXXX.pt` | Full checkpoint (model, optimizer, position) at every boundary | +| `verifications.jsonl` | Which segments were recomputed, by whom, on which GPU and driver, and the result | +| `release-hashes.txt` | SHA-256 of every model, checkpoint and record file | +| `code/` | Exact code: `simple/ovl.py` (train, verify, chat), the scripts, and the library files it imports | + +## How the verification works + +Training is split into segments: boundary k to boundary k+1. Each segment can be recomputed on +its own, starting from the published checkpoint k. A segment passes only if the recomputed state +is identical, bit for bit, to the committed entry k+1. Because every segment starts from a +published checkpoint, segments can be checked in any order, by different people, at the same +time. When all segments match, the whole training computation is verified without one long +replay. + +Also checkable without a GPU: +- the record's hash links; +- the starting weights, regenerated from the seed and equal to entry 0; +- the published models, equal to the committed states; +- every file, equal to `release-hashes.txt`. + +**Coverage at release: all 37 of 37 segments recomputed by the project, all MATCH.** That's 31 +Wikipedia segments plus 6 for the conversation phase, recomputed on a second RTX 5090 with a +different NVIDIA driver from training (595.91.07 vs 570.195.03 for segments 0-9). Segment 21 was +also recomputed on a fresh machine using only the public files and `verify_segment.sh`: MATCH. See +`verifications.jsonl` for the GPU, driver and code version of every check. + +**How hard is it to forge one segment?** With N segments, M independent checkers who each pick one +random segment catch a single forged segment with probability 1 − ((N−1)/N)^M. One checker who +checks k different segments catches it with probability k/N. + +## Check a segment yourself + +Requirements: an NVIDIA RTX 5090 and the image `runpod/pytorch:1.0.2-cu1281-torch280-ubuntu2404` +(PyTorch 2.8.0, CUDA 12.8). Bit-exact results hold for the same GPU type and software. They were +observed across NVIDIA drivers 570.195.03 and 595.91.07. A different GPU architecture is not +expected to reproduce the bits. + +```bash +# download code/ from this folder, then: +bash code/simple/verify_segment.sh # one random segment (~20 min) +K=3 bash code/simple/verify_segment.sh # three random segments +SEGMENTS="7 8" bash code/simple/verify_segment.sh # chosen segments +``` + +The script downloads the prepared data (22 GB, hash-checked), the record and only the +checkpoints it needs, then prints MATCH or MISMATCH for each segment. + +## Which hardware reproduces the bits (`hardware-map.jsonl`) + +The same published segment (32→33) was recomputed with the same software (PyTorch 2.8.0, CUDA 12.8): + +| Hardware | Result | +|---|---| +| RTX 5090 (Blackwell, the training GPU type) | MATCH (and all 37 segments on a second 5090) | +| RTX 4090 (Ada) | MISMATCH | +| H100 80GB (Hopper) | MISMATCH | +| x86 CPU (PyTorch 2.14) | MISMATCH | + +The seeded starting weights reproduce everywhere tested, including the CPU with a different +PyTorch version (2.14), because they are made on the CPU. Bit-exact +training reproduces on the same GPU architecture: two different NVIDIA drivers (570.195.03 and +595.91.07) gave identical bits. Other architectures run different low-level kernels and do not. +Checkers therefore need an RTX 5090. Anyone can rerun the probe with +`code/simple/hwmap_check.sh` in `release/unlearning-3i-atlas/`. + +## Timestamped (`anchor.json`, `anchor.*.tsr`) + +`anchor.json` records this release's chain head, the SHA-256 of `chain.jsonl` and of +`release-hashes.txt`, and the dataset commit. It was timestamped by two independent RFC 3161 +timestamp authorities (FreeTSA and DigiCert) at 2026-10-20 14:38:43 UTC. A timestamp proves the +release existed unchanged no later than that time, so the record cannot be rewritten afterwards +without detection. It does not prove when training happened. Check it with: + +```bash +openssl ts -verify -in anchor.digicert.tsr -data anchor.json -CAfile /etc/ssl/certs/ca-certificates.crt +curl -sO https://freetsa.org/files/cacert.pem; curl -sO https://freetsa.org/files/tsa.crt +openssl ts -verify -in anchor.freetsa.tsr -data anchor.json -CAfile cacert.pem -untrusted tsa.crt +``` + +## Verifiable unlearning (`release/unlearning-3i-atlas/`) + +A fork of this run retrains from checkpoint 30 without one article (3I/ATLAS), with the removal +recorded in its chain and every fork segment checked. It shares checkpoints 0–30 with this +release byte for byte. See that folder's README for the exact leave-one-out effect. + +## Data + +- Prepared training streams: `prepared/8de1d600…/` in this dataset. Wikipedia: 7,232,582 articles, + 7,118,121,139 training targets, each seen exactly once. Conversation: 3,481 conversations, + 1,278,137 targets. +- Raw inputs: `raw/3a7f5106…/` (the complete Wikipedia dump and the OpenAssistant oasst1 files), and + the signed source statement `source-commitments/ec263b5c…/`. +- **Rebuild from the raw dump: PASS (2026-10-21).** All six preparation stages (corpus, tokenizer, + Wikipedia stream, conversation selection, conversation and validation streams) were rerun from + scratch from the raw dump and the OpenAssistant files. It used the pinned preparation code + (revision 3f882ad, Python 3.12.14, locked packages), after checking the signed source statement. + The rebuilt `preparation.json` is byte-identical to the published one: sha256 + `8de1d60065b1e8e084c31c202e47367f28c8b89f11b4e895873f775bc0f7ba68`, the prepared-data ID this + model was trained on. So the training streams provably come from that Wikipedia dump. + Reproduce with `code/simple/rebuild_prep.sh` (CPU only; uses about 100 GB of disk, so allow + 150 GB; about a day). + +## Training facts + +- Model: 6 layers, 384 dimensions, 6 heads, 512-token context, 32,000-token vocabulary, tied + embeddings. Seed 1234. AdamW, BF16 autocast with FP32 weights, deterministic CUDA kernels. +- Wikipedia: 560,177 updates of 32 × 512 tokens, warmup then cosine learning rate 6e-4 → 6e-5. + Conversation: 3 passes at 1e-4. +- Code versions: segments 0–18 were trained with `ovl.py` sha256 `202ac6ce…` + (`code/training-code/ovl-segments-00-18.py`). Segments 19 onward used `c4a942c0…` + (`code/training-code/ovl-segments-19-end.py`, identical to `code/simple/ovl.py`). The newer version + only changes CPU-side batch preparation and the CPU thread count. Proof that it produces + identical results: segments 19 onward were recomputed with the original batch loader and + matched, and segment 5 (trained with the original code) was recomputed with the newer code and matched. +- The training host restarted once, at boundary 10. Training resumed from checkpoint 10, and + segment 10 (which spans the restart) matched. + +## Limits + +- This is a small model. It writes fluent fragments in an encyclopedia style. It often states + wrong facts and has only basic conversation ability. +- "Verified" here means the published model is exactly what this training on these inputs + produces. It does not mean the model's answers are true. +- Bit-exact checking needs the same GPU type and software stack as training. diff --git a/frontend/data/raw/release/simple-run/anchor.digicert.tsr b/frontend/data/raw/release/simple-run/anchor.digicert.tsr new file mode 100644 index 0000000000000000000000000000000000000000..16004fdab3cc56c44bbdf503f165d6f2574df816 GIT binary patch literal 6007 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 literal 0 HcmV?d00001 diff --git a/frontend/data/raw/release/simple-run/anchor.freetsa.tsr b/frontend/data/raw/release/simple-run/anchor.freetsa.tsr new file mode 100644 index 0000000000000000000000000000000000000000..cbbbf95285fd0802dd0087bcf5c785432345048c GIT binary patch literal 4644 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 OZC?BBk2IOv==~eB7Jvf) literal 0 HcmV?d00001 diff --git a/frontend/data/raw/release/simple-run/anchor.json b/frontend/data/raw/release/simple-run/anchor.json new file mode 100644 index 00000000..402d7900 --- /dev/null +++ b/frontend/data/raw/release/simple-run/anchor.json @@ -0,0 +1,13 @@ +{ + "chain_entries": 38, + "chain_head_index": 37, + "chain_head_sha256": "9edbcaddbb08ed20f3d655ac59d0aa57f6339a702d0fa1d3422856f5d8251a51", + "chain_jsonl_sha256": "c1f867e16d0660c611186183863cc5626e3510b046d52e617c3953beb8f8a327", + "commit": "1dc7fb2a430d24c06c970309d332c4891916548c", + "dataset": "AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence", + "final_model": "ec9a2b31ca524613f791aba00f4f7f31e4a7bf4a8a921e0deb81c1a922d0958b", + "final_state": "934d681c99e5c3e10617e82dbbb0ae0ddd1ad4e32cf45e8e3a6d2ed94b69f200", + "path": "release/simple-run", + "release_hashes_sha256": "479ce030fa8022f0f92262849f88dfde4c9cf2a0748b8830357f3aa277080e8d", + "schema": "ovl.release-anchor.v1" +} diff --git a/frontend/data/raw/release/simple-run/recipe.json b/frontend/data/raw/release/simple-run/recipe.json new file mode 100644 index 00000000..900c3703 --- /dev/null +++ b/frontend/data/raw/release/simple-run/recipe.json @@ -0,0 +1,25 @@ +{ + "batch_size": 32, + "boundary_every": 18080, + "context": 512, + "conversation_epochs": 3, + "init": "normal-0.02-tied-v1", + "model": { + "attn_impl": "manual", + "dropout": 0, + "embed_dim": 384, + "max_seq_len": 512, + "num_heads": 6, + "num_layers": 6, + "vocab_size": 32000 + }, + "schedule": { + "conversation": "0.0001", + "floor": "0.00006", + "peak": "0.0006", + "warmup": 2000, + "wikipedia_updates": 560177 + }, + "seed": 1234, + "weight_decay": "0.01" +} \ No newline at end of file diff --git a/frontend/data/raw/release/simple-run/release-hashes.txt b/frontend/data/raw/release/simple-run/release-hashes.txt new file mode 100644 index 00000000..506e672a --- /dev/null +++ b/frontend/data/raw/release/simple-run/release-hashes.txt @@ -0,0 +1,42 @@ +976c62e8b28db786c38dc2ff969339603d0ee917d830f2815d9e858d2a3c0ce3 base-model.pt +c1f867e16d0660c611186183863cc5626e3510b046d52e617c3953beb8f8a327 chain.jsonl +3dccf4a6d258ff5e150ee1ed590f4baff099e5a368d580e610ecf238b4ba8c22 ckpt-00000.pt +ba524fd9691c4a849d1a3dac177af426df36d8e04d9c75fba2dbf036a4b515f9 ckpt-00001.pt +627106799e630a9297770b31b0e1f66b1418215eea50c1cd3f3a23c48e138a33 ckpt-00002.pt +0b64c3f0208d636b19bdf5970810c27cb2ceab33f18153915d64f6493201bc10 ckpt-00003.pt +68f07c741473f7ad0c2c61d52dc25c4d8a9c441382d348f9c1a97d215bba452e ckpt-00004.pt +29cdefeb28098ba4572869655b58c9dd2e771edc3717f0112d700477b74defb8 ckpt-00005.pt +3e861cd5457c1a1566c8ebcee2a712feca2f3e5603ad46436d393aca5cbb5999 ckpt-00006.pt +400734c784b59c9363fdbdd745f7f0f6d70c1be09d2c747976bc2b4fae01b64b ckpt-00007.pt +fe5352356351e4d9e4b0abd59f279c7a2ed98888177fbb773fd1f1983fefe83f ckpt-00008.pt +41819daf70a409e200f5189ab45ae96293716794733ad534e4843ac3f8b1982e ckpt-00009.pt +75cd5863903d9f595e2d50cacea3ec0530f41c154d4ec8817f41376b6f222e3f ckpt-00010.pt +46ece4b519e8624a2b41856b1ecfa9a5daf4994616a9bdd8d941625cb09a32ed ckpt-00011.pt +8b0e19692ccc6c6e6e0eb745633ae2dd2c4e86d0ca84b8ea1c7f1f81a888b892 ckpt-00012.pt +3ac79c55fe528bcc62bd7a7a047e2b2a19e2d2e494c85e26301b0fc79f345aee ckpt-00013.pt +ad933ae52b14ff5de72624c5dc7af9b3e5464155b9c3ed84bd43bd5be4f737c3 ckpt-00014.pt +2cfddc6c26fb7e8dc99c94b6fb39007a4937b67e1c8d852f2561d990e857cb62 ckpt-00015.pt +3729909ae0f85b79377956ad8defdaaeceac0cd000a1c47e582f38685f4158d6 ckpt-00016.pt +9f8537d432d78b254dcba86e7bd987246d928bbc837950ffe2536ba989747c41 ckpt-00017.pt +a09df5692aac7e42a0430fd225c75937bf75c85a9dfb77b899b4cb956a8c51d1 ckpt-00018.pt +ef18f34f8ac17a2581193ffc681a927f655bdadce4c6ca2de0a095d72094bb24 ckpt-00019.pt +6bda17b7f79347cc57cb1325215a3a68f9f2357ee5b97f2c88e353189244fcdf ckpt-00020.pt +7df62e3801530777a4491bcecb0199a2b5628a9de61da30f5f6513c74c028095 ckpt-00021.pt +23d9271d4f4c49e8e04a13f498ed0a89d57c3f80705044c2c8fe10eecc895896 ckpt-00022.pt +2b68d53231a0d3a639312ed45eeb2afef3720f93824819843dd2c9fb68f2fc4c ckpt-00023.pt +8a06f96345a0ff23933d6b946a4fc88ad63a6b43a618a91a1639267cf1c0e23b ckpt-00024.pt +7bed06bf3566e18595a190bc1418fe5735689a2c47d280d857c0a5f68ba73a7f ckpt-00025.pt +31e21be4135f53a912312fae5f26d9b2eefc344171b8935e295c655f49c3b701 ckpt-00026.pt +2efcee93267b438152c35cfc1975fd0d8d2dcec804b2713fcc11bdd8602752cf ckpt-00027.pt +671cf6928fc370a464fade45cf5565a65c019c9888b6c9d8962230364cc4c5b4 ckpt-00028.pt +082195ad124ad61287e94f224c6672b2175b1c1c35f06baee2b56adbc12f92da ckpt-00029.pt +febe492c2c87335b078c910894172bcf8f572b853d807b8f24da99e9e0127979 ckpt-00030.pt +c687187b7daaa97d0fd8c96df302313e051febc29d64b5ef4d5b5775d684244b ckpt-00031.pt +b49bfa976a6aa59fc54b9511fccc4745a4493b81cc58a3ff310ffecf7a92f45e ckpt-00032.pt +8fa1f26811ef37b235c968c4204044983895b217e00db731d57f3a2cecda179e ckpt-00033.pt +5fe1e5af0d612046c7617d079181090e3ac0898411fe39900e05346c90b29aeb ckpt-00034.pt +4766216588d357cdbe5bdd35e4b9534317d59f8b1273b5b722a390e748ae3beb ckpt-00035.pt +1ca4bd559c51e9d83ba2ea84a85e518e0309d0844d964535868339a16b66e239 ckpt-00036.pt +88947898dab959fd82f954f81681103bac7f6b770f4bcc13d6eac29ca1795ecb ckpt-00037.pt +149cfae13c4523a1010c52161e13babf76c9ddc01f34fa1a8b580677b733a64c conversation-model.pt +28a2fb407a5582ae95c9e9b0bba2c14df946e87bba037800399c6059256b6e6d recipe.json diff --git a/frontend/data/raw/release/unlearning-3i-atlas/README.md b/frontend/data/raw/release/unlearning-3i-atlas/README.md new file mode 100644 index 00000000..8f36ee38 --- /dev/null +++ b/frontend/data/raw/release/unlearning-3i-atlas/README.md @@ -0,0 +1,60 @@ +# Verifiable unlearning: the simple-run model without the "3I/ATLAS" article + +This folder is a **fork** of the published run in `release/simple-run/`. It is the same training, +except that one Wikipedia article was never trained on: **3I/ATLAS** (the interstellar comet; +page 80340464, revision 1371028825, 10,395 training targets). Every step can be checked, so the +claim "this model never saw that article" is verifiable rather than trusted. + +## Why the claim holds + +1. **Shared history, byte for byte.** Entries 0–30 of this `chain.jsonl` are identical to entries + 0–30 of `release/simple-run/chain.jsonl`. The article's first training target (6,915,731,634) + comes after the cursor at boundary 30 (6,901,668,826), so no checkpoint up to 30 ever trained + on it. +2. **A recorded fork.** Entry 31 (kind `fork`) has exactly the state of entry 30. Its control adds + `exclude: {"wikipedia": [[6915731634, 10395]]}`, the article's exact target range. `verify` + checks that a fork entry changes nothing except declaring the exclusion, and that the excluded + range was not yet reached. +3. **Training without it.** From entry 31 on, the loader skips that document. Its tokens are + never used as inputs or targets, because windows never cross documents. The per-step coverage + check accepts a gap in target ids **only** at the recorded range, so any other missing or + repeated data would stop training. +4. **Checked.** Every fork segment (30→31 through 37→38) was recomputed from its starting + checkpoint and matched bit for bit, including the retrained last Wikipedia segment and the + whole conversation phase. The fork's `conversation-model.pt` matches its final entry. See + `verifications.jsonl`. They ran on the pod that trained the fork. The fork entry and the + retrained Wikipedia segment (30→31, 31→32) were also recomputed on a separate, fresh RTX 5090 + using only the public files: MATCH. Anyone can repeat them (below). + +## What removing one article changed (leave-one-out, `loo-results.json`) + +| | Original (trained on 3I/ATLAS) | This fork (never saw it) | +|---|---:|---:| +| Loss on the 3I/ATLAS article's own text | 3.3604 | 3.3860 (+0.0256) | +| Mean loss on 50 control articles from the same segment (both trained on them) | 2.8710 | 2.8712 (+0.0002) | + +Removing the article raised the loss on its own text about 100 times more than on articles both +models saw. That is the exact, causal effect of training on that one article, with no +approximation. A 23M model that sees each article once memorises little, and its generated text +about 3I/ATLAS is wrong either way. The point is that the effect can be measured and verified, +not that this small model knew the article. + +## Files + +- `chain.jsonl`, `recipe.json`: the fork's record (0–30 shared, 31 = fork, 32–38 new). +- `ckpt-00030.pt`: identical bytes to the original release's checkpoint 30. + `ckpt-00031.pt`–`ckpt-00038.pt`: the fork's checkpoints. +- `base-model.pt`, `conversation-model.pt`: the models that never saw the article. +- `verifications.jsonl`, `loo-results.json`, `release-hashes.txt`. +- `code/`: the exact code. `simple/ovl.py` adds the `fork` command; with no exclusion it trains + identically to the released code (checked on a real-data slice: identical chains). + `simple/loo_eval.py` produces `loo-results.json`. + +## Check it yourself (RTX 5090, image runpod/pytorch:1.0.2-cu1281-torch280-ubuntu2404) + +```bash +# with the prepared data from prepared/8de1d600…/ and this folder as RUN: +python code/simple/ovl.py verify --data PREP --run RUN --segment 30 31 32 33 34 35 36 37 \ + --weights RUN/conversation-model.pt +``` +Segment 31→32 (the retrained Wikipedia segment) takes about 18 minutes; the rest take seconds. diff --git a/frontend/data/raw/release/unlearning-3i-atlas/loo-results.json b/frontend/data/raw/release/unlearning-3i-atlas/loo-results.json new file mode 100644 index 00000000..3eeb52bd --- /dev/null +++ b/frontend/data/raw/release/unlearning-3i-atlas/loo-results.json @@ -0,0 +1,49 @@ +{ + "removed_documents": [ + [ + "859cf6cc1d13007d165025247cacaf463ff8a4ad700b19e476f7626e24169116", + "80340464", + "1371028825" + ] + ], + "control_documents": 50, + "original_base": { + "removed_loss": [ + 3.3604 + ], + "control_loss_mean": 2.871, + "completions": { + "3I/ATLAS is": " a type of electronic soundtrack album by the American musician and producer, DJ and producer, released in 2021. The album was recorded in the United States and Canada, and was released in the United Kingdom", + "The interstellar comet 3I/ATLAS": " is a comet in the interstellar medium of the Milky Way. It is a member of the group of stars in the interstellar medium.\n\nThe comet is a member of the group of stars in the", + "Oumuamua was the first interstellar object": " to be discovered in the early 20th century.\n\nOumuamua may also refer to:\n\n Oumuamua (surname), a surname\n Oumuam" + }, + "removed_minus_control": [ + 0.4894 + ] + }, + "fork_base": { + "removed_loss": [ + 3.386 + ], + "control_loss_mean": 2.8712, + "completions": { + "3I/ATLAS is": " a type of electronic soundtrack album by the American musician and producer, DJ and producer, released in 2021. The album was recorded at the University of California, Berkeley, and was released on the label", + "The interstellar comet 3I/ATLAS": " is a comet in the constellation of Leo. It is a member of the Solar System, and is a member of the Solar System.\n\nThe comet is a member of the Solar System, and", + "Oumuamua was the first interstellar object": " to be discovered in the early 20th century.\n\nOumuamua may also refer to:\n\n Oumuamua (surname), a surname\n Oumuam" + }, + "removed_minus_control": [ + 0.5148 + ] + }, + "original_conversation": { + "completions": { + "chat": "Here's an example of how you can use the \"Save the World\" algorithm to create a new version of the \"Save the World\" algorithm:\n\n```\n\n#" + } + }, + "fork_conversation": { + "completions": { + "chat": "Here's an example of how you can use the \"Save the World\" algorithm to create a new version of the \"Save the World\" algorithm:\n\n```\n\n#" + } + }, + "base_weight_relative_distance": 0.003339 +} diff --git a/frontend/data/raw/release/unlearning-3i-atlas/recipe.json b/frontend/data/raw/release/unlearning-3i-atlas/recipe.json new file mode 100644 index 00000000..900c3703 --- /dev/null +++ b/frontend/data/raw/release/unlearning-3i-atlas/recipe.json @@ -0,0 +1,25 @@ +{ + "batch_size": 32, + "boundary_every": 18080, + "context": 512, + "conversation_epochs": 3, + "init": "normal-0.02-tied-v1", + "model": { + "attn_impl": "manual", + "dropout": 0, + "embed_dim": 384, + "max_seq_len": 512, + "num_heads": 6, + "num_layers": 6, + "vocab_size": 32000 + }, + "schedule": { + "conversation": "0.0001", + "floor": "0.00006", + "peak": "0.0006", + "warmup": 2000, + "wikipedia_updates": 560177 + }, + "seed": 1234, + "weight_decay": "0.01" +} \ No newline at end of file diff --git a/frontend/data/raw/release/unlearning-3i-atlas/release-hashes.txt b/frontend/data/raw/release/unlearning-3i-atlas/release-hashes.txt new file mode 100644 index 00000000..074471a2 --- /dev/null +++ b/frontend/data/raw/release/unlearning-3i-atlas/release-hashes.txt @@ -0,0 +1,13 @@ +ff30d7f4bf9ec41f0514d63a4d8bc1a74172481b89e07608383c0c3513f83441 base-model.pt +98ffe339f9a0e20458b2615597fdb9ca23b0b12a5bac3873c9327893e724e6c1 chain.jsonl +febe492c2c87335b078c910894172bcf8f572b853d807b8f24da99e9e0127979 ckpt-00030.pt +1728660ffdc7985f08b68721c7419523def8dff5dc0d19278057a23028723004 ckpt-00031.pt +c91c03ac526a3a7e48b1053eacbf46f798fcc076d0dbbf562b72fdbf50191b3c ckpt-00032.pt +b98f60b056330d0b38d68e1c1977be7c54c17cbf8d95b8d997550ec33056adbb ckpt-00033.pt +2791741e1c6477954dd0b3177d29cfc4544a0d681375c841524edd774881b182 ckpt-00034.pt +276ce1ed5d85fa8da957e6a501bde1b1add80eb9aa80d977a96d5cbd1c83dbd8 ckpt-00035.pt +cecbdf2f59bc3a260fe94491da2eb01b3055997b597e9a8c3be6e240f9742211 ckpt-00036.pt +b2467b81ce20508df5007949e56cbe06a55bf22ed94c14a376ffa05033c97ced ckpt-00037.pt +650bf7c046b4e295d0f19ffeb6cca0660814a8fc53c3433db6f8cbb84510f039 ckpt-00038.pt +e41be3a27bbcf16ce7a5224eb4766e88b2abe09fe6ddb6aadea399b9db4472d4 conversation-model.pt +28a2fb407a5582ae95c9e9b0bba2c14df946e87bba037800399c6059256b6e6d recipe.json diff --git a/frontend/data/upstream/1049d2a7/README.md b/frontend/data/upstream/1049d2a7/README.md new file mode 100644 index 00000000..5343ea0d --- /dev/null +++ b/frontend/data/upstream/1049d2a7/README.md @@ -0,0 +1,219 @@ +# OpenVerifiableLLM:
Language models you can check yourself + +

+ OpenVerifiableLLM logo: a speech bubble with a check mark +

+ +

+ Why? | + Goals | + Status | + How it works | + Getting started | + Join us +

+ +

+ OpenSSF Scorecard + OpenSSF Best Practices + Best Practices + Discord + License: GPL-3.0 +

+ +**First release:** a 23M-parameter model trained on one exact pass over all of English Wikipedia, +with every one of its 37 training segments recomputed bit for bit. +[Get it on Hugging Face](https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/tree/main/release/simple-run). + + +Terminal session: the published weights match chain entry 37, and a recomputed training segment matches. Follow the link to check one yourself. + + +**Checkable, not just published** + +- Every training checkpoint is published and hash-linked +- Anyone can recompute any segment and get the same bits +- The training data rebuilds byte for byte from the raw Wikipedia dump + +**Cheap to check, in parallel** + +- One segment takes about 20 minutes on one GPU, about a dollar rented +- Segments are independent: many people, any order, at the same time +- A one-click checker on RunPod prints one line to share + +**Small and readable** + +- One 631-line file trains, verifies, forks and chats: `simple/ovl.py`, plus about 1,000 lines of + model and data code it imports from `src/` +- Timestamped by two independent authorities +- Open data, open code, open results, GPL-3.0 + +
+ +## Why OpenVerifiableLLM? + +Most model releases ask you to trust a list of datasets and a training description. You can't +check either: training is expensive, nondeterministic, and happens on someone else's machines. +That matters more as models are used for decisions, and as questions about what a model was +trained on (copyright, privacy, contamination of benchmarks) become legal and scientific +questions rather than marketing ones. + +OpenVerifiableLLM makes the training itself the evidence. The run is cut into segments. Each +segment boundary commits to the full model and optimizer state, the exact position in the data, +and the previous boundary. Training is made deterministic, so recomputing a segment from its +published starting checkpoint gives exactly the same bits. Anyone with the same GPU type can +therefore check any part of the run without trusting the publisher, and checking all parts +verifies the whole computation. + +Because the record pins the exact data position, it also allows things that are normally +impossible to show. For example, a model can be proven never to have trained on a given article: +the run is forked before it reaches the article, the article is removed, and the removal is recorded in +the chain. + +## Goals + +We are building OpenVerifiableLLM to support: + +- Training runs where every step can be recomputed and compared bit for bit +- Training data traceable to its raw public source +- Exact coverage: which data was seen, in which order, exactly once +- Checks that are cheap, independent and parallel +- Records that can't be quietly rewritten +- A training loop simple enough to review in an afternoon + +We also have explicit _non-goals_: + +- Proving a model's answers are correct. We verify the computation, not the content +- Bit-exact results across different GPU architectures +- Large models before the method is shown on small ones + +See [goals](docs/project/goals.md) for the full list and the principles behind it. + +## Project status + +The first verified model is **released**. It is small (23M parameters): it writes fluent, +encyclopedia-style text, often gets facts wrong, and holds a basic conversation. The method is +the point. It works the same way for bigger models, but a full check costs as much compute as the +training, so checking a large model in practice means many people each recomputing a random sample +of segments. + +What has been shown: + +- **37 of 37 segments** recomputed bit for bit on a second RTX 5090. Also from public files + only, on fresh machines: segments 8 and 21 +- **Data provenance**: the training data rebuilt from the raw 2026-09-01 Wikipedia dump is + byte-identical +- **Robustness**: a host failure, a mid-run code change and a driver change all happened during + training, and every affected segment still matched +- **Verifiable exclusion**: a fork that provably never trained on one article the run hadn't + reached yet, with the article's effect measured (one run, no variance estimate). This is exact + retraining without the article, not unlearning of something already learned +- **Hardware scope**: RTX 5090 reproduces the bits; RTX 4090, H100 and CPU do not + +Open limitations (details in [what "verified" means](docs/design/simple_run.md#what-verified-means)): + +- Checkers need the training GPU's architecture (RTX 5090), and they trust the same PyTorch/CUDA + toolchain. A deterministic error in that toolchain would match on every machine +- All checks so far were run by the project, on separate machines. **We need independent + checkers**: see [Join us](#join-us). Catching one forged segment out of 37 with 95% probability + takes about 110 independent random checks +- Check results are self-reported text lines. They aren't signed, and nothing proves a checker + picked its segment at random +- The timestamp proves the record existed by 20 Oct 2026, not how the training was done + +For the full results, cost, timeline and lessons learned, see +[the simple run](docs/design/simple_run.md). For what's next, see the +[roadmap](docs/project/roadmap.md). + +## How it works + +```text + raw Wikipedia dump ──rebuild──▶ prepared tokens ──┐ + ▼ + entry 0 ─▶ entry 1 ─▶ entry 2 ─▶ … ─▶ entry 37 chain.jsonl: each entry hashes the full + │ │ │ │ model + optimizer state, the data + ckpt 0 ckpt 1 ckpt 2 … ckpt 37 position and the previous entry + + check segment k: load ckpt k ─▶ train to boundary k+1 ─▶ compare with entry k+1, bit for bit +``` + +- **Determinism**: BF16 autocast with FP32 master weights, deterministic CUDA kernels, no TF32, + a fixed cuBLAS workspace, and a learning rate that is a pure function of the step +- **Exact coverage**: every step checks that its data continues exactly where the last one + stopped, and each phase must end with every item covered once +- **Timestamps**: every chain entry is stamped by two RFC 3161 authorities as it is written + +Details: [the simple run](docs/design/simple_run.md#how-it-works). + +## Getting started + +Check that the released model matches its timestamped record, without a GPU. This is a +consistency check: it recomputes no training. The real verification is the segment recomputation +below. + +```bash +pip install huggingface_hub torch numpy rfc8785==0.1.4 tokenizers==0.23.2 mwparserfromhell==0.7.2 \ + "safetensors>=0.4.5,<1.0" "pynacl>=1.5,<2.0" +hf download AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence \ + --repo-type dataset --include "release/simple-run/*" --exclude "*/ckpt-*" --local-dir ovl +cd ovl/release/simple-run +sha256sum -c --ignore-missing release-hashes.txt +openssl ts -verify -in anchor.digicert.tsr -data anchor.json -CAfile /etc/ssl/certs/ca-certificates.crt +# Verification: OK (DigiCert stamped anchor.json on 2026-10-20) +git clone -q --depth 1 --branch v1.0.1 https://github.com/AOSSIE-Org/OpenVerifiableLLM ovl-code +OVL_DEVICE=cpu python ovl-code/simple/ovl.py verify --run . --weights conversation-model.pt +# anchor anchor.json: chain head MATCH (38 entries) +# weights conversation-model.pt: MATCH chain entry 37 +``` + +Use `ovl.py` from the v1.0.1 tag, as above. It fails if `anchor.json` is missing. The copy in the +download's `code/` folder predates the anchor check, so it doesn't compare the record with its +timestamped anchor. + +Recompute a training segment on an RTX 5090, in one click: +[deploy the RunPod template](https://console.runpod.io/deploy?template=mai1ozh35g), wait about an +hour, and read the result line in the logs. Step by step: +[check a training segment](docs/guides/check_a_segment.md). + +Learn more: + +- [The simple run](docs/design/simple_run.md): method, results, cost, timeline, lessons +- [Goals](docs/project/goals.md), [roadmap](docs/project/roadmap.md) and + [FAQ](docs/project/faq.md) +- [The `ovllm verify` artifact verifier](docs/guides/ovllm_verify.md) and the reproducibility + study +- [Run the model in Ollama](docs/guides/ollama.md): `ollama run ryoari/openverifiablellm` +- [All docs](docs/README.md) + +### Repository layout + +| Path | What it is | Status | +|---|---|---| +| [`simple/`](simple/README.md) | The verifiable training loop: `ovl.py` (train, verify, fork, chat), segment checks, timestamps, the data rebuild. Start here | active | +| [`docs/`](docs/README.md) | Design, project and guide docs | active | +| `tests/` | Tests. `tests/simple/` covers `simple/ovl.py` and runs on a CPU | active | +| `src/ovllm.py`, `src/verifier.py`, `src/publish.py` | The [`ovllm verify` artifact verifier](docs/guides/ovllm_verify.md) | active | +| `src/` (other modules), `run_experiment.py`, `sweep.py`, `demo.py`, [`RUNBOOK.md`](RUNBOOK.md) | The July 2026 reproducibility study and its runbook | reference | +| `notebooks/`, `experiments/`, `paper/`, `data/` | Study notebooks, the paper draft, a small sample dataset | reference | +| `proofs/`, `keys/` | Recorded audit results and the study's public signing key | evidence | +| `project/` | Published evidence, source commitments and technical reports. Pinned by hash: don't edit | evidence | +| `src/ovl_pipeline/`, `scripts/`, `requirements/*.lock` | The earlier production pipeline and its locked environments. The simple run uses its data preparation | frozen | +| `Legacy/` | The pre-GSoC codebase | frozen | +| [`docs/legacy/`](docs/legacy/) | Superseded planning notes | frozen | +| [`brand/`](brand/Brand.md) | Logo, colours and typography | active | +| [`MAINTAINERS.md`](MAINTAINERS.md), [`BestPracticesChecklist.md`](BestPracticesChecklist.md) | Who maintains the project, AOSSIE best-practices status | active | + +## Join us + +- **Check a segment.** Have access to an RTX 5090, or a dollar for an hour of one? Run the + [one-click check](docs/guides/check_a_segment.md#one-segment-one-click) and post the result + line. Every independent check makes the release more credible +- **Contribute.** Read [CONTRIBUTING.md](CONTRIBUTING.md). New work targets `simple/` on `main` +- **Talk to us** on the [AOSSIE Discord](https://discord.gg/hjUhu33uAn) or in + [GitHub issues](https://github.com/AOSSIE-Org/OpenVerifiableLLM/issues) + +OpenVerifiableLLM is an [AOSSIE](https://aossie.org) project, licensed under +[GPL-3.0](LICENSE). Community standards follow AOSSIE's +[code of conduct](https://github.com/AOSSIE-Org/.github/blob/master/CODE_OF_CONDUCT.md) and +[security policy](https://github.com/AOSSIE-Org/.github/blob/master/SECURITY.md). diff --git a/frontend/data/upstream/1049d2a7/docs/design/simple_run.md b/frontend/data/upstream/1049d2a7/docs/design/simple_run.md new file mode 100644 index 00000000..e7010989 --- /dev/null +++ b/frontend/data/upstream/1049d2a7/docs/design/simple_run.md @@ -0,0 +1,228 @@ +# The simple run: a fully recomputable Wikipedia model + +This is the project's first production result: a 23.1M-parameter GPT trained from a seeded random +start on exactly one pass over the complete eligible English Wikipedia (2026-09-01 dump), then a +pinned conversation phase. Anyone with the same GPU type can recompute any part of the training +bit for bit and confirm the published weights are exactly what this training on these inputs +produces. + +- Release: Hugging Face dataset + [`AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence`](https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence), + folders `release/simple-run/` (the model) and `release/unlearning-3i-atlas/` (the unlearning fork). + The release README there is the user guide; this page is the project record. +- Code: `simple/` in this repository. `simple/ovl.py` (631 lines) trains, verifies and chats. It imports + the model (`src/model.py`) and the data and initialization helpers (`src/ovl_pipeline/data.py`, + `training.py`), about 1,000 lines in all. The training data was prepared by the earlier pipeline. + The exact code used for the run is also published in `release/simple-run/code/`. + +## How it works + +- **Data provenance.** The raw dump and the OpenAssistant files are published with checksums and a + signed source statement. A pinned preparation pipeline turns them into token streams: 7,232,582 + articles and 7,118,121,139 training targets for Wikipedia; 3,481 conversations and 1,278,137 + targets for the conversation phase. +- **Exact coverage.** Every training step checks that its targets continue exactly where the + previous step stopped. Each phase must end with every target covered once. +- **Determinism.** BF16 autocast with FP32 master weights, deterministic CUDA kernels, no TF32, + no reduced-precision reductions, a fixed cuBLAS workspace. The learning rate is a pure function + of the step. +- **Segmented commitments.** A boundary every 18,080 updates, plus the phase boundaries: 38 entries + and 37 segments. Each entry in `chain.jsonl` records the training position and a SHA-256 over the + full model and optimizer state, and links to the previous entry's hash. Every boundary checkpoint + is published. +- **Verification.** Segment k is checked by loading checkpoint k, recomputing to boundary k+1 and + comparing the full state digest bit for bit. Segments are independent, so they can be checked in + any order, by different people, at the same time. Checking all of them verifies the whole + training computation. +- **Timestamps.** `simple/stamp.py` sends every new chain entry to two RFC 3161 timestamp + authorities (FreeTSA and DigiCert), so the record cannot be rewritten later without detection. + The release itself was anchored after training. Per-boundary stamping was added after the run. + +## Results + +| Measurement | Value | +|---|---| +| Training | 560,177 Wikipedia + 441 conversation updates (batch 32 × 512 tokens) | +| Segments recomputed by the project on a second RTX 5090 | **37 / 37 MATCH** | +| Recomputed from public files only, on fresh machines | segments 8 and 21 MATCH | +| Starting weights regenerated from the seed | MATCH on every device tested, including CPU | +| Release anchor timestamped | FreeTSA and DigiCert, 2026-10-20 14:38:43 UTC | +| Rebuild of the training data from the raw dump | byte-identical `preparation.json` (sha256 `8de1d600…ba68`) | + +**Unplanned events that the method survived:** +- A host failure mid-run. Training resumed from checkpoint 10, and segment 10, which spans the + restart, matched. +- A mid-run code change to the CPU-side loader and thread pool. Later segments were rechecked with + the old loader, and an earlier segment with the new one. All matched. +- A driver change (570.195.03 → 595.91.07) gave identical bits. + +**Hardware scope** (segment 32→33, PyTorch 2.8.0, CUDA 12.8): + +| Hardware | Result | +|---|---| +| RTX 5090 (Blackwell, the training GPU) | MATCH | +| RTX 4090 (Ada) | MISMATCH | +| H100 80GB (Hopper) | MISMATCH | +| x86 CPU (PyTorch 2.14) | MISMATCH | + +Bit-exactness holds within one GPU architecture, regardless of driver. Checkers therefore need the +training GPU's architecture. This is the method's main trust assumption. + +**Verifiable exclusion** (the release folder is named `unlearning-3i-atlas`). A fork at boundary 30 removed one article that the run had not yet +reached ("3I/ATLAS", 10,395 targets). The fork shares checkpoints 0–30 byte for byte, records the +removed range in its chain, and its coverage check accepts a gap only at that range. Every fork +segment matched. Loss on the article's text went from 3.3604 to 3.3860 (+0.0256). Mean loss on 50 +control articles from the same segment, which both models saw, went from 2.8710 to 2.8712 +(+0.0002). One run, no variance estimate. This proves the fork never trained on the article. It +is exact retraining without a range the run hadn't reached, not unlearning in the research sense of +removing something a model already learned. + +## Check it yourself + +- **No GPU:** check the hash links, the seeded initialization, the published weights and the + file hashes with `python simple/ovl.py verify --run RUN --weights conversation-model.pt`, and + `sha256sum -c release-hashes.txt`. +- **One segment on an RTX 5090 (about an hour, about US$1–1.50 rented):** deploy the public RunPod + template "OpenVerifiableLLM segment check" + (). It runs `simple/checker_pod.sh` + and prints one result line. To run it by hand: `bash code/simple/verify_segment.sh` from the + release. +- **Timestamps:** `python simple/stamp.py RUN --check`, or the `openssl ts -verify` commands in the + release README. + +## Timeline + +All times UTC. + +| When | What | +|---|---| +| July 2026 | First complete deterministic run and segmented replay audit (116M model on A40): same-GPU recomputation matched, other architectures did not | +| September 2026 | 2026-09-01 Wikipedia dump and OpenAssistant files published with a signed source statement; prepared token streams published | +| mid-Sep to 19 Oct | Work on a large production pipeline (rental, transfer and budget guards). No training on real data happened in this period | +| 19 Oct | Switched to one script, `simple/ovl.py`, and segmented verification | +| 19 Oct 15:04 | Training starts on one RTX 5090. A second RTX 5090 mirrors every checkpoint off the training machine and recomputes each segment as it closes | +| 19 Oct ~20:30 | Training host fails; 19 minutes down; resumed from checkpoint 10 | +| 20 Oct ~02:15 | From boundary 19, the CPU thread pool is sized to the container quota: 120 → 63 ms per update | +| 20 Oct 06:46 | Wikipedia pass and conversation phase finished (15.7 hours in total) | +| 20 Oct | All 37 segments MATCH on the second GPU. Release uploaded and hash-checked; anchor timestamped at 14:38:43 | +| 20–21 Oct | Full rebuild of the training data from the raw dump: byte-identical. Hardware map, unlearning fork, fresh-machine checks | +| 21 Oct | Per-boundary timestamps (`simple/stamp.py`) and the one-click checker (`simple/checker_pod.sh` plus a RunPod template); first check: segment 8 MATCH | +| 22–26 Oct | Contributor fixes to `verify`: clearer weights message (#213), fail when no checks ran (#207), 17 CPU tests for `simple/ovl.py` (#208); a chain-head check against `anchor.json` (#210) is in review | +| 25 Oct | `simple-production-loop` merged into `main` (#217); 32 pull requests against the frozen pipeline closed | +| 26 Oct | Docs reorganized (design, project, guides), project logo added (#219) | + +## Cost + +Prices are RunPod list prices at the time: US$1.19/h for an RTX 5090 and US$0.50/h for the CPU +pod used for the data rebuild. Storage and transfer are not included. + +| Item | Time | Cost | +|---|---|---| +| Training (one RTX 5090) | 15.7 h, including a 19-minute outage and about 9 h at half speed before the CPU fix | about US$19 | +| Checking all 37 segments (second RTX 5090) | 10–16 h: one recomputation of every segment, at full or early speed | about US$12–19 | +| Rebuilding the training data from the raw dump (CPU pod) | about 23 h, plus a 3 h 20 min first attempt lost to a host reboot | about US$13 | +| Unlearning fork, hardware map, fresh-machine checks | a few GPU hours on RTX 5090, RTX 4090 and H100 pods | a few US$ | +| Pods kept running until the upload was verified | several hours on two 5090s | the largest avoidable cost | + +In total, the release took roughly **US$55–60** of rented compute. + +**A clean repeat** at full speed, with no outage and no idle time, would cost about **US$21** for +training plus checking every segment. These numbers come from the measured throughput (63 ms per +update) in `simple/bench_sizes.py`. The same calculation for bigger models: + +| Model | Training + full check | +|---|---| +| 23M | about US$21 | +| 42M | about US$34 | +| 70M | about US$52 | +| 110M | about US$73 | + +Checking is cheap per person: one segment is about 20 minutes of GPU time. Sampling also helps. +With N segments, M independent checkers who each pick one random segment catch a single forged +segment with probability 1 − ((N−1)/N)^M. + +## Things to avoid + +- **Don't put a verification method into the goal.** At one point the goal required one long + continuous replay. Segmented recomputation verifies the same computation, in parallel, at a + fraction of the risk. The goal should name the property ("every step is checkable"), not the + procedure. +- **Don't build safety machinery before anything runs.** A month of rental guards, transfer checks + and budget reservations produced no training on real data. The simple run started the morning + after the switch and finished in under a day. +- **Don't trust the host's CPU count inside a container.** PyTorch saw 120 cores and started 120 + threads, but the container's quota was 12.75 CPUs. It was throttled every scheduling period, and + the GPU sat about 50% idle. Read `/sys/fs/cgroup/cpu.max` and size thread pools to it. +- **Don't keep the only copy of a run on container disk.** On RunPod, `/workspace` on container disk + is wiped when the pod stops. A second machine mirrored every checkpoint as it was written, which + also made it the natural place to check each segment. +- **Don't expect bits to match across GPU architectures.** Pin the GPU type and the container image + tag, and say so to checkers up front. +- **Don't let a check pass with nothing checked.** `all([])` is `True` in Python. `verify` must + fail when it ran no checks (#207). +- **Don't leave paid pods idle.** Copy what you need off, verify it, then terminate. Most of the + difference between US$21 and the real total was outages, slow early steps and idle time. +- **Don't run day-long jobs without a way to resume.** The first data rebuild was lost to a host + reboot after 3 h 20 min. + +## Lessons learned + +- **Run something small end to end first.** July's small complete run worked. The attempt to + guarantee everything before starting cost a month. +- **Measure the platform.** The single largest speed-up (about 2×) came from a cgroup CPU quota, not + from the model or the GPU. +- **Verification that tolerates real life is worth more than verification that forbids it.** A host + failure, a code change and a driver change all happened mid-run. Because every segment is checked + on its own, each event became one more matched segment rather than a broken proof. +- **Recording the data position makes new things cheap.** Because each chain entry commits to the + exact training position, forking the run to remove one article took one extra chain entry and a + partial retrain, and gave an exact leave-one-out measurement for free. +- **Be explicit about what "verified" means.** The model is small and often wrong about facts. + Verification proves the computation, not the answers. + +## What "verified" means + +A **consistency check** (CPU, `ovl.py verify --weights` plus the timestamp check) shows that the +released files match the timestamped record: the model is the record's final state, and the record +hasn't changed since 2026-10-20. It recomputes no training, and the record comes from the publisher. + +A **segment check** recomputes one segment from its published starting checkpoint and compares the +result bit for bit. Checking every segment verifies the whole computation. What it relies on: + +- **Same architecture.** Bits match on RTX 5090. RTX 4090, H100 and CPU give a mismatch (the + hardware map). A checker needs a 5090, and the release can be checked only while 5090s are + available. +- **The toolchain.** Checkers run the same PyTorch, CUDA and container image. A deterministic error + there would give a match everywhere. That doesn't help a forger, but "verified" means + "this code on this stack produced these weights". +- **Enough independent checkers.** With N segments, M checkers who each pick one random segment + catch one forged segment with probability 1 − ((N−1)/N)^M. For N = 37 that's about 110 checks for + 95% and 169 for 99%. Longer runs with more segments need more checks. +- **Honest reporting.** A check result is a self-reported line, not signed, and nothing proves the + checker picked the segment at random. Signed results and public randomness for picking segments + are on the [roadmap](../project/roadmap.md). +- **Cost.** A full check costs as much compute as the training (the table above), and each + boundary stores the model and optimizer state (284 MB here, about 12 bytes per parameter). + For large models, full checks are only realistic for well-funded parties, so assurance comes from + sampling. + +## Limitations + +- A small model: fluent encyclopedic text, frequent factual errors, basic conversation. +- Checking needs the same GPU architecture as training. +- So far all segment checks were run by the project, on separate machines. None has been run by an + independent third party yet. +- The release timestamp proves the record existed no later than 2026-10-20 14:38:43 UTC, not when + or how training happened. Runs started after 21 Oct stamp every boundary as it is written. +- The repository's Git history was rewritten once, in September 2026 during repository maintenance, + before this run. It changed the public locations of the earlier pipeline's evidence (see + [the provenance note](../../project/evidence/history-maintenance-v1/PROVENANCE_STATUS.md)). This + run's record is anchored by its own timestamps, not by Git history. +- Removal works cheaply only for documents the run had not reached at the fork point. Removing an + earlier document means retraining from before its first appearance. + +## Status of the older pipeline + +The `docs/` pages other than this one, and `src/ovl_pipeline/`, describe the earlier production +pipeline. It is frozen: kept for reference and not used by the simple run, apart from the data +preparation and library files it imports. New work should target `simple/`. diff --git a/frontend/data/upstream/1049d2a7/docs/guides/check_a_segment.md b/frontend/data/upstream/1049d2a7/docs/guides/check_a_segment.md new file mode 100644 index 00000000..cdb01f3e --- /dev/null +++ b/frontend/data/upstream/1049d2a7/docs/guides/check_a_segment.md @@ -0,0 +1,98 @@ +# Check a training segment + +The released model's training is split into 37 segments. Each segment starts from a published +checkpoint, so anyone can recompute one segment on its own and compare the result, bit for bit, +with the published record. This guide shows three levels of checking, from a laptop to a rented +GPU. + +- [What you can check without a GPU](#without-a-gpu) +- [One segment, one click (RunPod)](#one-segment-one-click) +- [One segment, by hand](#one-segment-by-hand) +- [Check the timestamps](#check-the-timestamps) +- [What a check proves](#what-a-check-proves) + +The files are in the Hugging Face dataset +[`AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence`](https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/tree/main/release/simple-run), +folder `release/simple-run/`. + +## Without a GPU + +Download `release/simple-run/` without the `ckpt-*.pt` files, then from that folder: + +```bash +pip install huggingface_hub torch numpy rfc8785==0.1.4 tokenizers==0.23.2 mwparserfromhell==0.7.2 \ + "safetensors>=0.4.5,<1.0" "pynacl>=1.5,<2.0" +sha256sum -c --ignore-missing release-hashes.txt # every downloaded file matches the hash list +git clone -q --depth 1 --branch v1.0.1 https://github.com/AOSSIE-Org/OpenVerifiableLLM ovl-code +OVL_DEVICE=cpu python ovl-code/simple/ovl.py verify --run . --weights conversation-model.pt +# anchor anchor.json: chain head MATCH (38 entries) +# weights conversation-model.pt: MATCH chain entry 37 +``` + +This checks that `chain.jsonl` ends at the timestamped head in `anchor.json`, and that the published +model is exactly the state committed at the end of training. Use `ovl.py` from the v1.0.1 tag, as +above; it also fails if `anchor.json` is missing. The copy in the download's `code/` folder predates the anchor check, so an edited record +would still pass with it. With the prepared data (`--data`), `verify` also regenerates the +seeded starting weights and compares them with entry 0. That part works on any device, including a +CPU. + +## One segment, one click + +Recomputing a segment needs an **NVIDIA RTX 5090**, the GPU type the run was trained on. Other +architectures run different low-level kernels and do not reproduce the bits. + +1. Deploy the public RunPod template "OpenVerifiableLLM segment check" on an RTX 5090: + (60 GB container disk, no volume). +2. Wait about an hour: a 22 GB download, then about 20 minutes of training. +3. Open the pod's **Logs** or run `tail /workspace/check.log`. The last lines look like: + + ```text + OVL check PASS: segment 8 MATCH | NVIDIA GeForce RTX 5090, 595.91.07 | torch 2.8.0+cu128 | final state 934d681c99e5 | release 96dc282a | 2026-10-21 + ``` + +4. Post that line in the project Discord, then **terminate the pod**. It costs about US$1–1.50. + +The template runs [`simple/checker_pod.sh`](../../simple/checker_pod.sh) at a fixed commit. It +downloads the release's own code from Hugging Face at a pinned revision and runs +`verify_segment.sh`. Nothing is uploaded, and no account or token is needed. Set `K=3` to check +three random segments, or `SEGMENTS="7 8"` to choose them. + +## One segment, by hand + +Use an RTX 5090 with the image `runpod/pytorch:1.0.2-cu1281-torch280-ubuntu2404` (PyTorch 2.8.0, +CUDA 12.8). From the release's `code/` folder, or a clone of this repository: + +```bash +bash simple/verify_segment.sh # one random segment (~20 min) +K=3 bash simple/verify_segment.sh # three random segments +SEGMENTS="7 8" bash simple/verify_segment.sh # chosen segments +``` + +The script downloads the prepared data (hash-checked), the record and only the checkpoints it +needs. It prints `segment k->k+1: MATCH` or `MISMATCH` for each segment, and appends the result +to `verifications.jsonl`. + +## Check the timestamps + +`anchor.json` records the release's chain head and file hashes. Two independent RFC 3161 timestamp +authorities stamped it at 2026-10-20 14:38:43 UTC: + +```bash +openssl ts -verify -in anchor.digicert.tsr -data anchor.json -CAfile /etc/ssl/certs/ca-certificates.crt +curl -sO https://freetsa.org/files/cacert.pem; curl -sO https://freetsa.org/files/tsa.crt +openssl ts -verify -in anchor.freetsa.tsr -data anchor.json -CAfile cacert.pem -untrusted tsa.crt +``` + +Runs trained with the current `simple/ovl.py` also stamp every chain entry as it is written. +Check those with `python simple/stamp.py RUN --check`. + +## What a check proves + +A MATCH means the published checkpoint k, trained under the published recipe on the published +data, produces exactly the published state k+1. If all 37 segments match, the whole training +computation is verified. One forged segment among N is caught by a single random check with +probability 1/N. M independent checkers who each pick one random segment catch it with +probability 1 − ((N−1)/N)^M, which is why every independent check counts. + +A check does not show the model's answers are true. It shows the model is exactly what this +training on this data produces. diff --git a/frontend/data/upstream/1049d2a7/docs/guides/ollama.md b/frontend/data/upstream/1049d2a7/docs/guides/ollama.md new file mode 100644 index 00000000..d5d91032 --- /dev/null +++ b/frontend/data/upstream/1049d2a7/docs/guides/ollama.md @@ -0,0 +1,50 @@ +# Run the model in Ollama + +The released chat model can run in [Ollama](https://ollama.com) and other llama.cpp-based apps. It +is exported to GGUF with the model's own tokenizer and chat format. + +This is for trying the model. It isn't how the model is verified. llama.cpp uses a slightly +different GELU and different kernels, so its outputs are close to PyTorch's but not bit-identical. +To check the model, use the released `.pt` files and [`ovl.py verify`](check_a_segment.md). + +## Run it + +The model is on the Ollama registry as +[`ryoari/openverifiablellm`](https://ollama.com/ryoari/openverifiablellm): + +```bash +ollama run ryoari/openverifiablellm "Tell me about the Moon." +``` + +The GGUF file is also attached to the +[v1.0.0 release](https://github.com/AOSSIE-Org/OpenVerifiableLLM/releases/tag/v1.0.0) and stored in the +[Hugging Face dataset](https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/tree/2fbebaa3ac861898eb8a3dbd9a2a44d08d08216c/release/simple-run/gguf) +(revision `2fbebaa3`). All three are the same file, SHA-256 +`541d49c97b87cd4ed0acb90b4327535ee20b8c11c452e2583d460154e9d980de`. Running +`ollama show --modelfile ryoari/openverifiablellm` prints a `FROM` line ending in that hash. + +## Build it yourself + +You need the release's run folder and tokenizer (see [Check a training segment](check_a_segment.md) +for the download), plus `pip install gguf torch`. + +```bash +python simple/export_gguf.py --run RUN --tokenizer PREP/tokenizer/tokenizer.json --out ovl-23m-chat.gguf +ollama create openverifiablellm -f simple/Modelfile # run where ovl-23m-chat.gguf is +ollama run openverifiablellm "Tell me about the Moon." +``` + +`--model base` exports the Wikipedia-only model instead, which continues text rather than chatting. +The GGUF's description records the SHA-256 of the `.pt` file it came from. + +## What the export contains + +| | | +|---|---| +| Architecture | llama.cpp `gpt2`: 6 layers, 6 heads, 384 dimensions, 512-token context | +| Weights | float32, unchanged from the released `.pt` file (143 MB) | +| Tokenizer | GPT-2-style byte-level BPE, 32,000 tokens: `<\|pad\|>`, `<\|bos\|>`, `<\|eos\|>`, `<\|user\|>` and `<\|assistant\|>` at ids 0–4, then the trained vocabulary | +| Chat format | `<\|user\|>` question `<\|eos\|>` `<\|assistant\|>` answer `<\|eos\|>`, as in training | + +Running the exported tensors with llama.cpp's GPT-2 computation reproduces the PyTorch model's +greedy output token for token on a test prompt. diff --git a/frontend/data/upstream/1049d2a7/docs/project/roadmap.md b/frontend/data/upstream/1049d2a7/docs/project/roadmap.md new file mode 100644 index 00000000..2d9ce06e --- /dev/null +++ b/frontend/data/upstream/1049d2a7/docs/project/roadmap.md @@ -0,0 +1,58 @@ +# Roadmap + +## Done + +- **July 2026: reproducibility study.** Same-GPU recomputation matches bit for bit; other + architectures do not. A segmented replay audit cost 0.173 of training, against a theoretical + 0.15. +- **September 2026: data provenance.** The 2026-09-01 Wikipedia dump and OpenAssistant files + were published with a signed source statement, together with the prepared token streams. +- **October 2026: the simple run.** A 23M model was trained on one exact pass over English + Wikipedia, and all 37 segments were recomputed bit for bit. The data rebuild from the raw dump + gives byte-identical files. It also includes: + - a hardware reproducibility map; + - a verifiable exclusion fork (one article the run hadn't reached, retrained without it); + - RFC 3161 timestamps, per boundary since 21 Oct; + - a one-click segment check on RunPod. + + See [the simple run](../design/simple_run.md). +- **Late October 2026: hardening `verify`.** Contributor fixes: `verify` fails when it ran no + checks, clearer output for non-released weights, and CPU tests for `simple/ovl.py`. Since v1.0.1, + a missing `anchor.json` is a failure unless `--no-anchor` is given explicitly. + +## Next + +- **Independent checks.** Get segments checked by people outside the project, using the + [one-click check](../guides/check_a_segment.md#one-segment-one-click). This is the single most + valuable next step for the release's credibility. +- **Cheaper checks.** Publish per-segment data slices, so that checking one segment doesn't need + the full 22 GB of prepared data. +- **Per-article membership proofs.** For any Wikipedia article, show which segment trained on it, + with a proof against the chain. +- **Signed check results and random segment choice.** Today a check result is a self-reported line. + Checkers would sign their result, and the segment would be picked from public randomness (for + example a drand beacon round), so results can't be faked in bulk or aimed at honest segments. + +## Open research questions + +- **Checking across GPU architectures.** Bits currently match only on the training architecture. + Integer or fixed-point training, or a reference path with defined rounding, could let other + hardware check the same run. +- **Checking for less than the cost of training.** A full check costs as much as training. Proofs + for some steps, or a checker protocol with attested random sampling, could lower that. + +## Planned, pending funding + +- **A bigger model** with the same method. Measured cost of training plus checking every segment + at current throughput: + + | Model | Cost | + |---|---| + | 42M | about US$34 | + | 70M | about US$52 | + | 110M | about US$73 | + +## Not planned + +- A separate docs website or hosted demo app. The repository docs and the Hugging Face release + are the documentation. diff --git a/frontend/data/upstream/github-release-v1.0.1.json b/frontend/data/upstream/github-release-v1.0.1.json new file mode 100644 index 00000000..6159a8f6 --- /dev/null +++ b/frontend/data/upstream/github-release-v1.0.1.json @@ -0,0 +1,20 @@ +{ + "fetched": "2026-10-29", + "api": "https://api.github.com/repos/AOSSIE-Org/OpenVerifiableLLM/releases/tags/v1.0.1", + "tag_name": "v1.0.1", + "html_url": "https://github.com/AOSSIE-Org/OpenVerifiableLLM/releases/tag/v1.0.1", + "assets": [ + { + "name": "Modelfile", + "size": 722, + "digest": "sha256:df4dacfc3191e56b1dc1195764ea66ca1a7695856be04ecec17d8dde4c66fc8b", + "browser_download_url": "https://github.com/AOSSIE-Org/OpenVerifiableLLM/releases/download/v1.0.1/Modelfile" + }, + { + "name": "ovl-23m-chat.gguf", + "size": 142815808, + "digest": "sha256:541d49c97b87cd4ed0acb90b4327535ee20b8c11c452e2583d460154e9d980de", + "browser_download_url": "https://github.com/AOSSIE-Org/OpenVerifiableLLM/releases/download/v1.0.1/ovl-23m-chat.gguf" + } + ] +} \ No newline at end of file diff --git a/frontend/data/upstream/manifest.json b/frontend/data/upstream/manifest.json new file mode 100644 index 00000000..6fafc054 --- /dev/null +++ b/frontend/data/upstream/manifest.json @@ -0,0 +1,26 @@ +{ + "repo": "AOSSIE-Org/OpenVerifiableLLM", + "commit": "1049d2a782b8f63103abfa0cca8deab0d2037290", + "files": { + "README.md": { + "gitBlob": "5343ea0d37e4bb7cf9bafb18c8f86e6b2f2c69df", + "sha256": "ef32e41029216b56737713162a977c1f770e3afe4f5c0f4392a1c27c4c91e19d" + }, + "docs/design/simple_run.md": { + "gitBlob": "e7010989073191edc59ac0db97ed823e98766b66", + "sha256": "5eee8d48beddecd5ed825cbc680ce1c92d9ddeb8fb715f76156380cdcb1d4375" + }, + "docs/guides/check_a_segment.md": { + "gitBlob": "cdb01f3ea23d31186a333cd6053b5e08e69b938e", + "sha256": "2adafdace168bf92e78236b65fe238002d460937efe34fa94c8942d9b5f73424" + }, + "docs/guides/ollama.md": { + "gitBlob": "d5d91032a625cc5402e5589908ae5b9f02655d58", + "sha256": "0af9c9ed5d737b99342d0875f92f3ad980bf42edddb941aa253d94c1efe0ec0f" + }, + "docs/project/roadmap.md": { + "gitBlob": "2d9ce06ed7319ac4f25017e851e776ace7ce9062", + "sha256": "46b73d327ef71fab7fe075b00d7cb3681c2d4c7a64a7d3c5b8aebf1965ea7092" + } + } +} \ No newline at end of file diff --git a/frontend/public/data/site-data.json b/frontend/public/data/site-data.json new file mode 100644 index 00000000..d2482450 --- /dev/null +++ b/frontend/public/data/site-data.json @@ -0,0 +1,4864 @@ +{ + "schema": "ovl-site-data.v2", + "dataset": "AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence", + "revision": "96dc282a9803616c6b30bb31bfc3a0b91a7191e6", + "revShort": "96dc282a", + "hfTree": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/tree/96dc282a9803616c6b30bb31bfc3a0b91a7191e6", + "upstream": { + "repo": "https://github.com/AOSSIE-Org/OpenVerifiableLLM", + "commit": "1049d2a782b8f63103abfa0cca8deab0d2037290", + "short": "1049d2a7" + }, + "rawFiles": { + "release/simple-run/chain.jsonl": { + "sha256": "c1f867e16d0660c611186183863cc5626e3510b046d52e617c3953beb8f8a327", + "bytes": 19686 + }, + "release/simple-run/verifications.jsonl": { + "sha256": "ec73fe8fdce56eb075783c37383dbb5afaa23fac168fbd6619c01240de41b770", + "bytes": 7355 + }, + "release/simple-run/hardware-map.jsonl": { + "sha256": "5116f365398795a5e79513a3709d48995cc72a059ae9c69c653e324e723884e4", + "bytes": 956 + }, + "release/simple-run/release-hashes.txt": { + "sha256": "479ce030fa8022f0f92262849f88dfde4c9cf2a0748b8830357f3aa277080e8d", + "bytes": 3364 + }, + "release/simple-run/anchor.json": { + "sha256": "2adaea4cae25439199ec2396c0e6e94d1d14188c070f217ed7e360ce10c1c18d", + "bytes": 689 + }, + "release/simple-run/anchor.digicert.tsr": { + "sha256": "26a643321802ec92eb67f842d770c1d0b69aee66d3e9c3b58f84380a65d08564", + "bytes": 6007 + }, + "release/simple-run/anchor.freetsa.tsr": { + "sha256": "4c1cc74f8596fff22125f285899d50b3ab50b69a6a1023baf3d68139f32cba6f", + "bytes": 4644 + }, + "release/simple-run/README.md": { + "sha256": "d3a4a5b221d9d1bd9318e8e414b44adc75f66155d03cd356b489165243e932e9", + "bytes": 8250 + }, + "release/simple-run/recipe.json": { + "sha256": "28a2fb407a5582ae95c9e9b0bba2c14df946e87bba037800399c6059256b6e6d", + "bytes": 458 + }, + "release/unlearning-3i-atlas/chain.jsonl": { + "sha256": "98ffe339f9a0e20458b2615597fdb9ca23b0b12a5bac3873c9327893e724e6c1", + "bytes": 20725 + }, + "release/unlearning-3i-atlas/verifications.jsonl": { + "sha256": "6f23946c7bcb7413a7f8b7fa322f5fa6b3240caa93c6d4d63c5a7133cbc9e7ec", + "bytes": 1788 + }, + "release/unlearning-3i-atlas/loo-results.json": { + "sha256": "c926c965d1e040ab23c591c9dcdd007e5ece75a57ecfa100fd69515d190ead69", + "bytes": 2158 + }, + "release/unlearning-3i-atlas/release-hashes.txt": { + "sha256": "8b5800df8a3f88622d9cd91beb72949b37762e3e0b5f42253cd78c99c54ea508", + "bytes": 1044 + }, + "release/unlearning-3i-atlas/README.md": { + "sha256": "499eb00a91699fa785c94fcbf3d8e96f0ad71d390752ee4523d2b019a010f560", + "bytes": 3744 + }, + "release/unlearning-3i-atlas/recipe.json": { + "sha256": "28a2fb407a5582ae95c9e9b0bba2c14df946e87bba037800399c6059256b6e6d", + "bytes": 458 + }, + "prepared/8de1d60065b1e8e084c31c202e47367f28c8b89f11b4e895873f775bc0f7ba68/preparation.json": { + "sha256": "8de1d60065b1e8e084c31c202e47367f28c8b89f11b4e895873f775bc0f7ba68", + "bytes": 7985 + } + }, + "model": { + "millionParameters": 23, + "src": { + "origin": "hf", + "file": "release/simple-run/README.md", + "rev": "96dc282a", + "line": 3, + "lineEnd": null, + "raw": "A 23-million-parameter GPT trained from a seeded random start on one exact pass over English", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/README.md#L3" + }, + "recipe": { + "layers": 6, + "seed": 1234 + } + }, + "chain": { + "entries": 38, + "segments": 37, + "phases": [ + { + "phase": "wikipedia", + "first": 0, + "last": 30 + }, + { + "phase": "conversation", + "first": 31, + "last": 36 + } + ], + "boundaries": [ + { + "index": 0, + "kind": "initial", + "phase": "wikipedia", + "time": 1792422250.861772, + "utc": "2026-10-19T15:04:10.861772Z", + "model": "2b167bcb407f94ac3f1dead8f316ea180823a1cb40489b8a1ff974bf2bcd959d", + "state": "64041a4736bd76b64b149c2a784950a312fb19ed641c7eb87e7300c171d002fc", + "previous": null, + "src": { + "origin": "hf", + "file": "release/simple-run/chain.jsonl", + "rev": "96dc282a", + "line": 1, + "lineEnd": null, + "raw": "{\"control\": {\"batches\": \"10ea13010a13668c8bf9e2884e16bdbd16f8933d9bf4d09eda0c47459133eddb\", \"cursor\": 0, \"epoch\": 0, \"global_step\": 0, \"phase\": \"wikipedia\", \"phase_step\": 0, \"pos\": [0, 0]}, \"data\": {\"conversation\": \"e179de793decc82e8cecfbfabd7d449d1caf145a988c4c881a9a041dcda36b7f\", \"wikipedia\": \"a49baead333842ac36669a62a752ea6204295e4012a6bfa2d8f2b8c85981d832\"}, \"environment\": {\"cublas_workspace\": \":4096:8\", \"cuda\": \"12.8\", \"cudnn\": 91002, \"gpu\": \"NVIDIA GeForce RTX 5090\", \"torch\": \"2.8.0+cu128\"}, \"index\": 0, \"kind\": \"initial\", \"model\": \"2b167bcb407f94ac3f1dead8f316ea180823a1cb40489b8a1ff974bf2bcd959d\", \"previous\": null, \"recipe\": \"d0d9fc61c46b0f0e0b63e336579e7443860141452d881b1e7297ad46439f9fc5\", \"state\": \"64041a4736bd76b64b149c2a784950a312fb19ed641c7eb87e7300c171d002fc\", \"time\": 1792422250.861772}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/chain.jsonl#L1" + } + }, + { + "index": 1, + "kind": "progress", + "phase": "wikipedia", + "time": 1792424215.6430938, + "utc": "2026-10-19T15:36:55.643094Z", + "model": "c32f02fac9e87d0c4279aa39a0fa06b5cc06d5b141d5ff29503cb8431c4ca180", + "state": "ef5090325fcf3c392503406ac2f7e6bd99118d267c38fbe4b624df41b48eca8f", + "previous": "504f691b0958076c19294758dd4ba134b01e8740baa160f98d3b8e49dd2118e2", + "src": { + "origin": "hf", + "file": "release/simple-run/chain.jsonl", + "rev": "96dc282a", + "line": 2, + "lineEnd": null, + "raw": "{\"control\": {\"batches\": \"e3f19a5269c4824fb1615d433b678fa54a6fc23ea99fd82c3e83f3f400f66809\", \"cursor\": 274561003, \"epoch\": 0, \"global_step\": 18080, \"phase\": \"wikipedia\", \"phase_step\": 18080, \"pos\": [14363834, 3072]}, \"index\": 1, \"kind\": \"progress\", \"model\": \"c32f02fac9e87d0c4279aa39a0fa06b5cc06d5b141d5ff29503cb8431c4ca180\", \"previous\": \"504f691b0958076c19294758dd4ba134b01e8740baa160f98d3b8e49dd2118e2\", \"state\": \"ef5090325fcf3c392503406ac2f7e6bd99118d267c38fbe4b624df41b48eca8f\", \"time\": 1792424215.6430938}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/chain.jsonl#L2" + } + }, + { + "index": 2, + "kind": "progress", + "phase": "wikipedia", + "time": 1792426181.1370955, + "utc": "2026-10-19T16:09:41.137095Z", + "model": "29c055caaaefce12e962bb5905f79640bf7bcfc2dfe09070704f50a35e954868", + "state": "94e253d50adff230867baf0f9b2fbb247399b598511dd238cca10838439a228c", + "previous": "7c6fd00419883c91e75e804f7bc8e6b35bee3853c9202fd27f998c6ef23bb66f", + "src": { + "origin": "hf", + "file": "release/simple-run/chain.jsonl", + "rev": "96dc282a", + "line": 3, + "lineEnd": null, + "raw": "{\"control\": {\"batches\": \"d5b199348b8d97e5a30ee2ea1a9bc465fd5dc0220a1a4297b4fa0716abdc84dc\", \"cursor\": 547313827, \"epoch\": 0, \"global_step\": 36160, \"phase\": \"wikipedia\", \"phase_step\": 36160, \"pos\": [30161308, 6656]}, \"index\": 2, \"kind\": \"progress\", \"model\": \"29c055caaaefce12e962bb5905f79640bf7bcfc2dfe09070704f50a35e954868\", \"previous\": \"7c6fd00419883c91e75e804f7bc8e6b35bee3853c9202fd27f998c6ef23bb66f\", \"state\": \"94e253d50adff230867baf0f9b2fbb247399b598511dd238cca10838439a228c\", \"time\": 1792426181.1370955}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/chain.jsonl#L3" + } + }, + { + "index": 3, + "kind": "progress", + "phase": "wikipedia", + "time": 1792428164.4587104, + "utc": "2026-10-19T16:42:44.458710Z", + "model": "bc0210cc1ce7eb55786921b9be9142224551daaa14a5a94b5851415d9954513f", + "state": "63f2f1cf69a97b295ef4924af836583cc5942d4cfdde34a0d68da658e9b56875", + "previous": "491740cf089c9f5f7f6bcb98358f09629921444366cc64746d2ca443070e8789", + "src": { + "origin": "hf", + "file": "release/simple-run/chain.jsonl", + "rev": "96dc282a", + "line": 4, + "lineEnd": null, + "raw": "{\"control\": {\"batches\": \"f520d10b29d43cbbe5556d887bd7e622a26ed3003eaa8677366993ed6a0965df\", \"cursor\": 812314162, \"epoch\": 0, \"global_step\": 54240, \"phase\": \"wikipedia\", \"phase_step\": 54240, \"pos\": [50875269, 0]}, \"index\": 3, \"kind\": \"progress\", \"model\": \"bc0210cc1ce7eb55786921b9be9142224551daaa14a5a94b5851415d9954513f\", \"previous\": \"491740cf089c9f5f7f6bcb98358f09629921444366cc64746d2ca443070e8789\", \"state\": \"63f2f1cf69a97b295ef4924af836583cc5942d4cfdde34a0d68da658e9b56875\", \"time\": 1792428164.4587104}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/chain.jsonl#L4" + } + }, + { + "index": 4, + "kind": "progress", + "phase": "wikipedia", + "time": 1792430142.4307606, + "utc": "2026-10-19T17:15:42.430761Z", + "model": "f6c1733d73e556de085fd9cb99f4137296f9ad7835fc3c88c9f8588cfeca0165", + "state": "38544968f3a1f342c17ee65afed30915acacf2131314c3254cfb1d3367acf0f6", + "previous": "21ece8367d0fd3dfacba13dd330f401b1229748f994f91a6053a0f85fd421a37", + "src": { + "origin": "hf", + "file": "release/simple-run/chain.jsonl", + "rev": "96dc282a", + "line": 5, + "lineEnd": null, + "raw": "{\"control\": {\"batches\": \"9b1c36b8b217b225ab637476b5f96e9d13723e8ff2f49474a1aff9fe4b6c6836\", \"cursor\": 1071169817, \"epoch\": 0, \"global_step\": 72320, \"phase\": \"wikipedia\", \"phase_step\": 72320, \"pos\": [75821490, 512]}, \"index\": 4, \"kind\": \"progress\", \"model\": \"f6c1733d73e556de085fd9cb99f4137296f9ad7835fc3c88c9f8588cfeca0165\", \"previous\": \"21ece8367d0fd3dfacba13dd330f401b1229748f994f91a6053a0f85fd421a37\", \"state\": \"38544968f3a1f342c17ee65afed30915acacf2131314c3254cfb1d3367acf0f6\", \"time\": 1792430142.4307606}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/chain.jsonl#L5" + } + }, + { + "index": 5, + "kind": "progress", + "phase": "wikipedia", + "time": 1792432107.6645238, + "utc": "2026-10-19T17:48:27.664524Z", + "model": "521f1f5f34c6a0992a15e539f1eab5f5590f5fdca15fdf16c60842c1d8612754", + "state": "0f66051bfcf2b8512da505733cf9814527aba0412b28109071d9ebe1e7949165", + "previous": "7aab36987ca192ef19b1aa63efbfc63d005ed8e541ca07190e1c09b7371f3ab6", + "src": { + "origin": "hf", + "file": "release/simple-run/chain.jsonl", + "rev": "96dc282a", + "line": 6, + "lineEnd": null, + "raw": "{\"control\": {\"batches\": \"0feb0c99169621a584609ce24a7ba1710f4dd1127205dae3911df09e1ab75698\", \"cursor\": 1326339931, \"epoch\": 0, \"global_step\": 90400, \"phase\": \"wikipedia\", \"phase_step\": 90400, \"pos\": [103716532, 512]}, \"index\": 5, \"kind\": \"progress\", \"model\": \"521f1f5f34c6a0992a15e539f1eab5f5590f5fdca15fdf16c60842c1d8612754\", \"previous\": \"7aab36987ca192ef19b1aa63efbfc63d005ed8e541ca07190e1c09b7371f3ab6\", \"state\": \"0f66051bfcf2b8512da505733cf9814527aba0412b28109071d9ebe1e7949165\", \"time\": 1792432107.6645238}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/chain.jsonl#L6" + } + }, + { + "index": 6, + "kind": "progress", + "phase": "wikipedia", + "time": 1792434050.5597794, + "utc": "2026-10-19T18:20:50.559779Z", + "model": "655aa1b3b7f5a34c9f0a2eba172ddbfef233acb3f121373e351b6d2cd982475f", + "state": "d3f93a22ceb28a8640734ceca70e0217cf991b696807ecb6fdd31d318ad30aa8", + "previous": "5333b1e668315511ed83188188343e3de85e91c4382a997a8b1e649e59c472aa", + "src": { + "origin": "hf", + "file": "release/simple-run/chain.jsonl", + "rev": "96dc282a", + "line": 7, + "lineEnd": null, + "raw": "{\"control\": {\"batches\": \"dd5c823c56a28362db599fa09567143434f9f343784400622105200695fca78d\", \"cursor\": 1575735740, \"epoch\": 0, \"global_step\": 108480, \"phase\": \"wikipedia\", \"phase_step\": 108480, \"pos\": [135269108, 0]}, \"index\": 6, \"kind\": \"progress\", \"model\": \"655aa1b3b7f5a34c9f0a2eba172ddbfef233acb3f121373e351b6d2cd982475f\", \"previous\": \"5333b1e668315511ed83188188343e3de85e91c4382a997a8b1e649e59c472aa\", \"state\": \"d3f93a22ceb28a8640734ceca70e0217cf991b696807ecb6fdd31d318ad30aa8\", \"time\": 1792434050.5597794}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/chain.jsonl#L7" + } + }, + { + "index": 7, + "kind": "progress", + "phase": "wikipedia", + "time": 1792435994.2637668, + "utc": "2026-10-19T18:53:14.263767Z", + "model": "ab677b66cfcc2d0652d37b5cc354e5d6980716b273cc99b78ae53f63e581ba14", + "state": "228e635e6ee63fca5189f1af685f15c9d52a27527f300e7dac7a5ade82688e11", + "previous": "bd8ab58402e382c3378b92efebbb0666d02a034cb8ebb0dfed38c64b339df85a", + "src": { + "origin": "hf", + "file": "release/simple-run/chain.jsonl", + "rev": "96dc282a", + "line": 8, + "lineEnd": null, + "raw": "{\"control\": {\"batches\": \"496333b0221dbc6a2edeeb9ea5318d3b33069b8f91c98d489cf742f70bab1d43\", \"cursor\": 1821662484, \"epoch\": 0, \"global_step\": 126560, \"phase\": \"wikipedia\", \"phase_step\": 126560, \"pos\": [169162007, 512]}, \"index\": 7, \"kind\": \"progress\", \"model\": \"ab677b66cfcc2d0652d37b5cc354e5d6980716b273cc99b78ae53f63e581ba14\", \"previous\": \"bd8ab58402e382c3378b92efebbb0666d02a034cb8ebb0dfed38c64b339df85a\", \"state\": \"228e635e6ee63fca5189f1af685f15c9d52a27527f300e7dac7a5ade82688e11\", \"time\": 1792435994.2637668}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/chain.jsonl#L8" + } + }, + { + "index": 8, + "kind": "progress", + "phase": "wikipedia", + "time": 1792437967.4633026, + "utc": "2026-10-19T19:26:07.463303Z", + "model": "4419b42c7902c6f650e634055a1de54ca172e2a0a26c5bbad58ee8516cf4dfc6", + "state": "6cb7cf58b036f71d793b7940617d2756e4d24e906a8a4fdb6ec58ee56031ad53", + "previous": "8784633f5bc8763129ce3ca0727e4c1b11339afa37096f990ce299d155b74acc", + "src": { + "origin": "hf", + "file": "release/simple-run/chain.jsonl", + "rev": "96dc282a", + "line": 9, + "lineEnd": null, + "raw": "{\"control\": {\"batches\": \"a009f3186720dd943c7c0e3c597706610370b795c3fd87b65df4ce8cdc54822d\", \"cursor\": 2062246462, \"epoch\": 0, \"global_step\": 144640, \"phase\": \"wikipedia\", \"phase_step\": 144640, \"pos\": [206335253, 0]}, \"index\": 8, \"kind\": \"progress\", \"model\": \"4419b42c7902c6f650e634055a1de54ca172e2a0a26c5bbad58ee8516cf4dfc6\", \"previous\": \"8784633f5bc8763129ce3ca0727e4c1b11339afa37096f990ce299d155b74acc\", \"state\": \"6cb7cf58b036f71d793b7940617d2756e4d24e906a8a4fdb6ec58ee56031ad53\", \"time\": 1792437967.4633026}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/chain.jsonl#L9" + } + }, + { + "index": 9, + "kind": "progress", + "phase": "wikipedia", + "time": 1792439938.9320748, + "utc": "2026-10-19T19:58:58.932075Z", + "model": "967ff641117b62e0f4bbb19fda16cfb7a1b6c20adc35295ff0738a0664953048", + "state": "0947a1b7cb257922ed1bb71e36059bdde1fa1c76509255c1af8cb3167bff72db", + "previous": "09803876eabd9ae24bbc5ba4f4ae5047e9da90d725cc3d5ca70445ede3b9b9ae", + "src": { + "origin": "hf", + "file": "release/simple-run/chain.jsonl", + "rev": "96dc282a", + "line": 10, + "lineEnd": null, + "raw": "{\"control\": {\"batches\": \"9f883e76562c687ddae51575bda5430cc91dbc45e57e7311d3646340a420a020\", \"cursor\": 2299429619, \"epoch\": 0, \"global_step\": 162720, \"phase\": \"wikipedia\", \"phase_step\": 162720, \"pos\": [245609368, 0]}, \"index\": 9, \"kind\": \"progress\", \"model\": \"967ff641117b62e0f4bbb19fda16cfb7a1b6c20adc35295ff0738a0664953048\", \"previous\": \"09803876eabd9ae24bbc5ba4f4ae5047e9da90d725cc3d5ca70445ede3b9b9ae\", \"state\": \"0947a1b7cb257922ed1bb71e36059bdde1fa1c76509255c1af8cb3167bff72db\", \"time\": 1792439938.9320748}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/chain.jsonl#L10" + } + }, + { + "index": 10, + "kind": "progress", + "phase": "wikipedia", + "time": 1792441925.2640333, + "utc": "2026-10-19T20:32:05.264033Z", + "model": "cb2fbe49be6ead1201600d45004f411c7ed3ba0d532ebe2417b1a43ba40d9889", + "state": "e162c0ef79462cfcc2c88cd336170df12f92f1f6d099920decca178da9dd455a", + "previous": "e00e8ee29ee6ee131fa246a6ec1d787a2752857efb34b0d1f369db3e7a62bf43", + "src": { + "origin": "hf", + "file": "release/simple-run/chain.jsonl", + "rev": "96dc282a", + "line": 11, + "lineEnd": null, + "raw": "{\"control\": {\"batches\": \"14ffdd92074c743ba35ff842d9d2956a29ff1ecf6b93820fc1bedb2161e2f20f\", \"cursor\": 2534896708, \"epoch\": 0, \"global_step\": 180800, \"phase\": \"wikipedia\", \"phase_step\": 180800, \"pos\": [285958813, 5632]}, \"index\": 10, \"kind\": \"progress\", \"model\": \"cb2fbe49be6ead1201600d45004f411c7ed3ba0d532ebe2417b1a43ba40d9889\", \"previous\": \"e00e8ee29ee6ee131fa246a6ec1d787a2752857efb34b0d1f369db3e7a62bf43\", \"state\": \"e162c0ef79462cfcc2c88cd336170df12f92f1f6d099920decca178da9dd455a\", \"time\": 1792441925.2640333}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/chain.jsonl#L11" + } + }, + { + "index": 11, + "kind": "progress", + "phase": "wikipedia", + "time": 1792445221.8958924, + "utc": "2026-10-19T21:27:01.895892Z", + "model": "21e5ccc4f7a7b4c8b311febbdcb0cd037a2efff64c715935853fa663b61e5aeb", + "state": "be21dd4e7d988157822d75f6600146be013afa826076b49b45b3874e5a2bd1ca", + "previous": "19b1091f16ffa0006a0853ed750d237a528a54e3dcc93101fee747134200803b", + "src": { + "origin": "hf", + "file": "release/simple-run/chain.jsonl", + "rev": "96dc282a", + "line": 12, + "lineEnd": null, + "raw": "{\"control\": {\"batches\": \"7321c9e7f9b890c6b657525ffc10389c70e730b37f0ccaa0281264b7aaeec2ca\", \"cursor\": 2758953574, \"epoch\": 0, \"global_step\": 198880, \"phase\": \"wikipedia\", \"phase_step\": 198880, \"pos\": [331465519, 0]}, \"index\": 11, \"kind\": \"progress\", \"model\": \"21e5ccc4f7a7b4c8b311febbdcb0cd037a2efff64c715935853fa663b61e5aeb\", \"previous\": \"19b1091f16ffa0006a0853ed750d237a528a54e3dcc93101fee747134200803b\", \"state\": \"be21dd4e7d988157822d75f6600146be013afa826076b49b45b3874e5a2bd1ca\", \"time\": 1792445221.8958924}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/chain.jsonl#L12" + } + }, + { + "index": 12, + "kind": "progress", + "phase": "wikipedia", + "time": 1792447305.2481282, + "utc": "2026-10-19T22:01:45.248128Z", + "model": "ee22252416c44a8812aab40b456c60351eaf714679495ef7c39a81c3d24db503", + "state": "c9d571c059311fbeb20f46d33a56497113b1f3705b75939ef57e61cc98978ca6", + "previous": "5d4ad7bed8d2d8701de142eae5eea79a44bf54fc11e2a4623cb0baeea01efe18", + "src": { + "origin": "hf", + "file": "release/simple-run/chain.jsonl", + "rev": "96dc282a", + "line": 13, + "lineEnd": null, + "raw": "{\"control\": {\"batches\": \"0d86e2942f9d84483cd0e3cd5168d81cf418e915c04e25f94c03d3ad703c648d\", \"cursor\": 2977003841, \"epoch\": 0, \"global_step\": 216960, \"phase\": \"wikipedia\", \"phase_step\": 216960, \"pos\": [379051570, 512]}, \"index\": 12, \"kind\": \"progress\", \"model\": \"ee22252416c44a8812aab40b456c60351eaf714679495ef7c39a81c3d24db503\", \"previous\": \"5d4ad7bed8d2d8701de142eae5eea79a44bf54fc11e2a4623cb0baeea01efe18\", \"state\": \"c9d571c059311fbeb20f46d33a56497113b1f3705b75939ef57e61cc98978ca6\", \"time\": 1792447305.2481282}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/chain.jsonl#L13" + } + }, + { + "index": 13, + "kind": "progress", + "phase": "wikipedia", + "time": 1792449363.6749403, + "utc": "2026-10-19T22:36:03.674940Z", + "model": "978af11d622fb0e48dd842f5aa27e9992c267de2a91944b1b3b160aa89fa7675", + "state": "2733d7ef9aaacf20880e2196c819305f58ad0cc03494704fbc9f5e03a95931b2", + "previous": "54e85b9f28ca29d37f5cfd86bad3b6fe57fef7c0eb4aac943d937e90432e0165", + "src": { + "origin": "hf", + "file": "release/simple-run/chain.jsonl", + "rev": "96dc282a", + "line": 14, + "lineEnd": null, + "raw": "{\"control\": {\"batches\": \"bfe949e391619c70945f4ad5af5f73c00f8d44562f44733457ad865081612290\", \"cursor\": 3192270243, \"epoch\": 0, \"global_step\": 235040, \"phase\": \"wikipedia\", \"phase_step\": 235040, \"pos\": [427598539, 0]}, \"index\": 13, \"kind\": \"progress\", \"model\": \"978af11d622fb0e48dd842f5aa27e9992c267de2a91944b1b3b160aa89fa7675\", \"previous\": \"54e85b9f28ca29d37f5cfd86bad3b6fe57fef7c0eb4aac943d937e90432e0165\", \"state\": \"2733d7ef9aaacf20880e2196c819305f58ad0cc03494704fbc9f5e03a95931b2\", \"time\": 1792449363.6749403}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/chain.jsonl#L14" + } + }, + { + "index": 14, + "kind": "progress", + "phase": "wikipedia", + "time": 1792451498.6016607, + "utc": "2026-10-19T23:11:38.601661Z", + "model": "613728906a531097849fcaa83d13ccb54b334d805aeaef8abe127ef2b7b70e1d", + "state": "145353afb1e2ebc2b5f9831fed74e5631b42a11342aab9a0b9febe796446c446", + "previous": "dc2beb0f1985df3c46dfce9859f37c998a41224dd65b6c74b56a1b3ca1070e3f", + "src": { + "origin": "hf", + "file": "release/simple-run/chain.jsonl", + "rev": "96dc282a", + "line": 15, + "lineEnd": null, + "raw": "{\"control\": {\"batches\": \"7eea41e27f71c52d58558b90de9ef7cd26ac9123366132bcbc1e71f4de08acf4\", \"cursor\": 3407720912, \"epoch\": 0, \"global_step\": 253120, \"phase\": \"wikipedia\", \"phase_step\": 253120, \"pos\": [476680277, 0]}, \"index\": 14, \"kind\": \"progress\", \"model\": \"613728906a531097849fcaa83d13ccb54b334d805aeaef8abe127ef2b7b70e1d\", \"previous\": \"dc2beb0f1985df3c46dfce9859f37c998a41224dd65b6c74b56a1b3ca1070e3f\", \"state\": \"145353afb1e2ebc2b5f9831fed74e5631b42a11342aab9a0b9febe796446c446\", \"time\": 1792451498.6016607}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/chain.jsonl#L15" + } + }, + { + "index": 15, + "kind": "progress", + "phase": "wikipedia", + "time": 1792453682.104504, + "utc": "2026-10-19T23:48:02.104504Z", + "model": "0f122b6387647c6844f6668edc95b2b96efd34885985e80c25a1eb424c7ffa2c", + "state": "fa961c767d2e293f12adcd13a3410d345e3bb5952395725963eb2f6e5c228d9e", + "previous": "74ad00bd517b70b7fc068a01f255b7edf4930d056c5999dac36ee782e0501ffa", + "src": { + "origin": "hf", + "file": "release/simple-run/chain.jsonl", + "rev": "96dc282a", + "line": 16, + "lineEnd": null, + "raw": "{\"control\": {\"batches\": \"c294ad7b42d0f2e970f3c757f339b24f6fbdc2982e9a91078a071b121b9325a1\", \"cursor\": 3626056290, \"epoch\": 0, \"global_step\": 271200, \"phase\": \"wikipedia\", \"phase_step\": 271200, \"pos\": [524689002, 0]}, \"index\": 15, \"kind\": \"progress\", \"model\": \"0f122b6387647c6844f6668edc95b2b96efd34885985e80c25a1eb424c7ffa2c\", \"previous\": \"74ad00bd517b70b7fc068a01f255b7edf4930d056c5999dac36ee782e0501ffa\", \"state\": \"fa961c767d2e293f12adcd13a3410d345e3bb5952395725963eb2f6e5c228d9e\", \"time\": 1792453682.104504}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/chain.jsonl#L16" + } + }, + { + "index": 16, + "kind": "progress", + "phase": "wikipedia", + "time": 1792455885.299576, + "utc": "2026-10-20T00:24:45.299576Z", + "model": "9a1a2f4ad99c6aac613f620400dc405a8967906e435079c0d8d29622831044fa", + "state": "82d7f95aaed27c4ac54ec6b8de9567a84d818a875673030c4ae0d2d39a860754", + "previous": "02ae49797dac00039040490c47e210a12ab563766377996bea3c01e5fc2a5722", + "src": { + "origin": "hf", + "file": "release/simple-run/chain.jsonl", + "rev": "96dc282a", + "line": 17, + "lineEnd": null, + "raw": "{\"control\": {\"batches\": \"4d0765884b5a4f4af81e17f0914a728e631c665fa74ec82be39e458f3f4f40c1\", \"cursor\": 3842372860, \"epoch\": 0, \"global_step\": 289280, \"phase\": \"wikipedia\", \"phase_step\": 289280, \"pos\": [573811026, 2048]}, \"index\": 16, \"kind\": \"progress\", \"model\": \"9a1a2f4ad99c6aac613f620400dc405a8967906e435079c0d8d29622831044fa\", \"previous\": \"02ae49797dac00039040490c47e210a12ab563766377996bea3c01e5fc2a5722\", \"state\": \"82d7f95aaed27c4ac54ec6b8de9567a84d818a875673030c4ae0d2d39a860754\", \"time\": 1792455885.299576}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/chain.jsonl#L17" + } + }, + { + "index": 17, + "kind": "progress", + "phase": "wikipedia", + "time": 1792458112.5074773, + "utc": "2026-10-20T01:01:52.507477Z", + "model": "1e77516fc3d4c149c17b5e039ba9a886f520769df7512002fe89a9e5148f7d6e", + "state": "1082ced41232e82ff83506f0c20d887d0ddc3dc7458bc3ace5361a87485e5b60", + "previous": "d18717f336293c9ad84cf6a7fa7c906ce76bb75e2a30bb954ff53f6336fb349f", + "src": { + "origin": "hf", + "file": "release/simple-run/chain.jsonl", + "rev": "96dc282a", + "line": 18, + "lineEnd": null, + "raw": "{\"control\": {\"batches\": \"a219629293cfc4e69c74916379ba790f96b8a5425bd9fb7f4d9e481965ec9374\", \"cursor\": 4065481916, \"epoch\": 0, \"global_step\": 307360, \"phase\": \"wikipedia\", \"phase_step\": 307360, \"pos\": [619889558, 18944]}, \"index\": 17, \"kind\": \"progress\", \"model\": \"1e77516fc3d4c149c17b5e039ba9a886f520769df7512002fe89a9e5148f7d6e\", \"previous\": \"d18717f336293c9ad84cf6a7fa7c906ce76bb75e2a30bb954ff53f6336fb349f\", \"state\": \"1082ced41232e82ff83506f0c20d887d0ddc3dc7458bc3ace5361a87485e5b60\", \"time\": 1792458112.5074773}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/chain.jsonl#L18" + } + }, + { + "index": 18, + "kind": "progress", + "phase": "wikipedia", + "time": 1792460358.5080163, + "utc": "2026-10-20T01:39:18.508016Z", + "model": "4d79bcc6ee8060a9c28a5802c142f972665bafae70901176c9a964bc884f1dee", + "state": "0d4932793bd2279c0a17b3ca736159f89d48898d8a42113d15c7590dfdd85c26", + "previous": "2a5f5728e37dc780da3f0007096a4f16f6d1ce979541d021f22b30b21576c2f7", + "src": { + "origin": "hf", + "file": "release/simple-run/chain.jsonl", + "rev": "96dc282a", + "line": 19, + "lineEnd": null, + "raw": "{\"control\": {\"batches\": \"fbdade37939ffab2c5df52a9db88c8bac93a5501861522a30f1a50ebcafb4b3e\", \"cursor\": 4280170919, \"epoch\": 0, \"global_step\": 325440, \"phase\": \"wikipedia\", \"phase_step\": 325440, \"pos\": [669406302, 0]}, \"index\": 18, \"kind\": \"progress\", \"model\": \"4d79bcc6ee8060a9c28a5802c142f972665bafae70901176c9a964bc884f1dee\", \"previous\": \"2a5f5728e37dc780da3f0007096a4f16f6d1ce979541d021f22b30b21576c2f7\", \"state\": \"0d4932793bd2279c0a17b3ca736159f89d48898d8a42113d15c7590dfdd85c26\", \"time\": 1792460358.5080163}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/chain.jsonl#L19" + } + }, + { + "index": 19, + "kind": "progress", + "phase": "wikipedia", + "time": 1792462598.3975008, + "utc": "2026-10-20T02:16:38.397501Z", + "model": "9e597fcc4fc74828e30605677e3696a53b77a6976fecdc4f0e06b378e6721ee9", + "state": "cafd56b605b39449655b55534cd4e33616de0d40e6c3434fcd1a54c941e63191", + "previous": "a16cd66f1a0e4cd71e0655dbfa89443148eae0d12114c025edcfbc543e66fb89", + "src": { + "origin": "hf", + "file": "release/simple-run/chain.jsonl", + "rev": "96dc282a", + "line": 20, + "lineEnd": null, + "raw": "{\"control\": {\"batches\": \"32161f48812917ee1bed7a4367df261934308045464246622f47dba2ab129f2a\", \"cursor\": 4492270493, \"epoch\": 0, \"global_step\": 343520, \"phase\": \"wikipedia\", \"phase_step\": 343520, \"pos\": [719769225, 2048]}, \"index\": 19, \"kind\": \"progress\", \"model\": \"9e597fcc4fc74828e30605677e3696a53b77a6976fecdc4f0e06b378e6721ee9\", \"previous\": \"a16cd66f1a0e4cd71e0655dbfa89443148eae0d12114c025edcfbc543e66fb89\", \"state\": \"cafd56b605b39449655b55534cd4e33616de0d40e6c3434fcd1a54c941e63191\", \"time\": 1792462598.3975008}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/chain.jsonl#L20" + } + }, + { + "index": 20, + "kind": "progress", + "phase": "wikipedia", + "time": 1792463768.5816014, + "utc": "2026-10-20T02:36:08.581601Z", + "model": "f98ab99a90c7734a3f4cf2d60216ed8b1bdc657541ec3374c6f035b0bd42a307", + "state": "708b48121052bf9bc68bbd67e8613230dd713b9569610a4e66838fe45f35299a", + "previous": "e26d3eb4812c5c4d13625a8a2a72662d202697d0dae3336f24e3a0f7325cc12f", + "src": { + "origin": "hf", + "file": "release/simple-run/chain.jsonl", + "rev": "96dc282a", + "line": 21, + "lineEnd": null, + "raw": "{\"control\": {\"batches\": \"30c019ac1c173f6d688cdd4bd01e7ceaf9ed1376251e69d87cb9643b4386116b\", \"cursor\": 4705349595, \"epoch\": 0, \"global_step\": 361600, \"phase\": \"wikipedia\", \"phase_step\": 361600, \"pos\": [769153707, 4608]}, \"index\": 20, \"kind\": \"progress\", \"model\": \"f98ab99a90c7734a3f4cf2d60216ed8b1bdc657541ec3374c6f035b0bd42a307\", \"previous\": \"e26d3eb4812c5c4d13625a8a2a72662d202697d0dae3336f24e3a0f7325cc12f\", \"state\": \"708b48121052bf9bc68bbd67e8613230dd713b9569610a4e66838fe45f35299a\", \"time\": 1792463768.5816014}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/chain.jsonl#L21" + } + }, + { + "index": 21, + "kind": "progress", + "phase": "wikipedia", + "time": 1792465514.4536183, + "utc": "2026-10-20T03:05:14.453618Z", + "model": "b89d3b185a1fcf21bcc5ef432a26eafc9643eb62b9aa3d8eeb624cbfceeea340", + "state": "eb31ec48c4ce9373035fe1229a93190fcfec9060d1bc8520f62ed3dfcab752fa", + "previous": "d16e556f9c072f3fe71fba64d787402b5be33427db7c160745d0a58040af1e03", + "src": { + "origin": "hf", + "file": "release/simple-run/chain.jsonl", + "rev": "96dc282a", + "line": 22, + "lineEnd": null, + "raw": "{\"control\": {\"batches\": \"09506b60c4342ec5873bba53f2e993f0a46e1b726fc3449ce690e5e4eb43927c\", \"cursor\": 4919188008, \"epoch\": 0, \"global_step\": 379680, \"phase\": \"wikipedia\", \"phase_step\": 379680, \"pos\": [818886901, 0]}, \"index\": 21, \"kind\": \"progress\", \"model\": \"b89d3b185a1fcf21bcc5ef432a26eafc9643eb62b9aa3d8eeb624cbfceeea340\", \"previous\": \"d16e556f9c072f3fe71fba64d787402b5be33427db7c160745d0a58040af1e03\", \"state\": \"eb31ec48c4ce9373035fe1229a93190fcfec9060d1bc8520f62ed3dfcab752fa\", \"time\": 1792465514.4536183}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/chain.jsonl#L22" + } + }, + { + "index": 22, + "kind": "progress", + "phase": "wikipedia", + "time": 1792468481.591845, + "utc": "2026-10-20T03:54:41.591845Z", + "model": "1428e4c6cddc484d305881220b68eb5e04eb851632e1ae7d4f61725e0b24708b", + "state": "ee97359b8f9928977515e383d98a796d442444b5a07de5c9ec1158d372cc0e49", + "previous": "69385671abc45197a2a67165df66e34a51beeaf1d55eedf5daadb3b1d7e6ea5d", + "src": { + "origin": "hf", + "file": "release/simple-run/chain.jsonl", + "rev": "96dc282a", + "line": 23, + "lineEnd": null, + "raw": "{\"control\": {\"batches\": \"27f95fcd8bc5e1b25cea97a17fd58ce6f6771b5b15565014616d4519ab8c8184\", \"cursor\": 5137669818, \"epoch\": 0, \"global_step\": 397760, \"phase\": \"wikipedia\", \"phase_step\": 397760, \"pos\": [867774445, 512]}, \"index\": 22, \"kind\": \"progress\", \"model\": \"1428e4c6cddc484d305881220b68eb5e04eb851632e1ae7d4f61725e0b24708b\", \"previous\": \"69385671abc45197a2a67165df66e34a51beeaf1d55eedf5daadb3b1d7e6ea5d\", \"state\": \"ee97359b8f9928977515e383d98a796d442444b5a07de5c9ec1158d372cc0e49\", \"time\": 1792468481.591845}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/chain.jsonl#L23" + } + }, + { + "index": 23, + "kind": "progress", + "phase": "wikipedia", + "time": 1792469631.0069373, + "utc": "2026-10-20T04:13:51.006937Z", + "model": "8948b0defe4c934602354d44e72ceb0b34c46d87bb7a67832fa50ea581b57d16", + "state": "296c1763d3421f6991f4f841f4143166bf0910000e5b00673383a4589859483f", + "previous": "5522af40717e99883a27f65daa6c7646f1526d9b2aed9862ce88de7267c962a0", + "src": { + "origin": "hf", + "file": "release/simple-run/chain.jsonl", + "rev": "96dc282a", + "line": 24, + "lineEnd": null, + "raw": "{\"control\": {\"batches\": \"2ac5c320056a9766eaf2f910194309a2e1e3254958d1fe2e4afa92805ee04b28\", \"cursor\": 5354659564, \"epoch\": 0, \"global_step\": 415840, \"phase\": \"wikipedia\", \"phase_step\": 415840, \"pos\": [917385337, 0]}, \"index\": 23, \"kind\": \"progress\", \"model\": \"8948b0defe4c934602354d44e72ceb0b34c46d87bb7a67832fa50ea581b57d16\", \"previous\": \"5522af40717e99883a27f65daa6c7646f1526d9b2aed9862ce88de7267c962a0\", \"state\": \"296c1763d3421f6991f4f841f4143166bf0910000e5b00673383a4589859483f\", \"time\": 1792469631.0069373}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/chain.jsonl#L24" + } + }, + { + "index": 24, + "kind": "progress", + "phase": "wikipedia", + "time": 1792470779.9569445, + "utc": "2026-10-20T04:32:59.956944Z", + "model": "c553304d081e5817ba0e042bcdef7f1cf9642a290b006edab98778abd18eeedc", + "state": "6413ef4ca2bf9d47a89302d88662069fde930d732c4df7d0892f30ed64d3756d", + "previous": "44f6db9d7a6224e23d14abcfe7d1a1c4923332e676a302f7cb146cbc7d94aa99", + "src": { + "origin": "hf", + "file": "release/simple-run/chain.jsonl", + "rev": "96dc282a", + "line": 25, + "lineEnd": null, + "raw": "{\"control\": {\"batches\": \"3fae190c7c836188101a7a77d6046446431892e109590436e4c94a3ed1da8c13\", \"cursor\": 5571989843, \"epoch\": 0, \"global_step\": 433920, \"phase\": \"wikipedia\", \"phase_step\": 433920, \"pos\": [966632574, 8192]}, \"index\": 24, \"kind\": \"progress\", \"model\": \"c553304d081e5817ba0e042bcdef7f1cf9642a290b006edab98778abd18eeedc\", \"previous\": \"44f6db9d7a6224e23d14abcfe7d1a1c4923332e676a302f7cb146cbc7d94aa99\", \"state\": \"6413ef4ca2bf9d47a89302d88662069fde930d732c4df7d0892f30ed64d3756d\", \"time\": 1792470779.9569445}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/chain.jsonl#L25" + } + }, + { + "index": 25, + "kind": "progress", + "phase": "wikipedia", + "time": 1792471931.509705, + "utc": "2026-10-20T04:52:11.509705Z", + "model": "1f1becfa5470bac9a31962462d4d85647598dc8f75277e2f9c6efe5bc59ada97", + "state": "245211135b131b6c5e1940458575033082b4b473fa0033b55816d889c82d656b", + "previous": "05bfdd196077d5855614cf512c1226a3036a071bd251e5d82e9c05751dc9d74a", + "src": { + "origin": "hf", + "file": "release/simple-run/chain.jsonl", + "rev": "96dc282a", + "line": 26, + "lineEnd": null, + "raw": "{\"control\": {\"batches\": \"b77680f3b1febcf15d5adac2f244b845ea1ca7ae5837e9ce9e57a9b9661033c6\", \"cursor\": 5786932809, \"epoch\": 0, \"global_step\": 452000, \"phase\": \"wikipedia\", \"phase_step\": 452000, \"pos\": [1015978804, 2048]}, \"index\": 25, \"kind\": \"progress\", \"model\": \"1f1becfa5470bac9a31962462d4d85647598dc8f75277e2f9c6efe5bc59ada97\", \"previous\": \"05bfdd196077d5855614cf512c1226a3036a071bd251e5d82e9c05751dc9d74a\", \"state\": \"245211135b131b6c5e1940458575033082b4b473fa0033b55816d889c82d656b\", \"time\": 1792471931.509705}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/chain.jsonl#L26" + } + }, + { + "index": 26, + "kind": "progress", + "phase": "wikipedia", + "time": 1792473082.0379794, + "utc": "2026-10-20T05:11:22.037979Z", + "model": "6a59289ec3928857e0beacc7858e190c0756c72f2cdf48896578bb75720fa72a", + "state": "7b1ab9b324ac43d99f738ee00e3ef2b514e8dcc82313863c1d8f6e871d42bbb8", + "previous": "01b7d56bc8b58be5cca403ba71dc9fd1d5c6083d5740dae7c912e3a9557e8dd0", + "src": { + "origin": "hf", + "file": "release/simple-run/chain.jsonl", + "rev": "96dc282a", + "line": 27, + "lineEnd": null, + "raw": "{\"control\": {\"batches\": \"44eaf0d468c5578cc89e3999530132727e41ac47cbfcc8fcf80a7621b527cda0\", \"cursor\": 6003090585, \"epoch\": 0, \"global_step\": 470080, \"phase\": \"wikipedia\", \"phase_step\": 470080, \"pos\": [1065027050, 0]}, \"index\": 26, \"kind\": \"progress\", \"model\": \"6a59289ec3928857e0beacc7858e190c0756c72f2cdf48896578bb75720fa72a\", \"previous\": \"01b7d56bc8b58be5cca403ba71dc9fd1d5c6083d5740dae7c912e3a9557e8dd0\", \"state\": \"7b1ab9b324ac43d99f738ee00e3ef2b514e8dcc82313863c1d8f6e871d42bbb8\", \"time\": 1792473082.0379794}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/chain.jsonl#L27" + } + }, + { + "index": 27, + "kind": "progress", + "phase": "wikipedia", + "time": 1792474229.018975, + "utc": "2026-10-20T05:30:29.018975Z", + "model": "5329233dbd65f90b4c368e40c725c59496c03266053f934c4be9c4ef73e3ec73", + "state": "0ec654850f2c1288c7850e9e732b52187dcc5f73fffe0f3bc211143e32097e7a", + "previous": "6b141d06e0138bd34dc59373f5aa0bc92bc363b53c7f013a8c98cc09d411094e", + "src": { + "origin": "hf", + "file": "release/simple-run/chain.jsonl", + "rev": "96dc282a", + "line": 28, + "lineEnd": null, + "raw": "{\"control\": {\"batches\": \"58cf98d2ec42837434cc698720602c1ed7a427f1b7075de7b56e1957e42d7b7b\", \"cursor\": 6219792471, \"epoch\": 0, \"global_step\": 488160, \"phase\": \"wikipedia\", \"phase_step\": 488160, \"pos\": [1113864691, 1024]}, \"index\": 27, \"kind\": \"progress\", \"model\": \"5329233dbd65f90b4c368e40c725c59496c03266053f934c4be9c4ef73e3ec73\", \"previous\": \"6b141d06e0138bd34dc59373f5aa0bc92bc363b53c7f013a8c98cc09d411094e\", \"state\": \"0ec654850f2c1288c7850e9e732b52187dcc5f73fffe0f3bc211143e32097e7a\", \"time\": 1792474229.018975}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/chain.jsonl#L28" + } + }, + { + "index": 28, + "kind": "progress", + "phase": "wikipedia", + "time": 1792475372.9946525, + "utc": "2026-10-20T05:49:32.994653Z", + "model": "d6e1eaab6061fc051ae6de60bb6c95d99d1b98c6bcddfdcbbd593208b7d8a303", + "state": "e5891f8db717f770246c4255fa6598ba280922c428e9e1e6d814f5d96549cab1", + "previous": "339ba1cbaecfdf10cbae5574f973945950123a903c4d3da848cfb7dbdabd940c", + "src": { + "origin": "hf", + "file": "release/simple-run/chain.jsonl", + "rev": "96dc282a", + "line": 29, + "lineEnd": null, + "raw": "{\"control\": {\"batches\": \"8e7e2738dac57947ab3894def88fc8bfb84e0b8c55095fcd33d66e2699dabab5\", \"cursor\": 6444391263, \"epoch\": 0, \"global_step\": 506240, \"phase\": \"wikipedia\", \"phase_step\": 506240, \"pos\": [1159432427, 0]}, \"index\": 28, \"kind\": \"progress\", \"model\": \"d6e1eaab6061fc051ae6de60bb6c95d99d1b98c6bcddfdcbbd593208b7d8a303\", \"previous\": \"339ba1cbaecfdf10cbae5574f973945950123a903c4d3da848cfb7dbdabd940c\", \"state\": \"e5891f8db717f770246c4255fa6598ba280922c428e9e1e6d814f5d96549cab1\", \"time\": 1792475372.9946525}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/chain.jsonl#L29" + } + }, + { + "index": 29, + "kind": "progress", + "phase": "wikipedia", + "time": 1792476512.00237, + "utc": "2026-10-20T06:08:32.002370Z", + "model": "3c5459d2bdcdb86d05168a8a78370aa7f772cb6f48ab11e6949164ec6d30fdc0", + "state": "ab0f669782c60bf45255e4822fee5fe5425a24b614d10dc0821323ca7325853c", + "previous": "9f1343558e7f2897d578acf607bf2a7b5abad07e032bb5c4384f6716f19b02e5", + "src": { + "origin": "hf", + "file": "release/simple-run/chain.jsonl", + "rev": "96dc282a", + "line": 30, + "lineEnd": null, + "raw": "{\"control\": {\"batches\": \"7b351d64e2a3d2492e668dcfd73d82ce92c0ba04fdd4c3058c95d4e642a6807d\", \"cursor\": 6671911669, \"epoch\": 0, \"global_step\": 524320, \"phase\": \"wikipedia\", \"phase_step\": 524320, \"pos\": [1203647118, 0]}, \"index\": 29, \"kind\": \"progress\", \"model\": \"3c5459d2bdcdb86d05168a8a78370aa7f772cb6f48ab11e6949164ec6d30fdc0\", \"previous\": \"9f1343558e7f2897d578acf607bf2a7b5abad07e032bb5c4384f6716f19b02e5\", \"state\": \"ab0f669782c60bf45255e4822fee5fe5425a24b614d10dc0821323ca7325853c\", \"time\": 1792476512.00237}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/chain.jsonl#L30" + } + }, + { + "index": 30, + "kind": "progress", + "phase": "wikipedia", + "time": 1792477651.6187513, + "utc": "2026-10-20T06:27:31.618751Z", + "model": "bdfa54d7eb2938c8fe3258528e5cb84287c54f889471eb60909e7d8c6aca8061", + "state": "baf0f2694f6f7561b6e427c0181978541c19263849163984131f51dad72b6c38", + "previous": "e24b7d97bcd3f1d31bccc299bde66247d0c84ffd0ebeb2c942a770ab2345908b", + "src": { + "origin": "hf", + "file": "release/simple-run/chain.jsonl", + "rev": "96dc282a", + "line": 31, + "lineEnd": null, + "raw": "{\"control\": {\"batches\": \"304b2d3afe5a67a5ef902cb8334a55ee6f89877d474b438fb9c94e507814dece\", \"cursor\": 6901668826, \"epoch\": 0, \"global_step\": 542400, \"phase\": \"wikipedia\", \"phase_step\": 542400, \"pos\": [1246875101, 0]}, \"index\": 30, \"kind\": \"progress\", \"model\": \"bdfa54d7eb2938c8fe3258528e5cb84287c54f889471eb60909e7d8c6aca8061\", \"previous\": \"e24b7d97bcd3f1d31bccc299bde66247d0c84ffd0ebeb2c942a770ab2345908b\", \"state\": \"baf0f2694f6f7561b6e427c0181978541c19263849163984131f51dad72b6c38\", \"time\": 1792477651.6187513}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/chain.jsonl#L31" + } + }, + { + "index": 31, + "kind": "base", + "phase": "wikipedia", + "time": 1792478775.2381847, + "utc": "2026-10-20T06:46:15.238185Z", + "model": "31c8cd3a4972ffe5733ca19f614cb93c70c135ebc4ce1f053ca54a309b20a65f", + "state": "13d6ad64b2465d42653f250bba0463468c0c81b7980ebc9d97e3b0f95c713bf1", + "previous": "2f33f280a48f610d432e95d98fe14d12e81d77ea97d419f39964bb92119fec39", + "src": { + "origin": "hf", + "file": "release/simple-run/chain.jsonl", + "rev": "96dc282a", + "line": 32, + "lineEnd": null, + "raw": "{\"control\": {\"batches\": \"dcad901881cb94e24e81efa96ff4282bcf4a23d1ad042fc85d0fe5444c2fc875\", \"cursor\": 7118121139, \"epoch\": 0, \"global_step\": 560177, \"phase\": \"wikipedia\", \"phase_step\": 560177, \"pos\": [1293950757, 0]}, \"index\": 31, \"kind\": \"base\", \"model\": \"31c8cd3a4972ffe5733ca19f614cb93c70c135ebc4ce1f053ca54a309b20a65f\", \"previous\": \"2f33f280a48f610d432e95d98fe14d12e81d77ea97d419f39964bb92119fec39\", \"state\": \"13d6ad64b2465d42653f250bba0463468c0c81b7980ebc9d97e3b0f95c713bf1\", \"time\": 1792478775.2381847}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/chain.jsonl#L32" + } + }, + { + "index": 32, + "kind": "transition", + "phase": "conversation", + "time": 1792478776.1264164, + "utc": "2026-10-20T06:46:16.126416Z", + "model": "31c8cd3a4972ffe5733ca19f614cb93c70c135ebc4ce1f053ca54a309b20a65f", + "state": "8987fdd57ba91b044c23bba48cf41b132aa6ec949c4af650ba3180483476941d", + "previous": "5c05e153104c6987ed29668d611765bbfad8aba906bb2d28d258857ea13e5b5a", + "src": { + "origin": "hf", + "file": "release/simple-run/chain.jsonl", + "rev": "96dc282a", + "line": 33, + "lineEnd": null, + "raw": "{\"control\": {\"batches\": \"dcad901881cb94e24e81efa96ff4282bcf4a23d1ad042fc85d0fe5444c2fc875\", \"cursor\": 0, \"epoch\": 0, \"global_step\": 560177, \"phase\": \"conversation\", \"phase_step\": 0, \"pos\": [0, 0]}, \"index\": 32, \"kind\": \"transition\", \"model\": \"31c8cd3a4972ffe5733ca19f614cb93c70c135ebc4ce1f053ca54a309b20a65f\", \"previous\": \"5c05e153104c6987ed29668d611765bbfad8aba906bb2d28d258857ea13e5b5a\", \"state\": \"8987fdd57ba91b044c23bba48cf41b132aa6ec949c4af650ba3180483476941d\", \"time\": 1792478776.1264164}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/chain.jsonl#L33" + } + }, + { + "index": 33, + "kind": "epoch", + "phase": "conversation", + "time": 1792478785.6187253, + "utc": "2026-10-20T06:46:25.618725Z", + "model": "fa2903c63e2fedd52ff6e53cab2c16921f6dae52855700caf8f7d23358172b1e", + "state": "47e181e530d97201584906d931d1e5cfcd25ec000acfc6381c1162b102036b03", + "previous": "98e7266fe9e50a0ad993bfbba932f7c24f3f1e30d822517995b1d6092a980ec8", + "src": { + "origin": "hf", + "file": "release/simple-run/chain.jsonl", + "rev": "96dc282a", + "line": 34, + "lineEnd": null, + "raw": "{\"control\": {\"batches\": \"367fdeaa7d8de8113d22b27f162652c9cea078879dcdad4cd27555239df9ba67\", \"cursor\": 1278137, \"epoch\": 0, \"global_step\": 560324, \"phase\": \"conversation\", \"phase_step\": 147, \"pos\": [849666, 0]}, \"index\": 33, \"kind\": \"epoch\", \"model\": \"fa2903c63e2fedd52ff6e53cab2c16921f6dae52855700caf8f7d23358172b1e\", \"previous\": \"98e7266fe9e50a0ad993bfbba932f7c24f3f1e30d822517995b1d6092a980ec8\", \"state\": \"47e181e530d97201584906d931d1e5cfcd25ec000acfc6381c1162b102036b03\", \"time\": 1792478785.6187253}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/chain.jsonl#L34" + } + }, + { + "index": 34, + "kind": "transition", + "phase": "conversation", + "time": 1792478786.6568494, + "utc": "2026-10-20T06:46:26.656849Z", + "model": "fa2903c63e2fedd52ff6e53cab2c16921f6dae52855700caf8f7d23358172b1e", + "state": "47e181e530d97201584906d931d1e5cfcd25ec000acfc6381c1162b102036b03", + "previous": "94eee8a739a2edf0bc158091e8bd9299b83e82021cba2679f4fcec0b86c36035", + "src": { + "origin": "hf", + "file": "release/simple-run/chain.jsonl", + "rev": "96dc282a", + "line": 35, + "lineEnd": null, + "raw": "{\"control\": {\"batches\": \"367fdeaa7d8de8113d22b27f162652c9cea078879dcdad4cd27555239df9ba67\", \"cursor\": 0, \"epoch\": 1, \"global_step\": 560324, \"phase\": \"conversation\", \"phase_step\": 0, \"pos\": [0, 0]}, \"index\": 34, \"kind\": \"transition\", \"model\": \"fa2903c63e2fedd52ff6e53cab2c16921f6dae52855700caf8f7d23358172b1e\", \"previous\": \"94eee8a739a2edf0bc158091e8bd9299b83e82021cba2679f4fcec0b86c36035\", \"state\": \"47e181e530d97201584906d931d1e5cfcd25ec000acfc6381c1162b102036b03\", \"time\": 1792478786.6568494}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/chain.jsonl#L35" + } + }, + { + "index": 35, + "kind": "epoch", + "phase": "conversation", + "time": 1792478796.331579, + "utc": "2026-10-20T06:46:36.331579Z", + "model": "eb2d6225628c40d6b87bc5c2f95b4838ba58c3d9f1bd40c4def3464c40e3fbda", + "state": "e80d5db69e77bbe5e7ffc7c829631aa1871c8fa5230b8eb53d85b4a226420ab2", + "previous": "65d9e7fac71a421b97b20c56fbb9d8997b543f09752763e53dabac4817950f5f", + "src": { + "origin": "hf", + "file": "release/simple-run/chain.jsonl", + "rev": "96dc282a", + "line": 36, + "lineEnd": null, + "raw": "{\"control\": {\"batches\": \"5221cd468bc3661e4455cda6c9602d2ab155ea669e751927c77eb0a36c497023\", \"cursor\": 1278137, \"epoch\": 1, \"global_step\": 560471, \"phase\": \"conversation\", \"phase_step\": 147, \"pos\": [849666, 0]}, \"index\": 35, \"kind\": \"epoch\", \"model\": \"eb2d6225628c40d6b87bc5c2f95b4838ba58c3d9f1bd40c4def3464c40e3fbda\", \"previous\": \"65d9e7fac71a421b97b20c56fbb9d8997b543f09752763e53dabac4817950f5f\", \"state\": \"e80d5db69e77bbe5e7ffc7c829631aa1871c8fa5230b8eb53d85b4a226420ab2\", \"time\": 1792478796.331579}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/chain.jsonl#L36" + } + }, + { + "index": 36, + "kind": "transition", + "phase": "conversation", + "time": 1792478797.354915, + "utc": "2026-10-20T06:46:37.354915Z", + "model": "eb2d6225628c40d6b87bc5c2f95b4838ba58c3d9f1bd40c4def3464c40e3fbda", + "state": "e80d5db69e77bbe5e7ffc7c829631aa1871c8fa5230b8eb53d85b4a226420ab2", + "previous": "8c20bd99e5408e6240a51d71cf099f73b1d47eea5c043e4a027dffb397361042", + "src": { + "origin": "hf", + "file": "release/simple-run/chain.jsonl", + "rev": "96dc282a", + "line": 37, + "lineEnd": null, + "raw": "{\"control\": {\"batches\": \"5221cd468bc3661e4455cda6c9602d2ab155ea669e751927c77eb0a36c497023\", \"cursor\": 0, \"epoch\": 2, \"global_step\": 560471, \"phase\": \"conversation\", \"phase_step\": 0, \"pos\": [0, 0]}, \"index\": 36, \"kind\": \"transition\", \"model\": \"eb2d6225628c40d6b87bc5c2f95b4838ba58c3d9f1bd40c4def3464c40e3fbda\", \"previous\": \"8c20bd99e5408e6240a51d71cf099f73b1d47eea5c043e4a027dffb397361042\", \"state\": \"e80d5db69e77bbe5e7ffc7c829631aa1871c8fa5230b8eb53d85b4a226420ab2\", \"time\": 1792478797.354915}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/chain.jsonl#L37" + } + }, + { + "index": 37, + "kind": "final", + "phase": "conversation", + "time": 1792478807.0463226, + "utc": "2026-10-20T06:46:47.046323Z", + "model": "ec9a2b31ca524613f791aba00f4f7f31e4a7bf4a8a921e0deb81c1a922d0958b", + "state": "934d681c99e5c3e10617e82dbbb0ae0ddd1ad4e32cf45e8e3a6d2ed94b69f200", + "previous": "68d517a10e2641b690149d430e9e47fd8e4c97bfb5ae33b81c25cb29492dedcb", + "src": { + "origin": "hf", + "file": "release/simple-run/chain.jsonl", + "rev": "96dc282a", + "line": 38, + "lineEnd": null, + "raw": "{\"control\": {\"batches\": \"1fd22db0ab89ab98045f8c4b32ce4e4d55453163390ec9ebd5792dfc38fd5a52\", \"cursor\": 1278137, \"epoch\": 2, \"global_step\": 560618, \"phase\": \"conversation\", \"phase_step\": 147, \"pos\": [849666, 0]}, \"index\": 37, \"kind\": \"final\", \"model\": \"ec9a2b31ca524613f791aba00f4f7f31e4a7bf4a8a921e0deb81c1a922d0958b\", \"previous\": \"68d517a10e2641b690149d430e9e47fd8e4c97bfb5ae33b81c25cb29492dedcb\", \"state\": \"934d681c99e5c3e10617e82dbbb0ae0ddd1ad4e32cf45e8e3a6d2ed94b69f200\", \"time\": 1792478807.0463226}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/chain.jsonl#L38" + } + } + ], + "start": "2026-10-19T15:04:10.861772Z", + "end": "2026-10-20T06:46:47.046323Z", + "kinds": { + "base": 1, + "epoch": 2, + "final": 1, + "initial": 1, + "progress": 30, + "transition": 3 + } + }, + "verifications": { + "rows": [ + { + "segment": 0, + "result": "MATCH", + "checker": "project second pod", + "machine": "second pod", + "checkedBy": "project", + "code": "ovl.py 202ac6ce", + "gpu": "NVIDIA GeForce RTX 5090", + "driver": "595.91.07", + "src": { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "line": 1, + "lineEnd": null, + "raw": "{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 0}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L1" + } + }, + { + "segment": 1, + "result": "MATCH", + "checker": "project second pod", + "machine": "second pod", + "checkedBy": "project", + "code": "ovl.py 202ac6ce", + "gpu": "NVIDIA GeForce RTX 5090", + "driver": "595.91.07", + "src": { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "line": 2, + "lineEnd": null, + "raw": "{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 1}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L2" + } + }, + { + "segment": 2, + "result": "MATCH", + "checker": "project second pod", + "machine": "second pod", + "checkedBy": "project", + "code": "ovl.py 202ac6ce", + "gpu": "NVIDIA GeForce RTX 5090", + "driver": "595.91.07", + "src": { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "line": 3, + "lineEnd": null, + "raw": "{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 2}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L3" + } + }, + { + "segment": 3, + "result": "MATCH", + "checker": "project second pod", + "machine": "second pod", + "checkedBy": "project", + "code": "ovl.py 202ac6ce", + "gpu": "NVIDIA GeForce RTX 5090", + "driver": "595.91.07", + "src": { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "line": 4, + "lineEnd": null, + "raw": "{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 3}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L4" + } + }, + { + "segment": 4, + "result": "MATCH", + "checker": "project second pod", + "machine": "second pod", + "checkedBy": "project", + "code": "ovl.py 202ac6ce", + "gpu": "NVIDIA GeForce RTX 5090", + "driver": "595.91.07", + "src": { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "line": 5, + "lineEnd": null, + "raw": "{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 4}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L5" + } + }, + { + "segment": 5, + "result": "MATCH", + "checker": "project second pod", + "machine": "second pod", + "checkedBy": "project", + "code": "ovl.py 202ac6ce", + "gpu": "NVIDIA GeForce RTX 5090", + "driver": "595.91.07", + "src": { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "line": 6, + "lineEnd": null, + "raw": "{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 5}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L6" + } + }, + { + "segment": 6, + "result": "MATCH", + "checker": "project second pod", + "machine": "second pod", + "checkedBy": "project", + "code": "ovl.py 202ac6ce", + "gpu": "NVIDIA GeForce RTX 5090", + "driver": "595.91.07", + "src": { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "line": 7, + "lineEnd": null, + "raw": "{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 6}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L7" + } + }, + { + "segment": 7, + "result": "MATCH", + "checker": "project second pod", + "machine": "second pod", + "checkedBy": "project", + "code": "ovl.py 202ac6ce", + "gpu": "NVIDIA GeForce RTX 5090", + "driver": "595.91.07", + "src": { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "line": 8, + "lineEnd": null, + "raw": "{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 7}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L8" + } + }, + { + "segment": 8, + "result": "MATCH", + "checker": "project second pod", + "machine": "second pod", + "checkedBy": "project", + "code": "ovl.py 202ac6ce", + "gpu": "NVIDIA GeForce RTX 5090", + "driver": "595.91.07", + "src": { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "line": 9, + "lineEnd": null, + "raw": "{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 8}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L9" + } + }, + { + "segment": 9, + "result": "MATCH", + "checker": "project second pod", + "machine": "second pod", + "checkedBy": "project", + "code": "ovl.py 202ac6ce", + "gpu": "NVIDIA GeForce RTX 5090", + "driver": "595.91.07", + "src": { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "line": 10, + "lineEnd": null, + "raw": "{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 9}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L10" + } + }, + { + "segment": 10, + "result": "MATCH", + "checker": "project second pod", + "machine": "second pod", + "checkedBy": "project", + "code": "ovl.py 202ac6ce", + "gpu": "NVIDIA GeForce RTX 5090", + "driver": "595.91.07", + "src": { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "line": 11, + "lineEnd": null, + "raw": "{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 10}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L11" + } + }, + { + "segment": 11, + "result": "MATCH", + "checker": "project second pod", + "machine": "second pod", + "checkedBy": "project", + "code": "ovl.py 202ac6ce", + "gpu": "NVIDIA GeForce RTX 5090", + "driver": "595.91.07", + "src": { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "line": 12, + "lineEnd": null, + "raw": "{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 11}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L12" + } + }, + { + "segment": 12, + "result": "MATCH", + "checker": "project second pod", + "machine": "second pod", + "checkedBy": "project", + "code": "ovl.py 202ac6ce", + "gpu": "NVIDIA GeForce RTX 5090", + "driver": "595.91.07", + "src": { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "line": 13, + "lineEnd": null, + "raw": "{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 12}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L13" + } + }, + { + "segment": 13, + "result": "MATCH", + "checker": "project second pod", + "machine": "second pod", + "checkedBy": "project", + "code": "ovl.py 202ac6ce", + "gpu": "NVIDIA GeForce RTX 5090", + "driver": "595.91.07", + "src": { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "line": 14, + "lineEnd": null, + "raw": "{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 13}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L14" + } + }, + { + "segment": 14, + "result": "MATCH", + "checker": "project second pod", + "machine": "second pod", + "checkedBy": "project", + "code": "ovl.py 202ac6ce", + "gpu": "NVIDIA GeForce RTX 5090", + "driver": "595.91.07", + "src": { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "line": 15, + "lineEnd": null, + "raw": "{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 14}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L15" + } + }, + { + "segment": 15, + "result": "MATCH", + "checker": "project second pod", + "machine": "second pod", + "checkedBy": "project", + "code": "ovl.py 202ac6ce", + "gpu": "NVIDIA GeForce RTX 5090", + "driver": "595.91.07", + "src": { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "line": 16, + "lineEnd": null, + "raw": "{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 15}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L16" + } + }, + { + "segment": 16, + "result": "MATCH", + "checker": "project second pod", + "machine": "second pod", + "checkedBy": "project", + "code": "ovl.py 202ac6ce", + "gpu": "NVIDIA GeForce RTX 5090", + "driver": "595.91.07", + "src": { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "line": 17, + "lineEnd": null, + "raw": "{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 16}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L17" + } + }, + { + "segment": 17, + "result": "MATCH", + "checker": "project second pod", + "machine": "second pod", + "checkedBy": "project", + "code": "ovl.py 202ac6ce", + "gpu": "NVIDIA GeForce RTX 5090", + "driver": "595.91.07", + "src": { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "line": 18, + "lineEnd": null, + "raw": "{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 17}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L18" + } + }, + { + "segment": 18, + "result": "MATCH", + "checker": "project second pod", + "machine": "second pod", + "checkedBy": "project", + "code": "ovl.py 202ac6ce", + "gpu": "NVIDIA GeForce RTX 5090", + "driver": "595.91.07", + "src": { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "line": 19, + "lineEnd": null, + "raw": "{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 18}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L19" + } + }, + { + "segment": 19, + "result": "MATCH", + "checker": "project second pod", + "machine": "second pod", + "checkedBy": "project", + "code": "ovl.py c4a942c0 reference loader", + "gpu": "NVIDIA GeForce RTX 5090", + "driver": "595.91.07", + "src": { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "line": 20, + "lineEnd": null, + "raw": "{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 19}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L20" + } + }, + { + "segment": 20, + "result": "MATCH", + "checker": "project second pod", + "machine": "second pod", + "checkedBy": "project", + "code": "ovl.py c4a942c0 reference loader", + "gpu": "NVIDIA GeForce RTX 5090", + "driver": "595.91.07", + "src": { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "line": 21, + "lineEnd": null, + "raw": "{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 20}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L21" + } + }, + { + "segment": 21, + "result": "MATCH", + "checker": "project second pod", + "machine": "second pod", + "checkedBy": "project", + "code": "ovl.py c4a942c0 reference loader", + "gpu": "NVIDIA GeForce RTX 5090", + "driver": "595.91.07", + "src": { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "line": 22, + "lineEnd": null, + "raw": "{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 21}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L22" + } + }, + { + "segment": 22, + "result": "MATCH", + "checker": "project second pod", + "machine": "second pod", + "checkedBy": "project", + "code": "ovl.py c4a942c0 reference loader", + "gpu": "NVIDIA GeForce RTX 5090", + "driver": "595.91.07", + "src": { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "line": 23, + "lineEnd": null, + "raw": "{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 22}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L23" + } + }, + { + "segment": 23, + "result": "MATCH", + "checker": "project second pod", + "machine": "second pod", + "checkedBy": "project", + "code": "ovl.py c4a942c0 reference loader", + "gpu": "NVIDIA GeForce RTX 5090", + "driver": "595.91.07", + "src": { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "line": 24, + "lineEnd": null, + "raw": "{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 23}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L24" + } + }, + { + "segment": 24, + "result": "MATCH", + "checker": "project second pod", + "machine": "second pod", + "checkedBy": "project", + "code": "ovl.py c4a942c0 reference loader", + "gpu": "NVIDIA GeForce RTX 5090", + "driver": "595.91.07", + "src": { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "line": 25, + "lineEnd": null, + "raw": "{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 24}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L25" + } + }, + { + "segment": 25, + "result": "MATCH", + "checker": "project second pod", + "machine": "second pod", + "checkedBy": "project", + "code": "ovl.py c4a942c0 reference loader", + "gpu": "NVIDIA GeForce RTX 5090", + "driver": "595.91.07", + "src": { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "line": 26, + "lineEnd": null, + "raw": "{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 25}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L26" + } + }, + { + "segment": 26, + "result": "MATCH", + "checker": "project second pod", + "machine": "second pod", + "checkedBy": "project", + "code": "ovl.py c4a942c0 reference loader", + "gpu": "NVIDIA GeForce RTX 5090", + "driver": "595.91.07", + "src": { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "line": 27, + "lineEnd": null, + "raw": "{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 26}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L27" + } + }, + { + "segment": 27, + "result": "MATCH", + "checker": "project second pod", + "machine": "second pod", + "checkedBy": "project", + "code": "ovl.py c4a942c0 reference loader", + "gpu": "NVIDIA GeForce RTX 5090", + "driver": "595.91.07", + "src": { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "line": 28, + "lineEnd": null, + "raw": "{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 27}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L28" + } + }, + { + "segment": 28, + "result": "MATCH", + "checker": "project second pod", + "machine": "second pod", + "checkedBy": "project", + "code": "ovl.py c4a942c0 reference loader", + "gpu": "NVIDIA GeForce RTX 5090", + "driver": "595.91.07", + "src": { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "line": 29, + "lineEnd": null, + "raw": "{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 28}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L29" + } + }, + { + "segment": 29, + "result": "MATCH", + "checker": "project second pod", + "machine": "second pod", + "checkedBy": "project", + "code": "ovl.py c4a942c0 reference loader", + "gpu": "NVIDIA GeForce RTX 5090", + "driver": "595.91.07", + "src": { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "line": 30, + "lineEnd": null, + "raw": "{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 29}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L30" + } + }, + { + "segment": 30, + "result": "MATCH", + "checker": "project second pod", + "machine": "second pod", + "checkedBy": "project", + "code": "ovl.py c4a942c0 reference loader", + "gpu": "NVIDIA GeForce RTX 5090", + "driver": "595.91.07", + "src": { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "line": 31, + "lineEnd": null, + "raw": "{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 30}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L31" + } + }, + { + "segment": 31, + "result": "MATCH", + "checker": "project second pod", + "machine": "second pod", + "checkedBy": "project", + "code": "ovl.py c4a942c0 reference loader", + "gpu": "NVIDIA GeForce RTX 5090", + "driver": "595.91.07", + "src": { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "line": 32, + "lineEnd": null, + "raw": "{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 31}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L32" + } + }, + { + "segment": 32, + "result": "MATCH", + "checker": "project second pod", + "machine": "second pod", + "checkedBy": "project", + "code": "ovl.py c4a942c0 reference loader", + "gpu": "NVIDIA GeForce RTX 5090", + "driver": "595.91.07", + "src": { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "line": 33, + "lineEnd": null, + "raw": "{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 32}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L33" + } + }, + { + "segment": 33, + "result": "MATCH", + "checker": "project second pod", + "machine": "second pod", + "checkedBy": "project", + "code": "ovl.py c4a942c0 reference loader", + "gpu": "NVIDIA GeForce RTX 5090", + "driver": "595.91.07", + "src": { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "line": 34, + "lineEnd": null, + "raw": "{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 33}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L34" + } + }, + { + "segment": 34, + "result": "MATCH", + "checker": "project second pod", + "machine": "second pod", + "checkedBy": "project", + "code": "ovl.py c4a942c0 reference loader", + "gpu": "NVIDIA GeForce RTX 5090", + "driver": "595.91.07", + "src": { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "line": 35, + "lineEnd": null, + "raw": "{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 34}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L35" + } + }, + { + "segment": 35, + "result": "MATCH", + "checker": "project second pod", + "machine": "second pod", + "checkedBy": "project", + "code": "ovl.py c4a942c0 reference loader", + "gpu": "NVIDIA GeForce RTX 5090", + "driver": "595.91.07", + "src": { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "line": 36, + "lineEnd": null, + "raw": "{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 35}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L36" + } + }, + { + "segment": 36, + "result": "MATCH", + "checker": "project second pod", + "machine": "second pod", + "checkedBy": "project", + "code": "ovl.py c4a942c0 reference loader", + "gpu": "NVIDIA GeForce RTX 5090", + "driver": "595.91.07", + "src": { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "line": 37, + "lineEnd": null, + "raw": "{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 36}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L37" + } + }, + { + "segment": 22, + "result": "MATCH", + "checker": "project training pod", + "machine": "training pod", + "checkedBy": "project", + "code": "ovl.py c4a942c0", + "gpu": "NVIDIA GeForce RTX 5090", + "driver": "595.91.07", + "src": { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "line": 38, + "lineEnd": null, + "raw": "{\"checker\": \"project training pod\", \"code\": \"ovl.py c4a942c0\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 22}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L38" + } + }, + { + "segment": 31, + "result": "MATCH", + "checker": "project training pod", + "machine": "training pod", + "checkedBy": "project", + "code": "ovl.py c4a942c0", + "gpu": "NVIDIA GeForce RTX 5090", + "driver": "595.91.07", + "src": { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "line": 39, + "lineEnd": null, + "raw": "{\"checker\": \"project training pod\", \"code\": \"ovl.py c4a942c0\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 31}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L39" + } + }, + { + "segment": 32, + "result": "MATCH", + "checker": "project training pod", + "machine": "training pod", + "checkedBy": "project", + "code": "ovl.py c4a942c0", + "gpu": "NVIDIA GeForce RTX 5090", + "driver": "595.91.07", + "src": { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "line": 40, + "lineEnd": null, + "raw": "{\"checker\": \"project training pod\", \"code\": \"ovl.py c4a942c0\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 32}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L40" + } + }, + { + "segment": 33, + "result": "MATCH", + "checker": "project training pod", + "machine": "training pod", + "checkedBy": "project", + "code": "ovl.py c4a942c0", + "gpu": "NVIDIA GeForce RTX 5090", + "driver": "595.91.07", + "src": { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "line": 41, + "lineEnd": null, + "raw": "{\"checker\": \"project training pod\", \"code\": \"ovl.py c4a942c0\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 33}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L41" + } + }, + { + "segment": 34, + "result": "MATCH", + "checker": "project training pod", + "machine": "training pod", + "checkedBy": "project", + "code": "ovl.py c4a942c0", + "gpu": "NVIDIA GeForce RTX 5090", + "driver": "595.91.07", + "src": { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "line": 42, + "lineEnd": null, + "raw": "{\"checker\": \"project training pod\", \"code\": \"ovl.py c4a942c0\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 34}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L42" + } + }, + { + "segment": 35, + "result": "MATCH", + "checker": "project training pod", + "machine": "training pod", + "checkedBy": "project", + "code": "ovl.py c4a942c0", + "gpu": "NVIDIA GeForce RTX 5090", + "driver": "595.91.07", + "src": { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "line": 43, + "lineEnd": null, + "raw": "{\"checker\": \"project training pod\", \"code\": \"ovl.py c4a942c0\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 35}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L43" + } + }, + { + "segment": 36, + "result": "MATCH", + "checker": "project training pod", + "machine": "training pod", + "checkedBy": "project", + "code": "ovl.py c4a942c0", + "gpu": "NVIDIA GeForce RTX 5090", + "driver": "595.91.07", + "src": { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "line": 44, + "lineEnd": null, + "raw": "{\"checker\": \"project training pod\", \"code\": \"ovl.py c4a942c0\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 36}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L44" + } + }, + { + "segment": 5, + "result": "MATCH", + "checker": "project training pod", + "machine": "training pod", + "checkedBy": "project", + "code": "ovl.py c4a942c0 fast loader", + "gpu": "NVIDIA GeForce RTX 5090", + "driver": "595.91.07", + "src": { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "line": 45, + "lineEnd": null, + "raw": "{\"checker\": \"project training pod\", \"code\": \"ovl.py c4a942c0 fast loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 5}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L45" + } + }, + { + "segment": 21, + "result": "MATCH", + "checker": "project fresh machine public files only", + "machine": "fresh machine public files only", + "checkedBy": "project", + "code": "verify_segment.sh from the release", + "gpu": "NVIDIA GeForce RTX 5090", + "driver": "595.91.07", + "src": { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "line": 46, + "lineEnd": null, + "raw": "{\"checker\": \"project fresh machine public files only\", \"code\": \"verify_segment.sh from the release\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 21}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L46" + } + } + ], + "rowCount": 46, + "groups": [ + { + "checker": "project second pod", + "machine": "second pod", + "checkedBy": "project", + "rows": 37, + "match": 37, + "segments": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36 + ] + }, + { + "checker": "project training pod", + "machine": "training pod", + "checkedBy": "project", + "rows": 8, + "match": 8, + "segments": [ + 22, + 31, + 32, + 33, + 34, + 35, + 36, + 5 + ] + }, + { + "checker": "project fresh machine public files only", + "machine": "fresh machine public files only", + "checkedBy": "project", + "rows": 1, + "match": 1, + "segments": [ + 21 + ] + } + ], + "tiles": [ + { + "segment": 0, + "phase": "wikipedia", + "result": "MATCH", + "checkedBy": "project", + "checks": [ + 0 + ], + "events": [] + }, + { + "segment": 1, + "phase": "wikipedia", + "result": "MATCH", + "checkedBy": "project", + "checks": [ + 1 + ], + "events": [] + }, + { + "segment": 2, + "phase": "wikipedia", + "result": "MATCH", + "checkedBy": "project", + "checks": [ + 2 + ], + "events": [] + }, + { + "segment": 3, + "phase": "wikipedia", + "result": "MATCH", + "checkedBy": "project", + "checks": [ + 3 + ], + "events": [] + }, + { + "segment": 4, + "phase": "wikipedia", + "result": "MATCH", + "checkedBy": "project", + "checks": [ + 4 + ], + "events": [] + }, + { + "segment": 5, + "phase": "wikipedia", + "result": "MATCH", + "checkedBy": "project", + "checks": [ + 5, + 44 + ], + "events": [] + }, + { + "segment": 6, + "phase": "wikipedia", + "result": "MATCH", + "checkedBy": "project", + "checks": [ + 6 + ], + "events": [] + }, + { + "segment": 7, + "phase": "wikipedia", + "result": "MATCH", + "checkedBy": "project", + "checks": [ + 7 + ], + "events": [] + }, + { + "segment": 8, + "phase": "wikipedia", + "result": "MATCH", + "checkedBy": "project", + "checks": [ + 8 + ], + "events": [] + }, + { + "segment": 9, + "phase": "wikipedia", + "result": "MATCH", + "checkedBy": "project", + "checks": [ + 9 + ], + "events": [] + }, + { + "segment": 10, + "phase": "wikipedia", + "result": "MATCH", + "checkedBy": "project", + "checks": [ + 10 + ], + "events": [ + "restart" + ] + }, + { + "segment": 11, + "phase": "wikipedia", + "result": "MATCH", + "checkedBy": "project", + "checks": [ + 11 + ], + "events": [] + }, + { + "segment": 12, + "phase": "wikipedia", + "result": "MATCH", + "checkedBy": "project", + "checks": [ + 12 + ], + "events": [] + }, + { + "segment": 13, + "phase": "wikipedia", + "result": "MATCH", + "checkedBy": "project", + "checks": [ + 13 + ], + "events": [] + }, + { + "segment": 14, + "phase": "wikipedia", + "result": "MATCH", + "checkedBy": "project", + "checks": [ + 14 + ], + "events": [] + }, + { + "segment": 15, + "phase": "wikipedia", + "result": "MATCH", + "checkedBy": "project", + "checks": [ + 15 + ], + "events": [] + }, + { + "segment": 16, + "phase": "wikipedia", + "result": "MATCH", + "checkedBy": "project", + "checks": [ + 16 + ], + "events": [] + }, + { + "segment": 17, + "phase": "wikipedia", + "result": "MATCH", + "checkedBy": "project", + "checks": [ + 17 + ], + "events": [] + }, + { + "segment": 18, + "phase": "wikipedia", + "result": "MATCH", + "checkedBy": "project", + "checks": [ + 18 + ], + "events": [] + }, + { + "segment": 19, + "phase": "wikipedia", + "result": "MATCH", + "checkedBy": "project", + "checks": [ + 19 + ], + "events": [ + "code-change" + ] + }, + { + "segment": 20, + "phase": "wikipedia", + "result": "MATCH", + "checkedBy": "project", + "checks": [ + 20 + ], + "events": [] + }, + { + "segment": 21, + "phase": "wikipedia", + "result": "MATCH", + "checkedBy": "project", + "checks": [ + 21, + 45 + ], + "events": [] + }, + { + "segment": 22, + "phase": "wikipedia", + "result": "MATCH", + "checkedBy": "project", + "checks": [ + 22, + 37 + ], + "events": [] + }, + { + "segment": 23, + "phase": "wikipedia", + "result": "MATCH", + "checkedBy": "project", + "checks": [ + 23 + ], + "events": [] + }, + { + "segment": 24, + "phase": "wikipedia", + "result": "MATCH", + "checkedBy": "project", + "checks": [ + 24 + ], + "events": [] + }, + { + "segment": 25, + "phase": "wikipedia", + "result": "MATCH", + "checkedBy": "project", + "checks": [ + 25 + ], + "events": [] + }, + { + "segment": 26, + "phase": "wikipedia", + "result": "MATCH", + "checkedBy": "project", + "checks": [ + 26 + ], + "events": [] + }, + { + "segment": 27, + "phase": "wikipedia", + "result": "MATCH", + "checkedBy": "project", + "checks": [ + 27 + ], + "events": [] + }, + { + "segment": 28, + "phase": "wikipedia", + "result": "MATCH", + "checkedBy": "project", + "checks": [ + 28 + ], + "events": [] + }, + { + "segment": 29, + "phase": "wikipedia", + "result": "MATCH", + "checkedBy": "project", + "checks": [ + 29 + ], + "events": [] + }, + { + "segment": 30, + "phase": "wikipedia", + "result": "MATCH", + "checkedBy": "project", + "checks": [ + 30 + ], + "events": [] + }, + { + "segment": 31, + "phase": "conversation", + "result": "MATCH", + "checkedBy": "project", + "checks": [ + 31, + 38 + ], + "events": [] + }, + { + "segment": 32, + "phase": "conversation", + "result": "MATCH", + "checkedBy": "project", + "checks": [ + 32, + 39 + ], + "events": [] + }, + { + "segment": 33, + "phase": "conversation", + "result": "MATCH", + "checkedBy": "project", + "checks": [ + 33, + 40 + ], + "events": [] + }, + { + "segment": 34, + "phase": "conversation", + "result": "MATCH", + "checkedBy": "project", + "checks": [ + 34, + 41 + ], + "events": [] + }, + { + "segment": 35, + "phase": "conversation", + "result": "MATCH", + "checkedBy": "project", + "checks": [ + 35, + 42 + ], + "events": [] + }, + { + "segment": 36, + "phase": "conversation", + "result": "MATCH", + "checkedBy": "project", + "checks": [ + 36, + 43 + ], + "events": [] + } + ], + "machines": 3, + "allMatch": true, + "segmentsMatched": 37, + "secondMachineMatched": 37, + "secondMachine": "project second pod", + "freshMachine": "project fresh machine public files only", + "freshSegments": [ + 21 + ], + "projectChecks": 46, + "independentChecks": 0, + "src": { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "line": 1, + "lineEnd": 46, + "raw": null, + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L1-L46" + } + }, + "odds": { + "N": 37, + "Nm1": 36, + "formula": "1 − (36/37)^M", + "m95": 110, + "m99": 169, + "p95": 0.9508995539986606, + "p99": 0.9902494017588821, + "pAtN": 0.6371486544416634, + "currentM": 0, + "currentP": 0.0, + "src": { + "origin": "hf", + "file": "release/simple-run/README.md", + "rev": "96dc282a", + "line": 46, + "lineEnd": null, + "raw": "random segment catch a single forged segment with probability 1 − ((N−1)/N)^M. One checker who", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/README.md#L46" + } + }, + "events": [ + { + "id": "restart", + "segment": 10, + "gapSeconds": 3297, + "medianGapSeconds": 1968, + "src": { + "origin": "hf", + "file": "release/simple-run/README.md", + "rev": "96dc282a", + "line": 133, + "lineEnd": 134, + "raw": "- The training host restarted once, at boundary 10. Training resumed from checkpoint 10, and\n segment 10 (which spans the restart) matched.", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/README.md#L133-L134" + } + }, + { + "id": "code-change", + "segment": 19, + "codeBefore": "ovl.py 202ac6ce", + "codeAfter": "ovl.py c4a942c0 reference loader", + "src": { + "origin": "hf", + "file": "release/simple-run/README.md", + "rev": "96dc282a", + "line": 127, + "lineEnd": 128, + "raw": "- Code versions: segments 0–18 were trained with `ovl.py` sha256 `202ac6ce…`\n (`code/training-code/ovl-segments-00-18.py`). Segments 19 onward used `c4a942c0…`", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/README.md#L127-L128" + }, + "rowBefore": { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "line": 19, + "lineEnd": null, + "raw": "{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 18}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L19" + }, + "rowAfter": { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "line": 20, + "lineEnd": null, + "raw": "{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 19}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L20" + } + } + ], + "hardware": [ + { + "segment": "32", + "result": "MATCH", + "hardware": "NVIDIA GeForce RTX 5090 (Blackwell)", + "driver": "595.91.07", + "software": "torch 2.8.0+cu128", + "note": "training GPU type; control for this probe", + "src": { + "origin": "hf", + "file": "release/simple-run/hardware-map.jsonl", + "rev": "96dc282a", + "line": 1, + "lineEnd": null, + "raw": "{\"segment\": 32, \"result\": \"MATCH\", \"hardware\": \"NVIDIA GeForce RTX 5090 (Blackwell)\", \"driver\": \"595.91.07\", \"software\": \"torch 2.8.0+cu128\", \"note\": \"training GPU type; control for this probe\"}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/hardware-map.jsonl#L1" + } + }, + { + "segment": "32", + "result": "MISMATCH", + "hardware": "NVIDIA GeForce RTX 4090 (Ada)", + "driver": "595.91.07", + "software": "torch 2.8.0+cu128", + "note": "same software, different architecture", + "src": { + "origin": "hf", + "file": "release/simple-run/hardware-map.jsonl", + "rev": "96dc282a", + "line": 2, + "lineEnd": null, + "raw": "{\"segment\": 32, \"result\": \"MISMATCH\", \"hardware\": \"NVIDIA GeForce RTX 4090 (Ada)\", \"driver\": \"595.91.07\", \"software\": \"torch 2.8.0+cu128\", \"note\": \"same software, different architecture\"}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/hardware-map.jsonl#L2" + } + }, + { + "segment": "32", + "result": "MISMATCH", + "hardware": "NVIDIA H100 80GB HBM3 (Hopper)", + "driver": "595.91.07", + "software": "torch 2.8.0+cu128", + "note": "same software, different architecture", + "src": { + "origin": "hf", + "file": "release/simple-run/hardware-map.jsonl", + "rev": "96dc282a", + "line": 3, + "lineEnd": null, + "raw": "{\"segment\": 32, \"result\": \"MISMATCH\", \"hardware\": \"NVIDIA H100 80GB HBM3 (Hopper)\", \"driver\": \"595.91.07\", \"software\": \"torch 2.8.0+cu128\", \"note\": \"same software, different architecture\"}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/hardware-map.jsonl#L3" + } + }, + { + "segment": "32", + "result": "MISMATCH", + "hardware": "x86_64 CPU", + "driver": "none", + "software": "torch 2.14.0+cpu", + "note": "different hardware and software", + "src": { + "origin": "hf", + "file": "release/simple-run/hardware-map.jsonl", + "rev": "96dc282a", + "line": 4, + "lineEnd": null, + "raw": "{\"segment\": 32, \"result\": \"MISMATCH\", \"hardware\": \"x86_64 CPU\", \"driver\": \"none\", \"software\": \"torch 2.14.0+cpu\", \"note\": \"different hardware and software\"}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/hardware-map.jsonl#L4" + } + }, + { + "segment": "all 37", + "result": "MATCH", + "hardware": "NVIDIA GeForce RTX 5090 (Blackwell)", + "driver": "595.91.07", + "software": "torch 2.8.0+cu128", + "note": "training ran on driver 570.195.03 for segments 0-9, 595.91.07 after", + "src": { + "origin": "hf", + "file": "release/simple-run/hardware-map.jsonl", + "rev": "96dc282a", + "line": 5, + "lineEnd": null, + "raw": "{\"segment\": \"all 37\", \"result\": \"MATCH\", \"hardware\": \"NVIDIA GeForce RTX 5090 (Blackwell)\", \"driver\": \"595.91.07\", \"software\": \"torch 2.8.0+cu128\", \"note\": \"training ran on driver 570.195.03 for segments 0-9, 595.91.07 after\"}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/hardware-map.jsonl#L5" + } + } + ], + "downloads": [ + { + "release": "release/simple-run", + "files": [ + { + "file": "base-model.pt", + "sha256": "976c62e8b28db786c38dc2ff969339603d0ee917d830f2815d9e858d2a3c0ce3", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/base-model.pt", + "src": { + "origin": "hf", + "file": "release/simple-run/release-hashes.txt", + "rev": "96dc282a", + "line": 1, + "lineEnd": null, + "raw": "976c62e8b28db786c38dc2ff969339603d0ee917d830f2815d9e858d2a3c0ce3 base-model.pt", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/release-hashes.txt#L1" + } + }, + { + "file": "chain.jsonl", + "sha256": "c1f867e16d0660c611186183863cc5626e3510b046d52e617c3953beb8f8a327", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/chain.jsonl", + "src": { + "origin": "hf", + "file": "release/simple-run/release-hashes.txt", + "rev": "96dc282a", + "line": 2, + "lineEnd": null, + "raw": "c1f867e16d0660c611186183863cc5626e3510b046d52e617c3953beb8f8a327 chain.jsonl", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/release-hashes.txt#L2" + } + }, + { + "file": "ckpt-00000.pt", + "sha256": "3dccf4a6d258ff5e150ee1ed590f4baff099e5a368d580e610ecf238b4ba8c22", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/ckpt-00000.pt", + "src": { + "origin": "hf", + "file": "release/simple-run/release-hashes.txt", + "rev": "96dc282a", + "line": 3, + "lineEnd": null, + "raw": "3dccf4a6d258ff5e150ee1ed590f4baff099e5a368d580e610ecf238b4ba8c22 ckpt-00000.pt", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/release-hashes.txt#L3" + } + }, + { + "file": "ckpt-00001.pt", + "sha256": "ba524fd9691c4a849d1a3dac177af426df36d8e04d9c75fba2dbf036a4b515f9", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/ckpt-00001.pt", + "src": { + "origin": "hf", + "file": "release/simple-run/release-hashes.txt", + "rev": "96dc282a", + "line": 4, + "lineEnd": null, + "raw": "ba524fd9691c4a849d1a3dac177af426df36d8e04d9c75fba2dbf036a4b515f9 ckpt-00001.pt", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/release-hashes.txt#L4" + } + }, + { + "file": "ckpt-00002.pt", + "sha256": "627106799e630a9297770b31b0e1f66b1418215eea50c1cd3f3a23c48e138a33", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/ckpt-00002.pt", + "src": { + "origin": "hf", + "file": "release/simple-run/release-hashes.txt", + "rev": "96dc282a", + "line": 5, + "lineEnd": null, + "raw": "627106799e630a9297770b31b0e1f66b1418215eea50c1cd3f3a23c48e138a33 ckpt-00002.pt", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/release-hashes.txt#L5" + } + }, + { + "file": "ckpt-00003.pt", + "sha256": "0b64c3f0208d636b19bdf5970810c27cb2ceab33f18153915d64f6493201bc10", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/ckpt-00003.pt", + "src": { + "origin": "hf", + "file": "release/simple-run/release-hashes.txt", + "rev": "96dc282a", + "line": 6, + "lineEnd": null, + "raw": "0b64c3f0208d636b19bdf5970810c27cb2ceab33f18153915d64f6493201bc10 ckpt-00003.pt", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/release-hashes.txt#L6" + } + }, + { + "file": "ckpt-00004.pt", + "sha256": "68f07c741473f7ad0c2c61d52dc25c4d8a9c441382d348f9c1a97d215bba452e", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/ckpt-00004.pt", + "src": { + "origin": "hf", + "file": "release/simple-run/release-hashes.txt", + "rev": "96dc282a", + "line": 7, + "lineEnd": null, + "raw": "68f07c741473f7ad0c2c61d52dc25c4d8a9c441382d348f9c1a97d215bba452e ckpt-00004.pt", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/release-hashes.txt#L7" + } + }, + { + "file": "ckpt-00005.pt", + "sha256": "29cdefeb28098ba4572869655b58c9dd2e771edc3717f0112d700477b74defb8", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/ckpt-00005.pt", + "src": { + "origin": "hf", + "file": "release/simple-run/release-hashes.txt", + "rev": "96dc282a", + "line": 8, + "lineEnd": null, + "raw": "29cdefeb28098ba4572869655b58c9dd2e771edc3717f0112d700477b74defb8 ckpt-00005.pt", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/release-hashes.txt#L8" + } + }, + { + "file": "ckpt-00006.pt", + "sha256": "3e861cd5457c1a1566c8ebcee2a712feca2f3e5603ad46436d393aca5cbb5999", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/ckpt-00006.pt", + "src": { + "origin": "hf", + "file": "release/simple-run/release-hashes.txt", + "rev": "96dc282a", + "line": 9, + "lineEnd": null, + "raw": "3e861cd5457c1a1566c8ebcee2a712feca2f3e5603ad46436d393aca5cbb5999 ckpt-00006.pt", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/release-hashes.txt#L9" + } + }, + { + "file": "ckpt-00007.pt", + "sha256": "400734c784b59c9363fdbdd745f7f0f6d70c1be09d2c747976bc2b4fae01b64b", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/ckpt-00007.pt", + "src": { + "origin": "hf", + "file": "release/simple-run/release-hashes.txt", + "rev": "96dc282a", + "line": 10, + "lineEnd": null, + "raw": "400734c784b59c9363fdbdd745f7f0f6d70c1be09d2c747976bc2b4fae01b64b ckpt-00007.pt", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/release-hashes.txt#L10" + } + }, + { + "file": "ckpt-00008.pt", + "sha256": "fe5352356351e4d9e4b0abd59f279c7a2ed98888177fbb773fd1f1983fefe83f", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/ckpt-00008.pt", + "src": { + "origin": "hf", + "file": "release/simple-run/release-hashes.txt", + "rev": "96dc282a", + "line": 11, + "lineEnd": null, + "raw": "fe5352356351e4d9e4b0abd59f279c7a2ed98888177fbb773fd1f1983fefe83f ckpt-00008.pt", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/release-hashes.txt#L11" + } + }, + { + "file": "ckpt-00009.pt", + "sha256": "41819daf70a409e200f5189ab45ae96293716794733ad534e4843ac3f8b1982e", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/ckpt-00009.pt", + "src": { + "origin": "hf", + "file": "release/simple-run/release-hashes.txt", + "rev": "96dc282a", + "line": 12, + "lineEnd": null, + "raw": "41819daf70a409e200f5189ab45ae96293716794733ad534e4843ac3f8b1982e ckpt-00009.pt", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/release-hashes.txt#L12" + } + }, + { + "file": "ckpt-00010.pt", + "sha256": "75cd5863903d9f595e2d50cacea3ec0530f41c154d4ec8817f41376b6f222e3f", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/ckpt-00010.pt", + "src": { + "origin": "hf", + "file": "release/simple-run/release-hashes.txt", + "rev": "96dc282a", + "line": 13, + "lineEnd": null, + "raw": "75cd5863903d9f595e2d50cacea3ec0530f41c154d4ec8817f41376b6f222e3f ckpt-00010.pt", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/release-hashes.txt#L13" + } + }, + { + "file": "ckpt-00011.pt", + "sha256": "46ece4b519e8624a2b41856b1ecfa9a5daf4994616a9bdd8d941625cb09a32ed", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/ckpt-00011.pt", + "src": { + "origin": "hf", + "file": "release/simple-run/release-hashes.txt", + "rev": "96dc282a", + "line": 14, + "lineEnd": null, + "raw": "46ece4b519e8624a2b41856b1ecfa9a5daf4994616a9bdd8d941625cb09a32ed ckpt-00011.pt", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/release-hashes.txt#L14" + } + }, + { + "file": "ckpt-00012.pt", + "sha256": "8b0e19692ccc6c6e6e0eb745633ae2dd2c4e86d0ca84b8ea1c7f1f81a888b892", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/ckpt-00012.pt", + "src": { + "origin": "hf", + "file": "release/simple-run/release-hashes.txt", + "rev": "96dc282a", + "line": 15, + "lineEnd": null, + "raw": "8b0e19692ccc6c6e6e0eb745633ae2dd2c4e86d0ca84b8ea1c7f1f81a888b892 ckpt-00012.pt", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/release-hashes.txt#L15" + } + }, + { + "file": "ckpt-00013.pt", + "sha256": "3ac79c55fe528bcc62bd7a7a047e2b2a19e2d2e494c85e26301b0fc79f345aee", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/ckpt-00013.pt", + "src": { + "origin": "hf", + "file": "release/simple-run/release-hashes.txt", + "rev": "96dc282a", + "line": 16, + "lineEnd": null, + "raw": "3ac79c55fe528bcc62bd7a7a047e2b2a19e2d2e494c85e26301b0fc79f345aee ckpt-00013.pt", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/release-hashes.txt#L16" + } + }, + { + "file": "ckpt-00014.pt", + "sha256": "ad933ae52b14ff5de72624c5dc7af9b3e5464155b9c3ed84bd43bd5be4f737c3", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/ckpt-00014.pt", + "src": { + "origin": "hf", + "file": "release/simple-run/release-hashes.txt", + "rev": "96dc282a", + "line": 17, + "lineEnd": null, + "raw": "ad933ae52b14ff5de72624c5dc7af9b3e5464155b9c3ed84bd43bd5be4f737c3 ckpt-00014.pt", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/release-hashes.txt#L17" + } + }, + { + "file": "ckpt-00015.pt", + "sha256": "2cfddc6c26fb7e8dc99c94b6fb39007a4937b67e1c8d852f2561d990e857cb62", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/ckpt-00015.pt", + "src": { + "origin": "hf", + "file": "release/simple-run/release-hashes.txt", + "rev": "96dc282a", + "line": 18, + "lineEnd": null, + "raw": "2cfddc6c26fb7e8dc99c94b6fb39007a4937b67e1c8d852f2561d990e857cb62 ckpt-00015.pt", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/release-hashes.txt#L18" + } + }, + { + "file": "ckpt-00016.pt", + "sha256": "3729909ae0f85b79377956ad8defdaaeceac0cd000a1c47e582f38685f4158d6", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/ckpt-00016.pt", + "src": { + "origin": "hf", + "file": "release/simple-run/release-hashes.txt", + "rev": "96dc282a", + "line": 19, + "lineEnd": null, + "raw": "3729909ae0f85b79377956ad8defdaaeceac0cd000a1c47e582f38685f4158d6 ckpt-00016.pt", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/release-hashes.txt#L19" + } + }, + { + "file": "ckpt-00017.pt", + "sha256": "9f8537d432d78b254dcba86e7bd987246d928bbc837950ffe2536ba989747c41", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/ckpt-00017.pt", + "src": { + "origin": "hf", + "file": "release/simple-run/release-hashes.txt", + "rev": "96dc282a", + "line": 20, + "lineEnd": null, + "raw": "9f8537d432d78b254dcba86e7bd987246d928bbc837950ffe2536ba989747c41 ckpt-00017.pt", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/release-hashes.txt#L20" + } + }, + { + "file": "ckpt-00018.pt", + "sha256": "a09df5692aac7e42a0430fd225c75937bf75c85a9dfb77b899b4cb956a8c51d1", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/ckpt-00018.pt", + "src": { + "origin": "hf", + "file": "release/simple-run/release-hashes.txt", + "rev": "96dc282a", + "line": 21, + "lineEnd": null, + "raw": "a09df5692aac7e42a0430fd225c75937bf75c85a9dfb77b899b4cb956a8c51d1 ckpt-00018.pt", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/release-hashes.txt#L21" + } + }, + { + "file": "ckpt-00019.pt", + "sha256": "ef18f34f8ac17a2581193ffc681a927f655bdadce4c6ca2de0a095d72094bb24", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/ckpt-00019.pt", + "src": { + "origin": "hf", + "file": "release/simple-run/release-hashes.txt", + "rev": "96dc282a", + "line": 22, + "lineEnd": null, + "raw": "ef18f34f8ac17a2581193ffc681a927f655bdadce4c6ca2de0a095d72094bb24 ckpt-00019.pt", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/release-hashes.txt#L22" + } + }, + { + "file": "ckpt-00020.pt", + "sha256": "6bda17b7f79347cc57cb1325215a3a68f9f2357ee5b97f2c88e353189244fcdf", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/ckpt-00020.pt", + "src": { + "origin": "hf", + "file": "release/simple-run/release-hashes.txt", + "rev": "96dc282a", + "line": 23, + "lineEnd": null, + "raw": "6bda17b7f79347cc57cb1325215a3a68f9f2357ee5b97f2c88e353189244fcdf ckpt-00020.pt", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/release-hashes.txt#L23" + } + }, + { + "file": "ckpt-00021.pt", + "sha256": "7df62e3801530777a4491bcecb0199a2b5628a9de61da30f5f6513c74c028095", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/ckpt-00021.pt", + "src": { + "origin": "hf", + "file": "release/simple-run/release-hashes.txt", + "rev": "96dc282a", + "line": 24, + "lineEnd": null, + "raw": "7df62e3801530777a4491bcecb0199a2b5628a9de61da30f5f6513c74c028095 ckpt-00021.pt", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/release-hashes.txt#L24" + } + }, + { + "file": "ckpt-00022.pt", + "sha256": "23d9271d4f4c49e8e04a13f498ed0a89d57c3f80705044c2c8fe10eecc895896", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/ckpt-00022.pt", + "src": { + "origin": "hf", + "file": "release/simple-run/release-hashes.txt", + "rev": "96dc282a", + "line": 25, + "lineEnd": null, + "raw": "23d9271d4f4c49e8e04a13f498ed0a89d57c3f80705044c2c8fe10eecc895896 ckpt-00022.pt", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/release-hashes.txt#L25" + } + }, + { + "file": "ckpt-00023.pt", + "sha256": "2b68d53231a0d3a639312ed45eeb2afef3720f93824819843dd2c9fb68f2fc4c", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/ckpt-00023.pt", + "src": { + "origin": "hf", + "file": "release/simple-run/release-hashes.txt", + "rev": "96dc282a", + "line": 26, + "lineEnd": null, + "raw": "2b68d53231a0d3a639312ed45eeb2afef3720f93824819843dd2c9fb68f2fc4c ckpt-00023.pt", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/release-hashes.txt#L26" + } + }, + { + "file": "ckpt-00024.pt", + "sha256": "8a06f96345a0ff23933d6b946a4fc88ad63a6b43a618a91a1639267cf1c0e23b", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/ckpt-00024.pt", + "src": { + "origin": "hf", + "file": "release/simple-run/release-hashes.txt", + "rev": "96dc282a", + "line": 27, + "lineEnd": null, + "raw": "8a06f96345a0ff23933d6b946a4fc88ad63a6b43a618a91a1639267cf1c0e23b ckpt-00024.pt", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/release-hashes.txt#L27" + } + }, + { + "file": "ckpt-00025.pt", + "sha256": "7bed06bf3566e18595a190bc1418fe5735689a2c47d280d857c0a5f68ba73a7f", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/ckpt-00025.pt", + "src": { + "origin": "hf", + "file": "release/simple-run/release-hashes.txt", + "rev": "96dc282a", + "line": 28, + "lineEnd": null, + "raw": "7bed06bf3566e18595a190bc1418fe5735689a2c47d280d857c0a5f68ba73a7f ckpt-00025.pt", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/release-hashes.txt#L28" + } + }, + { + "file": "ckpt-00026.pt", + "sha256": "31e21be4135f53a912312fae5f26d9b2eefc344171b8935e295c655f49c3b701", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/ckpt-00026.pt", + "src": { + "origin": "hf", + "file": "release/simple-run/release-hashes.txt", + "rev": "96dc282a", + "line": 29, + "lineEnd": null, + "raw": "31e21be4135f53a912312fae5f26d9b2eefc344171b8935e295c655f49c3b701 ckpt-00026.pt", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/release-hashes.txt#L29" + } + }, + { + "file": "ckpt-00027.pt", + "sha256": "2efcee93267b438152c35cfc1975fd0d8d2dcec804b2713fcc11bdd8602752cf", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/ckpt-00027.pt", + "src": { + "origin": "hf", + "file": "release/simple-run/release-hashes.txt", + "rev": "96dc282a", + "line": 30, + "lineEnd": null, + "raw": "2efcee93267b438152c35cfc1975fd0d8d2dcec804b2713fcc11bdd8602752cf ckpt-00027.pt", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/release-hashes.txt#L30" + } + }, + { + "file": "ckpt-00028.pt", + "sha256": "671cf6928fc370a464fade45cf5565a65c019c9888b6c9d8962230364cc4c5b4", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/ckpt-00028.pt", + "src": { + "origin": "hf", + "file": "release/simple-run/release-hashes.txt", + "rev": "96dc282a", + "line": 31, + "lineEnd": null, + "raw": "671cf6928fc370a464fade45cf5565a65c019c9888b6c9d8962230364cc4c5b4 ckpt-00028.pt", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/release-hashes.txt#L31" + } + }, + { + "file": "ckpt-00029.pt", + "sha256": "082195ad124ad61287e94f224c6672b2175b1c1c35f06baee2b56adbc12f92da", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/ckpt-00029.pt", + "src": { + "origin": "hf", + "file": "release/simple-run/release-hashes.txt", + "rev": "96dc282a", + "line": 32, + "lineEnd": null, + "raw": "082195ad124ad61287e94f224c6672b2175b1c1c35f06baee2b56adbc12f92da ckpt-00029.pt", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/release-hashes.txt#L32" + } + }, + { + "file": "ckpt-00030.pt", + "sha256": "febe492c2c87335b078c910894172bcf8f572b853d807b8f24da99e9e0127979", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/ckpt-00030.pt", + "src": { + "origin": "hf", + "file": "release/simple-run/release-hashes.txt", + "rev": "96dc282a", + "line": 33, + "lineEnd": null, + "raw": "febe492c2c87335b078c910894172bcf8f572b853d807b8f24da99e9e0127979 ckpt-00030.pt", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/release-hashes.txt#L33" + } + }, + { + "file": "ckpt-00031.pt", + "sha256": "c687187b7daaa97d0fd8c96df302313e051febc29d64b5ef4d5b5775d684244b", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/ckpt-00031.pt", + "src": { + "origin": "hf", + "file": "release/simple-run/release-hashes.txt", + "rev": "96dc282a", + "line": 34, + "lineEnd": null, + "raw": "c687187b7daaa97d0fd8c96df302313e051febc29d64b5ef4d5b5775d684244b ckpt-00031.pt", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/release-hashes.txt#L34" + } + }, + { + "file": "ckpt-00032.pt", + "sha256": "b49bfa976a6aa59fc54b9511fccc4745a4493b81cc58a3ff310ffecf7a92f45e", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/ckpt-00032.pt", + "src": { + "origin": "hf", + "file": "release/simple-run/release-hashes.txt", + "rev": "96dc282a", + "line": 35, + "lineEnd": null, + "raw": "b49bfa976a6aa59fc54b9511fccc4745a4493b81cc58a3ff310ffecf7a92f45e ckpt-00032.pt", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/release-hashes.txt#L35" + } + }, + { + "file": "ckpt-00033.pt", + "sha256": "8fa1f26811ef37b235c968c4204044983895b217e00db731d57f3a2cecda179e", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/ckpt-00033.pt", + "src": { + "origin": "hf", + "file": "release/simple-run/release-hashes.txt", + "rev": "96dc282a", + "line": 36, + "lineEnd": null, + "raw": "8fa1f26811ef37b235c968c4204044983895b217e00db731d57f3a2cecda179e ckpt-00033.pt", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/release-hashes.txt#L36" + } + }, + { + "file": "ckpt-00034.pt", + "sha256": "5fe1e5af0d612046c7617d079181090e3ac0898411fe39900e05346c90b29aeb", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/ckpt-00034.pt", + "src": { + "origin": "hf", + "file": "release/simple-run/release-hashes.txt", + "rev": "96dc282a", + "line": 37, + "lineEnd": null, + "raw": "5fe1e5af0d612046c7617d079181090e3ac0898411fe39900e05346c90b29aeb ckpt-00034.pt", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/release-hashes.txt#L37" + } + }, + { + "file": "ckpt-00035.pt", + "sha256": "4766216588d357cdbe5bdd35e4b9534317d59f8b1273b5b722a390e748ae3beb", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/ckpt-00035.pt", + "src": { + "origin": "hf", + "file": "release/simple-run/release-hashes.txt", + "rev": "96dc282a", + "line": 38, + "lineEnd": null, + "raw": "4766216588d357cdbe5bdd35e4b9534317d59f8b1273b5b722a390e748ae3beb ckpt-00035.pt", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/release-hashes.txt#L38" + } + }, + { + "file": "ckpt-00036.pt", + "sha256": "1ca4bd559c51e9d83ba2ea84a85e518e0309d0844d964535868339a16b66e239", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/ckpt-00036.pt", + "src": { + "origin": "hf", + "file": "release/simple-run/release-hashes.txt", + "rev": "96dc282a", + "line": 39, + "lineEnd": null, + "raw": "1ca4bd559c51e9d83ba2ea84a85e518e0309d0844d964535868339a16b66e239 ckpt-00036.pt", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/release-hashes.txt#L39" + } + }, + { + "file": "ckpt-00037.pt", + "sha256": "88947898dab959fd82f954f81681103bac7f6b770f4bcc13d6eac29ca1795ecb", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/ckpt-00037.pt", + "src": { + "origin": "hf", + "file": "release/simple-run/release-hashes.txt", + "rev": "96dc282a", + "line": 40, + "lineEnd": null, + "raw": "88947898dab959fd82f954f81681103bac7f6b770f4bcc13d6eac29ca1795ecb ckpt-00037.pt", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/release-hashes.txt#L40" + } + }, + { + "file": "conversation-model.pt", + "sha256": "149cfae13c4523a1010c52161e13babf76c9ddc01f34fa1a8b580677b733a64c", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/conversation-model.pt", + "src": { + "origin": "hf", + "file": "release/simple-run/release-hashes.txt", + "rev": "96dc282a", + "line": 41, + "lineEnd": null, + "raw": "149cfae13c4523a1010c52161e13babf76c9ddc01f34fa1a8b580677b733a64c conversation-model.pt", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/release-hashes.txt#L41" + } + }, + { + "file": "recipe.json", + "sha256": "28a2fb407a5582ae95c9e9b0bba2c14df946e87bba037800399c6059256b6e6d", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/recipe.json", + "src": { + "origin": "hf", + "file": "release/simple-run/release-hashes.txt", + "rev": "96dc282a", + "line": 42, + "lineEnd": null, + "raw": "28a2fb407a5582ae95c9e9b0bba2c14df946e87bba037800399c6059256b6e6d recipe.json", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/release-hashes.txt#L42" + } + } + ] + }, + { + "release": "release/unlearning-3i-atlas", + "files": [ + { + "file": "base-model.pt", + "sha256": "ff30d7f4bf9ec41f0514d63a4d8bc1a74172481b89e07608383c0c3513f83441", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/base-model.pt", + "src": { + "origin": "hf", + "file": "release/unlearning-3i-atlas/release-hashes.txt", + "rev": "96dc282a", + "line": 1, + "lineEnd": null, + "raw": "ff30d7f4bf9ec41f0514d63a4d8bc1a74172481b89e07608383c0c3513f83441 base-model.pt", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/release-hashes.txt#L1" + } + }, + { + "file": "chain.jsonl", + "sha256": "98ffe339f9a0e20458b2615597fdb9ca23b0b12a5bac3873c9327893e724e6c1", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/chain.jsonl", + "src": { + "origin": "hf", + "file": "release/unlearning-3i-atlas/release-hashes.txt", + "rev": "96dc282a", + "line": 2, + "lineEnd": null, + "raw": "98ffe339f9a0e20458b2615597fdb9ca23b0b12a5bac3873c9327893e724e6c1 chain.jsonl", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/release-hashes.txt#L2" + } + }, + { + "file": "ckpt-00030.pt", + "sha256": "febe492c2c87335b078c910894172bcf8f572b853d807b8f24da99e9e0127979", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/ckpt-00030.pt", + "src": { + "origin": "hf", + "file": "release/unlearning-3i-atlas/release-hashes.txt", + "rev": "96dc282a", + "line": 3, + "lineEnd": null, + "raw": "febe492c2c87335b078c910894172bcf8f572b853d807b8f24da99e9e0127979 ckpt-00030.pt", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/release-hashes.txt#L3" + } + }, + { + "file": "ckpt-00031.pt", + "sha256": "1728660ffdc7985f08b68721c7419523def8dff5dc0d19278057a23028723004", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/ckpt-00031.pt", + "src": { + "origin": "hf", + "file": "release/unlearning-3i-atlas/release-hashes.txt", + "rev": "96dc282a", + "line": 4, + "lineEnd": null, + "raw": "1728660ffdc7985f08b68721c7419523def8dff5dc0d19278057a23028723004 ckpt-00031.pt", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/release-hashes.txt#L4" + } + }, + { + "file": "ckpt-00032.pt", + "sha256": "c91c03ac526a3a7e48b1053eacbf46f798fcc076d0dbbf562b72fdbf50191b3c", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/ckpt-00032.pt", + "src": { + "origin": "hf", + "file": "release/unlearning-3i-atlas/release-hashes.txt", + "rev": "96dc282a", + "line": 5, + "lineEnd": null, + "raw": "c91c03ac526a3a7e48b1053eacbf46f798fcc076d0dbbf562b72fdbf50191b3c ckpt-00032.pt", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/release-hashes.txt#L5" + } + }, + { + "file": "ckpt-00033.pt", + "sha256": "b98f60b056330d0b38d68e1c1977be7c54c17cbf8d95b8d997550ec33056adbb", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/ckpt-00033.pt", + "src": { + "origin": "hf", + "file": "release/unlearning-3i-atlas/release-hashes.txt", + "rev": "96dc282a", + "line": 6, + "lineEnd": null, + "raw": "b98f60b056330d0b38d68e1c1977be7c54c17cbf8d95b8d997550ec33056adbb ckpt-00033.pt", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/release-hashes.txt#L6" + } + }, + { + "file": "ckpt-00034.pt", + "sha256": "2791741e1c6477954dd0b3177d29cfc4544a0d681375c841524edd774881b182", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/ckpt-00034.pt", + "src": { + "origin": "hf", + "file": "release/unlearning-3i-atlas/release-hashes.txt", + "rev": "96dc282a", + "line": 7, + "lineEnd": null, + "raw": "2791741e1c6477954dd0b3177d29cfc4544a0d681375c841524edd774881b182 ckpt-00034.pt", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/release-hashes.txt#L7" + } + }, + { + "file": "ckpt-00035.pt", + "sha256": "276ce1ed5d85fa8da957e6a501bde1b1add80eb9aa80d977a96d5cbd1c83dbd8", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/ckpt-00035.pt", + "src": { + "origin": "hf", + "file": "release/unlearning-3i-atlas/release-hashes.txt", + "rev": "96dc282a", + "line": 8, + "lineEnd": null, + "raw": "276ce1ed5d85fa8da957e6a501bde1b1add80eb9aa80d977a96d5cbd1c83dbd8 ckpt-00035.pt", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/release-hashes.txt#L8" + } + }, + { + "file": "ckpt-00036.pt", + "sha256": "cecbdf2f59bc3a260fe94491da2eb01b3055997b597e9a8c3be6e240f9742211", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/ckpt-00036.pt", + "src": { + "origin": "hf", + "file": "release/unlearning-3i-atlas/release-hashes.txt", + "rev": "96dc282a", + "line": 9, + "lineEnd": null, + "raw": "cecbdf2f59bc3a260fe94491da2eb01b3055997b597e9a8c3be6e240f9742211 ckpt-00036.pt", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/release-hashes.txt#L9" + } + }, + { + "file": "ckpt-00037.pt", + "sha256": "b2467b81ce20508df5007949e56cbe06a55bf22ed94c14a376ffa05033c97ced", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/ckpt-00037.pt", + "src": { + "origin": "hf", + "file": "release/unlearning-3i-atlas/release-hashes.txt", + "rev": "96dc282a", + "line": 10, + "lineEnd": null, + "raw": "b2467b81ce20508df5007949e56cbe06a55bf22ed94c14a376ffa05033c97ced ckpt-00037.pt", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/release-hashes.txt#L10" + } + }, + { + "file": "ckpt-00038.pt", + "sha256": "650bf7c046b4e295d0f19ffeb6cca0660814a8fc53c3433db6f8cbb84510f039", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/ckpt-00038.pt", + "src": { + "origin": "hf", + "file": "release/unlearning-3i-atlas/release-hashes.txt", + "rev": "96dc282a", + "line": 11, + "lineEnd": null, + "raw": "650bf7c046b4e295d0f19ffeb6cca0660814a8fc53c3433db6f8cbb84510f039 ckpt-00038.pt", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/release-hashes.txt#L11" + } + }, + { + "file": "conversation-model.pt", + "sha256": "e41be3a27bbcf16ce7a5224eb4766e88b2abe09fe6ddb6aadea399b9db4472d4", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/conversation-model.pt", + "src": { + "origin": "hf", + "file": "release/unlearning-3i-atlas/release-hashes.txt", + "rev": "96dc282a", + "line": 12, + "lineEnd": null, + "raw": "e41be3a27bbcf16ce7a5224eb4766e88b2abe09fe6ddb6aadea399b9db4472d4 conversation-model.pt", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/release-hashes.txt#L12" + } + }, + { + "file": "recipe.json", + "sha256": "28a2fb407a5582ae95c9e9b0bba2c14df946e87bba037800399c6059256b6e6d", + "download": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/resolve/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/recipe.json", + "src": { + "origin": "hf", + "file": "release/unlearning-3i-atlas/release-hashes.txt", + "rev": "96dc282a", + "line": 13, + "lineEnd": null, + "raw": "28a2fb407a5582ae95c9e9b0bba2c14df946e87bba037800399c6059256b6e6d recipe.json", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/release-hashes.txt#L13" + } + } + ] + } + ], + "anchor": { + "sha256": "2adaea4cae25439199ec2396c0e6e94d1d14188c070f217ed7e360ce10c1c18d", + "chainHead": "9edbcaddbb08ed20f3d655ac59d0aa57f6339a702d0fa1d3422856f5d8251a51", + "entries": 38, + "tsa": [ + { + "authority": "digicert", + "genTime": "2026-10-20T14:38:43Z", + "src": { + "origin": "hf", + "file": "release/simple-run/anchor.digicert.tsr", + "rev": "96dc282a", + "line": null, + "lineEnd": null, + "raw": "Time stamp: Oct 20 14:38:43 2026 GMT", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/anchor.digicert.tsr" + } + }, + { + "authority": "freetsa", + "genTime": "2026-10-20T14:38:43Z", + "src": { + "origin": "hf", + "file": "release/simple-run/anchor.freetsa.tsr", + "rev": "96dc282a", + "line": null, + "lineEnd": null, + "raw": "Time stamp: Oct 20 14:38:43 2026 GMT", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/anchor.freetsa.tsr" + } + } + ], + "src": { + "origin": "hf", + "file": "release/simple-run/anchor.json", + "rev": "96dc282a", + "line": null, + "lineEnd": null, + "raw": null, + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/anchor.json" + } + }, + "exclusion": { + "title": "3I/ATLAS", + "page": "80340464", + "pageRevision": "1371028825", + "titleSrc": { + "origin": "hf", + "file": "release/unlearning-3i-atlas/README.md", + "rev": "96dc282a", + "line": 4, + "lineEnd": 5, + "raw": "except that one Wikipedia article was never trained on: **3I/ATLAS** (the interstellar comet;", + "checkedBy": null, + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/README.md#L4-L5" + }, + "entries": 39, + "sharedPrefix": 31, + "sharedFirst": 0, + "sharedLast": 30, + "forkIndex": 31, + "rows": [ + { + "segment": 30, + "result": "MATCH", + "checker": "project fork pod", + "machine": "fork pod", + "checkedBy": "project", + "src": { + "origin": "hf", + "file": "release/unlearning-3i-atlas/verifications.jsonl", + "rev": "96dc282a", + "line": 1, + "lineEnd": null, + "raw": "{\"checker\": \"project fork pod\", \"code\": \"ovl.py fork-capable (code/simple/ovl.py)\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 30}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/verifications.jsonl#L1" + } + }, + { + "segment": 31, + "result": "MATCH", + "checker": "project fork pod", + "machine": "fork pod", + "checkedBy": "project", + "src": { + "origin": "hf", + "file": "release/unlearning-3i-atlas/verifications.jsonl", + "rev": "96dc282a", + "line": 2, + "lineEnd": null, + "raw": "{\"checker\": \"project fork pod\", \"code\": \"ovl.py fork-capable (code/simple/ovl.py)\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 31}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/verifications.jsonl#L2" + } + }, + { + "segment": 32, + "result": "MATCH", + "checker": "project fork pod", + "machine": "fork pod", + "checkedBy": "project", + "src": { + "origin": "hf", + "file": "release/unlearning-3i-atlas/verifications.jsonl", + "rev": "96dc282a", + "line": 3, + "lineEnd": null, + "raw": "{\"checker\": \"project fork pod\", \"code\": \"ovl.py fork-capable (code/simple/ovl.py)\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 32}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/verifications.jsonl#L3" + } + }, + { + "segment": 33, + "result": "MATCH", + "checker": "project fork pod", + "machine": "fork pod", + "checkedBy": "project", + "src": { + "origin": "hf", + "file": "release/unlearning-3i-atlas/verifications.jsonl", + "rev": "96dc282a", + "line": 4, + "lineEnd": null, + "raw": "{\"checker\": \"project fork pod\", \"code\": \"ovl.py fork-capable (code/simple/ovl.py)\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 33}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/verifications.jsonl#L4" + } + }, + { + "segment": 34, + "result": "MATCH", + "checker": "project fork pod", + "machine": "fork pod", + "checkedBy": "project", + "src": { + "origin": "hf", + "file": "release/unlearning-3i-atlas/verifications.jsonl", + "rev": "96dc282a", + "line": 5, + "lineEnd": null, + "raw": "{\"checker\": \"project fork pod\", \"code\": \"ovl.py fork-capable (code/simple/ovl.py)\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 34}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/verifications.jsonl#L5" + } + }, + { + "segment": 35, + "result": "MATCH", + "checker": "project fork pod", + "machine": "fork pod", + "checkedBy": "project", + "src": { + "origin": "hf", + "file": "release/unlearning-3i-atlas/verifications.jsonl", + "rev": "96dc282a", + "line": 6, + "lineEnd": null, + "raw": "{\"checker\": \"project fork pod\", \"code\": \"ovl.py fork-capable (code/simple/ovl.py)\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 35}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/verifications.jsonl#L6" + } + }, + { + "segment": 36, + "result": "MATCH", + "checker": "project fork pod", + "machine": "fork pod", + "checkedBy": "project", + "src": { + "origin": "hf", + "file": "release/unlearning-3i-atlas/verifications.jsonl", + "rev": "96dc282a", + "line": 7, + "lineEnd": null, + "raw": "{\"checker\": \"project fork pod\", \"code\": \"ovl.py fork-capable (code/simple/ovl.py)\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 36}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/verifications.jsonl#L7" + } + }, + { + "segment": 37, + "result": "MATCH", + "checker": "project fork pod", + "machine": "fork pod", + "checkedBy": "project", + "src": { + "origin": "hf", + "file": "release/unlearning-3i-atlas/verifications.jsonl", + "rev": "96dc282a", + "line": 8, + "lineEnd": null, + "raw": "{\"checker\": \"project fork pod\", \"code\": \"ovl.py fork-capable (code/simple/ovl.py)\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 37}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/verifications.jsonl#L8" + } + }, + { + "segment": 30, + "result": "MATCH", + "checker": "project fresh machine public files only", + "machine": "fresh machine public files only", + "checkedBy": "project", + "src": { + "origin": "hf", + "file": "release/unlearning-3i-atlas/verifications.jsonl", + "rev": "96dc282a", + "line": 9, + "lineEnd": null, + "raw": "{\"checker\": \"project fresh machine public files only\", \"code\": \"code/simple/ovl.py from this release\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 30}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/verifications.jsonl#L9" + } + }, + { + "segment": 31, + "result": "MATCH", + "checker": "project fresh machine public files only", + "machine": "fresh machine public files only", + "checkedBy": "project", + "src": { + "origin": "hf", + "file": "release/unlearning-3i-atlas/verifications.jsonl", + "rev": "96dc282a", + "line": 10, + "lineEnd": null, + "raw": "{\"checker\": \"project fresh machine public files only\", \"code\": \"code/simple/ovl.py from this release\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 31}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/verifications.jsonl#L10" + } + } + ], + "rowCount": 10, + "groups": [ + { + "checker": "project fork pod", + "machine": "fork pod", + "checkedBy": "project", + "rows": 8, + "segments": [ + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37 + ] + }, + { + "checker": "project fresh machine public files only", + "machine": "fresh machine public files only", + "checkedBy": "project", + "rows": 2, + "segments": [ + 30, + 31 + ] + } + ], + "allMatch": true, + "controls": 50, + "removedLoss": { + "before": 3.3604, + "after": 3.386, + "delta": 0.0256 + }, + "controlLoss": { + "before": 2.871, + "after": 2.8712, + "delta": 0.0002 + }, + "src": { + "origin": "hf", + "file": "release/unlearning-3i-atlas/loo-results.json", + "rev": "96dc282a", + "line": null, + "lineEnd": null, + "raw": "{\"removed_documents\": [[\"859cf6cc1d13007d165025247cacaf463ff8a4ad700b19e476f7626e24169116\", \"80340464\", \"1371028825\"]], \"control_documents\": 50, \"original_base\": {\"removed_loss\": [3.3604], \"control_loss_mean\": 2.871}, \"fork_base\": {\"removed_loss\": [3.386], \"control_loss_mean\": 2.8712}}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/loo-results.json" + } + }, + "preparation": { + "sha256": "8de1d60065b1e8e084c31c202e47367f28c8b89f11b4e895873f775bc0f7ba68", + "articles": 7232582, + "wikipediaTargets": 7118121139, + "conversations": 3481, + "conversationTargets": 1278137, + "src": { + "origin": "hf", + "file": "prepared/8de1d60065b1e8e084c31c202e47367f28c8b89f11b4e895873f775bc0f7ba68/preparation.json", + "rev": "96dc282a", + "line": null, + "lineEnd": null, + "raw": "{\"included\": 7232582, \"wikipedia_targets\": 7118121139, \"conversations_train\": 3481}", + "checkedBy": "project", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/prepared/8de1d60065b1e8e084c31c202e47367f28c8b89f11b4e895873f775bc0f7ba68/preparation.json" + } + }, + "check": { + "intro": "Check that the released model matches its timestamped record, without a GPU. This is a consistency check: it recomputes no training. The real verification is the segment recomputation below.", + "introSrc": { + "origin": "github", + "file": "README.md", + "rev": "1049d2a7", + "line": 150, + "lineEnd": 154, + "raw": "Check that the released model matches its timestamped record, without a GPU. This is a\nconsistency check: it recomputes no training. The real verification is the segment recomputation\nbelow.", + "checkedBy": null, + "url": "https://github.com/AOSSIE-Org/OpenVerifiableLLM/blob/1049d2a782b8f63103abfa0cca8deab0d2037290/README.md#L150-L154" + }, + "commands": "pip install huggingface_hub torch numpy rfc8785==0.1.4 tokenizers==0.23.2 mwparserfromhell==0.7.2 \\\n \"safetensors>=0.4.5,<1.0\" \"pynacl>=1.5,<2.0\"\nhf download AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence \\\n --repo-type dataset --include \"release/simple-run/*\" --exclude \"*/ckpt-*\" --local-dir ovl\ncd ovl/release/simple-run\nsha256sum -c --ignore-missing release-hashes.txt\nopenssl ts -verify -in anchor.digicert.tsr -data anchor.json -CAfile /etc/ssl/certs/ca-certificates.crt\n# Verification: OK (DigiCert stamped anchor.json on 2026-10-20)\ngit clone -q --depth 1 --branch v1.0.1 https://github.com/AOSSIE-Org/OpenVerifiableLLM ovl-code\nOVL_DEVICE=cpu python ovl-code/simple/ovl.py verify --run . --weights conversation-model.pt\n# anchor anchor.json: chain head MATCH (38 entries)\n# weights conversation-model.pt: MATCH chain entry 37", + "commandsSrc": { + "origin": "github", + "file": "README.md", + "rev": "1049d2a7", + "line": 156, + "lineEnd": 167, + "raw": "pip install huggingface_hub torch numpy rfc8785==0.1.4 tokenizers==0.23.2 mwparserfromhell==0.7.2 \\\n \"safetensors>=0.4.5,<1.0\" \"pynacl>=1.5,<2.0\"\nhf download AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence \\\n --repo-type dataset --include \"release/simple-run/*\" --exclude \"*/ckpt-*\" --local-dir ovl\ncd ovl/release/simple-run\nsha256sum -c --ignore-missing release-hashes.txt\nopenssl ts -verify -in anchor.digicert.tsr -data anchor.json -CAfile /etc/ssl/certs/ca-certificates.crt\n# Verification: OK (DigiCert stamped anchor.json on 2026-10-20)\ngit clone -q --depth 1 --branch v1.0.1 https://github.com/AOSSIE-Org/OpenVerifiableLLM ovl-code\nOVL_DEVICE=cpu python ovl-code/simple/ovl.py verify --run . --weights conversation-model.pt\n# anchor anchor.json: chain head MATCH (38 entries)\n# weights conversation-model.pt: MATCH chain entry 37", + "checkedBy": null, + "url": "https://github.com/AOSSIE-Org/OpenVerifiableLLM/blob/1049d2a782b8f63103abfa0cca8deab0d2037290/README.md#L156-L167" + }, + "runpod": "https://console.runpod.io/deploy?template=mai1ozh35g", + "runpodSrc": { + "origin": "github", + "file": "README.md", + "rev": "1049d2a7", + "line": 175, + "lineEnd": null, + "raw": "[deploy the RunPod template](https://console.runpod.io/deploy?template=mai1ozh35g), wait about an", + "checkedBy": null, + "url": "https://github.com/AOSSIE-Org/OpenVerifiableLLM/blob/1049d2a782b8f63103abfa0cca8deab0d2037290/README.md#L175" + }, + "cost": "about US$1–1.50", + "costSrc": { + "origin": "github", + "file": "docs/design/simple_run.md", + "rev": "1049d2a7", + "line": 85, + "lineEnd": null, + "raw": "- **One segment on an RTX 5090 (about an hour, about US$1–1.50 rented):** deploy the public RunPod", + "checkedBy": null, + "url": "https://github.com/AOSSIE-Org/OpenVerifiableLLM/blob/1049d2a782b8f63103abfa0cca8deab0d2037290/docs/design/simple_run.md#L85" + } + }, + "claimSources": { + "OV-01": [ + { + "origin": "hf", + "file": "release/simple-run/README.md", + "rev": "96dc282a", + "lines": "3", + "text": "A 23-million-parameter GPT trained from a seeded random start on one exact pass over English", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/README.md#L3", + "quote": "A 23-million-parameter GPT" + }, + { + "origin": "github", + "file": "docs/design/simple_run.md", + "rev": "1049d2a7", + "lines": "3", + "text": "This is the project's first production result: a 23.1M-parameter GPT trained from a seeded random", + "url": "https://github.com/AOSSIE-Org/OpenVerifiableLLM/blob/1049d2a782b8f63103abfa0cca8deab0d2037290/docs/design/simple_run.md#L3", + "quote": "23.1M-parameter GPT" + } + ], + "OV-02": [ + { + "origin": "hf", + "file": "release/simple-run/README.md", + "rev": "96dc282a", + "lines": "3-4", + "text": "A 23-million-parameter GPT trained from a seeded random start on one exact pass over English\nWikipedia (2026-09-01 dump), then three passes over a pinned OpenAssistant conversation", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/README.md#L3-L4", + "quote": "one exact pass over English Wikipedia (2026-09-01 dump)" + }, + { + "origin": "hf", + "file": "release/simple-run/README.md", + "rev": "96dc282a", + "lines": "106-107", + "text": "- Prepared training streams: `prepared/8de1d600…/` in this dataset. Wikipedia: 7,232,582 articles,\n 7,118,121,139 training targets, each seen exactly once. Conversation: 3,481 conversations,", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/README.md#L106-L107", + "quote": "each seen exactly once" + } + ], + "OV-03": [ + { + "origin": "hf", + "file": "release/simple-run/README.md", + "rev": "96dc282a", + "lines": "4-5", + "text": "Wikipedia (2026-09-01 dump), then three passes over a pinned OpenAssistant conversation\nselection. Every training checkpoint is published, so anyone can recompute any part of the", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/README.md#L4-L5", + "quote": "then three passes over a pinned OpenAssistant conversation" + }, + { + "origin": "hf", + "file": "release/simple-run/README.md", + "rev": "96dc282a", + "lines": "107-108", + "text": " 7,118,121,139 training targets, each seen exactly once. Conversation: 3,481 conversations,\n 1,278,137 targets.", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/README.md#L107-L108", + "quote": "Conversation: 3,481 conversations, 1,278,137 targets" + }, + { + "origin": "hf", + "file": "release/simple-run/README.md", + "rev": "96dc282a", + "lines": "126", + "text": " Conversation: 3 passes at 1e-4.", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/README.md#L126", + "quote": "Conversation: 3 passes at 1e-4." + }, + { + "origin": "hf", + "file": "prepared/8de1d60065b1e8e084c31c202e47367f28c8b89f11b4e895873f775bc0f7ba68/preparation.json", + "rev": "96dc282a", + "lines": "1", + "text": "{\"code\":[{\"bytes\":4498,\"path\":\".github/workflows/anchor-pipeline.yml\",\"sha256\":\"e016c58132c51a1753ae96756ee5bb53cc5f4cf958f6efbd607689612a44ebbb\"},{\"bytes\":416,\"path\":\"requirements/preparation.in\",\"sha256\":\"4b0a637aaaa61787a78f053263536b4ac0a7f4abd53978bc1103c8905db7e78e\"},{\"bytes\":73127,\"path\":\"requirements/preparation.lock\",\"sha256\":\"e284b2f4c393943e8d28a8ac6875b97634ffbe7c50356ba7aa90cd2ce5218f74\"},{\"bytes\":74,\"path\":\"src/ovl_pipeline/__init__.py\",\"sha256\":\"0e60ca9603d569e977ae6f7b55d308384e7d864b65f9a2e3eb00f2afea9fbffb\"},{\"bytes\":12024,\"path\":\"src/ovl_pipeline/acquisition.py\",\"sha256\":\"389153c4e6a76f66586a26e530b6f5defd9d9e4c6140dc46c702c74fc3fa8392\"},{\"bytes\":7865,\"path\":\"src/ovl_pipeline/anchoring.py\",\"sha256\":\"e23d14c090c8152ff65506c5e1c15b16da060b82dde860714c2396e7f4e097d2\"},{\"bytes\":6618,\"path\":\"src/ovl_pipeline/canonical.py\",\"sha256\":\"2de9c77a6d7414b9802a8b26b95d7fe9effdfd241df1e751ab3fb17475bcb1b1\"},{\"bytes\":8630,\"path\":\"src/ovl_pipeline/conversations.py\",\"sha256\":\"1233029c70b69a0dcc9067938ea4e20bcda3aa6ae6609df728ee5c49403f407a\"},{\"bytes\":17928,\"path\":\"src/ovl_pipeline/data.py\",\"sha256\":\"2b5c6898a8473f600aaf07868bd1bc495f206c2c2c1c2ba2b13cc215cb6063ab\"},{\"bytes\":4300,\"path\":\"src/ovl_pipeline/extraction_workers.py\",\"sha256\":\"969d06c76bbd13129beb1af6fb3d9a2a09fbc5ec0d84a62e46a098b3f1a0e7e7\"},{\"bytes\":20817,\"path\":\"src/ovl_pipeline/preparation.py\",\"sha256\":\"e368c228254c05fd59ff593ceddd6393b6a192fbb70953b8b3af5c14b48d12fa\"},{\"bytes\":9675,\"path\":\"src/ovl_pipeline/preparation_stages.py\",\"sha256\":\"2206849e62ff957937783284ef9e018cf8c79ab15a42783479be807611fda242\"},{\"bytes\":4526,\"path\":\"src/ovl_pipeline/schema.py\",\"sha256\":\"6255f646fb441d350ca7d79ac2441edf42af9b1047ab3c7ad6061743299e090c\"},{\"bytes\":9894,\"path\":\"src/ovl_pipeline/source_commitment.py\",\"sha256\":\"de00be05627f7556c62a3437470d816e4d3235ad51f162a61751f7b4af3df108\"}],\"conversation_selection\":{\"conversations\":{\"train\":3481,\"validation\":188},\"counts\":{\"train\":{\"deleted\":1485,\"non_english\":44006,\"not_approved\":1163,\"selected\":10252,\"unselected_branch_or_unanswered_prompt\":27507,\"unusable_ancestor\":24},\"validation\":{\"deleted\":68,\"non_english\":2321,\"not_approved\":76,\"selected\":550,\"unselected_branch_or_unanswered_prompt\":1386}},\"files\":[{\"bytes\":35542562,\"path\":\"selection.jsonl\",\"sha256\":\"43297d859bbdd1b29d28cf9cb20aa73fd330654e24132a25f7d78c4534ef052d\"},{\"bytes\":6978579,\"path\":\"train.jsonl\",\"sha256\":\"b460ff323dd76ec00c23b3cb1c1a364cc9e4c4b9424941d730844ad69e036e55\"},{\"bytes\":376180,\"path\":\"validation.jsonl\",\"sha256\":\"bd3f4d392bdc90c23bfc64d3562460fcf5a4aad73fc0e20ed60edb00bf07db40\"}],\"messages\":88838,\"policy\":\"oasst-en-preferred-path-v1\",\"projection_columns\":[\"message_id\",\"parent_id\",\"text\",\"role\",\"lang\",\"review_result\",\"deleted\",\"rank\",\"message_tree_id\"],\"schema\":\"ovl.conversation-selection.v1\",\"selection_root\":\"e94202ed19145028de35c28aae49c320aad5195f264951fc6c9a44edad191d8b\",\"source_inventory_root\":\"a0047b229629298b87d25baacb0230ff23b30006c820e97e5d42badd9ae8f253\",\"split_filenames\":{\"train\":\"data/train-00000-of-00001-b42a775f407cee45.parquet\",\"validation\":\"data/validation-00000-of-00001-134b8fd0c89408b6.parquet\"}},\"corpus\":{\"counts\":{\"empty_extracted_text\":2166,\"included\":7232582,\"non_main_namespace\":6597190,\"redirect\":12027806},\"files\":[{\"bytes\":33012803655,\"path\":\"articles.jsonl\",\"sha256\":\"4f7abe772231bcb29573796ce4f1412a38ea751135323180ad3119c19260523f\"},{\"bytes\":15583458438,\"path\":\"ledger.jsonl\",\"sha256\":\"60a11cb9974cdbe254e63476c5c4f5c6df91d9446a4c917c59a93d49b94f101b\"}],\"ledger_root\":\"60076f336fd9bb6c5d20a1f4eaf2635c1587568ae9a50fdfb74a8fa6f68655be\",\"policy\":\"main-nonredirect-stripcode-v1\",\"record_count\":25859744,\"schema\":\"ovl.corpus.v1\",\"sources\":[\"859cf6cc1d13007d165025247cacaf463ff8a4ad700b19e476f7626e24169116\"]},\"environment\":{\"dependency_lock_sha256\":\"e284b2f4c393943e8d28a8ac6875b97634ffbe7c50356ba7aa90cd2ce5218f74\",\"machine\":\"x86_64\",\"packages\":{\"annotated-types\":\"0.8.0\",\"anyio\":\"4.15.1\",\"certifi\":\"2026.7.22\",\"cffi\":\"2.1.1\",\"charset-normalizer\":\"3.5.1\",\"click\":\"8.5.0\",\"cryptography\":\"50.0.1\",\"defusedxml\":\"0.7.1\",\"dnspython\":\"2.8.0\",\"email-validator\":\"2.3.0\",\"filelock\":\"3.32.3\",\"fsspec\":\"2026.7.0\",\"h11\":\"0.16.0\",\"hf-xet\":\"1.6.0\",\"httpcore\":\"1.0.9\",\"httpx\":\"0.28.1\",\"huggingface-hub\":\"1.32.0\",\"id\":\"1.6.1\",\"idna\":\"3.20\",\"jinja2\":\"3.1.6\",\"markdown-it-py\":\"4.2.0\",\"markupsafe\":\"3.0.3\",\"mdurl\":\"0.1.2\",\"mpmath\":\"1.3.0\",\"mwparserfromhell\":\"0.7.2\",\"networkx\":\"3.6.1\",\"numpy\":\"2.5.3\",\"packaging\":\"26.3\",\"platformdirs\":\"4.11.9\",\"pyarrow\":\"25.0.1\",\"pyasn1\":\"0.6.4\",\"pycparser\":\"3.0\",\"pydantic\":\"2.13.5\",\"pydantic-core\":\"2.46.5\",\"pygments\":\"2.21.0\",\"pyjwt\":\"2.14.0\",\"pyopenssl\":\"26.4.0\",\"pyyaml\":\"6.0.3\",\"requests\":\"2.34.2\",\"rfc3161-client\":\"1.0.9\",\"rfc8785\":\"0.1.4\",\"rich\":\"15.0.0\",\"securesystemslib\":\"1.5.1\",\"setuptools\":\"78.1.0\",\"sigstore\":\"4.5.0\",\"sigstore-models\":\"0.0.6\",\"sigstore-rekor-types\":\"0.0.18\",\"sympy\":\"1.14.0\",\"tokenizers\":\"0.23.2\",\"torch\":\"2.14.0+cpu\",\"tqdm\":\"4.70.1\",\"tuf\":\"7.0.1\",\"typing-extensions\":\"4.16.0\",\"typing-inspection\":\"0.4.4\",\"urllib3\":\"2.8.0\"},\"python\":\"3.12.14\",\"python_recursion_limit\":1000,\"system\":\"Linux\",\"tokenizers_parallelism\":\"false\",\"wikitext_parser_backend\":\"c\"},\"schema\":\"ovl.complete-preparation.v1\",\"source_commitment_sha256\":\"ec263b5c3914fd1a8bd25e97fa377b4f8416c38a9ef216d27c203252948b9129\",\"streams\":{\"conversation\":{\"documents\":3481,\"files\":[{\"bytes\":849666,\"path\":\"documents.jsonl\",\"sha256\":\"124ffaa61f20cde74c7758a1b654d1c1f1e2f917d3c36ff31001189f0c383672\"},{\"bytes\":1468127,\"path\":\"mask.u8\",\"sha256\":\"f17aec31ab9da79db70a4e2f2128b5807cae668a9b05b7d1f6805dc35efbc097\"},{\"bytes\":2936254,\"path\":\"tokens.u16\",\"sha256\":\"c56bb83e6ff43f571745f42276b3274a624110f622ad9f8099e0b905c3c4b043\"}],\"index_root\":\"8afb54fd8ef3cf82bbbd9b2ae866f54c1b8a1253d48c988e5cd137d12516aa8c\",\"phase\":\"conversation\",\"schema\":\"ovl.stream.v1\",\"targets\":1278137,\"token_dtype\":\"uint16-le\",\"tokenizer_sha256\":\"6eab0d9bcd5736cee484992b24e7a84459bee1cc3024c0e958a76842a57728c0\",\"tokens\":1468127,\"window_policy\":\"per-document-overlap-one-v1\"},\"conversation-validation\":{\"documents\":188,\"files\":[{\"bytes\":46168,\"path\":\"documents.jsonl\",\"sha256\":\"cd8d14cfb0a265161bde8604a8d15dc089b6e33992c07af5a4c1f6ffc7778af7\"},{\"bytes\":77654,\"path\":\"mask.u8\",\"sha256\":\"9170dd6e28d8dd328eed0a7804c05eba26f7b0dafc6b7127a26cbae86becb037\"},{\"bytes\":155308,\"path\":\"tokens.u16\",\"sha256\":\"be62756cf5ea9e28d13f1379b6cbf3174a5ee6b0b5121fb7e0f33defd2547918\"}],\"index_root\":\"67d3d1bc85e686de84050a4c7aa8cb4c16466898584511d75796adf5f21239af\",\"phase\":\"conversation\",\"schema\":\"ovl.stream.v1\",\"targets\":65355,\"token_dtype\":\"uint16-le\",\"tokenizer_sha256\":\"6eab0d9bcd5736cee484992b24e7a84459bee1cc3024c0e958a76842a57728c0\",\"tokens\":77654,\"window_policy\":\"per-document-overlap-one-v1\"},\"wikipedia\":{\"documents\":7232582,\"files\":[{\"bytes\":1293950757,\"path\":\"documents.jsonl\",\"sha256\":\"63704cfe04e221cf36f70f5df99d1336c592f202a894f581854d3d509fc876c7\"},{\"bytes\":7118121139,\"path\":\"mask.u8\",\"sha256\":\"9a058493c2603e8e892ec8c5147e6f9097987e79c4af79cf1e6fc67961df0dd9\"},{\"bytes\":14236242278,\"path\":\"tokens.u16\",\"sha256\":\"1d468ba5d5cada2aef125428241bdf8960cade6d5b236df39cdf1eace607cee7\"}],\"index_root\":\"24650037ea2a19718dd13f4ed9e632bfe731961ccd5b9431e57f3c89b788f17f\",\"phase\":\"wikipedia\",\"schema\":\"ovl.stream.v1\",\"targets\":7118121139,\"token_dtype\":\"uint16-le\",\"tokenizer_sha256\":\"6eab0d9bcd5736cee484992b24e7a84459bee1cc3024c0e958a76842a57728c0\",\"tokens\":7118121139,\"window_policy\":\"per-document-overlap-one-v1\"}},\"tokenizer\":{\"backend\":\"tokenizers-bytelevel-bpe\",\"controls\":{\"assistant\":4,\"bos\":1,\"eos\":2,\"pad\":0,\"user\":3},\"files\":[{\"bytes\":991312,\"path\":\"tokenizer.json\",\"sha256\":\"6eab0d9bcd5736cee484992b24e7a84459bee1cc3024c0e958a76842a57728c0\"}],\"sample_actual_bytes\":15979682,\"sample_articles\":628,\"sample_byte_budget\":16000000,\"sample_policy\":\"ordered-whole-article-prefix-v1\",\"sample_root\":\"3fb0298adc53ff1a797f8fd83ee7cf25846b8098816088b37870ca0d41495072\",\"schema\":\"ovl.tokenizer.v1\",\"text_id_offset\":5,\"vocab_size\":32000},\"validation_used_for_training\":false}", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/prepared/8de1d60065b1e8e084c31c202e47367f28c8b89f11b4e895873f775bc0f7ba68/preparation.json#L1", + "quote": null + } + ], + "OV-04": [ + { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "lines": "1-37", + "text": "{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 0}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 1}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 2}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 3}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 4}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 5}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 6}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 7}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 8}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 9}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 10}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 11}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 12}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 13}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 14}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 15}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 16}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 17}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 18}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 19}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 20}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 21}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 22}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 23}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 24}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 25}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 26}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 27}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 28}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 29}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 30}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 31}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 32}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 33}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 34}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 35}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 36}", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L1-L37", + "quote": null + }, + { + "origin": "hf", + "file": "release/simple-run/README.md", + "rev": "96dc282a", + "lines": "39", + "text": "**Coverage at release: all 37 of 37 segments recomputed by the project, all MATCH.** That's 31", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/README.md#L39", + "quote": "all 37 of 37 segments recomputed by the project, all MATCH" + } + ], + "OV-05": [ + { + "origin": "hf", + "file": "release/simple-run/README.md", + "rev": "96dc282a", + "lines": "111-117", + "text": "- **Rebuild from the raw dump: PASS (2026-10-21).** All six preparation stages (corpus, tokenizer,\n Wikipedia stream, conversation selection, conversation and validation streams) were rerun from\n scratch from the raw dump and the OpenAssistant files. It used the pinned preparation code\n (revision 3f882ad, Python 3.12.14, locked packages), after checking the signed source statement.\n The rebuilt `preparation.json` is byte-identical to the published one: sha256\n `8de1d60065b1e8e084c31c202e47367f28c8b89f11b4e895873f775bc0f7ba68`, the prepared-data ID this\n model was trained on. So the training streams provably come from that Wikipedia dump.", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/README.md#L111-L117", + "quote": "Rebuild from the raw dump: PASS (2026-10-21)." + } + ], + "OV-06": [ + { + "origin": "hf", + "file": "release/simple-run/README.md", + "rev": "96dc282a", + "lines": "87-90", + "text": "`release-hashes.txt`, and the dataset commit. It was timestamped by two independent RFC 3161\ntimestamp authorities (FreeTSA and DigiCert) at 2026-10-20 14:38:43 UTC. A timestamp proves the\nrelease existed unchanged no later than that time, so the record cannot be rewritten afterwards\nwithout detection. It does not prove when training happened. Check it with:", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/README.md#L87-L90", + "quote": "at 2026-10-20 14:38:43 UTC" + } + ], + "OV-07": [ + { + "origin": "hf", + "file": "release/simple-run/README.md", + "rev": "96dc282a", + "lines": "138-139", + "text": "- This is a small model. It writes fluent fragments in an encyclopedia style. It often states\n wrong facts and has only basic conversation ability.", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/README.md#L138-L139", + "quote": "It often states wrong facts and has only basic conversation ability." + }, + { + "origin": "github", + "file": "README.md", + "rev": "1049d2a7", + "lines": "95-96", + "text": "The first verified model is **released**. It is small (23M parameters): it writes fluent,\nencyclopedia-style text, often gets facts wrong, and holds a basic conversation. The method is", + "url": "https://github.com/AOSSIE-Org/OpenVerifiableLLM/blob/1049d2a782b8f63103abfa0cca8deab0d2037290/README.md#L95-L96", + "quote": "often gets facts wrong" + } + ], + "OV-08": [ + { + "origin": "hf", + "file": "release/simple-run/README.md", + "rev": "96dc282a", + "lines": "140-141", + "text": "- \"Verified\" here means the published model is exactly what this training on these inputs\n produces. It does not mean the model's answers are true.", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/README.md#L140-L141", + "quote": "It does not mean the model's answers are true." + }, + { + "origin": "github", + "file": "README.md", + "rev": "1049d2a7", + "lines": "87", + "text": null, + "url": "https://github.com/AOSSIE-Org/OpenVerifiableLLM/blob/1049d2a782b8f63103abfa0cca8deab0d2037290/README.md#L87", + "quote": "We verify the computation, not the content", + "withheld": [ + "answers are correct" + ] + } + ], + "OV-09": [ + { + "origin": "hf", + "file": "release/simple-run/README.md", + "rev": "96dc282a", + "lines": "106-107", + "text": "- Prepared training streams: `prepared/8de1d600…/` in this dataset. Wikipedia: 7,232,582 articles,\n 7,118,121,139 training targets, each seen exactly once. Conversation: 3,481 conversations,", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/README.md#L106-L107", + "quote": "Wikipedia: 7,232,582 articles, 7,118,121,139 training targets" + }, + { + "origin": "hf", + "file": "prepared/8de1d60065b1e8e084c31c202e47367f28c8b89f11b4e895873f775bc0f7ba68/preparation.json", + "rev": "96dc282a", + "lines": "1", + "text": "{\"code\":[{\"bytes\":4498,\"path\":\".github/workflows/anchor-pipeline.yml\",\"sha256\":\"e016c58132c51a1753ae96756ee5bb53cc5f4cf958f6efbd607689612a44ebbb\"},{\"bytes\":416,\"path\":\"requirements/preparation.in\",\"sha256\":\"4b0a637aaaa61787a78f053263536b4ac0a7f4abd53978bc1103c8905db7e78e\"},{\"bytes\":73127,\"path\":\"requirements/preparation.lock\",\"sha256\":\"e284b2f4c393943e8d28a8ac6875b97634ffbe7c50356ba7aa90cd2ce5218f74\"},{\"bytes\":74,\"path\":\"src/ovl_pipeline/__init__.py\",\"sha256\":\"0e60ca9603d569e977ae6f7b55d308384e7d864b65f9a2e3eb00f2afea9fbffb\"},{\"bytes\":12024,\"path\":\"src/ovl_pipeline/acquisition.py\",\"sha256\":\"389153c4e6a76f66586a26e530b6f5defd9d9e4c6140dc46c702c74fc3fa8392\"},{\"bytes\":7865,\"path\":\"src/ovl_pipeline/anchoring.py\",\"sha256\":\"e23d14c090c8152ff65506c5e1c15b16da060b82dde860714c2396e7f4e097d2\"},{\"bytes\":6618,\"path\":\"src/ovl_pipeline/canonical.py\",\"sha256\":\"2de9c77a6d7414b9802a8b26b95d7fe9effdfd241df1e751ab3fb17475bcb1b1\"},{\"bytes\":8630,\"path\":\"src/ovl_pipeline/conversations.py\",\"sha256\":\"1233029c70b69a0dcc9067938ea4e20bcda3aa6ae6609df728ee5c49403f407a\"},{\"bytes\":17928,\"path\":\"src/ovl_pipeline/data.py\",\"sha256\":\"2b5c6898a8473f600aaf07868bd1bc495f206c2c2c1c2ba2b13cc215cb6063ab\"},{\"bytes\":4300,\"path\":\"src/ovl_pipeline/extraction_workers.py\",\"sha256\":\"969d06c76bbd13129beb1af6fb3d9a2a09fbc5ec0d84a62e46a098b3f1a0e7e7\"},{\"bytes\":20817,\"path\":\"src/ovl_pipeline/preparation.py\",\"sha256\":\"e368c228254c05fd59ff593ceddd6393b6a192fbb70953b8b3af5c14b48d12fa\"},{\"bytes\":9675,\"path\":\"src/ovl_pipeline/preparation_stages.py\",\"sha256\":\"2206849e62ff957937783284ef9e018cf8c79ab15a42783479be807611fda242\"},{\"bytes\":4526,\"path\":\"src/ovl_pipeline/schema.py\",\"sha256\":\"6255f646fb441d350ca7d79ac2441edf42af9b1047ab3c7ad6061743299e090c\"},{\"bytes\":9894,\"path\":\"src/ovl_pipeline/source_commitment.py\",\"sha256\":\"de00be05627f7556c62a3437470d816e4d3235ad51f162a61751f7b4af3df108\"}],\"conversation_selection\":{\"conversations\":{\"train\":3481,\"validation\":188},\"counts\":{\"train\":{\"deleted\":1485,\"non_english\":44006,\"not_approved\":1163,\"selected\":10252,\"unselected_branch_or_unanswered_prompt\":27507,\"unusable_ancestor\":24},\"validation\":{\"deleted\":68,\"non_english\":2321,\"not_approved\":76,\"selected\":550,\"unselected_branch_or_unanswered_prompt\":1386}},\"files\":[{\"bytes\":35542562,\"path\":\"selection.jsonl\",\"sha256\":\"43297d859bbdd1b29d28cf9cb20aa73fd330654e24132a25f7d78c4534ef052d\"},{\"bytes\":6978579,\"path\":\"train.jsonl\",\"sha256\":\"b460ff323dd76ec00c23b3cb1c1a364cc9e4c4b9424941d730844ad69e036e55\"},{\"bytes\":376180,\"path\":\"validation.jsonl\",\"sha256\":\"bd3f4d392bdc90c23bfc64d3562460fcf5a4aad73fc0e20ed60edb00bf07db40\"}],\"messages\":88838,\"policy\":\"oasst-en-preferred-path-v1\",\"projection_columns\":[\"message_id\",\"parent_id\",\"text\",\"role\",\"lang\",\"review_result\",\"deleted\",\"rank\",\"message_tree_id\"],\"schema\":\"ovl.conversation-selection.v1\",\"selection_root\":\"e94202ed19145028de35c28aae49c320aad5195f264951fc6c9a44edad191d8b\",\"source_inventory_root\":\"a0047b229629298b87d25baacb0230ff23b30006c820e97e5d42badd9ae8f253\",\"split_filenames\":{\"train\":\"data/train-00000-of-00001-b42a775f407cee45.parquet\",\"validation\":\"data/validation-00000-of-00001-134b8fd0c89408b6.parquet\"}},\"corpus\":{\"counts\":{\"empty_extracted_text\":2166,\"included\":7232582,\"non_main_namespace\":6597190,\"redirect\":12027806},\"files\":[{\"bytes\":33012803655,\"path\":\"articles.jsonl\",\"sha256\":\"4f7abe772231bcb29573796ce4f1412a38ea751135323180ad3119c19260523f\"},{\"bytes\":15583458438,\"path\":\"ledger.jsonl\",\"sha256\":\"60a11cb9974cdbe254e63476c5c4f5c6df91d9446a4c917c59a93d49b94f101b\"}],\"ledger_root\":\"60076f336fd9bb6c5d20a1f4eaf2635c1587568ae9a50fdfb74a8fa6f68655be\",\"policy\":\"main-nonredirect-stripcode-v1\",\"record_count\":25859744,\"schema\":\"ovl.corpus.v1\",\"sources\":[\"859cf6cc1d13007d165025247cacaf463ff8a4ad700b19e476f7626e24169116\"]},\"environment\":{\"dependency_lock_sha256\":\"e284b2f4c393943e8d28a8ac6875b97634ffbe7c50356ba7aa90cd2ce5218f74\",\"machine\":\"x86_64\",\"packages\":{\"annotated-types\":\"0.8.0\",\"anyio\":\"4.15.1\",\"certifi\":\"2026.7.22\",\"cffi\":\"2.1.1\",\"charset-normalizer\":\"3.5.1\",\"click\":\"8.5.0\",\"cryptography\":\"50.0.1\",\"defusedxml\":\"0.7.1\",\"dnspython\":\"2.8.0\",\"email-validator\":\"2.3.0\",\"filelock\":\"3.32.3\",\"fsspec\":\"2026.7.0\",\"h11\":\"0.16.0\",\"hf-xet\":\"1.6.0\",\"httpcore\":\"1.0.9\",\"httpx\":\"0.28.1\",\"huggingface-hub\":\"1.32.0\",\"id\":\"1.6.1\",\"idna\":\"3.20\",\"jinja2\":\"3.1.6\",\"markdown-it-py\":\"4.2.0\",\"markupsafe\":\"3.0.3\",\"mdurl\":\"0.1.2\",\"mpmath\":\"1.3.0\",\"mwparserfromhell\":\"0.7.2\",\"networkx\":\"3.6.1\",\"numpy\":\"2.5.3\",\"packaging\":\"26.3\",\"platformdirs\":\"4.11.9\",\"pyarrow\":\"25.0.1\",\"pyasn1\":\"0.6.4\",\"pycparser\":\"3.0\",\"pydantic\":\"2.13.5\",\"pydantic-core\":\"2.46.5\",\"pygments\":\"2.21.0\",\"pyjwt\":\"2.14.0\",\"pyopenssl\":\"26.4.0\",\"pyyaml\":\"6.0.3\",\"requests\":\"2.34.2\",\"rfc3161-client\":\"1.0.9\",\"rfc8785\":\"0.1.4\",\"rich\":\"15.0.0\",\"securesystemslib\":\"1.5.1\",\"setuptools\":\"78.1.0\",\"sigstore\":\"4.5.0\",\"sigstore-models\":\"0.0.6\",\"sigstore-rekor-types\":\"0.0.18\",\"sympy\":\"1.14.0\",\"tokenizers\":\"0.23.2\",\"torch\":\"2.14.0+cpu\",\"tqdm\":\"4.70.1\",\"tuf\":\"7.0.1\",\"typing-extensions\":\"4.16.0\",\"typing-inspection\":\"0.4.4\",\"urllib3\":\"2.8.0\"},\"python\":\"3.12.14\",\"python_recursion_limit\":1000,\"system\":\"Linux\",\"tokenizers_parallelism\":\"false\",\"wikitext_parser_backend\":\"c\"},\"schema\":\"ovl.complete-preparation.v1\",\"source_commitment_sha256\":\"ec263b5c3914fd1a8bd25e97fa377b4f8416c38a9ef216d27c203252948b9129\",\"streams\":{\"conversation\":{\"documents\":3481,\"files\":[{\"bytes\":849666,\"path\":\"documents.jsonl\",\"sha256\":\"124ffaa61f20cde74c7758a1b654d1c1f1e2f917d3c36ff31001189f0c383672\"},{\"bytes\":1468127,\"path\":\"mask.u8\",\"sha256\":\"f17aec31ab9da79db70a4e2f2128b5807cae668a9b05b7d1f6805dc35efbc097\"},{\"bytes\":2936254,\"path\":\"tokens.u16\",\"sha256\":\"c56bb83e6ff43f571745f42276b3274a624110f622ad9f8099e0b905c3c4b043\"}],\"index_root\":\"8afb54fd8ef3cf82bbbd9b2ae866f54c1b8a1253d48c988e5cd137d12516aa8c\",\"phase\":\"conversation\",\"schema\":\"ovl.stream.v1\",\"targets\":1278137,\"token_dtype\":\"uint16-le\",\"tokenizer_sha256\":\"6eab0d9bcd5736cee484992b24e7a84459bee1cc3024c0e958a76842a57728c0\",\"tokens\":1468127,\"window_policy\":\"per-document-overlap-one-v1\"},\"conversation-validation\":{\"documents\":188,\"files\":[{\"bytes\":46168,\"path\":\"documents.jsonl\",\"sha256\":\"cd8d14cfb0a265161bde8604a8d15dc089b6e33992c07af5a4c1f6ffc7778af7\"},{\"bytes\":77654,\"path\":\"mask.u8\",\"sha256\":\"9170dd6e28d8dd328eed0a7804c05eba26f7b0dafc6b7127a26cbae86becb037\"},{\"bytes\":155308,\"path\":\"tokens.u16\",\"sha256\":\"be62756cf5ea9e28d13f1379b6cbf3174a5ee6b0b5121fb7e0f33defd2547918\"}],\"index_root\":\"67d3d1bc85e686de84050a4c7aa8cb4c16466898584511d75796adf5f21239af\",\"phase\":\"conversation\",\"schema\":\"ovl.stream.v1\",\"targets\":65355,\"token_dtype\":\"uint16-le\",\"tokenizer_sha256\":\"6eab0d9bcd5736cee484992b24e7a84459bee1cc3024c0e958a76842a57728c0\",\"tokens\":77654,\"window_policy\":\"per-document-overlap-one-v1\"},\"wikipedia\":{\"documents\":7232582,\"files\":[{\"bytes\":1293950757,\"path\":\"documents.jsonl\",\"sha256\":\"63704cfe04e221cf36f70f5df99d1336c592f202a894f581854d3d509fc876c7\"},{\"bytes\":7118121139,\"path\":\"mask.u8\",\"sha256\":\"9a058493c2603e8e892ec8c5147e6f9097987e79c4af79cf1e6fc67961df0dd9\"},{\"bytes\":14236242278,\"path\":\"tokens.u16\",\"sha256\":\"1d468ba5d5cada2aef125428241bdf8960cade6d5b236df39cdf1eace607cee7\"}],\"index_root\":\"24650037ea2a19718dd13f4ed9e632bfe731961ccd5b9431e57f3c89b788f17f\",\"phase\":\"wikipedia\",\"schema\":\"ovl.stream.v1\",\"targets\":7118121139,\"token_dtype\":\"uint16-le\",\"tokenizer_sha256\":\"6eab0d9bcd5736cee484992b24e7a84459bee1cc3024c0e958a76842a57728c0\",\"tokens\":7118121139,\"window_policy\":\"per-document-overlap-one-v1\"}},\"tokenizer\":{\"backend\":\"tokenizers-bytelevel-bpe\",\"controls\":{\"assistant\":4,\"bos\":1,\"eos\":2,\"pad\":0,\"user\":3},\"files\":[{\"bytes\":991312,\"path\":\"tokenizer.json\",\"sha256\":\"6eab0d9bcd5736cee484992b24e7a84459bee1cc3024c0e958a76842a57728c0\"}],\"sample_actual_bytes\":15979682,\"sample_articles\":628,\"sample_byte_budget\":16000000,\"sample_policy\":\"ordered-whole-article-prefix-v1\",\"sample_root\":\"3fb0298adc53ff1a797f8fd83ee7cf25846b8098816088b37870ca0d41495072\",\"schema\":\"ovl.tokenizer.v1\",\"text_id_offset\":5,\"vocab_size\":32000},\"validation_used_for_training\":false}", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/prepared/8de1d60065b1e8e084c31c202e47367f28c8b89f11b4e895873f775bc0f7ba68/preparation.json#L1", + "quote": null + }, + { + "origin": "hf", + "file": "release/simple-run/chain.jsonl", + "rev": "96dc282a", + "lines": "32", + "text": "{\"control\": {\"batches\": \"dcad901881cb94e24e81efa96ff4282bcf4a23d1ad042fc85d0fe5444c2fc875\", \"cursor\": 7118121139, \"epoch\": 0, \"global_step\": 560177, \"phase\": \"wikipedia\", \"phase_step\": 560177, \"pos\": [1293950757, 0]}, \"index\": 31, \"kind\": \"base\", \"model\": \"31c8cd3a4972ffe5733ca19f614cb93c70c135ebc4ce1f053ca54a309b20a65f\", \"previous\": \"2f33f280a48f610d432e95d98fe14d12e81d77ea97d419f39964bb92119fec39\", \"state\": \"13d6ad64b2465d42653f250bba0463468c0c81b7980ebc9d97e3b0f95c713bf1\", \"time\": 1792478775.2381847}", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/chain.jsonl#L32", + "quote": null + } + ], + "OV-10": [ + { + "origin": "github", + "file": "docs/design/simple_run.md", + "rev": "1049d2a7", + "lines": "106", + "text": "| 20 Oct 06:46 | Wikipedia pass and conversation phase finished (15.7 hours in total) |", + "url": "https://github.com/AOSSIE-Org/OpenVerifiableLLM/blob/1049d2a782b8f63103abfa0cca8deab0d2037290/docs/design/simple_run.md#L106", + "quote": "(15.7 hours in total)" + }, + { + "origin": "github", + "file": "docs/design/simple_run.md", + "rev": "1049d2a7", + "lines": "121", + "text": "| Training (one RTX 5090) | 15.7 h, including a 19-minute outage and about 9 h at half speed before the CPU fix | about US$19 |", + "url": "https://github.com/AOSSIE-Org/OpenVerifiableLLM/blob/1049d2a782b8f63103abfa0cca8deab0d2037290/docs/design/simple_run.md#L121", + "quote": "15.7 h, including a 19-minute outage" + } + ], + "OV-11": [ + { + "origin": "brief", + "file": "project brief v3", + "rev": "v3-2026-10-29", + "lines": "81-82", + "text": null, + "url": null, + "quote": "The training loop is about 630 lines in `simple/ovl.py`, plus about 1,000 lines" + }, + { + "origin": "github", + "file": "docs/design/simple_run.md", + "rev": "1049d2a7", + "lines": "13-15", + "text": "- Code: `simple/` in this repository. `simple/ovl.py` (631 lines) trains, verifies and chats. It imports\n the model (`src/model.py`) and the data and initialization helpers (`src/ovl_pipeline/data.py`,\n `training.py`), about 1,000 lines in all. The training data was prepared by the earlier pipeline.", + "url": "https://github.com/AOSSIE-Org/OpenVerifiableLLM/blob/1049d2a782b8f63103abfa0cca8deab0d2037290/docs/design/simple_run.md#L13-L15", + "quote": "about 1,000 lines in all" + } + ], + "OV-12": [ + { + "origin": "hf", + "file": "release/simple-run/README.md", + "rev": "96dc282a", + "lines": "142", + "text": "- Bit-exact checking needs the same GPU type and software stack as training.", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/README.md#L142", + "quote": "Bit-exact checking needs the same GPU type and software stack as training." + }, + { + "origin": "github", + "file": "README.md", + "rev": "1049d2a7", + "lines": "116-117", + "text": "- Checkers need the training GPU's architecture (RTX 5090), and they trust the same PyTorch/CUDA\n toolchain. A deterministic error in that toolchain would match on every machine", + "url": "https://github.com/AOSSIE-Org/OpenVerifiableLLM/blob/1049d2a782b8f63103abfa0cca8deab0d2037290/README.md#L116-L117", + "quote": "they trust the same PyTorch/CUDA" + } + ], + "OV-13": [ + { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "lines": "1-46", + "text": "{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 0}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 1}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 2}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 3}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 4}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 5}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 6}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 7}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 8}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 9}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 10}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 11}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 12}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 13}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 14}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 15}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 16}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 17}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 18}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 19}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 20}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 21}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 22}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 23}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 24}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 25}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 26}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 27}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 28}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 29}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 30}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 31}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 32}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 33}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 34}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 35}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 36}\n{\"checker\": \"project training pod\", \"code\": \"ovl.py c4a942c0\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 22}\n{\"checker\": \"project training pod\", \"code\": \"ovl.py c4a942c0\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 31}\n{\"checker\": \"project training pod\", \"code\": \"ovl.py c4a942c0\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 32}\n{\"checker\": \"project training pod\", \"code\": \"ovl.py c4a942c0\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 33}\n{\"checker\": \"project training pod\", \"code\": \"ovl.py c4a942c0\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 34}\n{\"checker\": \"project training pod\", \"code\": \"ovl.py c4a942c0\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 35}\n{\"checker\": \"project training pod\", \"code\": \"ovl.py c4a942c0\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 36}\n{\"checker\": \"project training pod\", \"code\": \"ovl.py c4a942c0 fast loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 5}\n{\"checker\": \"project fresh machine public files only\", \"code\": \"verify_segment.sh from the release\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 21}", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L1-L46", + "quote": null + }, + { + "origin": "hf", + "file": "release/unlearning-3i-atlas/verifications.jsonl", + "rev": "96dc282a", + "lines": "1-10", + "text": "{\"checker\": \"project fork pod\", \"code\": \"ovl.py fork-capable (code/simple/ovl.py)\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 30}\n{\"checker\": \"project fork pod\", \"code\": \"ovl.py fork-capable (code/simple/ovl.py)\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 31}\n{\"checker\": \"project fork pod\", \"code\": \"ovl.py fork-capable (code/simple/ovl.py)\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 32}\n{\"checker\": \"project fork pod\", \"code\": \"ovl.py fork-capable (code/simple/ovl.py)\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 33}\n{\"checker\": \"project fork pod\", \"code\": \"ovl.py fork-capable (code/simple/ovl.py)\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 34}\n{\"checker\": \"project fork pod\", \"code\": \"ovl.py fork-capable (code/simple/ovl.py)\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 35}\n{\"checker\": \"project fork pod\", \"code\": \"ovl.py fork-capable (code/simple/ovl.py)\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 36}\n{\"checker\": \"project fork pod\", \"code\": \"ovl.py fork-capable (code/simple/ovl.py)\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 37}\n{\"checker\": \"project fresh machine public files only\", \"code\": \"code/simple/ovl.py from this release\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 30}\n{\"checker\": \"project fresh machine public files only\", \"code\": \"code/simple/ovl.py from this release\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 31}", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/verifications.jsonl#L1-L10", + "quote": null + }, + { + "origin": "github", + "file": "README.md", + "rev": "1049d2a7", + "lines": "118", + "text": "- All checks so far were run by the project, on separate machines. **We need independent", + "url": "https://github.com/AOSSIE-Org/OpenVerifiableLLM/blob/1049d2a782b8f63103abfa0cca8deab0d2037290/README.md#L118", + "quote": "All checks so far were run by the project, on separate machines." + } + ], + "CK-01": [ + { + "origin": "github", + "file": "README.md", + "rev": "1049d2a7", + "lines": "186", + "text": "- [Run the model in Ollama](docs/guides/ollama.md): `ollama run ryoari/openverifiablellm`", + "url": "https://github.com/AOSSIE-Org/OpenVerifiableLLM/blob/1049d2a782b8f63103abfa0cca8deab0d2037290/README.md#L186", + "quote": "`ollama run ryoari/openverifiablellm`" + }, + { + "origin": "github", + "file": "docs/guides/ollama.md", + "rev": "1049d2a7", + "lines": "6-7", + "text": "This is for trying the model. It isn't how the model is verified. llama.cpp uses a slightly\ndifferent GELU and different kernels, so its outputs are close to PyTorch's but not bit-identical.", + "url": "https://github.com/AOSSIE-Org/OpenVerifiableLLM/blob/1049d2a782b8f63103abfa0cca8deab0d2037290/docs/guides/ollama.md#L6-L7", + "quote": "This is for trying the model. It isn't how the model is verified." + } + ], + "CK-02": [ + { + "origin": "github", + "file": "README.md", + "rev": "1049d2a7", + "lines": "151-153", + "text": "Check that the released model matches its timestamped record, without a GPU. This is a\nconsistency check: it recomputes no training. The real verification is the segment recomputation\nbelow.", + "url": "https://github.com/AOSSIE-Org/OpenVerifiableLLM/blob/1049d2a782b8f63103abfa0cca8deab0d2037290/README.md#L151-L153", + "quote": "This is a consistency check: it recomputes no training." + }, + { + "origin": "github", + "file": "README.md", + "rev": "1049d2a7", + "lines": "156-167", + "text": "pip install huggingface_hub torch numpy rfc8785==0.1.4 tokenizers==0.23.2 mwparserfromhell==0.7.2 \\\n \"safetensors>=0.4.5,<1.0\" \"pynacl>=1.5,<2.0\"\nhf download AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence \\\n --repo-type dataset --include \"release/simple-run/*\" --exclude \"*/ckpt-*\" --local-dir ovl\ncd ovl/release/simple-run\nsha256sum -c --ignore-missing release-hashes.txt\nopenssl ts -verify -in anchor.digicert.tsr -data anchor.json -CAfile /etc/ssl/certs/ca-certificates.crt\n# Verification: OK (DigiCert stamped anchor.json on 2026-10-20)\ngit clone -q --depth 1 --branch v1.0.1 https://github.com/AOSSIE-Org/OpenVerifiableLLM ovl-code\nOVL_DEVICE=cpu python ovl-code/simple/ovl.py verify --run . --weights conversation-model.pt\n# anchor anchor.json: chain head MATCH (38 entries)\n# weights conversation-model.pt: MATCH chain entry 37", + "url": "https://github.com/AOSSIE-Org/OpenVerifiableLLM/blob/1049d2a782b8f63103abfa0cca8deab0d2037290/README.md#L156-L167", + "quote": null + } + ], + "CK-03": [ + { + "origin": "github", + "file": "README.md", + "rev": "1049d2a7", + "lines": "170-172", + "text": "Use `ovl.py` from the v1.0.1 tag, as above. It fails if `anchor.json` is missing. The copy in the\ndownload's `code/` folder predates the anchor check, so it doesn't compare the record with its\ntimestamped anchor.", + "url": "https://github.com/AOSSIE-Org/OpenVerifiableLLM/blob/1049d2a782b8f63103abfa0cca8deab0d2037290/README.md#L170-L172", + "quote": "Use `ovl.py` from the v1.0.1 tag, as above. It fails if `anchor.json` is missing." + } + ], + "CK-04": [ + { + "origin": "github", + "file": "README.md", + "rev": "1049d2a7", + "lines": "166-167", + "text": "# anchor anchor.json: chain head MATCH (38 entries)\n# weights conversation-model.pt: MATCH chain entry 37", + "url": "https://github.com/AOSSIE-Org/OpenVerifiableLLM/blob/1049d2a782b8f63103abfa0cca8deab0d2037290/README.md#L166-L167", + "quote": "chain head MATCH (38 entries)" + }, + { + "origin": "hf", + "file": "release/simple-run/anchor.json", + "rev": "96dc282a", + "lines": "2-3", + "text": " \"chain_entries\": 38,\n \"chain_head_index\": 37,", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/anchor.json#L2-L3", + "quote": null + } + ], + "CK-05": [ + { + "origin": "github", + "file": "README.md", + "rev": "1049d2a7", + "lines": "174-176", + "text": "Recompute a training segment on an RTX 5090, in one click:\n[deploy the RunPod template](https://console.runpod.io/deploy?template=mai1ozh35g), wait about an\nhour, and read the result line in the logs. Step by step:", + "url": "https://github.com/AOSSIE-Org/OpenVerifiableLLM/blob/1049d2a782b8f63103abfa0cca8deab0d2037290/README.md#L174-L176", + "quote": "[deploy the RunPod template](https://console.runpod.io/deploy?template=mai1ozh35g), wait about an" + }, + { + "origin": "github", + "file": "docs/guides/check_a_segment.md", + "rev": "1049d2a7", + "lines": "46", + "text": "2. Wait about an hour: a 22 GB download, then about 20 minutes of training.", + "url": "https://github.com/AOSSIE-Org/OpenVerifiableLLM/blob/1049d2a782b8f63103abfa0cca8deab0d2037290/docs/guides/check_a_segment.md#L46", + "quote": "Wait about an hour: a 22 GB download, then about 20 minutes of training." + } + ], + "CK-06": [ + { + "origin": "github", + "file": "docs/design/simple_run.md", + "rev": "1049d2a7", + "lines": "85", + "text": "- **One segment on an RTX 5090 (about an hour, about US$1–1.50 rented):** deploy the public RunPod", + "url": "https://github.com/AOSSIE-Org/OpenVerifiableLLM/blob/1049d2a782b8f63103abfa0cca8deab0d2037290/docs/design/simple_run.md#L85", + "quote": "about an hour, about US$1–1.50 rented" + }, + { + "origin": "github", + "file": "docs/guides/check_a_segment.md", + "rev": "1049d2a7", + "lines": "53", + "text": "4. Post that line in the project Discord, then **terminate the pod**. It costs about US$1–1.50.", + "url": "https://github.com/AOSSIE-Org/OpenVerifiableLLM/blob/1049d2a782b8f63103abfa0cca8deab0d2037290/docs/guides/check_a_segment.md#L53", + "quote": "It costs about US$1–1.50." + }, + { + "origin": "github", + "file": "docs/design/simple_run.md", + "rev": "1049d2a7", + "lines": "116", + "text": "Prices are RunPod list prices at the time: US$1.19/h for an RTX 5090 and US$0.50/h for the CPU", + "url": "https://github.com/AOSSIE-Org/OpenVerifiableLLM/blob/1049d2a782b8f63103abfa0cca8deab0d2037290/docs/design/simple_run.md#L116", + "quote": "US$1.19/h for an RTX 5090" + } + ], + "CK-07": [ + { + "origin": "hf", + "file": "release/simple-run/README.md", + "rev": "96dc282a", + "lines": "57-60", + "text": "# download code/ from this folder, then:\nbash code/simple/verify_segment.sh # one random segment (~20 min)\nK=3 bash code/simple/verify_segment.sh # three random segments\nSEGMENTS=\"7 8\" bash code/simple/verify_segment.sh # chosen segments", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/README.md#L57-L60", + "quote": null + } + ], + "CK-08": [ + { + "origin": "hf", + "file": "release/simple-run/README.md", + "rev": "96dc282a", + "lines": "93-95", + "text": "openssl ts -verify -in anchor.digicert.tsr -data anchor.json -CAfile /etc/ssl/certs/ca-certificates.crt\ncurl -sO https://freetsa.org/files/cacert.pem; curl -sO https://freetsa.org/files/tsa.crt\nopenssl ts -verify -in anchor.freetsa.tsr -data anchor.json -CAfile cacert.pem -untrusted tsa.crt", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/README.md#L93-L95", + "quote": null + } + ], + "VE-01": [ + { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "lines": "1-37", + "text": "{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 0}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 1}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 2}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 3}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 4}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 5}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 6}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 7}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 8}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 9}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 10}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 11}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 12}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 13}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 14}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 15}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 16}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 17}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 18}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 19}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 20}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 21}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 22}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 23}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 24}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 25}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 26}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 27}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 28}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 29}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 30}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 31}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 32}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 33}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 34}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 35}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 36}", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L1-L37", + "quote": null + }, + { + "origin": "brief", + "file": "project brief v3", + "rev": "v3-2026-10-29", + "lines": "49", + "text": null, + "url": null, + "quote": "Today all 37 are \"project\"." + } + ], + "VE-02": [ + { + "origin": "hf", + "file": "release/simple-run/README.md", + "rev": "96dc282a", + "lines": "26-28", + "text": "Training is split into segments: boundary k to boundary k+1. Each segment can be recomputed on\nits own, starting from the published checkpoint k. A segment passes only if the recomputed state\nis identical, bit for bit, to the committed entry k+1. Because every segment starts from a", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/README.md#L26-L28", + "quote": "A segment passes only if the recomputed state is identical, bit for bit, to the committed entry k+1." + } + ], + "VE-03": [ + { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "lines": "1-46", + "text": "{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 0}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 1}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 2}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 3}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 4}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 5}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 6}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 7}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 8}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 9}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 10}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 11}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 12}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 13}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 14}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 15}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 16}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 17}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 18}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 19}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 20}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 21}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 22}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 23}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 24}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 25}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 26}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 27}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 28}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 29}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 30}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 31}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 32}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 33}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 34}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 35}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 36}\n{\"checker\": \"project training pod\", \"code\": \"ovl.py c4a942c0\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 22}\n{\"checker\": \"project training pod\", \"code\": \"ovl.py c4a942c0\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 31}\n{\"checker\": \"project training pod\", \"code\": \"ovl.py c4a942c0\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 32}\n{\"checker\": \"project training pod\", \"code\": \"ovl.py c4a942c0\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 33}\n{\"checker\": \"project training pod\", \"code\": \"ovl.py c4a942c0\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 34}\n{\"checker\": \"project training pod\", \"code\": \"ovl.py c4a942c0\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 35}\n{\"checker\": \"project training pod\", \"code\": \"ovl.py c4a942c0\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 36}\n{\"checker\": \"project training pod\", \"code\": \"ovl.py c4a942c0 fast loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 5}\n{\"checker\": \"project fresh machine public files only\", \"code\": \"verify_segment.sh from the release\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 21}", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L1-L46", + "quote": null + } + ], + "VE-04": [ + { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "lines": "46", + "text": "{\"checker\": \"project fresh machine public files only\", \"code\": \"verify_segment.sh from the release\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 21}", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L46", + "quote": null + }, + { + "origin": "hf", + "file": "release/simple-run/README.md", + "rev": "96dc282a", + "lines": "41-42", + "text": "different NVIDIA driver from training (595.91.07 vs 570.195.03 for segments 0-9). Segment 21 was\nalso recomputed on a fresh machine using only the public files and `verify_segment.sh`: MATCH. See", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/README.md#L41-L42", + "quote": "Segment 21 was" + } + ], + "VE-06": [ + { + "origin": "hf", + "file": "release/simple-run/README.md", + "rev": "96dc282a", + "lines": "45-47", + "text": "**How hard is it to forge one segment?** With N segments, M independent checkers who each pick one\nrandom segment catch a single forged segment with probability 1 − ((N−1)/N)^M. One checker who\nchecks k different segments catches it with probability k/N.", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/README.md#L45-L47", + "quote": "1 − ((N−1)/N)^M" + } + ], + "VE-07": [ + { + "origin": "github", + "file": "docs/design/simple_run.md", + "rev": "1049d2a7", + "lines": "199-200", + "text": " catch one forged segment with probability 1 − ((N−1)/N)^M. For N = 37 that's about 110 checks for\n 95% and 169 for 99%. Longer runs with more segments need more checks.", + "url": "https://github.com/AOSSIE-Org/OpenVerifiableLLM/blob/1049d2a782b8f63103abfa0cca8deab0d2037290/docs/design/simple_run.md#L199-L200", + "quote": "For N = 37 that's about 110 checks for 95% and 169 for 99%." + }, + { + "origin": "github", + "file": "README.md", + "rev": "1049d2a7", + "lines": "119-120", + "text": " checkers**: see [Join us](#join-us). Catching one forged segment out of 37 with 95% probability\n takes about 110 independent random checks", + "url": "https://github.com/AOSSIE-Org/OpenVerifiableLLM/blob/1049d2a782b8f63103abfa0cca8deab0d2037290/README.md#L119-L120", + "quote": "takes about 110 independent random checks" + } + ], + "VE-08": [ + { + "origin": "github", + "file": "docs/design/simple_run.md", + "rev": "1049d2a7", + "lines": "199-200", + "text": " catch one forged segment with probability 1 − ((N−1)/N)^M. For N = 37 that's about 110 checks for\n 95% and 169 for 99%. Longer runs with more segments need more checks.", + "url": "https://github.com/AOSSIE-Org/OpenVerifiableLLM/blob/1049d2a782b8f63103abfa0cca8deab0d2037290/docs/design/simple_run.md#L199-L200", + "quote": "169 for 99%" + } + ], + "VE-09": [ + { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "lines": "1-46", + "text": "{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 0}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 1}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 2}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 3}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 4}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 5}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 6}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 7}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 8}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 9}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 10}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 11}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 12}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 13}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 14}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 15}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 16}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 17}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 18}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 19}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 20}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 21}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 22}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 23}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 24}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 25}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 26}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 27}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 28}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 29}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 30}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 31}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 32}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 33}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 34}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 35}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 36}\n{\"checker\": \"project training pod\", \"code\": \"ovl.py c4a942c0\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 22}\n{\"checker\": \"project training pod\", \"code\": \"ovl.py c4a942c0\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 31}\n{\"checker\": \"project training pod\", \"code\": \"ovl.py c4a942c0\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 32}\n{\"checker\": \"project training pod\", \"code\": \"ovl.py c4a942c0\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 33}\n{\"checker\": \"project training pod\", \"code\": \"ovl.py c4a942c0\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 34}\n{\"checker\": \"project training pod\", \"code\": \"ovl.py c4a942c0\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 35}\n{\"checker\": \"project training pod\", \"code\": \"ovl.py c4a942c0\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 36}\n{\"checker\": \"project training pod\", \"code\": \"ovl.py c4a942c0 fast loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 5}\n{\"checker\": \"project fresh machine public files only\", \"code\": \"verify_segment.sh from the release\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 21}", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L1-L46", + "quote": null + }, + { + "origin": "hf", + "file": "release/unlearning-3i-atlas/verifications.jsonl", + "rev": "96dc282a", + "lines": "1-10", + "text": "{\"checker\": \"project fork pod\", \"code\": \"ovl.py fork-capable (code/simple/ovl.py)\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 30}\n{\"checker\": \"project fork pod\", \"code\": \"ovl.py fork-capable (code/simple/ovl.py)\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 31}\n{\"checker\": \"project fork pod\", \"code\": \"ovl.py fork-capable (code/simple/ovl.py)\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 32}\n{\"checker\": \"project fork pod\", \"code\": \"ovl.py fork-capable (code/simple/ovl.py)\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 33}\n{\"checker\": \"project fork pod\", \"code\": \"ovl.py fork-capable (code/simple/ovl.py)\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 34}\n{\"checker\": \"project fork pod\", \"code\": \"ovl.py fork-capable (code/simple/ovl.py)\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 35}\n{\"checker\": \"project fork pod\", \"code\": \"ovl.py fork-capable (code/simple/ovl.py)\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 36}\n{\"checker\": \"project fork pod\", \"code\": \"ovl.py fork-capable (code/simple/ovl.py)\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 37}\n{\"checker\": \"project fresh machine public files only\", \"code\": \"code/simple/ovl.py from this release\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 30}\n{\"checker\": \"project fresh machine public files only\", \"code\": \"code/simple/ovl.py from this release\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 31}", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/verifications.jsonl#L1-L10", + "quote": null + }, + { + "origin": "brief", + "file": "project brief v3", + "rev": "v3-2026-10-29", + "lines": "52", + "text": null, + "url": null, + "quote": "Show the current count of independent checks, which is 0." + } + ], + "VE-10": [ + { + "origin": "github", + "file": "README.md", + "rev": "1049d2a7", + "lines": "121-122", + "text": "- Check results are self-reported text lines. They aren't signed, and nothing proves a checker\n picked its segment at random", + "url": "https://github.com/AOSSIE-Org/OpenVerifiableLLM/blob/1049d2a782b8f63103abfa0cca8deab0d2037290/README.md#L121-L122", + "quote": "They aren't signed, and nothing proves a checker" + } + ], + "VE-11": [ + { + "origin": "github", + "file": "docs/project/roadmap.md", + "rev": "1049d2a7", + "lines": "32-33", + "text": "- **Signed check results and random segment choice.** Today a check result is a self-reported line.\n Checkers would sign their result, and the segment would be picked from public randomness (for", + "url": "https://github.com/AOSSIE-Org/OpenVerifiableLLM/blob/1049d2a782b8f63103abfa0cca8deab0d2037290/docs/project/roadmap.md#L32-L33", + "quote": "Signed check results and random segment choice." + }, + { + "origin": "github", + "file": "docs/design/simple_run.md", + "rev": "1049d2a7", + "lines": "202-203", + "text": " checker picked the segment at random. Signed results and public randomness for picking segments\n are on the [roadmap](../project/roadmap.md).", + "url": "https://github.com/AOSSIE-Org/OpenVerifiableLLM/blob/1049d2a782b8f63103abfa0cca8deab0d2037290/docs/design/simple_run.md#L202-L203", + "quote": "Signed results and public randomness for picking segments" + } + ], + "VE-HW-1": [ + { + "origin": "hf", + "file": "release/simple-run/hardware-map.jsonl", + "rev": "96dc282a", + "lines": "1", + "text": "{\"segment\": 32, \"result\": \"MATCH\", \"hardware\": \"NVIDIA GeForce RTX 5090 (Blackwell)\", \"driver\": \"595.91.07\", \"software\": \"torch 2.8.0+cu128\", \"note\": \"training GPU type; control for this probe\"}", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/hardware-map.jsonl#L1", + "quote": null + } + ], + "VE-HW-2": [ + { + "origin": "hf", + "file": "release/simple-run/hardware-map.jsonl", + "rev": "96dc282a", + "lines": "2", + "text": "{\"segment\": 32, \"result\": \"MISMATCH\", \"hardware\": \"NVIDIA GeForce RTX 4090 (Ada)\", \"driver\": \"595.91.07\", \"software\": \"torch 2.8.0+cu128\", \"note\": \"same software, different architecture\"}", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/hardware-map.jsonl#L2", + "quote": null + } + ], + "VE-HW-3": [ + { + "origin": "hf", + "file": "release/simple-run/hardware-map.jsonl", + "rev": "96dc282a", + "lines": "3", + "text": "{\"segment\": 32, \"result\": \"MISMATCH\", \"hardware\": \"NVIDIA H100 80GB HBM3 (Hopper)\", \"driver\": \"595.91.07\", \"software\": \"torch 2.8.0+cu128\", \"note\": \"same software, different architecture\"}", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/hardware-map.jsonl#L3", + "quote": null + } + ], + "VE-HW-4": [ + { + "origin": "hf", + "file": "release/simple-run/hardware-map.jsonl", + "rev": "96dc282a", + "lines": "4", + "text": "{\"segment\": 32, \"result\": \"MISMATCH\", \"hardware\": \"x86_64 CPU\", \"driver\": \"none\", \"software\": \"torch 2.14.0+cpu\", \"note\": \"different hardware and software\"}", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/hardware-map.jsonl#L4", + "quote": null + } + ], + "VE-HW-5": [ + { + "origin": "hf", + "file": "release/simple-run/README.md", + "rev": "96dc282a", + "lines": "68", + "text": "The same published segment (32→33) was recomputed with the same software (PyTorch 2.8.0, CUDA 12.8):", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/README.md#L68", + "quote": "The same published segment (32→33)" + } + ], + "VE-HW-6": [ + { + "origin": "hf", + "file": "release/simple-run/README.md", + "rev": "96dc282a", + "lines": "79-80", + "text": "training reproduces on the same GPU architecture: two different NVIDIA drivers (570.195.03 and\n595.91.07) gave identical bits. Other architectures run different low-level kernels and do not.", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/README.md#L79-L80", + "quote": "two different NVIDIA drivers (570.195.03 and" + } + ], + "VE-12": [ + { + "origin": "github", + "file": "README.md", + "rev": "1049d2a7", + "lines": "116-117", + "text": "- Checkers need the training GPU's architecture (RTX 5090), and they trust the same PyTorch/CUDA\n toolchain. A deterministic error in that toolchain would match on every machine", + "url": "https://github.com/AOSSIE-Org/OpenVerifiableLLM/blob/1049d2a782b8f63103abfa0cca8deab0d2037290/README.md#L116-L117", + "quote": "A deterministic error in that toolchain would match on every machine" + } + ], + "TL-01": [ + { + "origin": "hf", + "file": "release/simple-run/chain.jsonl", + "rev": "96dc282a", + "lines": "1-38", + "text": "{\"control\": {\"batches\": \"10ea13010a13668c8bf9e2884e16bdbd16f8933d9bf4d09eda0c47459133eddb\", \"cursor\": 0, \"epoch\": 0, \"global_step\": 0, \"phase\": \"wikipedia\", \"phase_step\": 0, \"pos\": [0, 0]}, \"data\": {\"conversation\": \"e179de793decc82e8cecfbfabd7d449d1caf145a988c4c881a9a041dcda36b7f\", \"wikipedia\": \"a49baead333842ac36669a62a752ea6204295e4012a6bfa2d8f2b8c85981d832\"}, \"environment\": {\"cublas_workspace\": \":4096:8\", \"cuda\": \"12.8\", \"cudnn\": 91002, \"gpu\": \"NVIDIA GeForce RTX 5090\", \"torch\": \"2.8.0+cu128\"}, \"index\": 0, \"kind\": \"initial\", \"model\": \"2b167bcb407f94ac3f1dead8f316ea180823a1cb40489b8a1ff974bf2bcd959d\", \"previous\": null, \"recipe\": \"d0d9fc61c46b0f0e0b63e336579e7443860141452d881b1e7297ad46439f9fc5\", \"state\": \"64041a4736bd76b64b149c2a784950a312fb19ed641c7eb87e7300c171d002fc\", \"time\": 1792422250.861772}\n{\"control\": {\"batches\": \"e3f19a5269c4824fb1615d433b678fa54a6fc23ea99fd82c3e83f3f400f66809\", \"cursor\": 274561003, \"epoch\": 0, \"global_step\": 18080, \"phase\": \"wikipedia\", \"phase_step\": 18080, \"pos\": [14363834, 3072]}, \"index\": 1, \"kind\": \"progress\", \"model\": \"c32f02fac9e87d0c4279aa39a0fa06b5cc06d5b141d5ff29503cb8431c4ca180\", \"previous\": \"504f691b0958076c19294758dd4ba134b01e8740baa160f98d3b8e49dd2118e2\", \"state\": \"ef5090325fcf3c392503406ac2f7e6bd99118d267c38fbe4b624df41b48eca8f\", \"time\": 1792424215.6430938}\n{\"control\": {\"batches\": \"d5b199348b8d97e5a30ee2ea1a9bc465fd5dc0220a1a4297b4fa0716abdc84dc\", \"cursor\": 547313827, \"epoch\": 0, \"global_step\": 36160, \"phase\": \"wikipedia\", \"phase_step\": 36160, \"pos\": [30161308, 6656]}, \"index\": 2, \"kind\": \"progress\", \"model\": \"29c055caaaefce12e962bb5905f79640bf7bcfc2dfe09070704f50a35e954868\", \"previous\": \"7c6fd00419883c91e75e804f7bc8e6b35bee3853c9202fd27f998c6ef23bb66f\", \"state\": \"94e253d50adff230867baf0f9b2fbb247399b598511dd238cca10838439a228c\", \"time\": 1792426181.1370955}\n{\"control\": {\"batches\": \"f520d10b29d43cbbe5556d887bd7e622a26ed3003eaa8677366993ed6a0965df\", \"cursor\": 812314162, \"epoch\": 0, \"global_step\": 54240, \"phase\": \"wikipedia\", \"phase_step\": 54240, \"pos\": [50875269, 0]}, \"index\": 3, \"kind\": \"progress\", \"model\": \"bc0210cc1ce7eb55786921b9be9142224551daaa14a5a94b5851415d9954513f\", \"previous\": \"491740cf089c9f5f7f6bcb98358f09629921444366cc64746d2ca443070e8789\", \"state\": \"63f2f1cf69a97b295ef4924af836583cc5942d4cfdde34a0d68da658e9b56875\", \"time\": 1792428164.4587104}\n{\"control\": {\"batches\": \"9b1c36b8b217b225ab637476b5f96e9d13723e8ff2f49474a1aff9fe4b6c6836\", \"cursor\": 1071169817, \"epoch\": 0, \"global_step\": 72320, \"phase\": \"wikipedia\", \"phase_step\": 72320, \"pos\": [75821490, 512]}, \"index\": 4, \"kind\": \"progress\", \"model\": \"f6c1733d73e556de085fd9cb99f4137296f9ad7835fc3c88c9f8588cfeca0165\", \"previous\": \"21ece8367d0fd3dfacba13dd330f401b1229748f994f91a6053a0f85fd421a37\", \"state\": \"38544968f3a1f342c17ee65afed30915acacf2131314c3254cfb1d3367acf0f6\", \"time\": 1792430142.4307606}\n{\"control\": {\"batches\": \"0feb0c99169621a584609ce24a7ba1710f4dd1127205dae3911df09e1ab75698\", \"cursor\": 1326339931, \"epoch\": 0, \"global_step\": 90400, \"phase\": \"wikipedia\", \"phase_step\": 90400, \"pos\": [103716532, 512]}, \"index\": 5, \"kind\": \"progress\", \"model\": \"521f1f5f34c6a0992a15e539f1eab5f5590f5fdca15fdf16c60842c1d8612754\", \"previous\": \"7aab36987ca192ef19b1aa63efbfc63d005ed8e541ca07190e1c09b7371f3ab6\", \"state\": \"0f66051bfcf2b8512da505733cf9814527aba0412b28109071d9ebe1e7949165\", \"time\": 1792432107.6645238}\n{\"control\": {\"batches\": \"dd5c823c56a28362db599fa09567143434f9f343784400622105200695fca78d\", \"cursor\": 1575735740, \"epoch\": 0, \"global_step\": 108480, \"phase\": \"wikipedia\", \"phase_step\": 108480, \"pos\": [135269108, 0]}, \"index\": 6, \"kind\": \"progress\", \"model\": \"655aa1b3b7f5a34c9f0a2eba172ddbfef233acb3f121373e351b6d2cd982475f\", \"previous\": \"5333b1e668315511ed83188188343e3de85e91c4382a997a8b1e649e59c472aa\", \"state\": \"d3f93a22ceb28a8640734ceca70e0217cf991b696807ecb6fdd31d318ad30aa8\", \"time\": 1792434050.5597794}\n{\"control\": {\"batches\": \"496333b0221dbc6a2edeeb9ea5318d3b33069b8f91c98d489cf742f70bab1d43\", \"cursor\": 1821662484, \"epoch\": 0, \"global_step\": 126560, \"phase\": \"wikipedia\", \"phase_step\": 126560, \"pos\": [169162007, 512]}, \"index\": 7, \"kind\": \"progress\", \"model\": \"ab677b66cfcc2d0652d37b5cc354e5d6980716b273cc99b78ae53f63e581ba14\", \"previous\": \"bd8ab58402e382c3378b92efebbb0666d02a034cb8ebb0dfed38c64b339df85a\", \"state\": \"228e635e6ee63fca5189f1af685f15c9d52a27527f300e7dac7a5ade82688e11\", \"time\": 1792435994.2637668}\n{\"control\": {\"batches\": \"a009f3186720dd943c7c0e3c597706610370b795c3fd87b65df4ce8cdc54822d\", \"cursor\": 2062246462, \"epoch\": 0, \"global_step\": 144640, \"phase\": \"wikipedia\", \"phase_step\": 144640, \"pos\": [206335253, 0]}, \"index\": 8, \"kind\": \"progress\", \"model\": \"4419b42c7902c6f650e634055a1de54ca172e2a0a26c5bbad58ee8516cf4dfc6\", \"previous\": \"8784633f5bc8763129ce3ca0727e4c1b11339afa37096f990ce299d155b74acc\", \"state\": \"6cb7cf58b036f71d793b7940617d2756e4d24e906a8a4fdb6ec58ee56031ad53\", \"time\": 1792437967.4633026}\n{\"control\": {\"batches\": \"9f883e76562c687ddae51575bda5430cc91dbc45e57e7311d3646340a420a020\", \"cursor\": 2299429619, \"epoch\": 0, \"global_step\": 162720, \"phase\": \"wikipedia\", \"phase_step\": 162720, \"pos\": [245609368, 0]}, \"index\": 9, \"kind\": \"progress\", \"model\": \"967ff641117b62e0f4bbb19fda16cfb7a1b6c20adc35295ff0738a0664953048\", \"previous\": \"09803876eabd9ae24bbc5ba4f4ae5047e9da90d725cc3d5ca70445ede3b9b9ae\", \"state\": \"0947a1b7cb257922ed1bb71e36059bdde1fa1c76509255c1af8cb3167bff72db\", \"time\": 1792439938.9320748}\n{\"control\": {\"batches\": \"14ffdd92074c743ba35ff842d9d2956a29ff1ecf6b93820fc1bedb2161e2f20f\", \"cursor\": 2534896708, \"epoch\": 0, \"global_step\": 180800, \"phase\": \"wikipedia\", \"phase_step\": 180800, \"pos\": [285958813, 5632]}, \"index\": 10, \"kind\": \"progress\", \"model\": \"cb2fbe49be6ead1201600d45004f411c7ed3ba0d532ebe2417b1a43ba40d9889\", \"previous\": \"e00e8ee29ee6ee131fa246a6ec1d787a2752857efb34b0d1f369db3e7a62bf43\", \"state\": \"e162c0ef79462cfcc2c88cd336170df12f92f1f6d099920decca178da9dd455a\", \"time\": 1792441925.2640333}\n{\"control\": {\"batches\": \"7321c9e7f9b890c6b657525ffc10389c70e730b37f0ccaa0281264b7aaeec2ca\", \"cursor\": 2758953574, \"epoch\": 0, \"global_step\": 198880, \"phase\": \"wikipedia\", \"phase_step\": 198880, \"pos\": [331465519, 0]}, \"index\": 11, \"kind\": \"progress\", \"model\": \"21e5ccc4f7a7b4c8b311febbdcb0cd037a2efff64c715935853fa663b61e5aeb\", \"previous\": \"19b1091f16ffa0006a0853ed750d237a528a54e3dcc93101fee747134200803b\", \"state\": \"be21dd4e7d988157822d75f6600146be013afa826076b49b45b3874e5a2bd1ca\", \"time\": 1792445221.8958924}\n{\"control\": {\"batches\": \"0d86e2942f9d84483cd0e3cd5168d81cf418e915c04e25f94c03d3ad703c648d\", \"cursor\": 2977003841, \"epoch\": 0, \"global_step\": 216960, \"phase\": \"wikipedia\", \"phase_step\": 216960, \"pos\": [379051570, 512]}, \"index\": 12, \"kind\": \"progress\", \"model\": \"ee22252416c44a8812aab40b456c60351eaf714679495ef7c39a81c3d24db503\", \"previous\": \"5d4ad7bed8d2d8701de142eae5eea79a44bf54fc11e2a4623cb0baeea01efe18\", \"state\": \"c9d571c059311fbeb20f46d33a56497113b1f3705b75939ef57e61cc98978ca6\", \"time\": 1792447305.2481282}\n{\"control\": {\"batches\": \"bfe949e391619c70945f4ad5af5f73c00f8d44562f44733457ad865081612290\", \"cursor\": 3192270243, \"epoch\": 0, \"global_step\": 235040, \"phase\": \"wikipedia\", \"phase_step\": 235040, \"pos\": [427598539, 0]}, \"index\": 13, \"kind\": \"progress\", \"model\": \"978af11d622fb0e48dd842f5aa27e9992c267de2a91944b1b3b160aa89fa7675\", \"previous\": \"54e85b9f28ca29d37f5cfd86bad3b6fe57fef7c0eb4aac943d937e90432e0165\", \"state\": \"2733d7ef9aaacf20880e2196c819305f58ad0cc03494704fbc9f5e03a95931b2\", \"time\": 1792449363.6749403}\n{\"control\": {\"batches\": \"7eea41e27f71c52d58558b90de9ef7cd26ac9123366132bcbc1e71f4de08acf4\", \"cursor\": 3407720912, \"epoch\": 0, \"global_step\": 253120, \"phase\": \"wikipedia\", \"phase_step\": 253120, \"pos\": [476680277, 0]}, \"index\": 14, \"kind\": \"progress\", \"model\": \"613728906a531097849fcaa83d13ccb54b334d805aeaef8abe127ef2b7b70e1d\", \"previous\": \"dc2beb0f1985df3c46dfce9859f37c998a41224dd65b6c74b56a1b3ca1070e3f\", \"state\": \"145353afb1e2ebc2b5f9831fed74e5631b42a11342aab9a0b9febe796446c446\", \"time\": 1792451498.6016607}\n{\"control\": {\"batches\": \"c294ad7b42d0f2e970f3c757f339b24f6fbdc2982e9a91078a071b121b9325a1\", \"cursor\": 3626056290, \"epoch\": 0, \"global_step\": 271200, \"phase\": \"wikipedia\", \"phase_step\": 271200, \"pos\": [524689002, 0]}, \"index\": 15, \"kind\": \"progress\", \"model\": \"0f122b6387647c6844f6668edc95b2b96efd34885985e80c25a1eb424c7ffa2c\", \"previous\": \"74ad00bd517b70b7fc068a01f255b7edf4930d056c5999dac36ee782e0501ffa\", \"state\": \"fa961c767d2e293f12adcd13a3410d345e3bb5952395725963eb2f6e5c228d9e\", \"time\": 1792453682.104504}\n{\"control\": {\"batches\": \"4d0765884b5a4f4af81e17f0914a728e631c665fa74ec82be39e458f3f4f40c1\", \"cursor\": 3842372860, \"epoch\": 0, \"global_step\": 289280, \"phase\": \"wikipedia\", \"phase_step\": 289280, \"pos\": [573811026, 2048]}, \"index\": 16, \"kind\": \"progress\", \"model\": \"9a1a2f4ad99c6aac613f620400dc405a8967906e435079c0d8d29622831044fa\", \"previous\": \"02ae49797dac00039040490c47e210a12ab563766377996bea3c01e5fc2a5722\", \"state\": \"82d7f95aaed27c4ac54ec6b8de9567a84d818a875673030c4ae0d2d39a860754\", \"time\": 1792455885.299576}\n{\"control\": {\"batches\": \"a219629293cfc4e69c74916379ba790f96b8a5425bd9fb7f4d9e481965ec9374\", \"cursor\": 4065481916, \"epoch\": 0, \"global_step\": 307360, \"phase\": \"wikipedia\", \"phase_step\": 307360, \"pos\": [619889558, 18944]}, \"index\": 17, \"kind\": \"progress\", \"model\": \"1e77516fc3d4c149c17b5e039ba9a886f520769df7512002fe89a9e5148f7d6e\", \"previous\": \"d18717f336293c9ad84cf6a7fa7c906ce76bb75e2a30bb954ff53f6336fb349f\", \"state\": \"1082ced41232e82ff83506f0c20d887d0ddc3dc7458bc3ace5361a87485e5b60\", \"time\": 1792458112.5074773}\n{\"control\": {\"batches\": \"fbdade37939ffab2c5df52a9db88c8bac93a5501861522a30f1a50ebcafb4b3e\", \"cursor\": 4280170919, \"epoch\": 0, \"global_step\": 325440, \"phase\": \"wikipedia\", \"phase_step\": 325440, \"pos\": [669406302, 0]}, \"index\": 18, \"kind\": \"progress\", \"model\": \"4d79bcc6ee8060a9c28a5802c142f972665bafae70901176c9a964bc884f1dee\", \"previous\": \"2a5f5728e37dc780da3f0007096a4f16f6d1ce979541d021f22b30b21576c2f7\", \"state\": \"0d4932793bd2279c0a17b3ca736159f89d48898d8a42113d15c7590dfdd85c26\", \"time\": 1792460358.5080163}\n{\"control\": {\"batches\": \"32161f48812917ee1bed7a4367df261934308045464246622f47dba2ab129f2a\", \"cursor\": 4492270493, \"epoch\": 0, \"global_step\": 343520, \"phase\": \"wikipedia\", \"phase_step\": 343520, \"pos\": [719769225, 2048]}, \"index\": 19, \"kind\": \"progress\", \"model\": \"9e597fcc4fc74828e30605677e3696a53b77a6976fecdc4f0e06b378e6721ee9\", \"previous\": \"a16cd66f1a0e4cd71e0655dbfa89443148eae0d12114c025edcfbc543e66fb89\", \"state\": \"cafd56b605b39449655b55534cd4e33616de0d40e6c3434fcd1a54c941e63191\", \"time\": 1792462598.3975008}\n{\"control\": {\"batches\": \"30c019ac1c173f6d688cdd4bd01e7ceaf9ed1376251e69d87cb9643b4386116b\", \"cursor\": 4705349595, \"epoch\": 0, \"global_step\": 361600, \"phase\": \"wikipedia\", \"phase_step\": 361600, \"pos\": [769153707, 4608]}, \"index\": 20, \"kind\": \"progress\", \"model\": \"f98ab99a90c7734a3f4cf2d60216ed8b1bdc657541ec3374c6f035b0bd42a307\", \"previous\": \"e26d3eb4812c5c4d13625a8a2a72662d202697d0dae3336f24e3a0f7325cc12f\", \"state\": \"708b48121052bf9bc68bbd67e8613230dd713b9569610a4e66838fe45f35299a\", \"time\": 1792463768.5816014}\n{\"control\": {\"batches\": \"09506b60c4342ec5873bba53f2e993f0a46e1b726fc3449ce690e5e4eb43927c\", \"cursor\": 4919188008, \"epoch\": 0, \"global_step\": 379680, \"phase\": \"wikipedia\", \"phase_step\": 379680, \"pos\": [818886901, 0]}, \"index\": 21, \"kind\": \"progress\", \"model\": \"b89d3b185a1fcf21bcc5ef432a26eafc9643eb62b9aa3d8eeb624cbfceeea340\", \"previous\": \"d16e556f9c072f3fe71fba64d787402b5be33427db7c160745d0a58040af1e03\", \"state\": \"eb31ec48c4ce9373035fe1229a93190fcfec9060d1bc8520f62ed3dfcab752fa\", \"time\": 1792465514.4536183}\n{\"control\": {\"batches\": \"27f95fcd8bc5e1b25cea97a17fd58ce6f6771b5b15565014616d4519ab8c8184\", \"cursor\": 5137669818, \"epoch\": 0, \"global_step\": 397760, \"phase\": \"wikipedia\", \"phase_step\": 397760, \"pos\": [867774445, 512]}, \"index\": 22, \"kind\": \"progress\", \"model\": \"1428e4c6cddc484d305881220b68eb5e04eb851632e1ae7d4f61725e0b24708b\", \"previous\": \"69385671abc45197a2a67165df66e34a51beeaf1d55eedf5daadb3b1d7e6ea5d\", \"state\": \"ee97359b8f9928977515e383d98a796d442444b5a07de5c9ec1158d372cc0e49\", \"time\": 1792468481.591845}\n{\"control\": {\"batches\": \"2ac5c320056a9766eaf2f910194309a2e1e3254958d1fe2e4afa92805ee04b28\", \"cursor\": 5354659564, \"epoch\": 0, \"global_step\": 415840, \"phase\": \"wikipedia\", \"phase_step\": 415840, \"pos\": [917385337, 0]}, \"index\": 23, \"kind\": \"progress\", \"model\": \"8948b0defe4c934602354d44e72ceb0b34c46d87bb7a67832fa50ea581b57d16\", \"previous\": \"5522af40717e99883a27f65daa6c7646f1526d9b2aed9862ce88de7267c962a0\", \"state\": \"296c1763d3421f6991f4f841f4143166bf0910000e5b00673383a4589859483f\", \"time\": 1792469631.0069373}\n{\"control\": {\"batches\": \"3fae190c7c836188101a7a77d6046446431892e109590436e4c94a3ed1da8c13\", \"cursor\": 5571989843, \"epoch\": 0, \"global_step\": 433920, \"phase\": \"wikipedia\", \"phase_step\": 433920, \"pos\": [966632574, 8192]}, \"index\": 24, \"kind\": \"progress\", \"model\": \"c553304d081e5817ba0e042bcdef7f1cf9642a290b006edab98778abd18eeedc\", \"previous\": \"44f6db9d7a6224e23d14abcfe7d1a1c4923332e676a302f7cb146cbc7d94aa99\", \"state\": \"6413ef4ca2bf9d47a89302d88662069fde930d732c4df7d0892f30ed64d3756d\", \"time\": 1792470779.9569445}\n{\"control\": {\"batches\": \"b77680f3b1febcf15d5adac2f244b845ea1ca7ae5837e9ce9e57a9b9661033c6\", \"cursor\": 5786932809, \"epoch\": 0, \"global_step\": 452000, \"phase\": \"wikipedia\", \"phase_step\": 452000, \"pos\": [1015978804, 2048]}, \"index\": 25, \"kind\": \"progress\", \"model\": \"1f1becfa5470bac9a31962462d4d85647598dc8f75277e2f9c6efe5bc59ada97\", \"previous\": \"05bfdd196077d5855614cf512c1226a3036a071bd251e5d82e9c05751dc9d74a\", \"state\": \"245211135b131b6c5e1940458575033082b4b473fa0033b55816d889c82d656b\", \"time\": 1792471931.509705}\n{\"control\": {\"batches\": \"44eaf0d468c5578cc89e3999530132727e41ac47cbfcc8fcf80a7621b527cda0\", \"cursor\": 6003090585, \"epoch\": 0, \"global_step\": 470080, \"phase\": \"wikipedia\", \"phase_step\": 470080, \"pos\": [1065027050, 0]}, \"index\": 26, \"kind\": \"progress\", \"model\": \"6a59289ec3928857e0beacc7858e190c0756c72f2cdf48896578bb75720fa72a\", \"previous\": \"01b7d56bc8b58be5cca403ba71dc9fd1d5c6083d5740dae7c912e3a9557e8dd0\", \"state\": \"7b1ab9b324ac43d99f738ee00e3ef2b514e8dcc82313863c1d8f6e871d42bbb8\", \"time\": 1792473082.0379794}\n{\"control\": {\"batches\": \"58cf98d2ec42837434cc698720602c1ed7a427f1b7075de7b56e1957e42d7b7b\", \"cursor\": 6219792471, \"epoch\": 0, \"global_step\": 488160, \"phase\": \"wikipedia\", \"phase_step\": 488160, \"pos\": [1113864691, 1024]}, \"index\": 27, \"kind\": \"progress\", \"model\": \"5329233dbd65f90b4c368e40c725c59496c03266053f934c4be9c4ef73e3ec73\", \"previous\": \"6b141d06e0138bd34dc59373f5aa0bc92bc363b53c7f013a8c98cc09d411094e\", \"state\": \"0ec654850f2c1288c7850e9e732b52187dcc5f73fffe0f3bc211143e32097e7a\", \"time\": 1792474229.018975}\n{\"control\": {\"batches\": \"8e7e2738dac57947ab3894def88fc8bfb84e0b8c55095fcd33d66e2699dabab5\", \"cursor\": 6444391263, \"epoch\": 0, \"global_step\": 506240, \"phase\": \"wikipedia\", \"phase_step\": 506240, \"pos\": [1159432427, 0]}, \"index\": 28, \"kind\": \"progress\", \"model\": \"d6e1eaab6061fc051ae6de60bb6c95d99d1b98c6bcddfdcbbd593208b7d8a303\", \"previous\": \"339ba1cbaecfdf10cbae5574f973945950123a903c4d3da848cfb7dbdabd940c\", \"state\": \"e5891f8db717f770246c4255fa6598ba280922c428e9e1e6d814f5d96549cab1\", \"time\": 1792475372.9946525}\n{\"control\": {\"batches\": \"7b351d64e2a3d2492e668dcfd73d82ce92c0ba04fdd4c3058c95d4e642a6807d\", \"cursor\": 6671911669, \"epoch\": 0, \"global_step\": 524320, \"phase\": \"wikipedia\", \"phase_step\": 524320, \"pos\": [1203647118, 0]}, \"index\": 29, \"kind\": \"progress\", \"model\": \"3c5459d2bdcdb86d05168a8a78370aa7f772cb6f48ab11e6949164ec6d30fdc0\", \"previous\": \"9f1343558e7f2897d578acf607bf2a7b5abad07e032bb5c4384f6716f19b02e5\", \"state\": \"ab0f669782c60bf45255e4822fee5fe5425a24b614d10dc0821323ca7325853c\", \"time\": 1792476512.00237}\n{\"control\": {\"batches\": \"304b2d3afe5a67a5ef902cb8334a55ee6f89877d474b438fb9c94e507814dece\", \"cursor\": 6901668826, \"epoch\": 0, \"global_step\": 542400, \"phase\": \"wikipedia\", \"phase_step\": 542400, \"pos\": [1246875101, 0]}, \"index\": 30, \"kind\": \"progress\", \"model\": \"bdfa54d7eb2938c8fe3258528e5cb84287c54f889471eb60909e7d8c6aca8061\", \"previous\": \"e24b7d97bcd3f1d31bccc299bde66247d0c84ffd0ebeb2c942a770ab2345908b\", \"state\": \"baf0f2694f6f7561b6e427c0181978541c19263849163984131f51dad72b6c38\", \"time\": 1792477651.6187513}\n{\"control\": {\"batches\": \"dcad901881cb94e24e81efa96ff4282bcf4a23d1ad042fc85d0fe5444c2fc875\", \"cursor\": 7118121139, \"epoch\": 0, \"global_step\": 560177, \"phase\": \"wikipedia\", \"phase_step\": 560177, \"pos\": [1293950757, 0]}, \"index\": 31, \"kind\": \"base\", \"model\": \"31c8cd3a4972ffe5733ca19f614cb93c70c135ebc4ce1f053ca54a309b20a65f\", \"previous\": \"2f33f280a48f610d432e95d98fe14d12e81d77ea97d419f39964bb92119fec39\", \"state\": \"13d6ad64b2465d42653f250bba0463468c0c81b7980ebc9d97e3b0f95c713bf1\", \"time\": 1792478775.2381847}\n{\"control\": {\"batches\": \"dcad901881cb94e24e81efa96ff4282bcf4a23d1ad042fc85d0fe5444c2fc875\", \"cursor\": 0, \"epoch\": 0, \"global_step\": 560177, \"phase\": \"conversation\", \"phase_step\": 0, \"pos\": [0, 0]}, \"index\": 32, \"kind\": \"transition\", \"model\": \"31c8cd3a4972ffe5733ca19f614cb93c70c135ebc4ce1f053ca54a309b20a65f\", \"previous\": \"5c05e153104c6987ed29668d611765bbfad8aba906bb2d28d258857ea13e5b5a\", \"state\": \"8987fdd57ba91b044c23bba48cf41b132aa6ec949c4af650ba3180483476941d\", \"time\": 1792478776.1264164}\n{\"control\": {\"batches\": \"367fdeaa7d8de8113d22b27f162652c9cea078879dcdad4cd27555239df9ba67\", \"cursor\": 1278137, \"epoch\": 0, \"global_step\": 560324, \"phase\": \"conversation\", \"phase_step\": 147, \"pos\": [849666, 0]}, \"index\": 33, \"kind\": \"epoch\", \"model\": \"fa2903c63e2fedd52ff6e53cab2c16921f6dae52855700caf8f7d23358172b1e\", \"previous\": \"98e7266fe9e50a0ad993bfbba932f7c24f3f1e30d822517995b1d6092a980ec8\", \"state\": \"47e181e530d97201584906d931d1e5cfcd25ec000acfc6381c1162b102036b03\", \"time\": 1792478785.6187253}\n{\"control\": {\"batches\": \"367fdeaa7d8de8113d22b27f162652c9cea078879dcdad4cd27555239df9ba67\", \"cursor\": 0, \"epoch\": 1, \"global_step\": 560324, \"phase\": \"conversation\", \"phase_step\": 0, \"pos\": [0, 0]}, \"index\": 34, \"kind\": \"transition\", \"model\": \"fa2903c63e2fedd52ff6e53cab2c16921f6dae52855700caf8f7d23358172b1e\", \"previous\": \"94eee8a739a2edf0bc158091e8bd9299b83e82021cba2679f4fcec0b86c36035\", \"state\": \"47e181e530d97201584906d931d1e5cfcd25ec000acfc6381c1162b102036b03\", \"time\": 1792478786.6568494}\n{\"control\": {\"batches\": \"5221cd468bc3661e4455cda6c9602d2ab155ea669e751927c77eb0a36c497023\", \"cursor\": 1278137, \"epoch\": 1, \"global_step\": 560471, \"phase\": \"conversation\", \"phase_step\": 147, \"pos\": [849666, 0]}, \"index\": 35, \"kind\": \"epoch\", \"model\": \"eb2d6225628c40d6b87bc5c2f95b4838ba58c3d9f1bd40c4def3464c40e3fbda\", \"previous\": \"65d9e7fac71a421b97b20c56fbb9d8997b543f09752763e53dabac4817950f5f\", \"state\": \"e80d5db69e77bbe5e7ffc7c829631aa1871c8fa5230b8eb53d85b4a226420ab2\", \"time\": 1792478796.331579}\n{\"control\": {\"batches\": \"5221cd468bc3661e4455cda6c9602d2ab155ea669e751927c77eb0a36c497023\", \"cursor\": 0, \"epoch\": 2, \"global_step\": 560471, \"phase\": \"conversation\", \"phase_step\": 0, \"pos\": [0, 0]}, \"index\": 36, \"kind\": \"transition\", \"model\": \"eb2d6225628c40d6b87bc5c2f95b4838ba58c3d9f1bd40c4def3464c40e3fbda\", \"previous\": \"8c20bd99e5408e6240a51d71cf099f73b1d47eea5c043e4a027dffb397361042\", \"state\": \"e80d5db69e77bbe5e7ffc7c829631aa1871c8fa5230b8eb53d85b4a226420ab2\", \"time\": 1792478797.354915}\n{\"control\": {\"batches\": \"1fd22db0ab89ab98045f8c4b32ce4e4d55453163390ec9ebd5792dfc38fd5a52\", \"cursor\": 1278137, \"epoch\": 2, \"global_step\": 560618, \"phase\": \"conversation\", \"phase_step\": 147, \"pos\": [849666, 0]}, \"index\": 37, \"kind\": \"final\", \"model\": \"ec9a2b31ca524613f791aba00f4f7f31e4a7bf4a8a921e0deb81c1a922d0958b\", \"previous\": \"68d517a10e2641b690149d430e9e47fd8e4c97bfb5ae33b81c25cb29492dedcb\", \"state\": \"934d681c99e5c3e10617e82dbbb0ae0ddd1ad4e32cf45e8e3a6d2ed94b69f200\", \"time\": 1792478807.0463226}", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/chain.jsonl#L1-L38", + "quote": null + }, + { + "origin": "github", + "file": "docs/design/simple_run.md", + "rev": "1049d2a7", + "lines": "29", + "text": "- **Segmented commitments.** A boundary every 18,080 updates, plus the phase boundaries: 38 entries", + "url": "https://github.com/AOSSIE-Org/OpenVerifiableLLM/blob/1049d2a782b8f63103abfa0cca8deab0d2037290/docs/design/simple_run.md#L29", + "quote": "38 entries" + } + ], + "TL-02": [ + { + "origin": "github", + "file": "docs/design/simple_run.md", + "rev": "1049d2a7", + "lines": "29", + "text": "- **Segmented commitments.** A boundary every 18,080 updates, plus the phase boundaries: 38 entries", + "url": "https://github.com/AOSSIE-Org/OpenVerifiableLLM/blob/1049d2a782b8f63103abfa0cca8deab0d2037290/docs/design/simple_run.md#L29", + "quote": "A boundary every 18,080 updates" + }, + { + "origin": "hf", + "file": "release/simple-run/chain.jsonl", + "rev": "96dc282a", + "lines": "32", + "text": "{\"control\": {\"batches\": \"dcad901881cb94e24e81efa96ff4282bcf4a23d1ad042fc85d0fe5444c2fc875\", \"cursor\": 7118121139, \"epoch\": 0, \"global_step\": 560177, \"phase\": \"wikipedia\", \"phase_step\": 560177, \"pos\": [1293950757, 0]}, \"index\": 31, \"kind\": \"base\", \"model\": \"31c8cd3a4972ffe5733ca19f614cb93c70c135ebc4ce1f053ca54a309b20a65f\", \"previous\": \"2f33f280a48f610d432e95d98fe14d12e81d77ea97d419f39964bb92119fec39\", \"state\": \"13d6ad64b2465d42653f250bba0463468c0c81b7980ebc9d97e3b0f95c713bf1\", \"time\": 1792478775.2381847}", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/chain.jsonl#L32", + "quote": null + }, + { + "origin": "hf", + "file": "release/simple-run/chain.jsonl", + "rev": "96dc282a", + "lines": "38", + "text": "{\"control\": {\"batches\": \"1fd22db0ab89ab98045f8c4b32ce4e4d55453163390ec9ebd5792dfc38fd5a52\", \"cursor\": 1278137, \"epoch\": 2, \"global_step\": 560618, \"phase\": \"conversation\", \"phase_step\": 147, \"pos\": [849666, 0]}, \"index\": 37, \"kind\": \"final\", \"model\": \"ec9a2b31ca524613f791aba00f4f7f31e4a7bf4a8a921e0deb81c1a922d0958b\", \"previous\": \"68d517a10e2641b690149d430e9e47fd8e4c97bfb5ae33b81c25cb29492dedcb\", \"state\": \"934d681c99e5c3e10617e82dbbb0ae0ddd1ad4e32cf45e8e3a6d2ed94b69f200\", \"time\": 1792478807.0463226}", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/chain.jsonl#L38", + "quote": null + } + ], + "TL-03": [ + { + "origin": "github", + "file": "docs/design/simple_run.md", + "rev": "1049d2a7", + "lines": "45", + "text": "| Training | 560,177 Wikipedia + 441 conversation updates (batch 32 × 512 tokens) |", + "url": "https://github.com/AOSSIE-Org/OpenVerifiableLLM/blob/1049d2a782b8f63103abfa0cca8deab0d2037290/docs/design/simple_run.md#L45", + "quote": "560,177 Wikipedia + 441 conversation updates" + } + ], + "TL-04": [ + { + "origin": "hf", + "file": "release/simple-run/README.md", + "rev": "96dc282a", + "lines": "133-134", + "text": "- The training host restarted once, at boundary 10. Training resumed from checkpoint 10, and\n segment 10 (which spans the restart) matched.", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/README.md#L133-L134", + "quote": "The training host restarted once, at boundary 10." + }, + { + "origin": "hf", + "file": "release/simple-run/chain.jsonl", + "rev": "96dc282a", + "lines": "11", + "text": "{\"control\": {\"batches\": \"14ffdd92074c743ba35ff842d9d2956a29ff1ecf6b93820fc1bedb2161e2f20f\", \"cursor\": 2534896708, \"epoch\": 0, \"global_step\": 180800, \"phase\": \"wikipedia\", \"phase_step\": 180800, \"pos\": [285958813, 5632]}, \"index\": 10, \"kind\": \"progress\", \"model\": \"cb2fbe49be6ead1201600d45004f411c7ed3ba0d532ebe2417b1a43ba40d9889\", \"previous\": \"e00e8ee29ee6ee131fa246a6ec1d787a2752857efb34b0d1f369db3e7a62bf43\", \"state\": \"e162c0ef79462cfcc2c88cd336170df12f92f1f6d099920decca178da9dd455a\", \"time\": 1792441925.2640333}", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/chain.jsonl#L11", + "quote": null + }, + { + "origin": "hf", + "file": "release/simple-run/chain.jsonl", + "rev": "96dc282a", + "lines": "12", + "text": "{\"control\": {\"batches\": \"7321c9e7f9b890c6b657525ffc10389c70e730b37f0ccaa0281264b7aaeec2ca\", \"cursor\": 2758953574, \"epoch\": 0, \"global_step\": 198880, \"phase\": \"wikipedia\", \"phase_step\": 198880, \"pos\": [331465519, 0]}, \"index\": 11, \"kind\": \"progress\", \"model\": \"21e5ccc4f7a7b4c8b311febbdcb0cd037a2efff64c715935853fa663b61e5aeb\", \"previous\": \"19b1091f16ffa0006a0853ed750d237a528a54e3dcc93101fee747134200803b\", \"state\": \"be21dd4e7d988157822d75f6600146be013afa826076b49b45b3874e5a2bd1ca\", \"time\": 1792445221.8958924}", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/chain.jsonl#L12", + "quote": null + }, + { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "lines": "11", + "text": "{\"checker\": \"project second pod\", \"code\": \"ovl.py 202ac6ce\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 10}", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L11", + "quote": null + } + ], + "TL-05": [ + { + "origin": "hf", + "file": "release/simple-run/README.md", + "rev": "96dc282a", + "lines": "127-132", + "text": "- Code versions: segments 0–18 were trained with `ovl.py` sha256 `202ac6ce…`\n (`code/training-code/ovl-segments-00-18.py`). Segments 19 onward used `c4a942c0…`\n (`code/training-code/ovl-segments-19-end.py`, identical to `code/simple/ovl.py`). The newer version\n only changes CPU-side batch preparation and the CPU thread count. Proof that it produces\n identical results: segments 19 onward were recomputed with the original batch loader and\n matched, and segment 5 (trained with the original code) was recomputed with the newer code and matched.", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/README.md#L127-L132", + "quote": "Segments 19 onward used `c4a942c0…`" + }, + { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "lines": "20-37", + "text": "{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 19}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 20}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 21}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 22}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 23}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 24}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 25}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 26}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 27}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 28}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 29}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 30}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 31}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 32}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 33}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 34}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 35}\n{\"checker\": \"project second pod\", \"code\": \"ovl.py c4a942c0 reference loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 36}", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L20-L37", + "quote": null + }, + { + "origin": "hf", + "file": "release/simple-run/verifications.jsonl", + "rev": "96dc282a", + "lines": "45", + "text": "{\"checker\": \"project training pod\", \"code\": \"ovl.py c4a942c0 fast loader\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 5}", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/verifications.jsonl#L45", + "quote": null + } + ], + "TL-06": [ + { + "origin": "github", + "file": "docs/design/simple_run.md", + "rev": "1049d2a7", + "lines": "103", + "text": "| 19 Oct 15:04 | Training starts on one RTX 5090. A second RTX 5090 mirrors every checkpoint off the training machine and recomputes each segment as it closes |", + "url": "https://github.com/AOSSIE-Org/OpenVerifiableLLM/blob/1049d2a782b8f63103abfa0cca8deab0d2037290/docs/design/simple_run.md#L103", + "quote": "19 Oct 15:04" + }, + { + "origin": "github", + "file": "docs/design/simple_run.md", + "rev": "1049d2a7", + "lines": "106", + "text": "| 20 Oct 06:46 | Wikipedia pass and conversation phase finished (15.7 hours in total) |", + "url": "https://github.com/AOSSIE-Org/OpenVerifiableLLM/blob/1049d2a782b8f63103abfa0cca8deab0d2037290/docs/design/simple_run.md#L106", + "quote": "20 Oct 06:46" + }, + { + "origin": "hf", + "file": "release/simple-run/chain.jsonl", + "rev": "96dc282a", + "lines": "1", + "text": "{\"control\": {\"batches\": \"10ea13010a13668c8bf9e2884e16bdbd16f8933d9bf4d09eda0c47459133eddb\", \"cursor\": 0, \"epoch\": 0, \"global_step\": 0, \"phase\": \"wikipedia\", \"phase_step\": 0, \"pos\": [0, 0]}, \"data\": {\"conversation\": \"e179de793decc82e8cecfbfabd7d449d1caf145a988c4c881a9a041dcda36b7f\", \"wikipedia\": \"a49baead333842ac36669a62a752ea6204295e4012a6bfa2d8f2b8c85981d832\"}, \"environment\": {\"cublas_workspace\": \":4096:8\", \"cuda\": \"12.8\", \"cudnn\": 91002, \"gpu\": \"NVIDIA GeForce RTX 5090\", \"torch\": \"2.8.0+cu128\"}, \"index\": 0, \"kind\": \"initial\", \"model\": \"2b167bcb407f94ac3f1dead8f316ea180823a1cb40489b8a1ff974bf2bcd959d\", \"previous\": null, \"recipe\": \"d0d9fc61c46b0f0e0b63e336579e7443860141452d881b1e7297ad46439f9fc5\", \"state\": \"64041a4736bd76b64b149c2a784950a312fb19ed641c7eb87e7300c171d002fc\", \"time\": 1792422250.861772}", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/chain.jsonl#L1", + "quote": null + }, + { + "origin": "hf", + "file": "release/simple-run/chain.jsonl", + "rev": "96dc282a", + "lines": "38", + "text": "{\"control\": {\"batches\": \"1fd22db0ab89ab98045f8c4b32ce4e4d55453163390ec9ebd5792dfc38fd5a52\", \"cursor\": 1278137, \"epoch\": 2, \"global_step\": 560618, \"phase\": \"conversation\", \"phase_step\": 147, \"pos\": [849666, 0]}, \"index\": 37, \"kind\": \"final\", \"model\": \"ec9a2b31ca524613f791aba00f4f7f31e4a7bf4a8a921e0deb81c1a922d0958b\", \"previous\": \"68d517a10e2641b690149d430e9e47fd8e4c97bfb5ae33b81c25cb29492dedcb\", \"state\": \"934d681c99e5c3e10617e82dbbb0ae0ddd1ad4e32cf45e8e3a6d2ed94b69f200\", \"time\": 1792478807.0463226}", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/chain.jsonl#L38", + "quote": null + } + ], + "TL-07": [ + { + "origin": "hf", + "file": "release/simple-run/README.md", + "rev": "96dc282a", + "lines": "40-41", + "text": "Wikipedia segments plus 6 for the conversation phase, recomputed on a second RTX 5090 with a\ndifferent NVIDIA driver from training (595.91.07 vs 570.195.03 for segments 0-9). Segment 21 was", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/README.md#L40-L41", + "quote": "(595.91.07 vs 570.195.03 for segments 0-9)" + } + ], + "EX-01": [ + { + "origin": "hf", + "file": "release/unlearning-3i-atlas/README.md", + "rev": "96dc282a", + "lines": "4-5", + "text": "except that one Wikipedia article was never trained on: **3I/ATLAS** (the interstellar comet;\npage 80340464, revision 1371028825, 10,395 training targets). Every step can be checked, so the", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/README.md#L4-L5", + "quote": "page 80340464, revision 1371028825, 10,395 training targets" + }, + { + "origin": "hf", + "file": "release/unlearning-3i-atlas/README.md", + "rev": "96dc282a", + "lines": "11-12", + "text": " 0–30 of `release/simple-run/chain.jsonl`. The article's first training target (6,915,731,634)\n comes after the cursor at boundary 30 (6,901,668,826), so no checkpoint up to 30 ever trained", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/README.md#L11-L12", + "quote": "(6,915,731,634)" + }, + { + "origin": "hf", + "file": "release/simple-run/chain.jsonl", + "rev": "96dc282a", + "lines": "31", + "text": "{\"control\": {\"batches\": \"304b2d3afe5a67a5ef902cb8334a55ee6f89877d474b438fb9c94e507814dece\", \"cursor\": 6901668826, \"epoch\": 0, \"global_step\": 542400, \"phase\": \"wikipedia\", \"phase_step\": 542400, \"pos\": [1246875101, 0]}, \"index\": 30, \"kind\": \"progress\", \"model\": \"bdfa54d7eb2938c8fe3258528e5cb84287c54f889471eb60909e7d8c6aca8061\", \"previous\": \"e24b7d97bcd3f1d31bccc299bde66247d0c84ffd0ebeb2c942a770ab2345908b\", \"state\": \"baf0f2694f6f7561b6e427c0181978541c19263849163984131f51dad72b6c38\", \"time\": 1792477651.6187513}", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/chain.jsonl#L31", + "quote": null + } + ], + "EX-02": [ + { + "origin": "hf", + "file": "release/unlearning-3i-atlas/README.md", + "rev": "96dc282a", + "lines": "10-11", + "text": "1. **Shared history, byte for byte.** Entries 0–30 of this `chain.jsonl` are identical to entries\n 0–30 of `release/simple-run/chain.jsonl`. The article's first training target (6,915,731,634)", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/README.md#L10-L11", + "quote": "Entries 0–30 of this `chain.jsonl` are identical to entries" + } + ], + "EX-03": [ + { + "origin": "hf", + "file": "release/unlearning-3i-atlas/README.md", + "rev": "96dc282a", + "lines": "14-16", + "text": "2. **A recorded fork.** Entry 31 (kind `fork`) has exactly the state of entry 30. Its control adds\n `exclude: {\"wikipedia\": [[6915731634, 10395]]}`, the article's exact target range. `verify`\n checks that a fork entry changes nothing except declaring the exclusion, and that the excluded", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/README.md#L14-L16", + "quote": "Entry 31 (kind `fork`) has exactly the state of entry 30." + } + ], + "EX-04": [ + { + "origin": "hf", + "file": "release/unlearning-3i-atlas/README.md", + "rev": "96dc282a", + "lines": "19-21", + "text": " never used as inputs or targets, because windows never cross documents. The per-step coverage\n check accepts a gap in target ids **only** at the recorded range, so any other missing or\n repeated data would stop training.", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/README.md#L19-L21", + "quote": "accepts a gap in target ids **only** at the recorded range" + } + ], + "EX-05": [ + { + "origin": "hf", + "file": "release/unlearning-3i-atlas/verifications.jsonl", + "rev": "96dc282a", + "lines": "1-10", + "text": "{\"checker\": \"project fork pod\", \"code\": \"ovl.py fork-capable (code/simple/ovl.py)\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 30}\n{\"checker\": \"project fork pod\", \"code\": \"ovl.py fork-capable (code/simple/ovl.py)\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 31}\n{\"checker\": \"project fork pod\", \"code\": \"ovl.py fork-capable (code/simple/ovl.py)\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 32}\n{\"checker\": \"project fork pod\", \"code\": \"ovl.py fork-capable (code/simple/ovl.py)\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 33}\n{\"checker\": \"project fork pod\", \"code\": \"ovl.py fork-capable (code/simple/ovl.py)\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 34}\n{\"checker\": \"project fork pod\", \"code\": \"ovl.py fork-capable (code/simple/ovl.py)\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 35}\n{\"checker\": \"project fork pod\", \"code\": \"ovl.py fork-capable (code/simple/ovl.py)\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 36}\n{\"checker\": \"project fork pod\", \"code\": \"ovl.py fork-capable (code/simple/ovl.py)\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 37}\n{\"checker\": \"project fresh machine public files only\", \"code\": \"code/simple/ovl.py from this release\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 30}\n{\"checker\": \"project fresh machine public files only\", \"code\": \"code/simple/ovl.py from this release\", \"driver\": \"595.91.07\", \"gpu\": \"NVIDIA GeForce RTX 5090\", \"result\": \"MATCH\", \"segment\": 31}", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/verifications.jsonl#L1-L10", + "quote": null + }, + { + "origin": "hf", + "file": "release/unlearning-3i-atlas/README.md", + "rev": "96dc282a", + "lines": "22-27", + "text": "4. **Checked.** Every fork segment (30→31 through 37→38) was recomputed from its starting\n checkpoint and matched bit for bit, including the retrained last Wikipedia segment and the\n whole conversation phase. The fork's `conversation-model.pt` matches its final entry. See\n `verifications.jsonl`. They ran on the pod that trained the fork. The fork entry and the\n retrained Wikipedia segment (30→31, 31→32) were also recomputed on a separate, fresh RTX 5090\n using only the public files: MATCH. Anyone can repeat them (below).", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/README.md#L22-L27", + "quote": "Every fork segment (30→31 through 37→38)" + } + ], + "EX-06": [ + { + "origin": "hf", + "file": "release/unlearning-3i-atlas/README.md", + "rev": "96dc282a", + "lines": "33", + "text": "| Loss on the 3I/ATLAS article's own text | 3.3604 | 3.3860 (+0.0256) |", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/README.md#L33", + "quote": null + }, + { + "origin": "hf", + "file": "release/unlearning-3i-atlas/loo-results.json", + "rev": "96dc282a", + "lines": "12-14", + "text": " 3.3604\n ],\n \"control_loss_mean\": 2.871,", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/loo-results.json#L12-L14", + "quote": null + } + ], + "EX-07": [ + { + "origin": "hf", + "file": "release/unlearning-3i-atlas/README.md", + "rev": "96dc282a", + "lines": "34", + "text": "| Mean loss on 50 control articles from the same segment (both trained on them) | 2.8710 | 2.8712 (+0.0002) |", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/README.md#L34", + "quote": null + }, + { + "origin": "hf", + "file": "release/unlearning-3i-atlas/loo-results.json", + "rev": "96dc282a", + "lines": "9", + "text": " \"control_documents\": 50,", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/loo-results.json#L9", + "quote": "\"control_documents\": 50" + } + ], + "EX-08": [ + { + "origin": "github", + "file": "docs/design/simple_run.md", + "rev": "1049d2a7", + "lines": "76-78", + "text": null, + "url": "https://github.com/AOSSIE-Org/OpenVerifiableLLM/blob/1049d2a782b8f63103abfa0cca8deab0d2037290/docs/design/simple_run.md#L76-L78", + "quote": "It is exact retraining without a range the run hadn't reached", + "withheld": [ + "unlearning", + "unlearn" + ] + } + ], + "EX-09": [ + { + "origin": "brief", + "file": "project brief v3", + "rev": "v3-2026-10-29", + "lines": "66", + "text": null, + "url": null, + "quote": "Text the run had already seen means retraining from an earlier save point." + } + ], + "EX-10": [ + { + "origin": "github", + "file": "docs/design/simple_run.md", + "rev": "1049d2a7", + "lines": "76", + "text": "(+0.0002). One run, no variance estimate. This proves the fork never trained on the article. It", + "url": "https://github.com/AOSSIE-Org/OpenVerifiableLLM/blob/1049d2a782b8f63103abfa0cca8deab0d2037290/docs/design/simple_run.md#L76", + "quote": "One run, no variance estimate." + } + ], + "DL-conversation-model.pt": [ + { + "origin": "hf", + "file": "release/simple-run/release-hashes.txt", + "rev": "96dc282a", + "lines": "41", + "text": "149cfae13c4523a1010c52161e13babf76c9ddc01f34fa1a8b580677b733a64c conversation-model.pt", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/release-hashes.txt#L41", + "quote": "149cfae13c4523a1010c52161e13babf76c9ddc01f34fa1a8b580677b733a64c" + } + ], + "DL-base-model.pt": [ + { + "origin": "hf", + "file": "release/simple-run/release-hashes.txt", + "rev": "96dc282a", + "lines": "1", + "text": "976c62e8b28db786c38dc2ff969339603d0ee917d830f2815d9e858d2a3c0ce3 base-model.pt", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/release-hashes.txt#L1", + "quote": "976c62e8b28db786c38dc2ff969339603d0ee917d830f2815d9e858d2a3c0ce3" + } + ], + "DL-chain.jsonl": [ + { + "origin": "hf", + "file": "release/simple-run/release-hashes.txt", + "rev": "96dc282a", + "lines": "2", + "text": "c1f867e16d0660c611186183863cc5626e3510b046d52e617c3953beb8f8a327 chain.jsonl", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/release-hashes.txt#L2", + "quote": "c1f867e16d0660c611186183863cc5626e3510b046d52e617c3953beb8f8a327" + } + ], + "DL-recipe.json": [ + { + "origin": "hf", + "file": "release/simple-run/release-hashes.txt", + "rev": "96dc282a", + "lines": "42", + "text": "28a2fb407a5582ae95c9e9b0bba2c14df946e87bba037800399c6059256b6e6d recipe.json", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/release-hashes.txt#L42", + "quote": "28a2fb407a5582ae95c9e9b0bba2c14df946e87bba037800399c6059256b6e6d" + } + ], + "DL-fork-conversation-model.pt": [ + { + "origin": "hf", + "file": "release/unlearning-3i-atlas/release-hashes.txt", + "rev": "96dc282a", + "lines": "12", + "text": "e41be3a27bbcf16ce7a5224eb4766e88b2abe09fe6ddb6aadea399b9db4472d4 conversation-model.pt", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/release-hashes.txt#L12", + "quote": "e41be3a27bbcf16ce7a5224eb4766e88b2abe09fe6ddb6aadea399b9db4472d4" + } + ], + "DL-fork-base-model.pt": [ + { + "origin": "hf", + "file": "release/unlearning-3i-atlas/release-hashes.txt", + "rev": "96dc282a", + "lines": "1", + "text": "ff30d7f4bf9ec41f0514d63a4d8bc1a74172481b89e07608383c0c3513f83441 base-model.pt", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/unlearning-3i-atlas/release-hashes.txt#L1", + "quote": "ff30d7f4bf9ec41f0514d63a4d8bc1a74172481b89e07608383c0c3513f83441" + } + ], + "DL-gguf": [ + { + "origin": "github-release", + "file": "GitHub release v1.0.1", + "rev": "v1.0.1", + "lines": "ovl-23m-chat.gguf", + "text": "{\n \"name\": \"ovl-23m-chat.gguf\",\n \"size\": 142815808,\n \"digest\": \"sha256:541d49c97b87cd4ed0acb90b4327535ee20b8c11c452e2583d460154e9d980de\",\n \"browser_download_url\": \"https://github.com/AOSSIE-Org/OpenVerifiableLLM/releases/download/v1.0.1/ovl-23m-chat.gguf\"\n}", + "url": "https://github.com/AOSSIE-Org/OpenVerifiableLLM/releases/tag/v1.0.1", + "quote": "sha256:541d49c97b87cd4ed0acb90b4327535ee20b8c11c452e2583d460154e9d980de" + }, + { + "origin": "github", + "file": "docs/guides/ollama.md", + "rev": "1049d2a7", + "lines": "23", + "text": "`541d49c97b87cd4ed0acb90b4327535ee20b8c11c452e2583d460154e9d980de`. Running", + "url": "https://github.com/AOSSIE-Org/OpenVerifiableLLM/blob/1049d2a782b8f63103abfa0cca8deab0d2037290/docs/guides/ollama.md#L23", + "quote": "541d49c97b87cd4ed0acb90b4327535ee20b8c11c452e2583d460154e9d980de" + } + ], + "DL-modelfile": [ + { + "origin": "github-release", + "file": "GitHub release v1.0.1", + "rev": "v1.0.1", + "lines": "Modelfile", + "text": "{\n \"name\": \"Modelfile\",\n \"size\": 722,\n \"digest\": \"sha256:df4dacfc3191e56b1dc1195764ea66ca1a7695856be04ecec17d8dde4c66fc8b\",\n \"browser_download_url\": \"https://github.com/AOSSIE-Org/OpenVerifiableLLM/releases/download/v1.0.1/Modelfile\"\n}", + "url": "https://github.com/AOSSIE-Org/OpenVerifiableLLM/releases/tag/v1.0.1", + "quote": "sha256:df4dacfc3191e56b1dc1195764ea66ca1a7695856be04ecec17d8dde4c66fc8b" + } + ], + "DL-hf": [ + { + "origin": "brief", + "file": "project brief v3", + "rev": "v3-2026-10-29", + "lines": "15", + "text": null, + "url": null, + "quote": "Pin to revision `96dc282a`." + } + ], + "DL-ollama": [ + { + "origin": "github", + "file": "docs/guides/ollama.md", + "rev": "1049d2a7", + "lines": "12-13", + "text": "The model is on the Ollama registry as\n[`ryoari/openverifiablellm`](https://ollama.com/ryoari/openverifiablellm):", + "url": "https://github.com/AOSSIE-Org/OpenVerifiableLLM/blob/1049d2a782b8f63103abfa0cca8deab0d2037290/docs/guides/ollama.md#L12-L13", + "quote": "ryoari/openverifiablellm" + } + ], + "LI-01": [ + { + "origin": "hf", + "file": "release/simple-run/README.md", + "rev": "96dc282a", + "lines": "138-139", + "text": "- This is a small model. It writes fluent fragments in an encyclopedia style. It often states\n wrong facts and has only basic conversation ability.", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/README.md#L138-L139", + "quote": "It often states" + } + ], + "LI-02": [ + { + "origin": "hf", + "file": "release/simple-run/README.md", + "rev": "96dc282a", + "lines": "81", + "text": "Checkers therefore need an RTX 5090. Anyone can rerun the probe with", + "url": "https://huggingface.co/datasets/AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence/blob/96dc282a9803616c6b30bb31bfc3a0b91a7191e6/release/simple-run/README.md#L81", + "quote": "Checkers therefore need an RTX 5090." + } + ], + "LI-03": [ + { + "origin": "github", + "file": "README.md", + "rev": "1049d2a7", + "lines": "118-119", + "text": "- All checks so far were run by the project, on separate machines. **We need independent\n checkers**: see [Join us](#join-us). Catching one forged segment out of 37 with 95% probability", + "url": "https://github.com/AOSSIE-Org/OpenVerifiableLLM/blob/1049d2a782b8f63103abfa0cca8deab0d2037290/README.md#L118-L119", + "quote": "We need independent" + } + ], + "LI-04": [ + { + "origin": "github", + "file": "README.md", + "rev": "1049d2a7", + "lines": "121", + "text": "- Check results are self-reported text lines. They aren't signed, and nothing proves a checker", + "url": "https://github.com/AOSSIE-Org/OpenVerifiableLLM/blob/1049d2a782b8f63103abfa0cca8deab0d2037290/README.md#L121", + "quote": "Check results are self-reported text lines." + } + ], + "LI-05": [ + { + "origin": "github", + "file": "README.md", + "rev": "1049d2a7", + "lines": "123", + "text": "- The timestamp proves the record existed by 20 Oct 2026, not how the training was done", + "url": "https://github.com/AOSSIE-Org/OpenVerifiableLLM/blob/1049d2a782b8f63103abfa0cca8deab0d2037290/README.md#L123", + "quote": "The timestamp proves the record existed by 20 Oct 2026, not how the training was done" + } + ], + "LI-06": [ + { + "origin": "github", + "file": "docs/design/simple_run.md", + "rev": "1049d2a7", + "lines": "204", + "text": "- **Cost.** A full check costs as much compute as the training (the table above), and each", + "url": "https://github.com/AOSSIE-Org/OpenVerifiableLLM/blob/1049d2a782b8f63103abfa0cca8deab0d2037290/docs/design/simple_run.md#L204", + "quote": "A full check costs as much compute as the training" + } + ] + }, + "claimExtraSources": { + "OV-01": 1, + "OV-02": 1, + "OV-03": 3, + "OV-04": 1, + "OV-07": 1, + "OV-08": 1, + "OV-09": 2, + "OV-10": 1, + "OV-11": 1, + "OV-12": 1, + "OV-13": 2, + "CK-01": 1, + "CK-02": 1, + "CK-04": 1, + "CK-05": 1, + "CK-06": 2, + "VE-01": 1, + "VE-04": 1, + "VE-07": 1, + "VE-09": 2, + "VE-11": 1, + "TL-01": 1, + "TL-02": 2, + "TL-04": 3, + "TL-05": 2, + "TL-06": 3, + "EX-01": 2, + "EX-05": 1, + "EX-06": 1, + "EX-07": 1, + "DL-gguf": 1 + } +} diff --git a/frontend/scripts/build-data.py b/frontend/scripts/build-data.py new file mode 100644 index 00000000..fcb6372e --- /dev/null +++ b/frontend/scripts/build-data.py @@ -0,0 +1,378 @@ +#!/usr/bin/env python3 +"""Build public/data/site-data.json from pinned files only. + +Inputs: + data/raw/** HF dataset files at the pinned revision (scripts/fetch-evidence.py) + data/upstream//** two GitHub docs copied verbatim from AOSSIE-Org/OpenVerifiableLLM at UPSTREAM +Every value that the site shows carries a `src` {file, rev, line, raw, url, checkedBy}. +`--check` rebuilds in memory and exits 1 if public/data/site-data.json differs (drift). +""" +import datetime, hashlib, json, math, os, re, subprocess, sys + +ROOT = os.path.normpath(os.path.join(os.path.dirname(os.path.abspath(__file__)), "..")) +RAW = os.path.join(ROOT, "data", "raw") +UPSTREAM = "1049d2a782b8f63103abfa0cca8deab0d2037290" +UP = os.path.join(ROOT, "data", "upstream", UPSTREAM[:8]) +GH = "https://github.com/AOSSIE-Org/OpenVerifiableLLM" +OUT = os.path.join(ROOT, "public", "data", "site-data.json") + +man = json.load(open(os.path.join(RAW, "manifest.json"))) +REV = man["revision"] +SR, EX = "release/simple-run", "release/unlearning-3i-atlas" + + +def fail(msg): + sys.exit(f"build-data: {msg}") + + +def read(p): + b = open(os.path.join(RAW, p), "rb").read() + want = man["files"][p]["sha256"] + if hashlib.sha256(b).hexdigest() != want: + fail(f"{p} does not match manifest sha256 (pinned file changed)") + return b + + +def lines(p): + return read(p).decode().splitlines() + + +def jl(p): + return [(i + 1, l, json.loads(l)) for i, l in enumerate(lines(p)) if l.strip()] + + +def src(p, line=None, raw=None, checked_by=None, line_end=None): + url = f"https://huggingface.co/datasets/{man['repo']}/blob/{REV}/{p}" + if line: + url += f"#L{line}" + (f"-L{line_end}" if line_end else "") + return {"origin": "hf", "file": p, "rev": REV[:8], "line": line, "lineEnd": line_end, + "raw": raw, "checkedBy": checked_by, "url": url} + + +def gh_src(p, line, line_end=None, raw=None): + url = f"{GH}/blob/{UPSTREAM}/{p}#L{line}" + (f"-L{line_end}" if line_end else "") + return {"origin": "github", "file": p, "rev": UPSTREAM[:8], "line": line, "lineEnd": line_end, + "raw": raw, "checkedBy": None, "url": url} + + +def find_line(text_lines, pattern, what): + rx = re.compile(pattern) + for i, l in enumerate(text_lines): + m = rx.search(l) + if m: + return i + 1, l, m + fail(f"could not find {what} ({pattern})") + + +def who(checker): + return "project" if checker.startswith("project") else "independent" + + +def machine(checker): + # "project second pod" -> "second pod"; keeps the recorded wording, only drops the owner word + return checker.split(" ", 1)[1] if checker.startswith("project ") else checker + + +def iso(t): + return datetime.datetime.fromtimestamp(t, datetime.timezone.utc) + + +def utc(t): + return iso(t).isoformat().replace("+00:00", "Z") + + +# ---------- chain ---------- +chain = jl(f"{SR}/chain.jsonl") +boundaries = [{"index": c["index"], "kind": c["kind"], "phase": c["control"]["phase"], + "time": c["time"], "utc": utc(c["time"]), "model": c["model"], "state": c["state"], "previous": c["previous"], + "src": src(f"{SR}/chain.jsonl", n, l, "project")} for n, l, c in chain] +N = len(boundaries) - 1 +phases = [] +for b in boundaries[1:]: + if not phases or phases[-1]["phase"] != b["phase"]: + phases.append({"phase": b["phase"], "first": b["index"] - 1, "last": b["index"] - 1}) + else: + phases[-1]["last"] = b["index"] - 1 +gaps = [{"segment": i, "seconds": round((iso(boundaries[i + 1]["time"]) - iso(boundaries[i]["time"])).total_seconds())} + for i in range(N)] + +# ---------- verifications ---------- +ver = jl(f"{SR}/verifications.jsonl") +rows = [{"segment": v["segment"], "result": v["result"], "checker": v["checker"], "machine": machine(v["checker"]), + "checkedBy": who(v["checker"]), "code": v.get("code"), "gpu": v.get("gpu"), "driver": v.get("driver"), + "src": src(f"{SR}/verifications.jsonl", n, l, who(v["checker"]))} for n, l, v in ver] +groups = [] +for r in rows: + g = next((g for g in groups if g["checker"] == r["checker"]), None) + if not g: + g = {"checker": r["checker"], "machine": r["machine"], "checkedBy": r["checkedBy"], "rows": 0, "match": 0, "segments": []} + groups.append(g) + g["rows"] += 1 + g["match"] += r["result"] == "MATCH" + if r["segment"] not in g["segments"]: + g["segments"].append(r["segment"]) +groups.sort(key=lambda g: -g["rows"]) +second = next(g for g in groups if "second" in g["checker"]) +fresh = next(g for g in groups if "fresh" in g["checker"]) + +# ---------- events (derived, then cross-checked) ---------- +readme = lines(f"{SR}/README.md") +ln, raw, m = find_line(readme, r"restarted once, at boundary (\d+)", "restart") +restart_seg = int(m.group(1)) +raw2 = readme[ln] # continuation line (the sentence wraps) +big_gap = max(gaps, key=lambda g: g["seconds"]) +if big_gap["segment"] != restart_seg: + fail(f"restart at {restart_seg} in README but longest chain gap is segment {big_gap['segment']}") +second_rows = sorted([r for r in rows if r["checker"] == second["checker"]], key=lambda r: r["segment"]) +changes = [(a, b) for a, b in zip(second_rows, second_rows[1:]) if a["code"] != b["code"]] +if len(changes) != 1: + fail(f"expected one code change in second-machine rows, found {len(changes)}") +before, after = changes[0] +cl, craw, _ = find_line(readme, r"Segments \d+ onward used", "code change") +# median wall time of the regular segments (those ending at a "progress" entry), as the ledger states it +prog = [(iso(boundaries[i + 1]["time"]) - iso(boundaries[i]["time"])).total_seconds() for i in range(N) if boundaries[i + 1]["kind"] == "progress"] +prog.sort() +typical = round((prog[len(prog) // 2 - 1] + prog[len(prog) // 2]) / 2 if len(prog) % 2 == 0 else prog[len(prog) // 2]) +events = [ + {"id": "restart", "segment": restart_seg, "gapSeconds": big_gap["seconds"], "medianGapSeconds": typical, + "src": src(f"{SR}/README.md", ln, raw + "\n" + raw2, "project", ln + 1)}, + {"id": "code-change", "segment": after["segment"], "codeBefore": before["code"], "codeAfter": after["code"], + "src": src(f"{SR}/README.md", cl - 1, readme[cl - 2] + "\n" + craw, "project", cl), + "rowBefore": before["src"], "rowAfter": after["src"]}, +] + +tiles = [] +for k in range(N): + checks = [i for i, r in enumerate(rows) if r["segment"] == k] + res = [rows[i]["result"] for i in checks] + tiles.append({"segment": k, "phase": boundaries[k + 1]["phase"], + "result": "NOT_RUN" if not res else ("MATCH" if all(x == "MATCH" for x in res) else "MISMATCH"), + "checkedBy": "independent" if any(rows[i]["checkedBy"] == "independent" for i in checks) else ("project" if checks else "pending"), + "checks": checks, "events": [e["id"] for e in events if e["segment"] == k]}) + +indep = sum(1 for r in rows if r["checkedBy"] == "independent") + + +def p_detect(m): + return 1 - ((N - 1) / N) ** m + + +def needed(p): + return math.ceil(math.log(1 - p) / math.log((N - 1) / N)) + + +m95, m99 = needed(0.95), needed(0.99) +hl, hraw, _ = find_line(readme, r"1 − \(\(N−1\)/N\)\^M", "odds formula") + +# ---------- hardware ---------- +hw = [{"segment": str(h["segment"]), "result": h["result"], "hardware": h["hardware"], "driver": h["driver"], + "software": h["software"], "note": h["note"], "src": src(f"{SR}/hardware-map.jsonl", n, l, "project")} + for n, l, h in jl(f"{SR}/hardware-map.jsonl")] + + +def hashes(folder): + out = [] + for i, l in enumerate(lines(f"{folder}/release-hashes.txt")): + if not l.strip(): + continue + sha, name = l.split(None, 1) + name = name.strip().lstrip("*") + out.append({"file": name, "sha256": sha, "download": f"https://huggingface.co/datasets/{man['repo']}/resolve/{REV}/{folder}/{name}", + "src": src(f"{folder}/release-hashes.txt", i + 1, l)}) + return out + + +# ---------- anchor ---------- +anchor_raw = read(f"{SR}/anchor.json") +anchor = json.loads(anchor_raw) +tsa = [] +for name in ("digicert", "freetsa"): + read(f"{SR}/anchor.{name}.tsr") + t = subprocess.run(["openssl", "ts", "-reply", "-in", os.path.join(RAW, SR, f"anchor.{name}.tsr"), "-text"], + capture_output=True, text=True, check=True).stdout + ts = next(l.split(":", 1)[1].strip() for l in t.splitlines() if l.startswith("Time stamp:")) + imprint = "".join(t.split("Message data:")[1].split("Nonce")[0].split()) if "Message data:" in t else "" + when = datetime.datetime.strptime(ts.replace(" GMT", ""), "%b %d %H:%M:%S %Y").replace(tzinfo=datetime.timezone.utc) + tsa.append({"authority": name, "genTime": when.isoformat().replace("+00:00", "Z"), + "src": src(f"{SR}/anchor.{name}.tsr", raw=f"Time stamp: {ts}", checked_by="project")}) + +# ---------- exclusion ---------- +ex_chain = jl(f"{EX}/chain.jsonl") +shared = 0 +for a, b in zip(chain, ex_chain): + if a[1] != b[1]: + break + shared += 1 +fork_entry = next(c for _, _, c in ex_chain if c["kind"] == "fork") +ex_rows = [{"segment": v["segment"], "result": v["result"], "checker": v["checker"], "machine": machine(v["checker"]), + "checkedBy": who(v["checker"]), "src": src(f"{EX}/verifications.jsonl", n, l, who(v["checker"]))} + for n, l, v in jl(f"{EX}/verifications.jsonl")] +loo_raw = read(f"{EX}/loo-results.json") +loo = json.loads(loo_raw) +exr = lines(f"{EX}/README.md") +tl, traw, tm = find_line(exr, r"\*\*(.+?)\*\* \(the interstellar comet;", "excluded title") +pl, praw, pm = find_line(exr, r"page (\d+), revision (\d+)", "page id") +if pm.group(1) != loo["removed_documents"][0][1]: + fail("README page id != loo-results removed document") +ex_groups = {} +for r in ex_rows: + ex_groups.setdefault(r["checker"], {"checker": r["checker"], "machine": r["machine"], "checkedBy": r["checkedBy"], "rows": 0, "segments": []}) + ex_groups[r["checker"]]["rows"] += 1 + ex_groups[r["checker"]]["segments"].append(r["segment"]) +r4 = lambda x: round(x, 4) + +# ---------- preparation ---------- +prep_dir = next(p for p in man["files"] if p.startswith("prepared/")) +prep_raw = read(prep_dir) +prep = json.loads(prep_raw) +prep_sha = hashlib.sha256(prep_raw).hexdigest() +if prep_sha != prep_dir.split("/")[1]: + fail("preparation.json sha256 != its folder id") + +# ---------- model facts (HF README) ---------- +ml, mraw, mm = find_line(readme, r"A (\d+)-million-parameter", "model size") +dl, draw, dm = find_line(readme, r"(\d{4}-\d{2}-\d{2}) (?:dump|English)", "dump date") if any(re.search(r"\d{4}-\d{2}-\d{2} (?:dump|English)", l) for l in readme) else (None, None, None) + +# ---------- upstream GitHub docs (verbatim copies at UPSTREAM) ---------- +up_readme = open(os.path.join(UP, "README.md")).read().splitlines() +gs, _, _ = find_line(up_readme, r"^## Getting started", "Getting started") +start = next(i for i in range(gs, len(up_readme)) if up_readme[i].startswith("```bash")) +end = next(i for i in range(start + 1, len(up_readme)) if up_readme[i].startswith("```")) +cmd_lines = up_readme[start + 1:end] +intro_end = start # prose between heading and code block +intro = " ".join(l.strip() for l in up_readme[gs:intro_end] if l.strip()) +rl, rraw, rm = find_line(up_readme, r"\((https://console\.runpod\.io/deploy\?template=[a-z0-9]+)\)", "runpod link") +sr = open(os.path.join(UP, "docs/design/simple_run.md")).read().splitlines() +cl2, craw2, cm2 = find_line(sr, r"about an hour, (about US\$[0-9.]+–[0-9.]+) rented", "cost") +if cl2 != 85: + fail(f"cost moved: simple_run.md line {cl2}, brief cites line 85") + +data = { + "schema": "ovl-site-data.v2", + "dataset": man["repo"], "revision": REV, "revShort": REV[:8], + "hfTree": f"https://huggingface.co/datasets/{man['repo']}/tree/{REV}", + "upstream": {"repo": GH, "commit": UPSTREAM, "short": UPSTREAM[:8]}, + "rawFiles": {k: {"sha256": v["sha256"], "bytes": v["bytes"]} for k, v in man["files"].items()}, + "model": {"millionParameters": int(mm.group(1)), "src": src(f"{SR}/README.md", ml, mraw, None), + "recipe": {"layers": json.loads(read(f"{SR}/recipe.json"))["model"]["num_layers"], + "seed": json.loads(read(f"{SR}/recipe.json"))["seed"]}}, + "chain": {"entries": len(boundaries), "segments": N, "phases": phases, "boundaries": boundaries, + "start": utc(boundaries[0]["time"]), "end": utc(boundaries[-1]["time"]), + "kinds": {k: sum(1 for b in boundaries if b["kind"] == k) for k in sorted({b["kind"] for b in boundaries})}}, + "verifications": { + "rows": rows, "rowCount": len(rows), "groups": groups, "tiles": tiles, + "machines": len(groups), "allMatch": all(r["result"] == "MATCH" for r in rows), + "segmentsMatched": sum(1 for t in tiles if t["result"] == "MATCH"), + "secondMachineMatched": len({r["segment"] for r in rows if r["checker"] == second["checker"] and r["result"] == "MATCH"}), + "secondMachine": second["checker"], "freshMachine": fresh["checker"], + "freshSegments": fresh["segments"], + "projectChecks": sum(1 for r in rows if r["checkedBy"] == "project"), + "independentChecks": indep, + "src": src(f"{SR}/verifications.jsonl", 1, None, "project", len(rows))}, + "odds": {"N": N, "Nm1": N - 1, "formula": f"1 − ({N - 1}/{N})^M", "m95": m95, "m99": m99, "p95": p_detect(m95), "p99": p_detect(m99), + "pAtN": p_detect(N), "currentM": indep, "currentP": p_detect(indep), + "src": src(f"{SR}/README.md", hl, hraw, None)}, + "events": events, + "hardware": hw, + "downloads": [{"release": SR, "files": hashes(SR)}, {"release": EX, "files": hashes(EX)}], + "anchor": {"sha256": hashlib.sha256(anchor_raw).hexdigest(), "chainHead": anchor["chain_head_sha256"], + "entries": anchor["chain_entries"], "tsa": tsa, "src": src(f"{SR}/anchor.json", checked_by="project")}, + "exclusion": { + "title": tm.group(1), "page": pm.group(1), "pageRevision": pm.group(2), + "titleSrc": src(f"{EX}/README.md", tl, traw, None, pl if pl != tl else None), + "entries": len(ex_chain), "sharedPrefix": shared, "sharedFirst": ex_chain[0][2]["index"], "sharedLast": shared - 1, + "forkIndex": fork_entry["index"], + "rows": ex_rows, "rowCount": len(ex_rows), "groups": list(ex_groups.values()), + "allMatch": all(r["result"] == "MATCH" for r in ex_rows), + "controls": loo["control_documents"], + "removedLoss": {"before": loo["original_base"]["removed_loss"][0], "after": loo["fork_base"]["removed_loss"][0], + "delta": r4(loo["fork_base"]["removed_loss"][0] - loo["original_base"]["removed_loss"][0])}, + "controlLoss": {"before": loo["original_base"]["control_loss_mean"], "after": loo["fork_base"]["control_loss_mean"], + "delta": r4(loo["fork_base"]["control_loss_mean"] - loo["original_base"]["control_loss_mean"])}, + "src": src(f"{EX}/loo-results.json", raw=json.dumps({k: loo[k] for k in ("removed_documents", "control_documents")} | {b: {k: loo[b][k] for k in ("removed_loss", "control_loss_mean")} for b in ("original_base", "fork_base")}), checked_by="project")}, + "preparation": {"sha256": prep_sha, "articles": prep["corpus"]["counts"]["included"], + "wikipediaTargets": prep["streams"]["wikipedia"]["targets"], + "conversations": prep["conversation_selection"]["conversations"]["train"], + "conversationTargets": prep["streams"]["conversation"]["targets"], "src": src(prep_dir, raw=json.dumps({"included": prep["corpus"]["counts"]["included"], "wikipedia_targets": prep["streams"]["wikipedia"]["targets"], "conversations_train": prep["conversation_selection"]["conversations"]["train"]}), checked_by="project")}, + "check": { + "intro": intro, "introSrc": gh_src("README.md", gs + 1, intro_end, "\n".join(up_readme[gs:intro_end]).strip()), + "commands": "\n".join(cmd_lines), "commandsSrc": gh_src("README.md", start + 2, end, "\n".join(cmd_lines)), + "runpod": rm.group(1), "runpodSrc": gh_src("README.md", rl, raw=rraw), + "cost": cm2.group(1), "costSrc": gh_src("docs/design/simple_run.md", cl2, raw=craw2), + }, +} +# ---------- claim sources: the exact cited lines for every ledger claim ---------- +LEDGER = json.load(open(os.path.join(ROOT, "src", "content", "claims.json"))) +upman = json.load(open(os.path.join(ROOT, "data", "upstream", "manifest.json"))) +RELEASE_URL = f"{GH}/releases/tag/v1.0.1" + + +def norm(t): + return re.sub(r"[\s`*>#-]+", " ", t).strip().lower() + + +def cited(s): + rev, f, ln = s["rev"], s["file"], str(s["lines"]) + if rev.startswith("hf:"): + text_lines = lines(f) + elif rev.startswith("gh:"): + b = open(os.path.join(UP, f), "rb").read() + if hashlib.sha256(b).hexdigest() != upman["files"][f]["sha256"]: + fail(f"upstream copy {f} changed") + text_lines = b.decode().splitlines() + elif rev.startswith("github-release:"): + rel = json.load(open(os.path.join(ROOT, "data", "upstream", "github-release-v1.0.1.json"))) + m = re.fullmatch(r"assets\[(.+)\]\.digest", ln) + asset = next((a for a in rel["assets"] if m and a["name"] == m.group(1)), None) + if not asset: + fail(f"release asset {ln} not in snapshot") + q = s.get("quote") + if q and q not in asset["digest"]: + fail(f"quote {q} does not match release digest for {asset['name']}") + return {"origin": "github-release", "file": f"GitHub release {rel['tag_name']}", "rev": rel["tag_name"], + "lines": asset["name"], "text": json.dumps(asset, indent=1), "url": RELEASE_URL, "quote": q} + else: # the internal brief: cited, but not public, so no link and no text + return {"origin": "brief", "file": "project brief v3", "rev": rev.split(":", 1)[1], "lines": ln, "text": None, "url": None, "quote": s.get("quote")} + if not re.fullmatch(r"\d+(-\d+)?", ln): + fail(f"bad line spec {ln} for {f}") + a, _, b2 = ln.partition("-") + a, b2 = int(a), int(b2 or a) + if b2 > len(text_lines): + fail(f"{f}:{ln} past end of file") + text = "\n".join(text_lines[a - 1:b2]) + q = s.get("quote") + if q and norm(q) not in norm(text): + fail(f"quote not found at {f}:{ln}: {q!r}") + if rev.startswith("hf:"): + url = src(f, a, None, None, b2 if b2 != a else None)["url"] + origin, r = "hf", REV[:8] + else: + url = f"{GH}/blob/{UPSTREAM}/{f}#L{a}" + (f"-L{b2}" if b2 != a else "") + origin, r = "github", UPSTREAM[:8] + return {"origin": origin, "file": f, "rev": r, "lines": ln, "text": text, "url": url, "quote": q} + + +def banned_hit(text): + t = text.lower().replace("unlearning-3i-atlas", "").replace("us$1–1.50", "") + return [b["phrase"] for b in LEDGER["forbidden_phrases"] if b["phrase"].lower() in t and not (b["phrase"].lower() == "signed results" and "roadmap" in t)] + + +def shown(c): + # A cited line that itself uses a banned phrase is linked, not quoted on the page. + if c["text"] and banned_hit(c["text"]): + c = {**c, "text": None, "withheld": banned_hit(c["text"])} + return c + + +data["claimSources"] = {c["id"]: [shown(cited(x)) for x in c["sources"]] for c in LEDGER["claims"] if c["status"] == "ALLOWED"} +data["claimExtraSources"] = {k: len(v) - 1 for k, v in data["claimSources"].items() if len(v) > 1} +text = json.dumps(data, indent=1, ensure_ascii=False) + "\n" +if "--check" in sys.argv: + cur = open(OUT).read() if os.path.exists(OUT) else "" + if cur != text: + fail("public/data/site-data.json is out of date with data/raw (run `npm run data`)") + print("build-data: site-data.json matches the pinned files") +else: + os.makedirs(os.path.dirname(OUT), exist_ok=True) + open(OUT, "w").write(text) + print("build-data: wrote", os.path.relpath(OUT, ROOT), len(text), "bytes") diff --git a/frontend/scripts/fetch-evidence.py b/frontend/scripts/fetch-evidence.py new file mode 100644 index 00000000..4267cee7 --- /dev/null +++ b/frontend/scripts/fetch-evidence.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python3 +"""Download pinned evidence files from HF and write data/raw/* + manifest (sha256 per file).""" +import hashlib, json, os, sys, urllib.request +REPO = "AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence" +REV = "96dc282a9803616c6b30bb31bfc3a0b91a7191e6" # brief pins 96dc282a; full sha resolved from HF API +PREP = "prepared/8de1d60065b1e8e084c31c202e47367f28c8b89f11b4e895873f775bc0f7ba68" +FILES = [f"release/simple-run/{f}" for f in ["chain.jsonl","verifications.jsonl","hardware-map.jsonl", + "release-hashes.txt","anchor.json","anchor.digicert.tsr","anchor.freetsa.tsr","README.md","recipe.json"]] + \ + [f"release/unlearning-3i-atlas/{f}" for f in ["chain.jsonl","verifications.jsonl","loo-results.json", + "release-hashes.txt","README.md","recipe.json"]] + [f"{PREP}/preparation.json"] +out = os.path.join(os.path.dirname(__file__), "..", "data", "raw") +manifest = {"repo": REPO, "revision": REV, "files": {}} +for p in FILES: + url = f"https://huggingface.co/datasets/{REPO}/resolve/{REV}/{p}" + b = urllib.request.urlopen(url).read() + dst = os.path.join(out, p); os.makedirs(os.path.dirname(dst), exist_ok=True) + open(dst, "wb").write(b) + manifest["files"][p] = {"sha256": hashlib.sha256(b).hexdigest(), "bytes": len(b), "url": url} +json.dump(manifest, open(os.path.join(out, "manifest.json"), "w"), indent=1) +print(len(FILES), "files ok") diff --git a/frontend/scripts/sync-claims.mjs b/frontend/scripts/sync-claims.mjs new file mode 100644 index 00000000..0e523bc9 --- /dev/null +++ b/frontend/scripts/sync-claims.mjs @@ -0,0 +1,31 @@ +// Copy the claim ledger (owned by Research Lab) and, if present, the plain-language copy file +// (owned by Open Source Ops) into src/content/. The site never edits either; it only renders them. +// CLAIMS_DIR=/path/to/ovllm-claims npm run claims:sync +import { copyFileSync, existsSync, readFileSync, writeFileSync } from 'node:fs'; +import path from 'node:path'; + +const dir = process.env.CLAIMS_DIR ?? path.resolve('..', '..', 'ovllm-claims'); +const ledger = path.join(dir, 'claims.json'); +if (!existsSync(ledger)) { + console.error(`sync-claims: ${ledger} not found (set CLAIMS_DIR)`); + process.exit(1); +} +const parsed = JSON.parse(readFileSync(ledger, 'utf8')); +if (parsed.schema !== 'ovllm.claims.v1') { + console.error(`sync-claims: unknown ledger schema ${parsed.schema}`); + process.exit(1); +} +copyFileSync(ledger, 'src/content/claims.json'); +// COPY.md: "## " then "- Headline: …" and "- Developer: …" lines. +const copy = path.join(dir, 'COPY.md'); +if (existsSync(copy)) { + const out = {}; + for (const block of readFileSync(copy, 'utf8').split(/^## /m).slice(1)) { + const id = block.split('\n', 1)[0].trim(); + const headline = /^- Headline: (.*)$/m.exec(block)?.[1]?.trim(); + const developer = /^- Developer: (.*)$/m.exec(block)?.[1]?.trim(); + if (headline) out[id] = { plain: headline, ...(developer ? { developer } : {}) }; + } + writeFileSync('src/content/copy.json', JSON.stringify(out, null, 1) + '\n'); +} else if (!existsSync('src/content/copy.json')) writeFileSync('src/content/copy.json', '{}\n'); +console.log(`sync-claims: ${parsed.claims.length} claims from ${ledger}${copy ? `, copy from ${copy}` : ''}`); diff --git a/frontend/src/content/claims.json b/frontend/src/content/claims.json new file mode 100644 index 00000000..eb28bc98 --- /dev/null +++ b/frontend/src/content/claims.json @@ -0,0 +1,2074 @@ +{ + "schema": "ovllm.claims.v1", + "generated": "2026-10-29", + "pins": { + "hf_dataset": "AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence", + "hf_revision": "96dc282a", + "hf_revision_full": "96dc282a9803…", + "github": "AOSSIE-Org/OpenVerifiableLLM", + "github_commit": "1049d2a782b8f63103abfa0cca8deab0d2037290", + "brief": "v3 2026-10-29" + }, + "source_roots": { + "hf:96dc282a": "/workspace/ovllm-frontend/data/raw", + "gh:1049d2a7": "/workspace/ovllm-claims/repo", + "brief:v3-2026-10-29": "/home/box/agent-data/agents/4b8da334-09b0-45df-aea6-057a85a7e4f4/attachments/564c193a1455f587f19a1589b8408c166aa773b83b0d68b24aecc53a47cff9e7.md" + }, + "derived": { + "odds": { + "N": 37, + "m95": 110, + "p95": 0.9508995539986606, + "m99": 169, + "p99": 0.9902494017588821, + "formula": "1-((N-1)/N)^M" + }, + "independent_checks": 0, + "coverage": { + "total": 37, + "match": 37, + "checker": "project" + }, + "events": [ + { + "type": "host_restart", + "segment": 10 + }, + { + "type": "code_change", + "from_segment": 19 + } + ] + }, + "claims": [ + { + "id": "OV-01", + "page": "overview", + "status": "ALLOWED", + "plain": "The model is small: about 23 million parameters.", + "developer": "23M-parameter GPT (23.1M per design doc).", + "value": 23000000, + "sources": [ + { + "rev": "hf:96dc282a", + "file": "release/simple-run/README.md", + "lines": "3", + "quote": "A 23-million-parameter GPT" + }, + { + "rev": "gh:1049d2a7", + "file": "docs/design/simple_run.md", + "lines": "3", + "quote": "23.1M-parameter GPT" + } + ], + "rule": "Numbers come from pinned data via script, never hand-typed (brief:28-29)", + "limit": "Small model; often wrong about facts", + "note": null, + "verbatim": null + }, + { + "id": "OV-02", + "page": "overview", + "status": "ALLOWED", + "plain": "It read English Wikipedia exactly once, from the 1 September 2026 dump.", + "developer": "One exact pass over English Wikipedia, 2026-09-01 dump; each target seen exactly once.", + "value": null, + "sources": [ + { + "rev": "hf:96dc282a", + "file": "release/simple-run/README.md", + "lines": "3-4", + "quote": "one exact pass over English Wikipedia (2026-09-01 dump)" + }, + { + "rev": "hf:96dc282a", + "file": "release/simple-run/README.md", + "lines": "106-107", + "quote": "each seen exactly once" + } + ], + "rule": "Numbers come from pinned data via script, never hand-typed (brief:28-29)", + "limit": "Proves what data was used, not that the model learned it well", + "note": null, + "verbatim": null + }, + { + "id": "OV-03", + "page": "overview", + "status": "ALLOWED", + "plain": "After Wikipedia, it had a short conversation phase: three passes over 3,481 chosen conversations.", + "developer": "Conversation phase: 3 passes over pinned OpenAssistant oasst1 selection, 3,481 conversations, 1,278,137 targets, LR 1e-4.", + "value": { + "conversations": 3481, + "passes": 3, + "targets": 1278137 + }, + "sources": [ + { + "rev": "hf:96dc282a", + "file": "release/simple-run/README.md", + "lines": "4-5", + "quote": "then three passes over a pinned OpenAssistant conversation" + }, + { + "rev": "hf:96dc282a", + "file": "release/simple-run/README.md", + "lines": "107-108", + "quote": "Conversation: 3,481 conversations, 1,278,137 targets" + }, + { + "rev": "hf:96dc282a", + "file": "release/simple-run/README.md", + "lines": "126", + "quote": "Conversation: 3 passes at 1e-4." + }, + { + "rev": "hf:96dc282a", + "file": "prepared/8de1d60065b1e8e084c31c202e47367f28c8b89f11b4e895873f775bc0f7ba68/preparation.json", + "lines": "1", + "quote": null + } + ], + "rule": "Numbers come from pinned data via script, never hand-typed (brief:28-29)", + "limit": "Only basic conversation ability", + "note": null, + "verbatim": null + }, + { + "id": "OV-04", + "page": "overview", + "status": "ALLOWED", + "plain": "37 of 37 training segments were recomputed bit for bit by the project on a second machine. All matched.", + "developer": "37/37 segments MATCH, checker 'project second pod', RTX 5090, driver 595.91.07 (verifications.jsonl rows 1-37).", + "value": { + "matched": 37, + "total": 37 + }, + "sources": [ + { + "rev": "hf:96dc282a", + "file": "release/simple-run/verifications.jsonl", + "lines": "1-37", + "quote": null + }, + { + "rev": "hf:96dc282a", + "file": "release/simple-run/README.md", + "lines": "39", + "quote": "all 37 of 37 segments recomputed by the project, all MATCH" + } + ], + "rule": "'Verified' = recomputed bit for bit and matched; never imply answers are correct (brief:75); Always say who checked: 'the project' or 'independent' (none yet) (brief:78)", + "limit": "All checks so far were run by the project; 0 independent; Checks need an RTX 5090 and the same PyTorch/CUDA stack", + "note": null, + "verbatim": null + }, + { + "id": "OV-05", + "page": "overview", + "status": "ALLOWED", + "plain": "Exact data provenance: the project rebuilt the training data from the raw Wikipedia dump, and it came out byte for byte the same.", + "developer": "Rebuild from raw dump PASS (2026-10-21): rebuilt preparation.json byte-identical, sha256 8de1d600…ba68.", + "value": "8de1d60065b1e8e084c31c202e47367f28c8b89f11b4e895873f775bc0f7ba68", + "sources": [ + { + "rev": "hf:96dc282a", + "file": "release/simple-run/README.md", + "lines": "111-117", + "quote": "Rebuild from the raw dump: PASS (2026-10-21)." + } + ], + "rule": "Always say who checked: 'the project' or 'independent' (none yet) (brief:78) (checked by the project)", + "limit": "Rebuild done by the project; needs ~150 GB disk and about a day to repeat", + "note": null, + "verbatim": null + }, + { + "id": "OV-06", + "page": "overview", + "status": "ALLOWED", + "plain": "There is a timestamped release record. Two timestamp services stamped it on 20 October 2026.", + "developer": "anchor.json timestamped by FreeTSA and DigiCert (RFC 3161) at 2026-10-20 14:38:43 UTC (20:08:43 IST).", + "value": "2026-10-20T14:38:43Z", + "sources": [ + { + "rev": "hf:96dc282a", + "file": "release/simple-run/README.md", + "lines": "87-90", + "quote": "at 2026-10-20 14:38:43 UTC" + } + ], + "rule": "Timestamps show the record existed by 20 October, not when/how training happened (brief:79)", + "limit": "Shows the record existed by 20 Oct 2026; says nothing about how training was done", + "note": null, + "verbatim": null + }, + { + "id": "OV-07", + "page": "overview", + "status": "ALLOWED", + "plain": "It is a small model. It writes fluent, encyclopedia-style text but often gets facts wrong.", + "developer": "Small model; fluent encyclopedia-style fragments; often states wrong facts; basic conversation only.", + "value": null, + "sources": [ + { + "rev": "hf:96dc282a", + "file": "release/simple-run/README.md", + "lines": "138-139", + "quote": "It often states wrong facts and has only basic conversation ability." + }, + { + "rev": "gh:1049d2a7", + "file": "README.md", + "lines": "95-96", + "quote": "often gets facts wrong" + } + ], + "rule": "'Verified' = recomputed bit for bit and matched; never imply answers are correct (brief:75)", + "limit": "—", + "note": null, + "verbatim": null + }, + { + "id": "OV-08", + "page": "overview", + "status": "ALLOWED", + "plain": "'Verified' means the published model is exactly what this training on these inputs produces. It does not mean the answers are true.", + "developer": "Verified = bit-exact recomputation of the committed state; not correctness of outputs.", + "value": null, + "sources": [ + { + "rev": "hf:96dc282a", + "file": "release/simple-run/README.md", + "lines": "140-141", + "quote": "It does not mean the model's answers are true." + }, + { + "rev": "gh:1049d2a7", + "file": "README.md", + "lines": "87", + "quote": "We verify the computation, not the content" + } + ], + "rule": "'Verified' = recomputed bit for bit and matched; never imply answers are correct (brief:75)", + "limit": "—", + "note": null, + "verbatim": null + }, + { + "id": "OV-09", + "page": "overview", + "status": "ALLOWED", + "plain": "Data counts: 7,232,582 articles and 7,118,121,139 Wikipedia training targets.", + "developer": "preparation.json: wikipedia included 7,232,582 docs; targets 7,118,121,139; also final chain cursor at entry 31 (base) = 7,118,121,139.", + "value": { + "articles": 7232582, + "targets": 7118121139 + }, + "sources": [ + { + "rev": "hf:96dc282a", + "file": "release/simple-run/README.md", + "lines": "106-107", + "quote": "Wikipedia: 7,232,582 articles, 7,118,121,139 training targets" + }, + { + "rev": "hf:96dc282a", + "file": "prepared/8de1d60065b1e8e084c31c202e47367f28c8b89f11b4e895873f775bc0f7ba68/preparation.json", + "lines": "1", + "quote": null + }, + { + "rev": "hf:96dc282a", + "file": "release/simple-run/chain.jsonl", + "lines": "32", + "quote": null + } + ], + "rule": "Numbers come from pinned data via script, never hand-typed (brief:28-29)", + "limit": "—", + "note": null, + "verbatim": null + }, + { + "id": "OV-10", + "page": "overview", + "status": "ALLOWED", + "plain": "Training ran on one RTX 5090 graphics card and took 15.7 hours in total.", + "developer": "Trained on one RTX 5090, 15.7 h incl. a 19-minute outage (simple_run.md timeline).", + "value": 15.7, + "sources": [ + { + "rev": "gh:1049d2a7", + "file": "docs/design/simple_run.md", + "lines": "106", + "quote": "(15.7 hours in total)" + }, + { + "rev": "gh:1049d2a7", + "file": "docs/design/simple_run.md", + "lines": "121", + "quote": "15.7 h, including a 19-minute outage" + } + ], + "rule": "Numbers come from pinned data via script, never hand-typed (brief:28-29)", + "limit": "Timing is from the project's notes, not from the timestamp", + "note": null, + "verbatim": null + }, + { + "id": "OV-11", + "page": "overview", + "status": "ALLOWED", + "plain": "The training loop is about 630 lines in simple/ovl.py, plus about 1,000 lines of model, data and setup helpers.", + "developer": "simple/ovl.py about 630 lines + about 1,000 lines in src/model.py, src/ovl_pipeline/data.py, training.py.", + "value": { + "ovl_py_lines_approx": 630 + }, + "sources": [ + { + "rev": "brief:v3-2026-10-29", + "file": "564c193a1455f587f19a1589b8408c166aa773b83b0d68b24aecc53a47cff9e7.md", + "lines": "81-82", + "quote": "The training loop is about 630 lines in `simple/ovl.py`, plus about 1,000 lines" + }, + { + "rev": "gh:1049d2a7", + "file": "docs/design/simple_run.md", + "lines": "13-15", + "quote": "about 1,000 lines in all" + } + ], + "rule": "~630 lines in simple/ovl.py + ~1,000 lines of helpers; never 'one file' (brief:81-82)", + "limit": "Approximate; don't print an exact count", + "note": "CONFLICT: README.md:47 and simple_run.md:13 say 631 lines; `wc -l simple/ovl.py` at 1049d2a7 = 636. Use 'about 630'. README.md:47 also says 'One 631-line file' — forbidden wording.", + "verbatim": null + }, + { + "id": "OV-12", + "page": "overview", + "status": "ALLOWED", + "plain": "Limit: checks need the same GPU type as training (RTX 5090).", + "developer": "Bit-exact checking needs the same GPU architecture and software stack (PyTorch 2.8.0, CUDA 12.8).", + "value": null, + "sources": [ + { + "rev": "hf:96dc282a", + "file": "release/simple-run/README.md", + "lines": "142", + "quote": "Bit-exact checking needs the same GPU type and software stack as training." + }, + { + "rev": "gh:1049d2a7", + "file": "README.md", + "lines": "116-117", + "quote": "they trust the same PyTorch/CUDA" + } + ], + "rule": "'Verified' = recomputed bit for bit and matched; never imply answers are correct (brief:75)", + "limit": "Checks need an RTX 5090 and the same PyTorch/CUDA stack", + "note": null, + "verbatim": null + }, + { + "id": "OV-13", + "page": "overview", + "status": "ALLOWED", + "plain": "Limit: no independent checks yet. Every check so far was run by the project.", + "developer": "0 rows with a checker outside 'project …' in either verifications.jsonl.", + "value": 0, + "sources": [ + { + "rev": "hf:96dc282a", + "file": "release/simple-run/verifications.jsonl", + "lines": "1-46", + "quote": null + }, + { + "rev": "hf:96dc282a", + "file": "release/unlearning-3i-atlas/verifications.jsonl", + "lines": "1-10", + "quote": null + }, + { + "rev": "gh:1049d2a7", + "file": "README.md", + "lines": "118", + "quote": "All checks so far were run by the project, on separate machines." + } + ], + "rule": "Always say who checked: 'the project' or 'independent' (none yet) (brief:78)", + "limit": "All checks so far were run by the project; 0 independent", + "note": null, + "verbatim": null + }, + { + "id": "CK-01", + "page": "check", + "status": "ALLOWED", + "plain": "2 minutes, try it: run the model in Ollama. This checks nothing. It is only a demo.", + "developer": "`ollama run ryoari/openverifiablellm` — GGUF via llama.cpp; outputs close to PyTorch but not bit-identical; not a verification.", + "value": null, + "sources": [ + { + "rev": "gh:1049d2a7", + "file": "README.md", + "lines": "186", + "quote": "`ollama run ryoari/openverifiablellm`" + }, + { + "rev": "gh:1049d2a7", + "file": "docs/guides/ollama.md", + "lines": "6-7", + "quote": "This is for trying the model. It isn't how the model is verified." + } + ], + "rule": "Laptop check = 'consistency check'; segment recompute = 'actual verification' (brief:76-77); must say it checks nothing (brief:41)", + "limit": "Checks nothing", + "note": null, + "verbatim": "ollama run ryoari/openverifiablellm" + }, + { + "id": "CK-02", + "page": "check", + "status": "ALLOWED", + "plain": "10 minutes, consistency check, no GPU. It shows the release matches its timestamped record. It does not recompute any training.", + "developer": "README Getting started block (lines 156-167, verbatim): pip install, hf download, sha256sum -c, openssl ts -verify, clone --branch v1.0.1, ovl.py verify.", + "value": null, + "sources": [ + { + "rev": "gh:1049d2a7", + "file": "README.md", + "lines": "151-153", + "quote": "This is a consistency check: it recomputes no training." + }, + { + "rev": "gh:1049d2a7", + "file": "README.md", + "lines": "156-167", + "quote": null + } + ], + "rule": "Laptop check = 'consistency check'; segment recompute = 'actual verification' (brief:76-77); copy verbatim (brief:44-45)", + "limit": "Recomputes no training; the code/ copy in the download predates the anchor check", + "note": "Copy from main@1049d2a7. The v1.0.1 tag's README:164 still says --branch v1.0.0 (AUDIT 4b).", + "verbatim": "pip install huggingface_hub torch numpy rfc8785==0.1.4 tokenizers==0.23.2 mwparserfromhell==0.7.2 \\\n \"safetensors>=0.4.5,<1.0\" \"pynacl>=1.5,<2.0\"\nhf download AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence \\\n --repo-type dataset --include \"release/simple-run/*\" --exclude \"*/ckpt-*\" --local-dir ovl\ncd ovl/release/simple-run\nsha256sum -c --ignore-missing release-hashes.txt\nopenssl ts -verify -in anchor.digicert.tsr -data anchor.json -CAfile /etc/ssl/certs/ca-certificates.crt\n# Verification: OK (DigiCert stamped anchor.json on 2026-10-20)\ngit clone -q --depth 1 --branch v1.0.1 https://github.com/AOSSIE-Org/OpenVerifiableLLM ovl-code\nOVL_DEVICE=cpu python ovl-code/simple/ovl.py verify --run . --weights conversation-model.pt\n# anchor anchor.json: chain head MATCH (38 entries)\n# weights conversation-model.pt: MATCH chain entry 37" + }, + { + "id": "CK-03", + "page": "check", + "status": "ALLOWED", + "plain": "Use ovl.py from the v1.0.1 tag. It fails if anchor.json is missing.", + "developer": "Use ovl.py from tag v1.0.1; the download's code/ copy predates the anchor check.", + "value": null, + "sources": [ + { + "rev": "gh:1049d2a7", + "file": "README.md", + "lines": "170-172", + "quote": "Use `ovl.py` from the v1.0.1 tag, as above. It fails if `anchor.json` is missing." + } + ], + "rule": "Laptop check = 'consistency check'; segment recompute = 'actual verification' (brief:76-77)", + "limit": "—", + "note": null, + "verbatim": null + }, + { + "id": "CK-04", + "page": "check", + "status": "ALLOWED", + "plain": "Expected output: the chain head matches (38 entries) and the weights match chain entry 37.", + "developer": "Expected lines '# anchor anchor.json: chain head MATCH (38 entries)' and '# weights conversation-model.pt: MATCH chain entry 37'.", + "value": { + "chain_entries": 38, + "head": 37 + }, + "sources": [ + { + "rev": "gh:1049d2a7", + "file": "README.md", + "lines": "166-167", + "quote": "chain head MATCH (38 entries)" + }, + { + "rev": "hf:96dc282a", + "file": "release/simple-run/anchor.json", + "lines": "2-3", + "quote": null + } + ], + "rule": "Laptop check = 'consistency check'; segment recompute = 'actual verification' (brief:76-77)", + "limit": "Consistency only", + "note": null, + "verbatim": null + }, + { + "id": "CK-05", + "page": "check", + "status": "ALLOWED", + "plain": "1 hour, the actual verification: a one-click RunPod template recomputes one segment on an RTX 5090 and compares it bit for bit.", + "developer": "RunPod template mai1ozh35g runs simple/checker_pod.sh; ~22 GB download + ~20 min training; prints one result line.", + "value": null, + "sources": [ + { + "rev": "gh:1049d2a7", + "file": "README.md", + "lines": "174-176", + "quote": "[deploy the RunPod template](https://console.runpod.io/deploy?template=mai1ozh35g), wait about an" + }, + { + "rev": "gh:1049d2a7", + "file": "docs/guides/check_a_segment.md", + "lines": "46", + "quote": "Wait about an hour: a 22 GB download, then about 20 minutes of training." + } + ], + "rule": "Laptop check = 'consistency check'; segment recompute = 'actual verification' (brief:76-77); 'Verified' = recomputed bit for bit and matched; never imply answers are correct (brief:75)", + "limit": "Checks need an RTX 5090 and the same PyTorch/CUDA stack; Check results are self-reported and unsigned; segment choice not proven random", + "note": null, + "verbatim": "https://console.runpod.io/deploy?template=mai1ozh35g" + }, + { + "id": "CK-06", + "page": "check", + "status": "ALLOWED", + "plain": "It costs about US$1 to 1.50 to rent the GPU for the hour.", + "developer": "about US$1–1.50 (RTX 5090 list price US$1.19/h at the time).", + "value": { + "min_usd": 1.0, + "max_usd": 1.5 + }, + "sources": [ + { + "rev": "gh:1049d2a7", + "file": "docs/design/simple_run.md", + "lines": "85", + "quote": "about an hour, about US$1–1.50 rented" + }, + { + "rev": "gh:1049d2a7", + "file": "docs/guides/check_a_segment.md", + "lines": "53", + "quote": "It costs about US$1–1.50." + }, + { + "rev": "gh:1049d2a7", + "file": "docs/design/simple_run.md", + "lines": "116", + "quote": "US$1.19/h for an RTX 5090" + } + ], + "rule": "Numbers come from pinned data via script, never hand-typed (brief:28-29)", + "limit": "Rental prices change", + "note": "CONFLICT: brief:46 says 'about US$1.50'; README.md:41 says 'about a dollar'; README.md:209 'a dollar for an hour'. Use 'about US$1–1.50' (AUDIT 4c).", + "verbatim": null + }, + { + "id": "CK-07", + "page": "check", + "status": "ALLOWED", + "plain": "Run by hand: verify_segment.sh checks one random segment (about 20 minutes), three random ones, or ones you choose.", + "developer": "HF README verbatim commands.", + "value": null, + "sources": [ + { + "rev": "hf:96dc282a", + "file": "release/simple-run/README.md", + "lines": "57-60", + "quote": null + } + ], + "rule": "Laptop check = 'consistency check'; segment recompute = 'actual verification' (brief:76-77)", + "limit": "Checks need an RTX 5090 and the same PyTorch/CUDA stack", + "note": null, + "verbatim": "# download code/ from this folder, then:\nbash code/simple/verify_segment.sh # one random segment (~20 min)\nK=3 bash code/simple/verify_segment.sh # three random segments\nSEGMENTS=\"7 8\" bash code/simple/verify_segment.sh # chosen segments" + }, + { + "id": "CK-08", + "page": "check", + "status": "ALLOWED", + "plain": "You can check both timestamps yourself with openssl.", + "developer": "Verbatim openssl ts -verify commands for DigiCert and FreeTSA.", + "value": null, + "sources": [ + { + "rev": "hf:96dc282a", + "file": "release/simple-run/README.md", + "lines": "93-95", + "quote": null + } + ], + "rule": "Timestamps show the record existed by 20 October, not when/how training happened (brief:79); Laptop check = 'consistency check'; segment recompute = 'actual verification' (brief:76-77)", + "limit": "Shows existence by a time only", + "note": null, + "verbatim": "openssl ts -verify -in anchor.digicert.tsr -data anchor.json -CAfile /etc/ssl/certs/ca-certificates.crt\ncurl -sO https://freetsa.org/files/cacert.pem; curl -sO https://freetsa.org/files/tsa.crt\nopenssl ts -verify -in anchor.freetsa.tsr -data anchor.json -CAfile cacert.pem -untrusted tsa.crt" + }, + { + "id": "VE-01", + "page": "verification", + "status": "ALLOWED", + "plain": "Coverage map: 37 tiles, one per segment. All 37 matched. All 37 were checked by the project. None yet by independent checkers.", + "developer": "Tiles = verifications.jsonl rows 1-37 (project second pod), segments 0-36; label 'project'; reserve 'independent'.", + "value": { + "tiles": 37, + "project": 37, + "independent": 0 + }, + "sources": [ + { + "rev": "hf:96dc282a", + "file": "release/simple-run/verifications.jsonl", + "lines": "1-37", + "quote": null + }, + { + "rev": "brief:v3-2026-10-29", + "file": "564c193a1455f587f19a1589b8408c166aa773b83b0d68b24aecc53a47cff9e7.md", + "lines": "49", + "quote": "Today all 37 are \"project\"." + } + ], + "rule": "Always say who checked: 'the project' or 'independent' (none yet) (brief:78); 'Verified' = recomputed bit for bit and matched; never imply answers are correct (brief:75)", + "limit": "All checks so far were run by the project; 0 independent", + "note": null, + "verbatim": null + }, + { + "id": "VE-02", + "page": "verification", + "status": "ALLOWED", + "plain": "Segment k means training from boundary k to boundary k+1.", + "developer": "segment k = boundary k → k+1; passes only if recomputed state is identical to entry k+1.", + "value": null, + "sources": [ + { + "rev": "hf:96dc282a", + "file": "release/simple-run/README.md", + "lines": "26-28", + "quote": "A segment passes only if the recomputed state is identical, bit for bit, to the committed entry k+1." + } + ], + "rule": "'Verified' = recomputed bit for bit and matched; never imply answers are correct (brief:75)", + "limit": "—", + "note": null, + "verbatim": null + }, + { + "id": "VE-03", + "page": "verification", + "status": "ALLOWED", + "plain": "There are 46 check results in total, all MATCH and all by the project: 37 from the second machine, 8 from the training machine, and 1 from a fresh machine using only public files.", + "developer": "verifications.jsonl: 46 rows = 37 'project second pod' + 8 'project training pod' (22,31-36, 5 fast loader) + 1 'project fresh machine public files only' (21).", + "value": { + "rows": 46, + "second_pod": 37, + "training_pod": 8, + "fresh_machine": 1 + }, + "sources": [ + { + "rev": "hf:96dc282a", + "file": "release/simple-run/verifications.jsonl", + "lines": "1-46", + "quote": null + } + ], + "rule": "Always say who checked: 'the project' or 'independent' (none yet) (brief:78)", + "limit": "All checks so far were run by the project; 0 independent", + "note": null, + "verbatim": null + }, + { + "id": "VE-04", + "page": "verification", + "status": "ALLOWED", + "plain": "Segment 21 was also recomputed by the project on a fresh machine using only the public files. It matched.", + "developer": "verifications.jsonl row 46: segment 21, 'project fresh machine public files only', verify_segment.sh from the release.", + "value": 21, + "sources": [ + { + "rev": "hf:96dc282a", + "file": "release/simple-run/verifications.jsonl", + "lines": "46", + "quote": null + }, + { + "rev": "hf:96dc282a", + "file": "release/simple-run/README.md", + "lines": "41-42", + "quote": "Segment 21 was" + } + ], + "rule": "Always say who checked: 'the project' or 'independent' (none yet) (brief:78)", + "limit": "All checks so far were run by the project; 0 independent", + "note": null, + "verbatim": null + }, + { + "id": "VE-05", + "page": "verification", + "status": "CONFLICT", + "plain": "The project also says segment 8 matched on a fresh machine, but that result is not in the pinned data. Don't show it.", + "developer": "GitHub README:103-104 'segments 8 and 21'; simple_run.md:47 and :109. Not in verifications.jsonl @96dc282a.", + "value": null, + "sources": [ + { + "rev": "gh:1049d2a7", + "file": "README.md", + "lines": "103-104", + "quote": "segments 8 and 21" + }, + { + "rev": "gh:1049d2a7", + "file": "docs/design/simple_run.md", + "lines": "109", + "quote": "first check: segment 8 MATCH" + } + ], + "rule": "Numbers come from pinned data via script, never hand-typed (brief:28-29)", + "limit": "—", + "note": "Not in verifications.jsonl at 96dc282a (or HF main 2fbebaa3). Do not render; ask Rajat to add the row.", + "verbatim": null + }, + { + "id": "VE-06", + "page": "verification", + "status": "ALLOWED", + "plain": "How likely is a single forged segment to be caught? With N segments and M independent random checks, the chance is 1 − ((N−1)/N)^M.", + "developer": "P(detect) = 1 − ((N−1)/N)^M; one checker doing k distinct segments: k/N.", + "value": { + "N": 37 + }, + "sources": [ + { + "rev": "hf:96dc282a", + "file": "release/simple-run/README.md", + "lines": "45-47", + "quote": "1 − ((N−1)/N)^M" + } + ], + "rule": "Always say who checked: 'the project' or 'independent' (none yet) (brief:78) (only independent checks count)", + "limit": "Assumes random segment choice; nothing proves it today", + "note": null, + "verbatim": null + }, + { + "id": "VE-07", + "page": "verification", + "status": "ALLOWED", + "plain": "With 37 segments, 110 independent random checks give a 95% chance of catching one forged segment.", + "developer": "Smallest M with p≥0.95 at N=37 is 110 (p=0.95090).", + "value": { + "M": 110, + "p": 0.9509 + }, + "sources": [ + { + "rev": "gh:1049d2a7", + "file": "docs/design/simple_run.md", + "lines": "199-200", + "quote": "For N = 37 that's about 110 checks for 95% and 169 for 99%." + }, + { + "rev": "gh:1049d2a7", + "file": "README.md", + "lines": "119-120", + "quote": "takes about 110 independent random checks" + } + ], + "rule": "Numbers come from pinned data via script, never hand-typed (brief:28-29) (recompute, don't type)", + "limit": "Independent random checks only", + "note": null, + "verbatim": null + }, + { + "id": "VE-08", + "page": "verification", + "status": "ALLOWED", + "plain": "169 independent random checks give a 99% chance.", + "developer": "Smallest M with p≥0.99 at N=37 is 169 (p=0.99025).", + "value": { + "M": 169, + "p": 0.99025 + }, + "sources": [ + { + "rev": "gh:1049d2a7", + "file": "docs/design/simple_run.md", + "lines": "199-200", + "quote": "169 for 99%" + } + ], + "rule": "Numbers come from pinned data via script, never hand-typed (brief:28-29)", + "limit": "Independent random checks only", + "note": null, + "verbatim": null + }, + { + "id": "VE-09", + "page": "verification", + "status": "ALLOWED", + "plain": "Independent checks so far: 0.", + "developer": "count(checker not starting 'project') = 0 across both verifications.jsonl files.", + "value": 0, + "sources": [ + { + "rev": "hf:96dc282a", + "file": "release/simple-run/verifications.jsonl", + "lines": "1-46", + "quote": null + }, + { + "rev": "hf:96dc282a", + "file": "release/unlearning-3i-atlas/verifications.jsonl", + "lines": "1-10", + "quote": null + }, + { + "rev": "brief:v3-2026-10-29", + "file": "564c193a1455f587f19a1589b8408c166aa773b83b0d68b24aecc53a47cff9e7.md", + "lines": "52", + "quote": "Show the current count of independent checks, which is 0." + } + ], + "rule": "Always say who checked: 'the project' or 'independent' (none yet) (brief:78)", + "limit": "All checks so far were run by the project; 0 independent", + "note": null, + "verbatim": null + }, + { + "id": "VE-10", + "page": "verification", + "status": "ALLOWED", + "plain": "Check results are self-reported text lines. They are not signed, and nothing proves a checker picked the segment at random.", + "developer": "Results unsigned; random selection unproven.", + "value": null, + "sources": [ + { + "rev": "gh:1049d2a7", + "file": "README.md", + "lines": "121-122", + "quote": "They aren't signed, and nothing proves a checker" + } + ], + "rule": "Always say who checked: 'the project' or 'independent' (none yet) (brief:78)", + "limit": "Check results are self-reported and unsigned; segment choice not proven random", + "note": null, + "verbatim": null + }, + { + "id": "VE-11", + "page": "verification", + "status": "ALLOWED", + "plain": "Signed results and picking segments from public randomness are on the roadmap.", + "developer": "Roadmap: signed check results + segment choice from public randomness.", + "value": null, + "sources": [ + { + "rev": "gh:1049d2a7", + "file": "docs/project/roadmap.md", + "lines": "32-33", + "quote": "Signed check results and random segment choice." + }, + { + "rev": "gh:1049d2a7", + "file": "docs/design/simple_run.md", + "lines": "202-203", + "quote": "Signed results and public randomness for picking segments" + } + ], + "rule": "Roadmap, not done; don't present as shipped", + "limit": "Not implemented", + "note": null, + "verbatim": null + }, + { + "id": "VE-HW-1", + "page": "verification", + "status": "ALLOWED", + "plain": "Hardware map: RTX 5090 — reproduces the bits.", + "developer": "hardware-map.jsonl row 1: segment 32, NVIDIA GeForce RTX 5090 (Blackwell), torch 2.8.0+cu128, MATCH.", + "value": { + "hardware": "NVIDIA GeForce RTX 5090 (Blackwell)", + "result": "MATCH", + "segment": 32 + }, + "sources": [ + { + "rev": "hf:96dc282a", + "file": "release/simple-run/hardware-map.jsonl", + "lines": "1", + "quote": null + } + ], + "rule": "Numbers come from pinned data via script, never hand-typed (brief:28-29)", + "limit": "Checks need an RTX 5090 and the same PyTorch/CUDA stack", + "note": null, + "verbatim": null + }, + { + "id": "VE-HW-2", + "page": "verification", + "status": "ALLOWED", + "plain": "Hardware map: RTX 4090 — does not reproduce the bits.", + "developer": "hardware-map.jsonl row 2: segment 32, NVIDIA GeForce RTX 4090 (Ada), torch 2.8.0+cu128, MISMATCH.", + "value": { + "hardware": "NVIDIA GeForce RTX 4090 (Ada)", + "result": "MISMATCH", + "segment": 32 + }, + "sources": [ + { + "rev": "hf:96dc282a", + "file": "release/simple-run/hardware-map.jsonl", + "lines": "2", + "quote": null + } + ], + "rule": "Numbers come from pinned data via script, never hand-typed (brief:28-29)", + "limit": "Checks need an RTX 5090 and the same PyTorch/CUDA stack", + "note": null, + "verbatim": null + }, + { + "id": "VE-HW-3", + "page": "verification", + "status": "ALLOWED", + "plain": "Hardware map: H100 — does not reproduce the bits.", + "developer": "hardware-map.jsonl row 3: segment 32, NVIDIA H100 80GB HBM3 (Hopper), torch 2.8.0+cu128, MISMATCH.", + "value": { + "hardware": "NVIDIA H100 80GB HBM3 (Hopper)", + "result": "MISMATCH", + "segment": 32 + }, + "sources": [ + { + "rev": "hf:96dc282a", + "file": "release/simple-run/hardware-map.jsonl", + "lines": "3", + "quote": null + } + ], + "rule": "Numbers come from pinned data via script, never hand-typed (brief:28-29)", + "limit": "Checks need an RTX 5090 and the same PyTorch/CUDA stack", + "note": null, + "verbatim": null + }, + { + "id": "VE-HW-4", + "page": "verification", + "status": "ALLOWED", + "plain": "Hardware map: x86 CPU — does not reproduce the bits.", + "developer": "hardware-map.jsonl row 4: segment 32, x86_64 CPU, torch 2.14.0+cpu, MISMATCH.", + "value": { + "hardware": "x86_64 CPU", + "result": "MISMATCH", + "segment": 32 + }, + "sources": [ + { + "rev": "hf:96dc282a", + "file": "release/simple-run/hardware-map.jsonl", + "lines": "4", + "quote": null + } + ], + "rule": "Numbers come from pinned data via script, never hand-typed (brief:28-29)", + "limit": "Checks need an RTX 5090 and the same PyTorch/CUDA stack", + "note": null, + "verbatim": null + }, + { + "id": "VE-HW-5", + "page": "verification", + "status": "ALLOWED", + "plain": "All four hardware tests recomputed the same segment, 32 (boundary 32 to 33).", + "developer": "Probe segment 32→33 with torch 2.8.0+cu128 (CPU: torch 2.14).", + "value": 32, + "sources": [ + { + "rev": "hf:96dc282a", + "file": "release/simple-run/README.md", + "lines": "68", + "quote": "The same published segment (32→33)" + } + ], + "rule": "Numbers come from pinned data via script, never hand-typed (brief:28-29)", + "limit": "Checks need an RTX 5090 and the same PyTorch/CUDA stack", + "note": null, + "verbatim": null + }, + { + "id": "VE-HW-6", + "page": "verification", + "status": "ALLOWED", + "plain": "Bits matched across two different NVIDIA drivers (570.195.03 and 595.91.07) on the same GPU type.", + "developer": "Training driver 570.195.03 (segs 0-9), checker 595.91.07.", + "value": null, + "sources": [ + { + "rev": "hf:96dc282a", + "file": "release/simple-run/README.md", + "lines": "79-80", + "quote": "two different NVIDIA drivers (570.195.03 and" + } + ], + "rule": "'Verified' = recomputed bit for bit and matched; never imply answers are correct (brief:75)", + "limit": "Checks need an RTX 5090 and the same PyTorch/CUDA stack", + "note": null, + "verbatim": null + }, + { + "id": "VE-12", + "page": "verification", + "status": "ALLOWED", + "plain": "A deterministic error in PyTorch or CUDA itself would match on every machine. Checkers trust that toolchain.", + "developer": "Toolchain trust assumption.", + "value": null, + "sources": [ + { + "rev": "gh:1049d2a7", + "file": "README.md", + "lines": "116-117", + "quote": "A deterministic error in that toolchain would match on every machine" + } + ], + "rule": "'Verified' = recomputed bit for bit and matched; never imply answers are correct (brief:75)", + "limit": "Toolchain is trusted", + "note": null, + "verbatim": null + }, + { + "id": "TL-01", + "page": "timeline", + "status": "ALLOWED", + "plain": "The training record has 38 boundaries, which makes 37 segments.", + "developer": "chain.jsonl 38 entries (index 0-37); kinds: initial [0], progress [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30], base [31], transition [32, 34, 36], epoch [33, 35], final [37]", + "value": { + "entries": 38, + "segments": 37, + "kinds": { + "initial": [ + 0 + ], + "progress": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30 + ], + "base": [ + 31 + ], + "transition": [ + 32, + 34, + 36 + ], + "epoch": [ + 33, + 35 + ], + "final": [ + 37 + ] + } + }, + "sources": [ + { + "rev": "hf:96dc282a", + "file": "release/simple-run/chain.jsonl", + "lines": "1-38", + "quote": null + }, + { + "rev": "gh:1049d2a7", + "file": "docs/design/simple_run.md", + "lines": "29", + "quote": "38 entries" + } + ], + "rule": "Numbers come from pinned data via script, never hand-typed (brief:28-29)", + "limit": "—", + "note": null, + "verbatim": null + }, + { + "id": "TL-02", + "page": "timeline", + "status": "ALLOWED", + "plain": "A boundary every 18,080 updates, plus the phase boundaries.", + "developer": "global_step multiples of 18,080 for entries 1-30; base at 560,177; final at 560,618.", + "value": { + "interval": 18080, + "wiki_updates": 560177, + "final_step": 560618 + }, + "sources": [ + { + "rev": "gh:1049d2a7", + "file": "docs/design/simple_run.md", + "lines": "29", + "quote": "A boundary every 18,080 updates" + }, + { + "rev": "hf:96dc282a", + "file": "release/simple-run/chain.jsonl", + "lines": "32", + "quote": null + }, + { + "rev": "hf:96dc282a", + "file": "release/simple-run/chain.jsonl", + "lines": "38", + "quote": null + } + ], + "rule": "Numbers come from pinned data via script, never hand-typed (brief:28-29)", + "limit": "—", + "note": null, + "verbatim": null + }, + { + "id": "TL-03", + "page": "timeline", + "status": "ALLOWED", + "plain": "Wikipedia: 560,177 updates. Conversation phase: 441 updates.", + "developer": "560,177 Wikipedia + 441 conversation updates, batch 32×512.", + "value": { + "wiki": 560177, + "conv": 441 + }, + "sources": [ + { + "rev": "gh:1049d2a7", + "file": "docs/design/simple_run.md", + "lines": "45", + "quote": "560,177 Wikipedia + 441 conversation updates" + } + ], + "rule": "Numbers come from pinned data via script, never hand-typed (brief:28-29)", + "limit": "—", + "note": null, + "verbatim": null + }, + { + "id": "TL-04", + "page": "timeline", + "status": "ALLOWED", + "plain": "The training machine restarted once, at boundary 10. Training resumed from checkpoint 10. Segment 10 spans the restart and still matched.", + "developer": "README.md:133-134; chain gap 10→11 = 3297 s vs median gap 1968 s (median of the 30 boundary gaps 0→1 … 29→30, the regular Wikipedia segments; includes the restart gap); verifications row 11 seg 10 MATCH.", + "value": { + "segment": 10, + "gap_s": 3297 + }, + "sources": [ + { + "rev": "hf:96dc282a", + "file": "release/simple-run/README.md", + "lines": "133-134", + "quote": "The training host restarted once, at boundary 10." + }, + { + "rev": "hf:96dc282a", + "file": "release/simple-run/chain.jsonl", + "lines": "11", + "quote": null + }, + { + "rev": "hf:96dc282a", + "file": "release/simple-run/chain.jsonl", + "lines": "12", + "quote": null + }, + { + "rev": "hf:96dc282a", + "file": "release/simple-run/verifications.jsonl", + "lines": "11", + "quote": null + } + ], + "rule": "'Verified' = recomputed bit for bit and matched; never imply answers are correct (brief:75); Always say who checked: 'the project' or 'independent' (none yet) (brief:78)", + "limit": "Checked by the project", + "note": null, + "verbatim": null + }, + { + "id": "TL-05", + "page": "timeline", + "status": "ALLOWED", + "plain": "From segment 19, a newer code version was used. It only changed how the computer prepared batches and how many processor threads it used. Segments 19 onward still matched when recomputed with the original batch loader, and segment 5 matched with the newer code.", + "developer": "ovl.py 202ac6ce for segs 0-18, c4a942c0 for 19+; segs 19-36 recomputed with reference loader (rows 20-37) MATCH; seg 5 with new code (row 45) MATCH.", + "value": { + "from_segment": 19, + "old": "202ac6ce", + "new": "c4a942c0" + }, + "sources": [ + { + "rev": "hf:96dc282a", + "file": "release/simple-run/README.md", + "lines": "127-132", + "quote": "Segments 19 onward used `c4a942c0…`" + }, + { + "rev": "hf:96dc282a", + "file": "release/simple-run/verifications.jsonl", + "lines": "20-37", + "quote": null + }, + { + "rev": "hf:96dc282a", + "file": "release/simple-run/verifications.jsonl", + "lines": "45", + "quote": null + } + ], + "rule": "'Verified' = recomputed bit for bit and matched; never imply answers are correct (brief:75); Always say who checked: 'the project' or 'independent' (none yet) (brief:78)", + "limit": "Checked by the project", + "note": null, + "verbatim": null + }, + { + "id": "TL-06", + "page": "timeline", + "status": "ALLOWED", + "plain": "Training started 19 October 15:04 UTC and the run finished 20 October 06:46 UTC.", + "developer": "simple_run.md timeline (UTC); chain time entry0=1792422250, entry37=1792478807 (unix).", + "value": { + "start": "2026-10-19T15:04Z", + "end": "2026-10-20T06:46Z" + }, + "sources": [ + { + "rev": "gh:1049d2a7", + "file": "docs/design/simple_run.md", + "lines": "103", + "quote": "19 Oct 15:04" + }, + { + "rev": "gh:1049d2a7", + "file": "docs/design/simple_run.md", + "lines": "106", + "quote": "20 Oct 06:46" + }, + { + "rev": "hf:96dc282a", + "file": "release/simple-run/chain.jsonl", + "lines": "1", + "quote": null + }, + { + "rev": "hf:96dc282a", + "file": "release/simple-run/chain.jsonl", + "lines": "38", + "quote": null + } + ], + "rule": "Timestamps show the record existed by 20 October, not when/how training happened (brief:79) (chain 'time' is self-reported, not the RFC 3161 stamp)", + "limit": "Times are the project's own record", + "note": null, + "verbatim": null + }, + { + "id": "TL-07", + "page": "timeline", + "status": "ALLOWED", + "plain": "A driver change also happened during training: segments 0–9 were trained with driver 570.195.03.", + "developer": "570.195.03 for segments 0-9 vs 595.91.07 checker.", + "value": null, + "sources": [ + { + "rev": "hf:96dc282a", + "file": "release/simple-run/README.md", + "lines": "40-41", + "quote": "(595.91.07 vs 570.195.03 for segments 0-9)" + } + ], + "rule": "'Verified' = recomputed bit for bit and matched; never imply answers are correct (brief:75)", + "limit": "—", + "note": null, + "verbatim": null + }, + { + "id": "EX-01", + "page": "exclusion", + "status": "ALLOWED", + "plain": "What was removed: one article, 3I/ATLAS (the interstellar comet). Training had not reached it yet.", + "developer": "Fork from checkpoint 30 without page 80340464 rev 1371028825 (10,395 targets); first target 6,915,731,634 > cursor@30 6,901,668,826.", + "value": { + "targets": 10395, + "first_target": 6915731634, + "cursor30": 6901668826 + }, + "sources": [ + { + "rev": "hf:96dc282a", + "file": "release/unlearning-3i-atlas/README.md", + "lines": "4-5", + "quote": "page 80340464, revision 1371028825, 10,395 training targets" + }, + { + "rev": "hf:96dc282a", + "file": "release/unlearning-3i-atlas/README.md", + "lines": "11-12", + "quote": "(6,915,731,634)" + }, + { + "rev": "hf:96dc282a", + "file": "release/simple-run/chain.jsonl", + "lines": "31", + "quote": null + } + ], + "rule": "Say 'verifiable exclusion', not 'unlearning' (brief:80)", + "limit": "Only works for text the run had not seen yet", + "note": null, + "verbatim": null + }, + { + "id": "EX-02", + "page": "exclusion", + "status": "ALLOWED", + "plain": "Checkpoints 0 to 30 are shared byte for byte with the main run.", + "developer": "Fork chain entries 0-30 identical to simple-run entries 0-30.", + "value": null, + "sources": [ + { + "rev": "hf:96dc282a", + "file": "release/unlearning-3i-atlas/README.md", + "lines": "10-11", + "quote": "Entries 0–30 of this `chain.jsonl` are identical to entries" + } + ], + "rule": "Say 'verifiable exclusion', not 'unlearning' (brief:80)", + "limit": "—", + "note": null, + "verbatim": null + }, + { + "id": "EX-03", + "page": "exclusion", + "status": "ALLOWED", + "plain": "The removal is written into the training record.", + "developer": "Entry 31 kind 'fork': same state as 30; control.exclude = wikipedia [[6915731634, 10395]].", + "value": null, + "sources": [ + { + "rev": "hf:96dc282a", + "file": "release/unlearning-3i-atlas/README.md", + "lines": "14-16", + "quote": "Entry 31 (kind `fork`) has exactly the state of entry 30." + } + ], + "rule": "Say 'verifiable exclusion', not 'unlearning' (brief:80)", + "limit": "—", + "note": null, + "verbatim": null + }, + { + "id": "EX-04", + "page": "exclusion", + "status": "ALLOWED", + "plain": "Any other gap in the data is refused. Training would stop.", + "developer": "Coverage check accepts a gap only at the recorded range.", + "value": null, + "sources": [ + { + "rev": "hf:96dc282a", + "file": "release/unlearning-3i-atlas/README.md", + "lines": "19-21", + "quote": "accepts a gap in target ids **only** at the recorded range" + } + ], + "rule": "Say 'verifiable exclusion', not 'unlearning' (brief:80)", + "limit": "—", + "note": null, + "verbatim": null + }, + { + "id": "EX-05", + "page": "exclusion", + "status": "ALLOWED", + "plain": "Every fork segment matched. All were checked by the project.", + "developer": "Fork verifications.jsonl: 10 rows, 8 'project fork pod' (30-37) + 2 'project fresh machine public files only' (30,31), all MATCH.", + "value": { + "rows": 10, + "fork_pod": 8, + "fresh_machine": 2 + }, + "sources": [ + { + "rev": "hf:96dc282a", + "file": "release/unlearning-3i-atlas/verifications.jsonl", + "lines": "1-10", + "quote": null + }, + { + "rev": "hf:96dc282a", + "file": "release/unlearning-3i-atlas/README.md", + "lines": "22-27", + "quote": "Every fork segment (30→31 through 37→38)" + } + ], + "rule": "Say 'verifiable exclusion', not 'unlearning' (brief:80); Always say who checked: 'the project' or 'independent' (none yet) (brief:78)", + "limit": "All checks so far were run by the project; 0 independent", + "note": null, + "verbatim": null + }, + { + "id": "EX-06", + "page": "exclusion", + "status": "ALLOWED", + "plain": "Loss on the removed article's own text went from 3.3604 to 3.3860.", + "developer": "loo-results.json original_base.removed_loss 3.3604 → fork_base.removed_loss 3.386 (+0.0256).", + "value": { + "before": 3.3604, + "after": 3.386 + }, + "sources": [ + { + "rev": "hf:96dc282a", + "file": "release/unlearning-3i-atlas/README.md", + "lines": "33", + "quote": null + }, + { + "rev": "hf:96dc282a", + "file": "release/unlearning-3i-atlas/loo-results.json", + "lines": "12-14", + "quote": null + } + ], + "rule": "Say 'verifiable exclusion', not 'unlearning' (brief:80)", + "limit": "One run, no variance estimate", + "note": null, + "verbatim": null + }, + { + "id": "EX-07", + "page": "exclusion", + "status": "ALLOWED", + "plain": "Mean loss on 50 control articles barely moved: 2.8710 to 2.8712.", + "developer": "control_loss_mean 2.871 → 2.8712 (+0.0002), 50 controls.", + "value": { + "before": 2.871, + "after": 2.8712, + "controls": 50 + }, + "sources": [ + { + "rev": "hf:96dc282a", + "file": "release/unlearning-3i-atlas/README.md", + "lines": "34", + "quote": null + }, + { + "rev": "hf:96dc282a", + "file": "release/unlearning-3i-atlas/loo-results.json", + "lines": "9", + "quote": "\"control_documents\": 50" + } + ], + "rule": "Say 'verifiable exclusion', not 'unlearning' (brief:80)", + "limit": "One run, no variance estimate", + "note": null, + "verbatim": null + }, + { + "id": "EX-08", + "page": "exclusion", + "status": "ALLOWED", + "plain": "Limit: this proves a model was trained without the article. It does not remove content a model already learned.", + "developer": "Exact retraining without an unreached range; does not remove content a model already learned.", + "value": null, + "sources": [ + { + "rev": "gh:1049d2a7", + "file": "docs/design/simple_run.md", + "lines": "76-78", + "quote": "It is exact retraining without a range the run hadn't reached" + } + ], + "rule": "Say 'verifiable exclusion', not 'unlearning' (brief:80)", + "limit": "Not erasure", + "note": null, + "verbatim": null + }, + { + "id": "EX-09", + "page": "exclusion", + "status": "ALLOWED", + "plain": "Limit: removing text the run had already seen means retraining from an earlier save point.", + "developer": "Brief wording.", + "value": null, + "sources": [ + { + "rev": "brief:v3-2026-10-29", + "file": "564c193a1455f587f19a1589b8408c166aa773b83b0d68b24aecc53a47cff9e7.md", + "lines": "66", + "quote": "Text the run had already seen means retraining from an earlier save point." + } + ], + "rule": "Say 'verifiable exclusion', not 'unlearning' (brief:80)", + "limit": "—", + "note": "Source is the brief only; docs imply it (fork must precede the range) but do not state it literally.", + "verbatim": null + }, + { + "id": "EX-10", + "page": "exclusion", + "status": "ALLOWED", + "plain": "Limit: one run, no variance estimate.", + "developer": "n=1.", + "value": null, + "sources": [ + { + "rev": "gh:1049d2a7", + "file": "docs/design/simple_run.md", + "lines": "76", + "quote": "One run, no variance estimate." + } + ], + "rule": "Say 'verifiable exclusion', not 'unlearning' (brief:80)", + "limit": "—", + "note": null, + "verbatim": null + }, + { + "id": "DL-conversation-model.pt", + "page": "downloads", + "status": "ALLOWED", + "plain": "conversation-model.pt — SHA-256 shown next to the download.", + "developer": "release-hashes.txt line 41", + "value": "149cfae13c4523a1010c52161e13babf76c9ddc01f34fa1a8b580677b733a64c", + "sources": [ + { + "rev": "hf:96dc282a", + "file": "release/simple-run/release-hashes.txt", + "lines": "41", + "quote": "149cfae13c4523a1010c52161e13babf76c9ddc01f34fa1a8b580677b733a64c" + } + ], + "rule": "Numbers come from pinned data via script, never hand-typed (brief:28-29)", + "limit": "Hash proves file identity only", + "note": null, + "verbatim": null + }, + { + "id": "DL-base-model.pt", + "page": "downloads", + "status": "ALLOWED", + "plain": "base-model.pt — SHA-256 shown next to the download.", + "developer": "release-hashes.txt line 1", + "value": "976c62e8b28db786c38dc2ff969339603d0ee917d830f2815d9e858d2a3c0ce3", + "sources": [ + { + "rev": "hf:96dc282a", + "file": "release/simple-run/release-hashes.txt", + "lines": "1", + "quote": "976c62e8b28db786c38dc2ff969339603d0ee917d830f2815d9e858d2a3c0ce3" + } + ], + "rule": "Numbers come from pinned data via script, never hand-typed (brief:28-29)", + "limit": "Hash proves file identity only", + "note": null, + "verbatim": null + }, + { + "id": "DL-chain.jsonl", + "page": "downloads", + "status": "ALLOWED", + "plain": "chain.jsonl — SHA-256 shown next to the download.", + "developer": "release-hashes.txt line 2", + "value": "c1f867e16d0660c611186183863cc5626e3510b046d52e617c3953beb8f8a327", + "sources": [ + { + "rev": "hf:96dc282a", + "file": "release/simple-run/release-hashes.txt", + "lines": "2", + "quote": "c1f867e16d0660c611186183863cc5626e3510b046d52e617c3953beb8f8a327" + } + ], + "rule": "Numbers come from pinned data via script, never hand-typed (brief:28-29)", + "limit": "Hash proves file identity only", + "note": null, + "verbatim": null + }, + { + "id": "DL-recipe.json", + "page": "downloads", + "status": "ALLOWED", + "plain": "recipe.json — SHA-256 shown next to the download.", + "developer": "release-hashes.txt line 42", + "value": "28a2fb407a5582ae95c9e9b0bba2c14df946e87bba037800399c6059256b6e6d", + "sources": [ + { + "rev": "hf:96dc282a", + "file": "release/simple-run/release-hashes.txt", + "lines": "42", + "quote": "28a2fb407a5582ae95c9e9b0bba2c14df946e87bba037800399c6059256b6e6d" + } + ], + "rule": "Numbers come from pinned data via script, never hand-typed (brief:28-29)", + "limit": "Hash proves file identity only", + "note": null, + "verbatim": null + }, + { + "id": "DL-fork-conversation-model.pt", + "page": "downloads", + "status": "ALLOWED", + "plain": "Verifiable exclusion fork conversation-model.pt — SHA-256.", + "developer": "unlearning-3i-atlas/release-hashes.txt", + "value": "e41be3a27bbcf16ce7a5224eb4766e88b2abe09fe6ddb6aadea399b9db4472d4", + "sources": [ + { + "rev": "hf:96dc282a", + "file": "release/unlearning-3i-atlas/release-hashes.txt", + "lines": "12", + "quote": "e41be3a27bbcf16ce7a5224eb4766e88b2abe09fe6ddb6aadea399b9db4472d4" + } + ], + "rule": "Numbers come from pinned data via script, never hand-typed (brief:28-29); Say 'verifiable exclusion', not 'unlearning' (brief:80)", + "limit": "—", + "note": null, + "verbatim": null + }, + { + "id": "DL-fork-base-model.pt", + "page": "downloads", + "status": "ALLOWED", + "plain": "Verifiable exclusion fork base-model.pt — SHA-256.", + "developer": "unlearning-3i-atlas/release-hashes.txt", + "value": "ff30d7f4bf9ec41f0514d63a4d8bc1a74172481b89e07608383c0c3513f83441", + "sources": [ + { + "rev": "hf:96dc282a", + "file": "release/unlearning-3i-atlas/release-hashes.txt", + "lines": "1", + "quote": "ff30d7f4bf9ec41f0514d63a4d8bc1a74172481b89e07608383c0c3513f83441" + } + ], + "rule": "Numbers come from pinned data via script, never hand-typed (brief:28-29); Say 'verifiable exclusion', not 'unlearning' (brief:80)", + "limit": "—", + "note": null, + "verbatim": null + }, + { + "id": "DL-gguf", + "page": "downloads", + "status": "ALLOWED", + "plain": "GitHub release v1.0.1: ovl-23m-chat.gguf (for Ollama and llama.cpp).", + "developer": "Asset sha256 541d49c9…80de, 142,815,808 bytes (GitHub API digest); same hash in ollama.md:23.", + "value": "541d49c97b87cd4ed0acb90b4327535ee20b8c11c452e2583d460154e9d980de", + "sources": [ + { + "rev": "github-release:v1.0.1", + "file": "api.github.com/repos/AOSSIE-Org/OpenVerifiableLLM/releases/tags/v1.0.1", + "lines": "assets[ovl-23m-chat.gguf].digest", + "quote": "sha256:541d49c97b87cd4ed0acb90b4327535ee20b8c11c452e2583d460154e9d980de" + }, + { + "rev": "gh:1049d2a7", + "file": "docs/guides/ollama.md", + "lines": "23", + "quote": "541d49c97b87cd4ed0acb90b4327535ee20b8c11c452e2583d460154e9d980de" + } + ], + "rule": "Numbers come from pinned data via script, never hand-typed (brief:28-29)", + "limit": "GGUF is for trying the model, not for verifying it; not in pinned HF rev 96dc282a", + "note": "ollama.md:20 links the v1.0.0 release; v1.0.1 has the same asset digest.", + "verbatim": null + }, + { + "id": "DL-modelfile", + "page": "downloads", + "status": "ALLOWED", + "plain": "GitHub release v1.0.1: Modelfile.", + "developer": "Asset sha256 df4dacfc…fc8b, 722 bytes (GitHub API digest).", + "value": "df4dacfc3191e56b1dc1195764ea66ca1a7695856be04ecec17d8dde4c66fc8b", + "sources": [ + { + "rev": "github-release:v1.0.1", + "file": "api.github.com/repos/AOSSIE-Org/OpenVerifiableLLM/releases/tags/v1.0.1", + "lines": "assets[Modelfile].digest", + "quote": "sha256:df4dacfc3191e56b1dc1195764ea66ca1a7695856be04ecec17d8dde4c66fc8b" + } + ], + "rule": "Numbers come from pinned data via script, never hand-typed (brief:28-29)", + "limit": "—", + "note": null, + "verbatim": null + }, + { + "id": "DL-hf", + "page": "downloads", + "status": "ALLOWED", + "plain": "Hugging Face dataset, pinned to revision 96dc282a.", + "developer": "AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence@96dc282a.", + "value": "96dc282a", + "sources": [ + { + "rev": "brief:v3-2026-10-29", + "file": "564c193a1455f587f19a1589b8408c166aa773b83b0d68b24aecc53a47cff9e7.md", + "lines": "15", + "quote": "Pin to revision `96dc282a`." + } + ], + "rule": "Numbers come from pinned data via script, never hand-typed (brief:28-29)", + "limit": "—", + "note": null, + "verbatim": null + }, + { + "id": "DL-ollama", + "page": "downloads", + "status": "ALLOWED", + "plain": "Ollama: ryoari/openverifiablellm.", + "developer": "ollama.com/ryoari/openverifiablellm", + "value": null, + "sources": [ + { + "rev": "gh:1049d2a7", + "file": "docs/guides/ollama.md", + "lines": "12-13", + "quote": "ryoari/openverifiablellm" + } + ], + "rule": "Laptop check = 'consistency check'; segment recompute = 'actual verification' (brief:76-77)", + "limit": "Demo only", + "note": null, + "verbatim": null + }, + { + "id": "LI-01", + "page": "limits", + "status": "ALLOWED", + "plain": "A small model that is often wrong about facts.", + "developer": "see OV-07", + "value": null, + "sources": [ + { + "rev": "hf:96dc282a", + "file": "release/simple-run/README.md", + "lines": "138-139", + "quote": "It often states" + } + ], + "rule": "'Verified' = recomputed bit for bit and matched; never imply answers are correct (brief:75)", + "limit": "—", + "note": null, + "verbatim": null + }, + { + "id": "LI-02", + "page": "limits", + "status": "ALLOWED", + "plain": "Checks need an RTX 5090 and the same software.", + "developer": "see OV-12", + "value": null, + "sources": [ + { + "rev": "hf:96dc282a", + "file": "release/simple-run/README.md", + "lines": "81", + "quote": "Checkers therefore need an RTX 5090." + } + ], + "rule": "'Verified' = recomputed bit for bit and matched; never imply answers are correct (brief:75)", + "limit": "Checks need an RTX 5090 and the same PyTorch/CUDA stack", + "note": null, + "verbatim": null + }, + { + "id": "LI-03", + "page": "limits", + "status": "ALLOWED", + "plain": "No independent checks yet.", + "developer": "see VE-09", + "value": null, + "sources": [ + { + "rev": "gh:1049d2a7", + "file": "README.md", + "lines": "118-119", + "quote": "We need independent" + } + ], + "rule": "Always say who checked: 'the project' or 'independent' (none yet) (brief:78)", + "limit": "All checks so far were run by the project; 0 independent", + "note": null, + "verbatim": null + }, + { + "id": "LI-04", + "page": "limits", + "status": "ALLOWED", + "plain": "Check results are self-reported and unsigned.", + "developer": "see VE-10", + "value": null, + "sources": [ + { + "rev": "gh:1049d2a7", + "file": "README.md", + "lines": "121", + "quote": "Check results are self-reported text lines." + } + ], + "rule": "Always say who checked: 'the project' or 'independent' (none yet) (brief:78)", + "limit": "Check results are self-reported and unsigned; segment choice not proven random", + "note": null, + "verbatim": null + }, + { + "id": "LI-05", + "page": "limits", + "status": "ALLOWED", + "plain": "The timestamp proves the record existed by 20 October 2026, not how the training was done.", + "developer": "README.md:123", + "value": null, + "sources": [ + { + "rev": "gh:1049d2a7", + "file": "README.md", + "lines": "123", + "quote": "The timestamp proves the record existed by 20 Oct 2026, not how the training was done" + } + ], + "rule": "Timestamps show the record existed by 20 October, not when/how training happened (brief:79)", + "limit": "—", + "note": null, + "verbatim": null + }, + { + "id": "LI-06", + "page": "limits", + "status": "ALLOWED", + "plain": "A full check costs as much compute as the training itself.", + "developer": "simple_run.md:204", + "value": null, + "sources": [ + { + "rev": "gh:1049d2a7", + "file": "docs/design/simple_run.md", + "lines": "204", + "quote": "A full check costs as much compute as the training" + } + ], + "rule": "Numbers come from pinned data via script, never hand-typed (brief:28-29)", + "limit": "—", + "note": null, + "verbatim": null + }, + { + "id": "UN-01", + "page": "check", + "status": "UNSOURCED", + "plain": "'About US$1.50' as a flat figure.", + "developer": "brief:64", + "value": null, + "sources": [ + { + "rev": "brief:v3-2026-10-29", + "file": "564c193a1455f587f19a1589b8408c166aa773b83b0d68b24aecc53a47cff9e7.md", + "lines": "46", + "quote": "about US$1.50" + } + ], + "rule": "Numbers come from pinned data via script, never hand-typed (brief:28-29)", + "limit": "—", + "note": "No source in pinned data or docs gives a flat US$1.50; docs say US$1–1.50 (use CK-06).", + "verbatim": null + }, + { + "id": "UN-02", + "page": "overview", + "status": "FORBIDDEN", + "plain": "'One file' / '631-line file' trains everything.", + "developer": "README.md:47", + "value": null, + "sources": [ + { + "rev": "gh:1049d2a7", + "file": "README.md", + "lines": "47", + "quote": "One 631-line file trains" + } + ], + "rule": "~630 lines in simple/ovl.py + ~1,000 lines of helpers; never 'one file' (brief:81-82)", + "limit": "—", + "note": "Source exists but brief forbids the wording; use OV-11.", + "verbatim": null + } + ], + "forbidden_phrases": [ + { + "phrase": "unlearning", + "why": "Say 'verifiable exclusion', not 'unlearning' (brief:80)", + "exception": "only inside the URL/path 'unlearning-3i-atlas'" + }, + { + "phrase": "unlearn", + "why": "Say 'verifiable exclusion', not 'unlearning' (brief:80)" + }, + { + "phrase": "verifiable unlearning", + "why": "Say 'verifiable exclusion', not 'unlearning' (brief:80); HF README.md:98 heading uses it—don't copy" + }, + { + "phrase": "machine unlearning", + "why": "Say 'verifiable exclusion', not 'unlearning' (brief:80)" + }, + { + "phrase": "erase", + "why": "Exclusion does not erase learned content (EX-08)" + }, + { + "phrase": "forgets", + "why": "EX-08" + }, + { + "phrase": "one file", + "why": "~630 lines in simple/ovl.py + ~1,000 lines of helpers; never 'one file' (brief:81-82)" + }, + { + "phrase": "single file", + "why": "~630 lines in simple/ovl.py + ~1,000 lines of helpers; never 'one file' (brief:81-82)" + }, + { + "phrase": "631-line file", + "why": "~630 lines in simple/ovl.py + ~1,000 lines of helpers; never 'one file' (brief:81-82)" + }, + { + "phrase": "one-file", + "why": "~630 lines in simple/ovl.py + ~1,000 lines of helpers; never 'one file' (brief:81-82)" + }, + { + "phrase": "independently verified", + "why": "Always say who checked: 'the project' or 'independent' (none yet) (brief:78); 0 independent checks" + }, + { + "phrase": "independently checked", + "why": "Always say who checked: 'the project' or 'independent' (none yet) (brief:78)" + }, + { + "phrase": "third-party verified", + "why": "Always say who checked: 'the project' or 'independent' (none yet) (brief:78)" + }, + { + "phrase": "audited by", + "why": "Always say who checked: 'the project' or 'independent' (none yet) (brief:78)" + }, + { + "phrase": "answers are correct", + "why": "'Verified' = recomputed bit for bit and matched; never imply answers are correct (brief:75)" + }, + { + "phrase": "accurate answers", + "why": "'Verified' = recomputed bit for bit and matched; never imply answers are correct (brief:75)" + }, + { + "phrase": "verified facts", + "why": "'Verified' = recomputed bit for bit and matched; never imply answers are correct (brief:75)" + }, + { + "phrase": "trustworthy answers", + "why": "'Verified' = recomputed bit for bit and matched; never imply answers are correct (brief:75)" + }, + { + "phrase": "factually verified", + "why": "'Verified' = recomputed bit for bit and matched; never imply answers are correct (brief:75)" + }, + { + "phrase": "verify it in 10 minutes", + "why": "Laptop check = 'consistency check'; segment recompute = 'actual verification' (brief:76-77) (laptop check is a consistency check)" + }, + { + "phrase": "verify on your laptop", + "why": "Laptop check = 'consistency check'; segment recompute = 'actual verification' (brief:76-77)" + }, + { + "phrase": "verify without a GPU", + "why": "Laptop check = 'consistency check'; segment recompute = 'actual verification' (brief:76-77)" + }, + { + "phrase": "Ollama verifies", + "why": "Ollama demo checks nothing (CK-01)" + }, + { + "phrase": "trained on 20 October", + "why": "Timestamps show the record existed by 20 October, not when/how training happened (brief:79)" + }, + { + "phrase": "proves when training happened", + "why": "Timestamps show the record existed by 20 October, not when/how training happened (brief:79)" + }, + { + "phrase": "proves how the model was trained", + "why": "Timestamps show the record existed by 20 October, not when/how training happened (brief:79)" + }, + { + "phrase": "signed results", + "why": "Roadmap only; results are unsigned (VE-11)", + "exception": "allowed only with 'on the roadmap'" + }, + { + "phrase": "works on any GPU", + "why": "Checks need an RTX 5090 and the same PyTorch/CUDA stack" + }, + { + "phrase": "any hardware", + "why": "Checks need an RTX 5090 and the same PyTorch/CUDA stack" + }, + { + "phrase": "H100 reproduces", + "why": "hardware-map row 3 MISMATCH" + }, + { + "phrase": "US$1.50", + "why": "UN-01: use 'about US$1–1.50'", + "exception": "as part of 'US$1–1.50'" + }, + { + "phrase": "segments 8 and 21", + "why": "VE-05: segment 8 not in pinned data" + }, + { + "phrase": "37 of 37 independent", + "why": "Always say who checked: 'the project' or 'independent' (none yet) (brief:78)" + }, + { + "phrase": "guaranteed", + "why": "Odds are probabilistic (VE-06)" + } + ] +} \ No newline at end of file diff --git a/frontend/src/content/copy.json b/frontend/src/content/copy.json new file mode 100644 index 00000000..bc57f4b5 --- /dev/null +++ b/frontend/src/content/copy.json @@ -0,0 +1,286 @@ +{ + "OV-01": { + "plain": "The project reports the model is small: about 23 million parameters.", + "developer": "23M-parameter GPT (23.1M per design doc)." + }, + "OV-02": { + "plain": "The project records that the model read English Wikipedia exactly once, from the 1 September 2026 dump.", + "developer": "One exact pass over English Wikipedia, 2026-09-01 dump; each target seen exactly once." + }, + "OV-03": { + "plain": "The project records a short conversation phase after Wikipedia: three passes over 3,481 chosen conversations.", + "developer": "Conversation phase: 3 passes over pinned OpenAssistant oasst1 selection, 3,481 conversations, 1,278,137 targets, LR 1e-4." + }, + "OV-04": { + "plain": "The project recomputed 37 of 37 segments on a second machine and all matched. Independent checks: none yet.", + "developer": "37/37 segments MATCH, checker 'project second pod', RTX 5090, driver 595.91.07 (verifications.jsonl rows 1-37)." + }, + "OV-05": { + "plain": "The project rebuilt the training data from the raw Wikipedia dump and got a byte-for-byte identical result.", + "developer": "Rebuild from raw dump PASS (2026-10-21): rebuilt preparation.json byte-identical, sha256 8de1d600…ba68." + }, + "OV-06": { + "plain": "Two timestamp services stamped the project's release record. This shows the record existed by 20 October 2026.", + "developer": "anchor.json timestamped by FreeTSA and DigiCert (RFC 3161) at 2026-10-20 14:38:43 UTC (20:08:43 IST)." + }, + "OV-07": { + "plain": "The project says plainly: this small model writes fluent text but often gets facts wrong.", + "developer": "Small model; fluent encyclopedia-style fragments; often states wrong facts; basic conversation only." + }, + "OV-08": { + "plain": "Verified here means the project recomputed the model bit for bit and it matched. It does not mean answers are true.", + "developer": "Verified = bit-exact recomputation of the committed state; not correctness of outputs." + }, + "OV-09": { + "plain": "The project's data record counts 7,232,582 articles and 7,118,121,139 Wikipedia training targets.", + "developer": "preparation.json: wikipedia included 7,232,582 docs; targets 7,118,121,139; also final chain cursor at entry 31 (base) = 7,118,121,139." + }, + "OV-10": { + "plain": "The project's notes say training ran on one RTX 5090 graphics card for 15.7 hours in total.", + "developer": "Trained on one RTX 5090, 15.7 h incl. a 19-minute outage (simple_run.md timeline)." + }, + "OV-11": { + "plain": "The project's training loop is about 630 lines in simple/ovl.py, plus about 1,000 lines of helpers.", + "developer": "simple/ovl.py ~630 lines + ~1,000 lines in src/model.py, src/ovl_pipeline/data.py, training.py." + }, + "OV-12": { + "plain": "Limit noted by the project: checks need the same GPU type as training, an RTX 5090.", + "developer": "Bit-exact checking needs the same GPU architecture and software stack (PyTorch 2.8.0, CUDA 12.8)." + }, + "OV-13": { + "plain": "Limit: every check so far was run by the project. Independent checks: none yet.", + "developer": "0 rows with a checker outside 'project …' in either verifications.jsonl." + }, + "CK-01": { + "plain": "Try the project's model yourself in Ollama in about 2 minutes. This is a demo; it checks nothing.", + "developer": "`ollama run ryoari/openverifiablellm` — GGUF via llama.cpp; outputs close to PyTorch but not bit-identical; not a verification." + }, + "CK-02": { + "plain": "A 10-minute consistency check you run, no GPU: it shows the release matches the project's timestamped record. No training is recomputed.", + "developer": "README Getting started block (lines 156-167, verbatim): pip install, hf download, sha256sum -c, openssl ts -verify, clone --branch v1.0.1, ovl.py verify." + }, + "CK-03": { + "plain": "For the consistency check, use ovl.py from the project's v1.0.1 tag. It fails if anchor.json is missing.", + "developer": "Use ovl.py from tag v1.0.1; the download's code/ copy predates the anchor check." + }, + "CK-04": { + "plain": "When you run the consistency check, a pass prints: the chain head matches (38 entries) and the weights match chain entry 37.", + "developer": "Expected lines '# anchor anchor.json: chain head MATCH (38 entries)' and '# weights conversation-model.pt: MATCH chain entry 37'." + }, + "CK-05": { + "plain": "Actual verification you run, about 1 hour: the project's RunPod template recomputes one segment bit for bit on an RTX 5090.", + "developer": "RunPod template mai1ozh35g runs simple/checker_pod.sh; ~22 GB download + ~20 min training; prints one result line." + }, + "CK-06": { + "plain": "Renting the GPU for that hour costs about US$1–1.50, per the project's docs. Prices change.", + "developer": "about US$1–1.50 (RTX 5090 list price US$1.19/h at the time)." + }, + "CK-07": { + "plain": "Or run the project's verify_segment.sh yourself: one random segment (about 20 minutes), three random ones, or your choice.", + "developer": "HF README verbatim commands." + }, + "CK-08": { + "plain": "You can check both timestamps on the project's record yourself with openssl.", + "developer": "Verbatim openssl ts -verify commands for DigiCert and FreeTSA." + }, + "VE-01": { + "plain": "Coverage map: 37 tiles, one per segment. The project checked all 37 and all matched. Independent checks: none yet.", + "developer": "Tiles = verifications.jsonl rows 1-37 (project second pod), segments 0-36; label 'project'; reserve 'independent'." + }, + "VE-02": { + "plain": "Segment k means the training between boundary k and boundary k+1 in the project's record.", + "developer": "segment k = boundary k → k+1; passes only if recomputed state is identical to entry k+1." + }, + "VE-03": { + "plain": "There are 46 check results, all matches, all run by the project: 37 second machine, 8 training machine, 1 fresh machine.", + "developer": "verifications.jsonl: 46 rows = 37 'project second pod' + 8 'project training pod' (22,31-36, 5 fast loader) + 1 'project fresh machine public files only' (21)." + }, + "VE-04": { + "plain": "The project also recomputed segment 21 on a fresh machine using only public files. It matched. Not an independent check.", + "developer": "verifications.jsonl row 46: segment 21, 'project fresh machine public files only', verify_segment.sh from the release." + }, + "VE-06": { + "plain": "How likely independent random checks catch one forged segment: 1 − ((N−1)/N)^M. So far only the project has checked.", + "developer": "P(detect) = 1 − ((N−1)/N)^M; one checker doing k distinct segments: k/N." + }, + "VE-07": { + "plain": "110 independent random checks of 37 segments would catch one forged segment 95% of the time. Only the project has checked.", + "developer": "Smallest M with p≥0.95 at N=37 is 110 (p=0.95090)." + }, + "VE-08": { + "plain": "169 independent random checks would give a 99% chance. So far only the project has checked.", + "developer": "Smallest M with p≥0.99 at N=37 is 169 (p=0.99025)." + }, + "VE-09": { + "plain": "Independent checks so far: 0. Every check to date was run by the project.", + "developer": "count(checker not starting 'project') = 0 across both verifications.jsonl files." + }, + "VE-10": { + "plain": "Check results, including the project's own, are self-reported text lines. They are unsigned, and random segment choice is unproven.", + "developer": "Results unsigned; random selection unproven." + }, + "VE-11": { + "plain": "On the project's roadmap, not built yet: signed check results and segment choice from public randomness.", + "developer": "Roadmap: signed check results + segment choice from public randomness." + }, + "VE-HW-1": { + "plain": "The project tested this: an RTX 5090 reproduces the bits.", + "developer": "hardware-map.jsonl row 1: segment 32, NVIDIA GeForce RTX 5090 (Blackwell), torch 2.8.0+cu128, MATCH." + }, + "VE-HW-2": { + "plain": "The project tested this: an RTX 4090 does not reproduce the bits.", + "developer": "hardware-map.jsonl row 2: segment 32, NVIDIA GeForce RTX 4090 (Ada), torch 2.8.0+cu128, MISMATCH." + }, + "VE-HW-3": { + "plain": "The project tested this: an H100 does not reproduce the bits.", + "developer": "hardware-map.jsonl row 3: segment 32, NVIDIA H100 80GB HBM3 (Hopper), torch 2.8.0+cu128, MISMATCH." + }, + "VE-HW-4": { + "plain": "The project tested this: an x86 CPU does not reproduce the bits.", + "developer": "hardware-map.jsonl row 4: segment 32, x86_64 CPU, torch 2.14.0+cpu, MISMATCH." + }, + "VE-HW-5": { + "plain": "All four of the project's hardware tests recomputed the same segment, 32 (boundary 32 to 33).", + "developer": "Probe segment 32→33 with torch 2.8.0+cu128 (CPU: torch 2.14)." + }, + "VE-HW-6": { + "plain": "The project found bits matched across two NVIDIA drivers (570.195.03 and 595.91.07) on the same GPU type.", + "developer": "Training driver 570.195.03 (segs 0-9), checker 595.91.07." + }, + "VE-12": { + "plain": "Every checker, the project included, trusts PyTorch and CUDA. A deterministic error there would match everywhere.", + "developer": "Toolchain trust assumption." + }, + "TL-01": { + "plain": "The project's training record has 38 boundaries, which makes 37 segments.", + "developer": "chain.jsonl 38 entries (index 0-37); kinds: initial [0], progress [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30], base [31], transition [32, 34, 36], epoch [33, 35], final [37]" + }, + "TL-02": { + "plain": "The project's record has a boundary every 18,080 updates, plus the phase boundaries.", + "developer": "global_step multiples of 18,080 for entries 1-30; base at 560,177; final at 560,618." + }, + "TL-03": { + "plain": "The project's record shows 560,177 Wikipedia updates and 441 conversation-phase updates.", + "developer": "560,177 Wikipedia + 441 conversation updates, batch 32×512." + }, + "TL-04": { + "plain": "The training machine restarted once, at boundary 10. The project recomputed segment 10 across the restart: it matched.", + "developer": "README.md:133-134; chain gap 10→11 = 3297 s vs median gap 1968 s (median of the 30 boundary gaps 0→1 … 29→30, the regular Wikipedia segments; includes the restart gap); verifications row 11 seg 10 MATCH." + }, + "TL-05": { + "plain": "The code changed from segment 19 (batch preparation and threads only). The project's recomputes still matched.", + "developer": "ovl.py 202ac6ce for segs 0-18, c4a942c0 for 19+; segs 19-36 recomputed with reference loader (rows 20-37) MATCH; seg 5 with new code (row 45) MATCH." + }, + "TL-06": { + "plain": "The project's own record says training started 19 October 15:04 UTC and finished 20 October 06:46 UTC.", + "developer": "simple_run.md timeline (UTC); chain time entry0=1792422250, entry37=1792478807 (unix)." + }, + "TL-07": { + "plain": "The project's record shows a driver change: segments 0–9 were trained with driver 570.195.03.", + "developer": "570.195.03 for segments 0-9 vs 595.91.07 checker." + }, + "EX-01": { + "plain": "Verifiable exclusion: the project removed one article, 3I/ATLAS, which training had not reached yet.", + "developer": "Fork from checkpoint 30 without page 80340464 rev 1371028825 (10,395 targets); first target 6,915,731,634 > cursor@30 6,901,668,826." + }, + "EX-02": { + "plain": "In the project's exclusion run, checkpoints 0 to 30 are byte-for-byte the same as the main run.", + "developer": "Fork chain entries 0-30 identical to simple-run entries 0-30." + }, + "EX-03": { + "plain": "The project wrote the removal into the training record.", + "developer": "Entry 31 kind 'fork': same state as 30; control.exclude = wikipedia [[6915731634, 10395]]." + }, + "EX-04": { + "plain": "The project's training code refuses any other gap in the data; training would stop.", + "developer": "Coverage check accepts a gap only at the recorded range." + }, + "EX-05": { + "plain": "Every segment of the exclusion run matched. All were checked by the project; independent checks: none yet.", + "developer": "Fork verifications.jsonl: 10 rows, 8 'project fork pod' (30-37) + 2 'project fresh machine public files only' (30,31), all MATCH." + }, + "EX-06": { + "plain": "The project measured loss on the removed article's own text: it went from 3.3604 to 3.3860.", + "developer": "loo-results.json original_base.removed_loss 3.3604 → fork_base.removed_loss 3.386 (+0.0256)." + }, + "EX-07": { + "plain": "The project measured mean loss on 50 control articles: it barely moved, 2.8710 to 2.8712.", + "developer": "control_loss_mean 2.871 → 2.8712 (+0.0002), 50 controls." + }, + "EX-08": { + "plain": "Limit noted by the project: this proves a model was trained without the article, not that learned content was removed.", + "developer": "Exact retraining without an unreached range; does not remove content a model already learned." + }, + "EX-09": { + "plain": "Limit noted by the project: excluding text the run already saw means retraining from an earlier save point.", + "developer": "Brief wording." + }, + "EX-10": { + "plain": "Limit noted by the project: one run, no variance estimate.", + "developer": "n=1." + }, + "DL-conversation-model.pt": { + "plain": "conversation-model.pt, with the project's published SHA-256 shown next to it.", + "developer": "release-hashes.txt line 41" + }, + "DL-base-model.pt": { + "plain": "base-model.pt, with the project's published SHA-256 shown next to it.", + "developer": "release-hashes.txt line 1" + }, + "DL-chain.jsonl": { + "plain": "chain.jsonl (the training record), with the project's published SHA-256.", + "developer": "release-hashes.txt line 2" + }, + "DL-recipe.json": { + "plain": "recipe.json, with the project's published SHA-256.", + "developer": "release-hashes.txt line 42" + }, + "DL-fork-conversation-model.pt": { + "plain": "Verifiable exclusion run: conversation-model.pt, with the project's published SHA-256.", + "developer": "unlearning-3i-atlas/release-hashes.txt" + }, + "DL-fork-base-model.pt": { + "plain": "Verifiable exclusion run: base-model.pt, with the project's published SHA-256.", + "developer": "unlearning-3i-atlas/release-hashes.txt" + }, + "DL-gguf": { + "plain": "The project's GitHub release v1.0.1: ovl-23m-chat.gguf, for trying the model in Ollama or llama.cpp.", + "developer": "Asset sha256 541d49c9…80de, 142,815,808 bytes (GitHub API digest); same hash in ollama.md:23." + }, + "DL-modelfile": { + "plain": "The project's GitHub release v1.0.1: Modelfile.", + "developer": "Asset sha256 df4dacfc…fc8b, 722 bytes (GitHub API digest)." + }, + "DL-hf": { + "plain": "The project's Hugging Face dataset, pinned to revision 96dc282a.", + "developer": "AOSSIE/openverifiable-enwiki-20260901-20260918-r1-evidence@96dc282a." + }, + "DL-ollama": { + "plain": "The project's Ollama model: ryoari/openverifiablellm. Demo only.", + "developer": "ollama.com/ryoari/openverifiablellm" + }, + "LI-01": { + "plain": "Limit noted by the project: a small model that is often wrong about facts.", + "developer": "see OV-07" + }, + "LI-02": { + "plain": "Limit noted by the project: checks need an RTX 5090 and the same software.", + "developer": "see OV-12" + }, + "LI-03": { + "plain": "Limit: every check so far was by the project. Independent checks: none yet.", + "developer": "see VE-09" + }, + "LI-04": { + "plain": "Limit: check results, including the project's, are self-reported and unsigned.", + "developer": "see VE-10" + }, + "LI-05": { + "plain": "The project's timestamp proves the record existed by 20 October 2026, not how training was done.", + "developer": "README.md:123" + }, + "LI-06": { + "plain": "Limit noted by the project: a full check costs as much compute as the training itself.", + "developer": "simple_run.md:204" + } +} From 803a1f1642c86d973d6176c180974ad185ace46b Mon Sep 17 00:00:00 2001 From: Panshul Arora <170356171+panshularora@users.noreply.github.com> Date: Thu, 29 Oct 2026 18:58:48 +0530 Subject: [PATCH 02/75] feat(site): data validator and ledger audit Strict validator recomputes counts, odds, events and chain links; ledger audit enforces sources, banned phrases and number provenance. --- frontend/scripts/check-data.ts | 17 ++ frontend/src/content/audit.ts | 70 ++++++++ frontend/src/content/ledger-issues.json | 1 + frontend/src/content/ledger.ts | 96 +++++++++++ frontend/src/content/ui.json | 99 +++++++++++ frontend/src/content/ui.ts | 10 ++ frontend/src/data/context.tsx | 11 ++ frontend/src/data/format.ts | 26 +++ frontend/src/data/load.ts | 14 ++ frontend/src/data/path.ts | 11 ++ frontend/src/data/types.ts | 55 +++++++ frontend/src/data/validate.ts | 210 ++++++++++++++++++++++++ 12 files changed, 620 insertions(+) create mode 100644 frontend/scripts/check-data.ts create mode 100644 frontend/src/content/audit.ts create mode 100644 frontend/src/content/ledger-issues.json create mode 100644 frontend/src/content/ledger.ts create mode 100644 frontend/src/content/ui.json create mode 100644 frontend/src/content/ui.ts create mode 100644 frontend/src/data/context.tsx create mode 100644 frontend/src/data/format.ts create mode 100644 frontend/src/data/load.ts create mode 100644 frontend/src/data/path.ts create mode 100644 frontend/src/data/types.ts create mode 100644 frontend/src/data/validate.ts diff --git a/frontend/scripts/check-data.ts b/frontend/scripts/check-data.ts new file mode 100644 index 00000000..6d616295 --- /dev/null +++ b/frontend/scripts/check-data.ts @@ -0,0 +1,17 @@ +// Build gate: site-data.json must validate strictly (with chain hashes recomputed) and every +// rendered ledger claim must pass the wording and number rules. Any problem exits non-zero. +import { readFileSync } from 'node:fs'; +import { createHash } from 'node:crypto'; +import { validateStrict } from '../src/data/validate'; +import { auditClaims } from '../src/content/audit'; + +const sha = (s: string) => createHash('sha256').update(s).digest('hex'); +const raw: unknown = JSON.parse(readFileSync('public/data/site-data.json', 'utf8')); +const data = validateStrict(raw, sha); +const problems = auditClaims(data); +if (problems.length) { + console.error(`check-data: ${problems.length} ledger problem(s)`); + for (const p of problems) console.error(' -', p); + process.exit(1); +} +console.log(`check-data: OK (${data.chain.entries} entries, ${data.verifications.rowCount} check rows, ${data.verifications.tiles.length} tiles)`); diff --git a/frontend/src/content/audit.ts b/frontend/src/content/audit.ts new file mode 100644 index 00000000..5f9636ca --- /dev/null +++ b/frontend/src/content/audit.ts @@ -0,0 +1,70 @@ +import type { SiteData } from '../data/types'; +import { formatValue } from '../data/format'; +import issues from './ledger-issues.json' with { type: 'json' }; +import { bannedIn, claims, ledger, numbersIn, ui } from './ledger'; + +/** Every number a reader sees in a claim must be found in the claim's cited source lines or in site-data.json. */ +export function numberUniverse(data: SiteData): Set { + const out = new Set(); + const add = (v: unknown): void => { + if (typeof v === 'number') { + out.add(String(v)); + out.add(String(Math.trunc(v))); + out.add(formatValue(v, 'pct2').replace('%', '')); + for (let d = 1; d <= 5; d++) out.add(v.toFixed(d)); + } else if (typeof v === 'string') numbersIn(v).forEach((n) => out.add(n)); + else if (Array.isArray(v)) v.forEach(add); + else if (v && typeof v === 'object') Object.values(v).forEach(add); + }; + add({ ...data, claimSources: undefined }); + return out; +} + +const same = (a: string, set: Set) => set.has(a) || [...set].some((b) => Number(b) === Number(a) && !Number.isNaN(Number(a))); + +export interface LedgerIssue { id: string; part: string; number: string; reason: string } +export const KNOWN_ISSUES = issues as LedgerIssue[]; +const known = (id: string, part: string, n: string) => KNOWN_ISSUES.some((i) => i.id === id && i.part === part && i.number === n); + +/** Numbers the ledger states that the pinned files do not support. Reported, and pinned in ledger-issues.json + * so the build still fails on any new one. */ +export function unsupportedNumbers(data: SiteData): LedgerIssue[] { + const out: LedgerIssue[] = []; + const universe = numberUniverse(data); + for (const c of claims.values()) { + const local = new Set(); + for (const s of data.claimSources[c.id] ?? []) for (const n of numbersIn(`${s.text ?? ''} ${s.quote ?? ''} ${s.file} ${s.lines}`)) local.add(n); + for (const [part, text] of [['plain', c.plain], ['developer', c.developer], ['limit', c.limit ?? '']] as const) + for (const n of numbersIn(text)) if (!same(n, local) && !same(n, universe)) out.push({ id: c.id, part, number: n, reason: '' }); + } + return out; +} + +export function auditClaims(data: SiteData): string[] { + const errs: string[] = []; + const universe = numberUniverse(data); + for (const [k, v] of Object.entries(ui)) { + if (/\d/.test(v.replace('SHA-256', ''))) errs.push(`ui.${k}: UI labels must not carry numbers`); + for (const b of bannedIn(v)) errs.push(`ui.${k}: banned "${b}"`); + } + for (const c of claims.values()) { + const srcs = data.claimSources[c.id]; + if (!srcs || srcs.length === 0) { + errs.push(`${c.id}: no source`); + continue; + } + const local = new Set(); + for (const s of srcs) for (const n of numbersIn(`${s.text ?? ''} ${s.quote ?? ''} ${s.file} ${s.lines}`)) local.add(n); + for (const [part, text] of [['plain', c.plain], ['developer', c.developer], ['limit', c.limit ?? ''], ['verbatim', c.verbatim ?? '']] as const) { + for (const b of bannedIn(text)) errs.push(`${c.id}.${part}: banned "${b}"`); + if (part === 'verbatim') continue; + for (const n of numbersIn(text)) if (!same(n, local) && !same(n, universe) && !known(c.id, part, n)) errs.push(`${c.id}.${part}: number ${n} not in its sources or site-data.json`); + } + } + const ck02 = claims.get('CK-02'); + if (ck02 && ck02.verbatim !== data.check.commands) errs.push('CK-02: commands differ from README main@1049d2a7 lines'); + for (const i of KNOWN_ISSUES) if (!unsupportedNumbers(data).some((u) => u.id === i.id && u.part === i.part && u.number === i.number)) errs.push(`ledger-issues.json: ${i.id} ${i.number} is resolved; remove it`); + const allowed = ledger.claims.filter((c) => c.status === 'ALLOWED').length; + if (claims.size !== allowed) errs.push('allowed claim count drift'); + return errs; +} diff --git a/frontend/src/content/ledger-issues.json b/frontend/src/content/ledger-issues.json new file mode 100644 index 00000000..fe51488c --- /dev/null +++ b/frontend/src/content/ledger-issues.json @@ -0,0 +1 @@ +[] diff --git a/frontend/src/content/ledger.ts b/frontend/src/content/ledger.ts new file mode 100644 index 00000000..b72658e9 --- /dev/null +++ b/frontend/src/content/ledger.ts @@ -0,0 +1,96 @@ +// The site's words come from three files, none written by the site code: +// claims.json the claim ledger (Research Lab): ids, sources, limits, banned phrases +// copy.json plain-language headlines per claim id (Open Source Ops, from COPY.md) +// ui.json navigation, headings and table labels (no facts, no numbers) +import ledgerJson from './claims.json' with { type: 'json' }; +import copyJson from './copy.json' with { type: 'json' }; +import { ui } from './ui'; + +export interface LedgerSource { rev: string; file: string; lines: string | number; quote?: string | null } +export interface LedgerClaim { + id: string; + page: string; + status: 'ALLOWED' | 'CONFLICT' | 'UNSOURCED' | 'FORBIDDEN'; + plain: string; + developer: string; + value: unknown; + sources: LedgerSource[]; + rule: string | null; + limit: string | null; + note: string | null; + verbatim: string | null; +} +export interface Banned { phrase: string; why: string; exception?: string } +export interface Ledger { schema: 'ovllm.claims.v1'; pins: Record; claims: LedgerClaim[]; forbidden_phrases: Banned[] } +export type Who = 'project' | 'independent' | null; +export interface Claim { id: string; page: string; plain: string; developer: string; limit: string | null; verbatim: string | null; who: Who; sources: LedgerSource[] } + +export const ledger = ledgerJson as unknown as Ledger; +export const copy = copyJson as Record; +export { ui }; + +const CHECK_FILES = /verifications\.jsonl|hardware-map\.jsonl|loo-results\.json/; + +/** Who ran the check behind a claim. null = the claim states a fact or a rule, not a check result. */ +export function whoChecked(c: LedgerClaim): Who { + const isCheck = c.sources.some((s) => CHECK_FILES.test(s.file)) || /checked by the project/i.test(c.rule ?? ''); + if (!isCheck) return null; + return 'project'; +} + +const dash = (s: string | null) => (s === null || s.trim() === '' || s.trim() === '—' ? null : s); + +export function buildClaim(c: LedgerClaim, cp = copy): Claim { + const over = cp[c.id]; + return { + id: c.id, + page: c.page, + plain: over?.plain ?? c.plain, + developer: over?.developer ?? c.developer, + limit: dash(c.limit), + verbatim: c.verbatim, + who: whoChecked(c), + sources: c.sources, + }; +} + +/** Only ALLOWED claims are ever rendered. */ +export const claims: ReadonlyMap = new Map( + ledger.claims.filter((c) => c.status === 'ALLOWED').map((c) => [c.id, buildClaim(c)]), +); + +export function claim(id: string): Claim { + const c = claims.get(id); + if (!c) throw new Error(`claim ${id} is not an ALLOWED ledger claim`); + return c; +} +export { label, hasLabel } from './ui'; +export const claimsOn = (page: string, prefix?: string) => + [...claims.values()].filter((c) => c.page === page && (!prefix || c.id.startsWith(prefix))); + +/** Banned phrases from the ledger, with the ledger's own exceptions, plus the brief's wording rules. */ +/** styleRules: the brief's wording rules for the site's own copy; off when scanning verbatim source quotes. */ +export function bannedIn(text: string, banned: Banned[] = ledger.forbidden_phrases, styleRules = true): string[] { + const hits: string[] = []; + const low = text.toLowerCase(); + for (const b of banned) { + const p = b.phrase.toLowerCase(); + let t = low; + if (p.includes('unlearn')) t = t.replaceAll('unlearning-3i-atlas', ''); + if (p === 'us$1.50') t = t.replaceAll('us$1–1.50', ''); + if (p === 'signed results' || p === 'signed check results') t = t.replace(/[^.]*roadmap[^.]*/g, ''); + if (t.includes(p)) hits.push(b.phrase); + } + const rules: [RegExp, string][] = [ + [/\bwe\b/, 'bare "we"'], + [/\btraining steps?\b/, 'say "segments", not "steps"'], + [/\bone file\b/, 'never "one file"'], + [/\bsegment 8\b[^.\n]*\b(?:fresh|match)/, 'segment 8 is not in the pinned data'], + [/\bindependent(?:ly)? (?:fresh|computer|machine)\b/, 'the fresh machine is not independent'], + ]; + if (styleRules) for (const [re, why] of rules) if (re.test(low)) hits.push(why); + return hits; +} + +const NUM = /\d{1,3}(?:,\d{3})+(?:\.\d+)?|\d+(?:\.\d+)?/g; +export const numbersIn = (s: string): string[] => [...s.matchAll(NUM)].map((m) => m[0].replace(/,/g, '').replace(/\.$/, '')); diff --git a/frontend/src/content/ui.json b/frontend/src/content/ui.json new file mode 100644 index 00000000..2a4ca133 --- /dev/null +++ b/frontend/src/content/ui.json @@ -0,0 +1,99 @@ +{ + "site.title": "OpenVerifiableLLM", + "skip": "Skip to content", + "nav.label": "Pages", + "nav.overview": "Overview", + "nav.check": "Check it yourself", + "nav.verification": "Verification", + "nav.timeline": "Training timeline", + "nav.exclusion": "Verifiable exclusion", + "nav.downloads": "Downloads", + "h1.overview": "OpenVerifiableLLM: a model you can recompute", + "h1.check": "Check it yourself", + "h1.verification": "Verification", + "h1.timeline": "Training timeline", + "h1.exclusion": "Verifiable exclusion", + "h1.downloads": "Downloads", + "h2.trained": "What was trained", + "h2.evidence": "Evidence", + "h2.meaning": "What the words mean", + "h2.limits": "Limits", + "h2.map": "Coverage map", + "h2.rows": "Every recorded check, by who ran it", + "h2.odds": "Detection odds", + "h2.hardware": "Hardware map", + "h2.trust": "What you still have to trust", + "h2.try": "Try it", + "h2.consistency": "Consistency check", + "h2.actual": "Actual verification", + "h2.timestamps": "Timestamps", + "h2.record": "The training record", + "h2.events": "Events during training", + "h2.removed": "What was removed", + "h2.why": "Why the claim holds", + "h2.loss": "What removing it changed", + "h2.hf": "Pinned evidence files", + "h2.github": "GitHub release", + "h2.elsewhere": "Elsewhere", + "independent.label": "Independent checks:", + "limit": "Limit", + "source": "Source", + "developer": "For developers", + "who.project": "the project", + "who.independent": "independent", + "who.pending": "no check yet", + "result.MATCH": "MATCH", + "result.MISMATCH": "MISMATCH", + "result.NOT_RUN": "not run", + "copy": "Copy", + "copied": "Copied to clipboard.", + "copy.failed": "Copy failed. Select the text instead.", + "table.show": "Show the coverage map as a table", + "th.segment": "Segment", + "th.result": "Result", + "th.who": "Checked by", + "th.machine": "Computer", + "th.code": "Code", + "th.gpu": "GPU", + "th.driver": "Driver", + "th.hardware": "Hardware", + "th.software": "Software", + "th.note": "Note", + "th.file": "File", + "th.sha": "SHA-256", + "th.measure": "Measure", + "th.before": "Original model", + "th.after": "Model without the article", + "th.delta": "Change", + "loss.removed": "Loss on the removed article", + "loss.control": "Mean loss on control articles", + "tile.hint": "Select a segment to see every check recorded for it.", + "tile.checks": "Checks for segment", + "legend.project": "Outlined square: checked by the project", + "legend.independent": "Solid square: checked independently", + "legend.restart": "Flag: host restart", + "legend.code": "Bar: code change", + "event.restart": "host restart", + "event.code-change": "code change", + "phase.wikipedia": "Wikipedia", + "phase.conversation": "Conversation", + "odds.now": "now", + "odds.checks": "independent checks", + "download": "Download", + "release.simple-run": "Released model", + "release.unlearning-3i-atlas": "Verifiable exclusion fork", + "checker.project second pod": "the project's second computer", + "checker.project training pod": "the project's training computer", + "checker.project fresh machine public files only": "the project's fresh computer (public files only)", + "checker.project fork pod": "the project's fork computer", + "error.title": "Couldn't load this evidence.", + "error.body": "The data file is missing or did not pass validation, so nothing is shown as checked.", + "error.section": "Couldn't load this evidence.", + "error.retry": "Reload the page", + "loading": "Loading evidence…", + "empty": "No rows recorded.", + "footer": "Made with ♥ by AOSSIE Community", + "footer.data": "Evidence pinned at", + "notfound": "Page not found.", + "brief": "project brief (not public)" +} \ No newline at end of file diff --git a/frontend/src/content/ui.ts b/frontend/src/content/ui.ts new file mode 100644 index 00000000..0b4d8b44 --- /dev/null +++ b/frontend/src/content/ui.ts @@ -0,0 +1,10 @@ +import uiJson from './ui.json' with { type: 'json' }; + +/** Navigation, headings and table labels. No facts and no numbers live here. */ +export const ui = uiJson as Record; +export function label(key: string): string { + const v = ui[key]; + if (v === undefined) throw new Error(`missing UI label ${key}`); + return v; +} +export const hasLabel = (key: string) => key in ui; diff --git a/frontend/src/data/context.tsx b/frontend/src/data/context.tsx new file mode 100644 index 00000000..915f544e --- /dev/null +++ b/frontend/src/data/context.tsx @@ -0,0 +1,11 @@ +import { createContext, useContext } from 'react'; +import type { SectionErrors } from './validate'; +import type { SiteData } from './types'; + +export interface DataState { data: SiteData; errors: SectionErrors } +export const DataContext = createContext(null); +export function useData(): DataState { + const v = useContext(DataContext); + if (!v) throw new Error('DataContext missing'); + return v; +} diff --git a/frontend/src/data/format.ts b/frontend/src/data/format.ts new file mode 100644 index 00000000..c9ad1e0d --- /dev/null +++ b/frontend/src/data/format.ts @@ -0,0 +1,26 @@ +/** The only place values become text. Tests import this to recompute every displayed number. */ +export type Fmt = 'auto' | 'int' | 'pct2' | 'utc' | 'short' | 'raw' | 'list' | 'yesno'; + +const intFmt = new Intl.NumberFormat('en-US'); +const MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; + +export function formatValue(value: unknown, fmt: Fmt = 'auto'): string { + if (value === undefined || value === null) throw new Error('missing value'); + switch (fmt) { + case 'int': return intFmt.format(Number(value)); + case 'pct2': return `${(Number(value) * 100).toFixed(2)}%`; + case 'short': return `${String(value).slice(0, 8)}…`; + case 'list': return (value as unknown[]).map(String).join(', '); + case 'yesno': return value === true ? 'yes' : value === false ? 'no' : String(value); + case 'utc': { + const d = new Date(String(value)); + if (Number.isNaN(d.getTime())) throw new Error(`bad date ${String(value)}`); + const p = (n: number) => String(n).padStart(2, '0'); + return `${d.getUTCDate()} ${MONTHS[d.getUTCMonth()]} ${d.getUTCFullYear()}, ${p(d.getUTCHours())}:${p(d.getUTCMinutes())}:${p(d.getUTCSeconds())} UTC`; + } + case 'raw': + case 'auto': + default: + return String(value); + } +} diff --git a/frontend/src/data/load.ts b/frontend/src/data/load.ts new file mode 100644 index 00000000..5332e19a --- /dev/null +++ b/frontend/src/data/load.ts @@ -0,0 +1,14 @@ +import { validateSite, type Validated } from './validate'; + +export const DATA_URL = `${import.meta.env.BASE_URL}data/site-data.json`; + +/** Fetch and validate. Any failure returns an error, never partial "success" data. */ +export async function loadData(fetcher: typeof fetch = fetch): Promise { + try { + const res = await fetcher(DATA_URL, { cache: 'no-cache' }); + if (!res.ok) return { error: `HTTP ${res.status}` }; + return validateSite(await res.json()); + } catch (e) { + return { error: e instanceof Error ? e.message : String(e) }; + } +} diff --git a/frontend/src/data/path.ts b/frontend/src/data/path.ts new file mode 100644 index 00000000..cea0c036 --- /dev/null +++ b/frontend/src/data/path.ts @@ -0,0 +1,11 @@ +/** Read a dotted path ("odds.p95", "events.0.segment", "hardware.length") from a JSON value. */ +export function getPath(root: unknown, path: string): unknown { + let cur: unknown = root; + for (const key of path.split('.')) { + if (cur === null || cur === undefined) return undefined; + if (Array.isArray(cur) && key === 'length') { cur = cur.length; continue; } + if (typeof cur !== 'object') return undefined; + cur = (cur as Record)[key]; + } + return cur; +} diff --git a/frontend/src/data/types.ts b/frontend/src/data/types.ts new file mode 100644 index 00000000..fedd5088 --- /dev/null +++ b/frontend/src/data/types.ts @@ -0,0 +1,55 @@ +export type Result = 'MATCH' | 'MISMATCH'; +export type CheckedBy = 'project' | 'independent'; + +export interface Src { + origin: 'hf' | 'github'; + file: string; + rev: string; + line: number | null; + lineEnd: number | null; + raw: string | null; + checkedBy: CheckedBy | null; + url: string; +} +export interface Boundary { index: number; kind: string; phase: string; time: number; utc: string; model: string; state: string; previous: string | null; src: Src } +export interface CheckRow { segment: number; result: Result; checker: string; machine: string; checkedBy: CheckedBy; code?: string | null; gpu?: string | null; driver?: string | null; src: Src } +export interface Group { checker: string; machine: string; checkedBy: CheckedBy; rows: number; match?: number; segments: number[] } +export interface Tile { segment: number; phase: string; result: Result | 'NOT_RUN'; checkedBy: CheckedBy | 'pending'; checks: number[]; events: string[] } +export interface EventItem { id: 'restart' | 'code-change'; segment: number; src: Src; gapSeconds?: number; medianGapSeconds?: number; codeBefore?: string; codeAfter?: string } +export interface HardwareRow { segment: string; result: Result; hardware: string; driver: string; software: string; note: string; src: Src } +export interface DownloadFile { file: string; sha256: string; download: string; src: Src } +export interface Release { release: string; files: DownloadFile[] } +export interface Loss { before: number; after: number; delta: number } + +export interface ClaimSource { origin: 'hf' | 'github' | 'github-release' | 'brief'; file: string; rev: string; lines: string; text: string | null; url: string | null; quote: string | null } + +export interface SiteData { + schema: 'ovl-site-data.v2'; + dataset: string; + revision: string; + revShort: string; + hfTree: string; + upstream: { repo: string; commit: string; short: string }; + rawFiles: Record; + model: { millionParameters: number; src: Src; recipe: { layers: number; seed: number } }; + chain: { entries: number; segments: number; phases: { phase: string; first: number; last: number }[]; boundaries: Boundary[]; start: string; end: string; kinds: Record }; + verifications: { + rows: CheckRow[]; rowCount: number; groups: Group[]; tiles: Tile[]; machines: number; allMatch: boolean; + segmentsMatched: number; secondMachineMatched: number; secondMachine: string; freshMachine: string; freshSegments: number[]; + projectChecks: number; independentChecks: number; src: Src; + }; + odds: { N: number; Nm1: number; formula: string; m95: number; m99: number; p95: number; p99: number; pAtN: number; currentM: number; currentP: number; src: Src }; + events: EventItem[]; + hardware: HardwareRow[]; + downloads: Release[]; + anchor: { sha256: string; chainHead: string; entries: number; tsa: { authority: string; genTime: string; src: Src }[]; src: Src }; + exclusion: { + title: string; page: string; pageRevision: string; titleSrc: Src; entries: number; sharedPrefix: number; sharedFirst: number; sharedLast: number; + forkIndex: number; rows: CheckRow[]; rowCount: number; groups: Group[]; allMatch: boolean; controls: number; + removedLoss: Loss; controlLoss: Loss; src: Src; + }; + preparation: { sha256: string; articles: number; wikipediaTargets: number; conversations: number; conversationTargets: number; src: Src }; + claimSources: Record; + claimExtraSources: Record; + check: { intro: string; introSrc: Src; commands: string; commandsSrc: Src; runpod: string; runpodSrc: Src; cost: string; costSrc: Src }; +} diff --git a/frontend/src/data/validate.ts b/frontend/src/data/validate.ts new file mode 100644 index 00000000..c975c315 --- /dev/null +++ b/frontend/src/data/validate.ts @@ -0,0 +1,210 @@ +import type { CheckRow, SiteData, Src, Tile } from './types'; + +export class DataError extends Error { + override name = 'DataError'; +} +export const SECTIONS = ['chain', 'verifications', 'odds', 'events', 'hardware', 'downloads', 'anchor', 'exclusion', 'preparation', 'check', 'model'] as const; +export type SectionId = (typeof SECTIONS)[number]; +export type SectionErrors = Partial>; +export interface Validated { data: SiteData; errors: SectionErrors } +export type Sha256 = (text: string) => string; + +export const PINNED_REVISION = /^96dc282a[0-9a-f]{32}$/; +export const UPSTREAM_COMMIT = '1049d2a782b8f63103abfa0cca8deab0d2037290'; +const HEX64 = /^[0-9a-f]{64}$/; +const RESULTS = new Set(['MATCH', 'MISMATCH']); + +function must(cond: unknown, msg: string): asserts cond { + if (!cond) throw new DataError(msg); +} +const isObj = (v: unknown): v is Record => typeof v === 'object' && v !== null && !Array.isArray(v); +const close = (a: number, b: number) => Math.abs(a - b) < 1e-9; + +function checkSrc(s: unknown, where: string, needRaw = false): void { + must(isObj(s), `${where}: missing source`); + must(typeof s.file === 'string' && s.file.length > 0, `${where}: source without file`); + must(typeof s.url === 'string' && s.url.startsWith('https://'), `${where}: source URL must be https`); + must(s.rev === '96dc282a' || s.rev === UPSTREAM_COMMIT.slice(0, 8), `${where}: source not at a pinned revision`); + if (needRaw) must(typeof s.raw === 'string' && s.raw.length > 0 && typeof s.line === 'number', `${where}: row without source line`); +} + +const whoOf = (checker: string) => (checker.startsWith('project') ? 'project' : 'independent'); + +/** Smallest M with 1-((N-1)/N)^M >= p. Recomputed here so a typed constant can't drift. */ +export function minChecks(N: number, p: number): number { + let m = 0; + while (1 - ((N - 1) / N) ** m < p) m += 1; + return m; +} +export const detect = (N: number, m: number) => 1 - ((N - 1) / N) ** m; + +function checkRows(rows: unknown, where: string, N: number): asserts rows is CheckRow[] { + must(Array.isArray(rows) && rows.length > 0, `${where}: no rows`); + rows.forEach((r: unknown, i) => { + must(isObj(r), `${where}[${i}] not an object`); + must(RESULTS.has(r.result as string), `${where}[${i}]: unknown result ${String(r.result)}`); + must(typeof r.checker === 'string', `${where}[${i}]: no checker`); + must(r.checkedBy === whoOf(r.checker), `${where}[${i}]: checkedBy does not follow the checker`); + must(Number.isInteger(r.segment) && (r.segment as number) >= 0 && (r.segment as number) <= N, `${where}[${i}]: segment out of range`); + checkSrc(r.src, `${where}[${i}]`, true); + }); +} + +const sections: Record void> = { + model(d) { + must(Number.isInteger(d.model?.millionParameters) && d.model.millionParameters > 0, 'model size'); + checkSrc(d.model.src, 'model', true); + }, + chain(d, sha) { + const c = d.chain, B = c?.boundaries; + must(Array.isArray(B) && B.length === c.entries && c.segments === B.length - 1, 'segment count != entries-1'); + B.forEach((b, i) => { + must(b.index === i, `chain index gap at ${i}`); + checkSrc(b.src, `chain[${i}]`, true); + if (sha) must(i === 0 ? b.previous === null : b.previous === sha(B[i - 1]!.src.raw ?? ''), `chain link broken at ${i}`); + }); + must(Array.isArray(c.phases) && c.phases.length > 0, 'chain phases'); + const covered = c.phases.reduce((n, p) => n + p.last - p.first + 1, 0); + must(covered === c.segments, 'phases do not cover every segment'); + }, + verifications(d) { + const v = d.verifications, N = d.chain.segments; + checkRows(v?.rows, 'verifications', N - 1); + must(v.rowCount === v.rows.length, `row count ${v.rowCount} != ${v.rows.length} rows`); + const checkers = [...new Set(v.rows.map((r) => r.checker))]; + must(v.machines === checkers.length && v.groups.length === checkers.length, 'machine count drift'); + for (const g of v.groups) { + const mine = v.rows.filter((r) => r.checker === g.checker); + must(g.rows === mine.length, `group ${g.checker} row count drift`); + must(g.checkedBy === whoOf(g.checker), `group ${g.checker} checkedBy drift`); + must(JSON.stringify([...g.segments].sort((a, b) => a - b)) === JSON.stringify([...new Set(mine.map((r) => r.segment))].sort((a, b) => a - b)), `group ${g.checker} segments drift`); + } + must(v.groups.reduce((n, g) => n + g.rows, 0) === v.rowCount, 'groups do not add up to all rows'); + must(Array.isArray(v.tiles) && v.tiles.length === N, `tile count ${v.tiles?.length} != ${N} segments`); + v.tiles.forEach((t: Tile, k) => { + must(t.segment === k, `tile ${k} out of order`); + const idx = v.rows.flatMap((r, i) => (r.segment === k ? [i] : [])); + must(JSON.stringify(idx) === JSON.stringify(t.checks), `tile ${k} checks drift`); + const res = idx.map((i) => v.rows[i]!.result); + const want = res.length === 0 ? 'NOT_RUN' : res.every((x) => x === 'MATCH') ? 'MATCH' : 'MISMATCH'; + must(t.result === want, `tile ${k} result drift`); + }); + must(v.segmentsMatched === v.tiles.filter((t) => t.result === 'MATCH').length, 'segmentsMatched drift'); + must(v.secondMachineMatched === new Set(v.rows.filter((r) => r.checker === v.secondMachine && r.result === 'MATCH').map((r) => r.segment)).size, 'secondMachineMatched drift'); + must(v.independentChecks === v.rows.filter((r) => r.checkedBy === 'independent').length, 'independent count drift'); + must(v.projectChecks === v.rows.filter((r) => r.checkedBy === 'project').length, 'project count drift'); + must(v.allMatch === v.rows.every((r) => r.result === 'MATCH'), 'allMatch drift'); + must(JSON.stringify(v.freshSegments) === JSON.stringify(v.rows.filter((r) => r.checker === v.freshMachine).map((r) => r.segment)), 'fresh-machine segments drift'); + }, + odds(d) { + const o = d.odds, N = d.chain.segments; + must(o.N === N && o.Nm1 === N - 1, 'odds N drift'); + must(o.formula === `1 − (${N - 1}/${N})^M`, 'odds formula drift'); + must(o.m95 === minChecks(N, 0.95) && o.m99 === minChecks(N, 0.99), 'odds M is not the minimal value'); + must(close(o.p95, detect(N, o.m95)) && close(o.p99, detect(N, o.m99)) && close(o.pAtN, detect(N, N)), 'odds probability drift'); + must(o.currentM === d.verifications.independentChecks && close(o.currentP, detect(N, o.currentM)), 'odds M != independent check count'); + checkSrc(o.src, 'odds', true); + }, + events(d) { + must(Array.isArray(d.events) && d.events.length > 0, 'no events'); + for (const e of d.events) { + checkSrc(e.src, `event ${e.id}`, true); + const tile = d.verifications.tiles[e.segment]; + must(tile && tile.events.includes(e.id), `event ${e.id} not marked on tile ${e.segment}`); + } + for (const t of d.verifications.tiles) for (const id of t.events) must(d.events.some((e) => e.id === id && e.segment === t.segment), `tile ${t.segment} marks unknown event ${id}`); + const cc = d.events.find((e) => e.id === 'code-change'); + if (cc) { + const second = d.verifications.rows.filter((r) => r.checker === d.verifications.secondMachine).sort((a, b) => a.segment - b.segment); + const at = second.findIndex((r, i) => i > 0 && r.code !== second[i - 1]!.code); + must(at > 0 && second[at]!.segment === cc.segment, 'code-change segment does not follow the data'); + } + }, + hardware(d) { + must(Array.isArray(d.hardware) && d.hardware.length > 0, 'no hardware rows'); + d.hardware.forEach((h, i) => { + must(RESULTS.has(h.result), `hardware[${i}] result`); + must(typeof h.hardware === 'string' && h.hardware.length > 0, `hardware[${i}] name`); + checkSrc(h.src, `hardware[${i}]`, true); + }); + }, + downloads(d) { + must(Array.isArray(d.downloads) && d.downloads.length > 0, 'no downloads'); + for (const r of d.downloads) { + must(Array.isArray(r.files) && r.files.length > 0, `${r.release}: no files`); + for (const f of r.files) { + must(HEX64.test(f.sha256), `bad sha256 for ${f.file}`); + must(f.download.startsWith('https://huggingface.co/') && f.download.includes(d.revision), `${f.file}: download not pinned`); + checkSrc(f.src, f.file, true); + } + } + }, + anchor(d, sha) { + const a = d.anchor; + must(HEX64.test(a.sha256) && HEX64.test(a.chainHead), 'anchor hashes'); + must(a.entries === d.chain.entries, 'anchor entry count mismatch'); + if (sha) must(sha(d.chain.boundaries.at(-1)?.src.raw ?? '') === a.chainHead, 'chain head != anchor.json'); + must(a.tsa.length > 0 && a.tsa.every((t) => !Number.isNaN(Date.parse(t.genTime))), 'timestamp tokens'); + }, + exclusion(d) { + const x = d.exclusion; + checkRows(x.rows, 'exclusion', x.entries); + must(x.rowCount === x.rows.length, 'exclusion row count drift'); + must(x.allMatch === x.rows.every((r) => r.result === 'MATCH'), 'exclusion allMatch drift'); + must(x.groups.reduce((n, g) => n + g.rows, 0) === x.rowCount, 'exclusion groups'); + must(x.sharedLast === x.sharedFirst + x.sharedPrefix - 1, 'shared prefix drift'); + for (const l of [x.removedLoss, x.controlLoss]) must(close(l.delta, Math.round((l.after - l.before) * 1e4) / 1e4), 'loss delta drift'); + checkSrc(x.titleSrc, 'exclusion title', true); + }, + preparation(d) { + const p = d.preparation; + must(HEX64.test(p.sha256), 'preparation sha'); + must(p.src.file.includes(p.sha256), 'preparation.json sha256 != its folder id'); + for (const k of ['articles', 'wikipediaTargets', 'conversations'] as const) must(Number.isInteger(p[k]) && p[k] > 0, `preparation.${k}`); + }, + check(d) { + const c = d.check; + must(typeof c.commands === 'string' && c.commands.includes('--branch v1.0.1'), 'commands must clone --branch v1.0.1 (README main@1049d2a7)'); + for (const s of [c.introSrc, c.commandsSrc, c.costSrc, c.runpodSrc] as Src[]) { + checkSrc(s, 'check', true); + must(s.url.includes(UPSTREAM_COMMIT), 'check sources must be at 1049d2a7'); + } + must(c.commandsSrc.raw === c.commands, 'commands are not verbatim'); + must(c.costSrc.file === 'docs/design/simple_run.md' && c.costSrc.line === 85 && (c.costSrc.raw ?? '').includes(c.cost), 'cost is not cited from simple_run.md:85'); + }, +}; + +function walkUrls(o: unknown): void { + if (Array.isArray(o)) return o.forEach(walkUrls); + if (!isObj(o)) return; + for (const [k, v] of Object.entries(o)) { + if ((k === 'url' || k === 'download' || k === 'runpod' || k === 'hfTree') && typeof v === 'string') must(v.startsWith('https://'), `disallowed URL scheme ${v}`); + walkUrls(v); + } +} + +/** Fatal problems throw; a broken section is reported so only that section shows the fallback. */ +export function validateSite(input: unknown, sha?: Sha256): Validated { + must(isObj(input), 'data is not an object'); + must(input.schema === 'ovl-site-data.v2', 'unknown schema'); + must(typeof input.revision === 'string' && PINNED_REVISION.test(input.revision), 'revision is not the pinned 96dc282a'); + walkUrls(input); + const data = input as unknown as SiteData; + const errors: SectionErrors = {}; + for (const id of SECTIONS) { + try { + sections[id](data, sha); + } catch (e) { + errors[id] = e instanceof Error ? e.message : String(e); + } + } + return { data, errors }; +} + +/** Build-time: any problem at all fails. */ +export function validateStrict(input: unknown, sha?: Sha256): SiteData { + const { data, errors } = validateSite(input, sha); + const first = Object.entries(errors)[0]; + if (first) throw new DataError(`${first[0]}: ${first[1]}`); + return data; +} From feba19a5276cfdfc8b4c187f89e2592e6562bb9b Mon Sep 17 00:00:00 2001 From: Panshul Arora <170356171+panshularora@users.noreply.github.com> Date: Thu, 29 Oct 2026 18:58:48 +0530 Subject: [PATCH 03/75] feat(site): six-page static evidence site with prerendering Overview, Check it yourself, Verification, Training timeline, Verifiable exclusion and Downloads. Lazy routes, section error boundaries, phone budget. --- frontend/.gitignore | 5 + frontend/eslint.config.js | 20 + frontend/index.html | 14 + frontend/package-lock.json | 4138 +++++++++++++++++ frontend/package.json | 49 + frontend/public/fonts/Inter-OFL.txt | 93 + .../public/fonts/InterVariable-latin.woff2 | Bin 0 -> 48256 bytes frontend/public/fonts/JetBrainsMono-OFL.txt | 93 + .../fonts/JetBrainsMono-Regular-latin.woff2 | Bin 0 -> 21168 bytes frontend/public/fonts/SourceSerif4-OFL.txt | 93 + .../fonts/SourceSerif4Variable-latin.woff2 | Bin 0 -> 50936 bytes frontend/scripts/check-budget.mjs | 33 + frontend/scripts/prerender.mjs | 20 + frontend/scripts/static-server.mjs | 26 + frontend/src/App.tsx | 85 + frontend/src/components/ClaimBlock.tsx | 82 + frontend/src/components/CommandBlock.tsx | 25 + frontend/src/components/CoverageMap.tsx | 126 + frontend/src/components/Downloads.tsx | 28 + frontend/src/components/HardwareMap.tsx | 56 + frontend/src/components/Hash.tsx | 26 + frontend/src/components/LossTable.tsx | 36 + frontend/src/components/OddsBar.tsx | 51 + frontend/src/components/RowGroups.tsx | 46 + frontend/src/components/Section.tsx | 34 + frontend/src/components/SourceChip.tsx | 25 + frontend/src/components/Timeline.tsx | 48 + frontend/src/components/text.tsx | 30 + frontend/src/content/ui.json | 18 +- frontend/src/entry-server.tsx | 22 + frontend/src/main.tsx | 46 + frontend/src/pages/Check.tsx | 27 + frontend/src/pages/Downloads.tsx | 37 + frontend/src/pages/Exclusion.tsx | 35 + frontend/src/pages/Overview.tsx | 51 + frontend/src/pages/Timeline.tsx | 31 + frontend/src/pages/Verification.tsx | 70 + frontend/src/routes.ts | 19 + frontend/src/styles/site.css | 178 + frontend/tsconfig.json | 23 + frontend/vite.config.ts | 34 + 41 files changed, 5871 insertions(+), 2 deletions(-) create mode 100644 frontend/.gitignore create mode 100644 frontend/eslint.config.js create mode 100644 frontend/index.html create mode 100644 frontend/package-lock.json create mode 100644 frontend/package.json create mode 100644 frontend/public/fonts/Inter-OFL.txt create mode 100644 frontend/public/fonts/InterVariable-latin.woff2 create mode 100644 frontend/public/fonts/JetBrainsMono-OFL.txt create mode 100644 frontend/public/fonts/JetBrainsMono-Regular-latin.woff2 create mode 100644 frontend/public/fonts/SourceSerif4-OFL.txt create mode 100644 frontend/public/fonts/SourceSerif4Variable-latin.woff2 create mode 100644 frontend/scripts/check-budget.mjs create mode 100644 frontend/scripts/prerender.mjs create mode 100644 frontend/scripts/static-server.mjs create mode 100644 frontend/src/App.tsx create mode 100644 frontend/src/components/ClaimBlock.tsx create mode 100644 frontend/src/components/CommandBlock.tsx create mode 100644 frontend/src/components/CoverageMap.tsx create mode 100644 frontend/src/components/Downloads.tsx create mode 100644 frontend/src/components/HardwareMap.tsx create mode 100644 frontend/src/components/Hash.tsx create mode 100644 frontend/src/components/LossTable.tsx create mode 100644 frontend/src/components/OddsBar.tsx create mode 100644 frontend/src/components/RowGroups.tsx create mode 100644 frontend/src/components/Section.tsx create mode 100644 frontend/src/components/SourceChip.tsx create mode 100644 frontend/src/components/Timeline.tsx create mode 100644 frontend/src/components/text.tsx create mode 100644 frontend/src/entry-server.tsx create mode 100644 frontend/src/main.tsx create mode 100644 frontend/src/pages/Check.tsx create mode 100644 frontend/src/pages/Downloads.tsx create mode 100644 frontend/src/pages/Exclusion.tsx create mode 100644 frontend/src/pages/Overview.tsx create mode 100644 frontend/src/pages/Timeline.tsx create mode 100644 frontend/src/pages/Verification.tsx create mode 100644 frontend/src/routes.ts create mode 100644 frontend/src/styles/site.css create mode 100644 frontend/tsconfig.json create mode 100644 frontend/vite.config.ts diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 00000000..081cd71b --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,5 @@ +node_modules +dist +dist-ssr +test-results +playwright-report diff --git a/frontend/eslint.config.js b/frontend/eslint.config.js new file mode 100644 index 00000000..8d6afeff --- /dev/null +++ b/frontend/eslint.config.js @@ -0,0 +1,20 @@ +import js from '@eslint/js'; +import tseslint from 'typescript-eslint'; +import hooks from 'eslint-plugin-react-hooks'; +import globals from 'globals'; + +export default tseslint.config( + { ignores: ['dist', 'dist-ssr', 'node_modules', 'test-results', 'playwright-report'] }, + js.configs.recommended, + ...tseslint.configs.strict, + { + files: ['**/*.{ts,tsx,js,mjs}'], + languageOptions: { globals: { ...globals.browser, ...globals.node } }, + plugins: { 'react-hooks': hooks }, + rules: { + ...hooks.configs.recommended.rules, + // noUncheckedIndexedAccess is on; indexes into validated data (validate.ts) are asserted with `!`. + '@typescript-eslint/no-non-null-assertion': 'off', + }, + }, +); diff --git a/frontend/index.html b/frontend/index.html new file mode 100644 index 00000000..682484ac --- /dev/null +++ b/frontend/index.html @@ -0,0 +1,14 @@ + + + + + + + + OpenVerifiableLLM + + +
+ + + diff --git a/frontend/package-lock.json b/frontend/package-lock.json new file mode 100644 index 00000000..6ba71eae --- /dev/null +++ b/frontend/package-lock.json @@ -0,0 +1,4138 @@ +{ + "name": "openverifiablellm-site", + "version": "0.3.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "openverifiablellm-site", + "version": "0.3.0", + "dependencies": { + "react": "^19.3.1", + "react-dom": "^19.3.1" + }, + "devDependencies": { + "@axe-core/playwright": "^4.13.0", + "@eslint/js": "^9.39.5", + "@playwright/test": "^1.64.1", + "@testing-library/dom": "^10.4.2", + "@testing-library/react": "^16.3.3", + "@types/node": "^20.19.43", + "@types/react": "^19.3.0", + "@types/react-dom": "^19.3.0", + "@vitejs/plugin-react": "^5.2.0", + "eslint": "^9.39.5", + "eslint-plugin-react-hooks": "^7.1.1", + "globals": "^17.13.0", + "happy-dom": "^21.0.4", + "typescript": "^6.0.3", + "typescript-eslint": "^8.72.1", + "vite": "^7.3.7", + "vite-node": "^3.2.4", + "vitest": "^3.2.7" + }, + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/@axe-core/playwright": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@axe-core/playwright/-/playwright-4.13.0.tgz", + "integrity": "sha512-6YLx+kxXu5GJceG4ozFg+33a2EMTdjYwWGloJ3sb9Kta5pp+ZNS53uxGVog5JetIY8s++P5UrtX+cri+u0VAVg==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "axe-core": "~4.13.0" + }, + "peerDependencies": { + "playwright-core": ">= 1.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.11", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.11.tgz", + "integrity": "sha512-snZbO7MEDOof+hvNa97EjEY7qD7h2kwvQr5AJC3ZhQudKW5dnej6k3kP9NQV88hJwaS8vDqRLFo9rivLEhle2g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.10.tgz", + "integrity": "sha512-EMCx3AGZ3WfAl6ht7AyQoPm2Lh+BGYEMdc4Q6Hf7uSCDOZFuLq44qNwL+iaim8VlyYhRAo4X43+weadK8ZB4Yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.8" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.11", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.11.tgz", + "integrity": "sha512-OZ6+oaK7GMyg3IfCpj8JOmn8n+w2rJbDT0LLfVDTLb1ZFeKDh3AiNELgCMUw175IJHSkLl74hG0M0VLsvx+gag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.11" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.29.7.tgz", + "integrity": "sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.29.7.tgz", + "integrity": "sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.10", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.10.tgz", + "integrity": "sha512-NpugTzbKgGrNe45Ui32cN8vCFFMxVtP/9rtfwv0nP5FRDAjvYBxJcLVpYA9mr1jxP6cnIT7x9LUzuDTbWYYNRA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.10.tgz", + "integrity": "sha512-B3lYAs2nkKskbgQ1nfy8Ma9ao9Q1rntTAQHrzzyDuj+TSO+X3le6PfWwqDvodsb+OumE10eMFfuMCTQSQ5iuIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.8", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.9", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.8", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.11", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.11.tgz", + "integrity": "sha512-WCsemW40Cpc6gouC1SrY6PBaZ+oLRlEVY9XBvZBI7il/HyUrb2nJ505wE1MHEFyDZNnrWDEuy4jL50WVHfTTSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.11", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz", + "integrity": "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.2.tgz", + "integrity": "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz", + "integrity": "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.2.tgz", + "integrity": "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz", + "integrity": "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz", + "integrity": "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz", + "integrity": "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz", + "integrity": "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz", + "integrity": "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz", + "integrity": "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz", + "integrity": "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz", + "integrity": "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz", + "integrity": "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz", + "integrity": "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz", + "integrity": "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz", + "integrity": "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz", + "integrity": "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz", + "integrity": "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz", + "integrity": "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz", + "integrity": "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz", + "integrity": "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz", + "integrity": "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz", + "integrity": "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz", + "integrity": "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz", + "integrity": "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz", + "integrity": "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", + "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.5" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.7.tgz", + "integrity": "sha512-F42g89Qd5oAWtp0k0nnSrjziAKza7w8SVT4mStc18LZMaRb4J1HQAHLCalEtDCxrTuksx7NU9qsmeLwpOfPqWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.14.0", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.3.2", + "minimatch": "^3.1.5", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.5", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.5.tgz", + "integrity": "sha512-QywQuszQh77pIXCsq998c8hbhSTI/azTty1Z6N53dmAudKHhy573j3yvRLsX2BSp8YpLtoCEG8E9DJe+8zUh4A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@napi-rs/lzma-linux-x64-gnu": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", + "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^22.20 || ^24.12 || >=25" + } + }, + "node_modules/@playwright/test": { + "version": "1.64.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.64.1.tgz", + "integrity": "sha512-IaYGml/nSOiZWROfPtuIL7neuu9qDOZ3TNvNljUIrhDMxiGTgPjzj/g9p9RxpS2tSepPDRY+UwAaEeiKtUvIAg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.64.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.3", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.3.tgz", + "integrity": "sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.66.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.66.0.tgz", + "integrity": "sha512-7y4XeoUHPecjfUDRmap8U0q6bjfLAPn7uOGT8BKyqy8uNDOjsGS8rlBhOx6sZLVwwjN6hapvGl2mW9/IS6UNww==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.66.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.66.0.tgz", + "integrity": "sha512-e8WugYZXpgqrlMXLCudYVRAxAcK7AIY36JxRDwFRD38L9q62G1VsEUW6ijXxzjxYjNB8i1zo3B/ycIQ/qjLC/Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.66.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.66.0.tgz", + "integrity": "sha512-6vkDCfyDjNLokh+Rt1D2KtNgFFMEPdkWha/mbtP4cSjh9xiN8T/JBS/A7nDYKjmMAXHrvR9J3AzUk2LtFbIBLg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.66.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.66.0.tgz", + "integrity": "sha512-/mzZAX0+Q6eXxvkR0HB0RZCCrsbmFD8DpsvCQoMYABDfq/DjqkbfytuJ7GvZ4AhR/Mgis2fXbZrGqfbcK2Z5fA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.66.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.66.0.tgz", + "integrity": "sha512-JQJx9E8tUjGqed1RevDmoHaS3V30ODdV8uyvGxlwd4K5se6bkPrMeltSybqAtpJ+ltDRfo7FORQaJG2Hd5nGog==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.66.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.66.0.tgz", + "integrity": "sha512-GEaUQQjMaG7X1304qMgqLjzCKv6CdDirzJSS+UqUs3xhJ9X2Kjzu0JDbLoUU42FWxwmZqz+SsgU1SlQv9GNRVA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.66.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.66.0.tgz", + "integrity": "sha512-DgmAU9N0NhDQDzHgFUocDio7zRO8jR/nY/obDGvCR8zbJ6J77Fg6X49yPuExJUpYPbC82EOaRhG969pWzUSnHQ==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.66.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.66.0.tgz", + "integrity": "sha512-zG09YZ+sk/HoHq+P9gYB0EseQ3M20RbDuKGWey6fbiMDV1LxfXvhgSW9jDaCcvFPMgfLXpimzXY+UYvA8R2mLQ==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.66.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.66.0.tgz", + "integrity": "sha512-vlArhgyXbcVc1D4WZPoiYuqJIaMiSHBj6etRXua0KlfjlZeuiQyVAPYi0/N49O4mSp3u1iGUBLEjNa8ec81XZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.66.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.66.0.tgz", + "integrity": "sha512-RxJZtk0G87YPotDaRDvRqStV8cbqLSC5TroHvQHHKsqBg0ok64RxKgtXeFsa7FBcy7mb4crBrG3xK8USWIqWNA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.66.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.66.0.tgz", + "integrity": "sha512-qlGcw959PrLLkZhiBxF3OZ6SQvj+OKY85mCqGNgSRs4LZlDJ6ICqmz6UdxtINdhcXYwNIbZoapQVBAmZlD2hUQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.66.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.66.0.tgz", + "integrity": "sha512-TvTI/7Cy0WvRA1SXgwzu6bwXBnMpmeT/ln5q7WvSpqmXy1VbmEnY8HVIDQNBiaHJvoWqRr0M4FNo7qiqtyMaFw==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.66.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.66.0.tgz", + "integrity": "sha512-UZEDkSoDRZ50NyLj70nO6mpIK3dvs2cPTTvQb1bA/PBDmr9fvn5KiESuGfh6srd7Zi6Lt9Sv2sVrFr1QoHLvPQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.66.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.66.0.tgz", + "integrity": "sha512-VRbxTvagLh3HRcysx1CNq+HHcvJbSebNI6fCbk7jwmmWHkXjrSIV3igXBpRHUTFdg0pagWGu50xoSZXnrZHjVQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.66.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.66.0.tgz", + "integrity": "sha512-uWdJpvYqh0LE/i+YBL3sMX0a2kUkICENjmrPmyBmMOFc3jMrs6MSQH/pMD+VIpGEoUcr3XkHGLLfymzIqPSRRg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.66.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.66.0.tgz", + "integrity": "sha512-3FUd88pxgWAjK60OgCrika1AcNG+u8zaCdWjg4TlcZTDkt5TGyci8ZU64l3OJ9ax0MEjw3P80B/3PoSQDCLwJQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.66.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.66.0.tgz", + "integrity": "sha512-qT2rMmgyej62g5AdwktK+Bt2lBu497pzWZe12TTQ5JmZjOYPnEwcPEAOSLTBxBV+6gIES75rXm219v/QkT397A==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.66.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.66.0.tgz", + "integrity": "sha512-E46rnZgp7J84Qwe8RMlF+rgimnDo/9fuiGbUArGB0ZkMWf97O7yeSCfKls5x/YJOF0RcuSe9RctuKe1hlxICiA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.66.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.66.0.tgz", + "integrity": "sha512-Uz1HiZe+qBzqgdPsON+z0wRx3WdATuyzwvGT6cr2VZVrqqko0ZJVfkrQJtwDMuDcAfXYdo7XucaxJ7lTLjEcgg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.66.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.66.0.tgz", + "integrity": "sha512-Ph7TX3Ex5qdfcb7Tc6eEPugVkRfJ501eTovO4T5029YObfpZ7dzn3RiwpFvGp50nk2QUhvBMZ0PFGlEj6pOYTg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.66.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.66.0.tgz", + "integrity": "sha512-nZYPEya7ZkeNxUEiF7qmNZbyLTyRN3MK5cO22KqsaoneUzXJuzBIQRw+7BEQy9LGj2O5vrCE9V3EpK06FYo1tQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.66.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.66.0.tgz", + "integrity": "sha512-u7aTfS3R6C4hRsqXSzaO6qLZYLVuMkHMvcWlux4IM8IJif1VCl2cgPBSo5gSNoFoStQypQP+qwq8W1IyFBf1QQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.66.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.66.0.tgz", + "integrity": "sha512-e+i9ueHrH1Bafb0cf0woAIVJbYcoC8vRaD+vz+Xi8w6jz9cYJSV3vyKO6ELGSZ6g4W4MJOm2WPLN4/nQf77h7w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.66.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.66.0.tgz", + "integrity": "sha512-KfTCbrtr2zXTqH2E1F+uYlFTrYibxHKqPAHobpd8Kfg49cEHmuHebOidCTDRgqG1suaPFX7oejFQeGE71zWKfA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.66.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.66.0.tgz", + "integrity": "sha512-xA+neBh1bqkqaS3b48T2UHZnDsTIpb9B0h+TdBzynjF/ymCpYndhfY10RqW0qSKB1HqqQA83mINVhAdwA+mETg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@testing-library/dom": { + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.2.tgz", + "integrity": "sha512-yzr2S9HyAIdhz2/6qHgbs665Q7PKVcDF05vsOlHPxG1mo36gKVesdYVeDLnXgfjJ03CrKRk08knc6+E/9m8v2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "picocolors": "1.1.1", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@testing-library/react": { + "version": "16.3.3", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.3.tgz", + "integrity": "sha512-Uo193NgQbPMz6lrrhtRQQFcMC6Re/ELLFbbuVL30WDlZxlpZf9/lMHTAVxPRLw1q1iu9OJmR1c2BLiENRstdBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@testing-library/dom": "^10.0.0", + "@types/react": "^18.0.0 || ^19.0.0", + "@types/react-dom": "^18.0.0 || ^19.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.10.tgz", + "integrity": "sha512-lTyOMnOcmRBzdCv6/4zUZCrEhV0xrqQiUZBZtVcbmLHBXKLnN8q89v/wKRF/Q0HbwVsqbIG3o5HDoFl9sduM+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.19.43", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.43.tgz", + "integrity": "sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/react": { + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.3.0.tgz", + "integrity": "sha512-N0rFCuH9YoxG9/m61l9MfpJKfmLOVU0em7ipIz6TRgSSkvReLB9vL85GB+yr8Bs5leqpvg96JSwF4ZS1s4viQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.3.0.tgz", + "integrity": "sha512-ZI7bU42mZXXKHn/qNLEw2IrbiINU7X5+vfgdixBHkCNpYWXjKgfQ/P+uyGb5CjOLB9UcnTeg3rylQtV2hym44Q==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.3.0" + } + }, + "node_modules/@types/whatwg-mimetype": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/whatwg-mimetype/-/whatwg-mimetype-3.0.2.tgz", + "integrity": "sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.18.2", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.2.tgz", + "integrity": "sha512-67MQl+fpWKVTT1NYdnmo3U4sc/xPo/zQBncVnI74qmQa0z/b+1g6iYqNmGCPbxO+zz2aklb08a0oHfegiVd0/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.72.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.72.1.tgz", + "integrity": "sha512-5CokTWXpmbylfFabsbvHC0CAw3XLaGnoa+nFJX5FR592h/LoZsENUE6p/rg5xvkKrFEXz6pYmgI29AgXc2N3BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.72.1", + "@typescript-eslint/type-utils": "8.72.1", + "@typescript-eslint/utils": "8.72.1", + "@typescript-eslint/visitor-keys": "8.72.1", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.72.1", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.14", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.14.tgz", + "integrity": "sha512-wCBiZ77u1tuWde6G/nfOtLaCTYcFDU5yCzARzK10y+rLhzYoL7a7yEemcopcc2Mzow7gZOIjnV2ym1NYmdiJOQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.72.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.72.1.tgz", + "integrity": "sha512-ZGwZP4OCfyA0AQTpEAMWz+rtX01DRhQWW5hB0ucKDEIX5U7jdmPSaMx94rQfaPAQzIYz2BimOgKOJtjfpRFQ9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.72.1", + "@typescript-eslint/types": "8.72.1", + "@typescript-eslint/typescript-estree": "8.72.1", + "@typescript-eslint/visitor-keys": "8.72.1", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.72.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.72.1.tgz", + "integrity": "sha512-fAuVMkwdO/huI8nyo/WKnNKf6Gag93S56Rh3Ts5mGcavwSdaN8tRg1gCeIGX8PF+nzp1BjGfO4gHhGzW1J6jTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.72.1", + "@typescript-eslint/types": "^8.72.1", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.72.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.72.1.tgz", + "integrity": "sha512-lC/t6eMCZZQAAKZEYGL6RDVSuFehpdmMT6h+nJIjIa6oylN/PwDgDVtEIbB7O9xFfZYtZAYLoLlDNWKJhtF+uQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.72.1", + "@typescript-eslint/visitor-keys": "8.72.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.72.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.72.1.tgz", + "integrity": "sha512-e4D5R5vpeAEPBxT2BAzsFQL3sbwyeeeo5+aczgNSRK1V734jE7pTqaGFU+fXapWEQwnZbpFaTn32+Z8DwS6OTg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.72.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.72.1.tgz", + "integrity": "sha512-iY2wlmyrXJmx4yxUGP3aYCFF3cA/6ShddOKmLU2dx7LnEykbAM8WThlxZEfd1NddqceF6eJmZUayxx9oKIYNlg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.72.1", + "@typescript-eslint/typescript-estree": "8.72.1", + "@typescript-eslint/utils": "8.72.1", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.72.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.72.1.tgz", + "integrity": "sha512-LmE5IhQet1BWOWEXqBrVtBPsMAOQ6Nzk35d+WLh3mk4EUF33sqlfxjio1MdYeSvKSG5skactKKuixBIKXhL4Rw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.72.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.72.1.tgz", + "integrity": "sha512-DAlUoUV93hIvrtIQLwCbmZQYVZwOMhiHJrOVUUIWicFZaIYjTRqlY3I/NZevfkLmSqkNHRu2qYDcq9lrn16oOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.72.1", + "@typescript-eslint/tsconfig-utils": "8.72.1", + "@typescript-eslint/types": "8.72.1", + "@typescript-eslint/visitor-keys": "8.72.1", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz", + "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.8" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.72.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.72.1.tgz", + "integrity": "sha512-5v5liypurJBFHCBNqh/RjsymAD+VWcE0djuGY/BUqp5fC3Qn+luWDEksjuTtWjPn6i5zQlUtkZCRG/CYG0yCkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.72.1", + "@typescript-eslint/types": "8.72.1", + "@typescript-eslint/typescript-estree": "8.72.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.72.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.72.1.tgz", + "integrity": "sha512-SB8xqipSzZHUePCCLNeYxqnxq83X61/qzNhjQGbTfjxGZIeOEP7tBgWYX05Tcd6CgE02WdTJnh5b8kMZJ/+bnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.72.1", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.2.0.tgz", + "integrity": "sha512-YmKkfhOAi3wsB1PhJq5Scj3GXMn3WvtQ/JC0xoopuHoXSdmtdStOpFrYaT1kie2YgFBcIe64ROzMYRjCrYOdYw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.29.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-rc.3", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.18.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@vitest/expect": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.7.tgz", + "integrity": "sha512-E8eBXaKibuvH2pSZErOjdVb5vF4PbKYcrnluBTYxEk1l/VhhwZg1kZQsdtjq+CsF5CFydf2Rdkz7jDHKSisi3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/spy": "3.2.7", + "@vitest/utils": "3.2.7", + "chai": "^5.2.0", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.7.tgz", + "integrity": "sha512-Trr0hYO9CM3Wj6ksWHRhK9IZpIY6wTMO5u/MqXurMxT57sWBaOPEtP3Oq60ihZuh5JsiagKfz95OcxdEP6dBrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "3.2.7", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.17" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.7.tgz", + "integrity": "sha512-KUHlwqVu0sRlhCdyPdQ/wBoTfRahjUky1MubOmYw9fWfIZy1gNoHpuaaQBPAaMaVYdQYHJLurzj8ECCj5OwTqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.7.tgz", + "integrity": "sha512-sB9y4ovltoQP+WaUPwmSxO9WIg9Ig694Di5PalVPsYHklAdE027mehpWF2SQSVq+k6sFgaivbTjTJwZLSHbedA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "3.2.7", + "pathe": "^2.0.3", + "strip-literal": "^3.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.7.tgz", + "integrity": "sha512-7C+MwShwtBSI5Buwoyg3s/iY1eHL9PKAf+O1wVh/TdnjXUtkoL/9YQtre90i4MtNXM6edP1wJ2zOBpfCyhIS7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.7", + "magic-string": "^0.30.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.7.tgz", + "integrity": "sha512-Q2eQGI6d2L/hBtZ0qNuKcAGid68XK6cv1xsoaIma6PaJhHPoqcEJhYpXZ/5myCMqkNgtP6UKuBhbc0nHKnrkuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^4.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.7.tgz", + "integrity": "sha512-x6BDOd7dyo3PFLY3I9/HJ25X/6OurhGXk2/B9gOZNPF7XDVjeBK4k01lQE5uvDpbuheErh91qYuE1E2OEjK3Rw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.7", + "loupe": "^3.1.4", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/acorn": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.19.0.tgz", + "integrity": "sha512-oJlA3XiRm7Cyk6qFD2Jn8ak9B7jSy0qy00ADO3+8dpT0LSjFihQYv4C02LFCSYJV3Q37xYwwRy5m+IpIiUzqWw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/axe-core": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.13.0.tgz", + "integrity": "sha512-UzGt8zg7Ny8djbYMhxl2zuEevVa7r2gJjYY5Lwr1xM7+XU2nd6CkIWFTVcCIbAP63vSz71NaVyyuSk9lHKcy0A==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.11.34", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.34.tgz", + "integrity": "sha512-Aqr8mA1kIvyJ3UY5YAY7ib8LSo1DmDMbMnVqGPtsKW1LxaFQFwn9Eb3yvq2fUKJsRvaXjnAV7R5osqETapzNiA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz", + "integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/browserslist": { + "version": "4.29.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.29.5.tgz", + "integrity": "sha512-khTmKu5NGYTotqcYo8Bew2k4RAE9PuXRSFRXG2lQBrCEQHyeQ/vX6gKMxfokwywBsLiXZMnHsmWMG1pnO8J7uQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.11.33", + "caniuse-lite": "^1.0.30001819", + "electron-to-chromium": "^1.5.464", + "node-releases": "^2.0.60", + "update-browserslist-db": "^1.3.4" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-image-size": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/buffer-image-size/-/buffer-image-size-0.6.4.tgz", + "integrity": "sha512-nEh+kZOPY1w+gcCMobZ6ETUp9WfibndnosbpwB1iJk/8Gt5ZF2bhS6+B6bPYz424KtwsR6Rflc3tCz1/ghX2dQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001820", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001820.tgz", + "integrity": "sha512-gfWD6MxqVCqAOwmODfZf7DchWvlrA+SRdNX7ceLfg3xRqe5ssjjpF7EgslC/0tiLiNTajdaNN/q8c/5u/7Gz8w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chai": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", + "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/check-error": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.3.tgz", + "integrity": "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.467", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.467.tgz", + "integrity": "sha512-Nw9X371rtZmYcBSnEijnCDONILjs93biCZO34juC7MBOmK8E+GFnyD4T/WvyrlJkppul7oxg6TwvtKst9SODTw==", + "dev": true, + "license": "ISC" + }, + "node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz", + "integrity": "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.2", + "@esbuild/android-arm": "0.28.2", + "@esbuild/android-arm64": "0.28.2", + "@esbuild/android-x64": "0.28.2", + "@esbuild/darwin-arm64": "0.28.2", + "@esbuild/darwin-x64": "0.28.2", + "@esbuild/freebsd-arm64": "0.28.2", + "@esbuild/freebsd-x64": "0.28.2", + "@esbuild/linux-arm": "0.28.2", + "@esbuild/linux-arm64": "0.28.2", + "@esbuild/linux-ia32": "0.28.2", + "@esbuild/linux-loong64": "0.28.2", + "@esbuild/linux-mips64el": "0.28.2", + "@esbuild/linux-ppc64": "0.28.2", + "@esbuild/linux-riscv64": "0.28.2", + "@esbuild/linux-s390x": "0.28.2", + "@esbuild/linux-x64": "0.28.2", + "@esbuild/netbsd-arm64": "0.28.2", + "@esbuild/netbsd-x64": "0.28.2", + "@esbuild/openbsd-arm64": "0.28.2", + "@esbuild/openbsd-x64": "0.28.2", + "@esbuild/openharmony-arm64": "0.28.2", + "@esbuild/sunos-x64": "0.28.2", + "@esbuild/win32-arm64": "0.28.2", + "@esbuild/win32-ia32": "0.28.2", + "@esbuild/win32-x64": "0.28.2" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.39.5", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.5.tgz", + "integrity": "sha512-DgZS62aPLXKlnxILS/AYCoRvHaZeXceIzlXPkkGGzJWSow1aEk0lbTlxUSlyjC8jcaKxAdOnTDz+o1JFSBsyjw==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.2", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.6", + "@eslint/js": "9.39.5", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.5", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz", + "integrity": "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expect-type": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.4.0.tgz", + "integrity": "sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", + "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "17.13.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.13.0.tgz", + "integrity": "sha512-RwMTC61u7hrG3ZJMkZQOK4JLJrKS8QtoTii63EmWvFXHqycY9FObBJQCbsLxSO8kjKhWE5kV1GC+Vb1g3RI0Zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/happy-dom": { + "version": "21.0.4", + "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-21.0.4.tgz", + "integrity": "sha512-tFm+GaLBgo6o0awHnvHaNoraVo27qJ+2tZEtZ+cIa08hXbeitrxAJajLI05hsUy/2/YTKcUjQYzHe5mCcraLBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": ">=20.0.0", + "@types/whatwg-mimetype": "^3.0.2", + "@types/ws": "^8.18.1", + "buffer-image-size": "^0.6.4", + "entities": "^7.0.1", + "whatwg-mimetype": "^3.0.0", + "ws": "^8.21.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", + "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/loupe": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", + "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "license": "MIT", + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.20.tgz", + "integrity": "sha512-uKdg2G3GNCKQn9byYOpxbGqrT2fGO5KRt5J/8b3pok8rT6qxGWF6hxMyJiEYtAf+FVyYuD9hRaDqX5uPFYJ4ZQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.61", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.61.tgz", + "integrity": "sha512-5NUN6QCxNFrS9oEA9RPS+d0AP+ooGBzzovY2JhIpDRHacPvOhHjXjUsUMX9qp4nLHZ+5jVgXB2jj/P4arGOE/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathval": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", + "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/playwright": { + "version": "1.64.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.64.1.tgz", + "integrity": "sha512-HCrVhHr5QQuwYoswEUGTb7gGp522yflbv/ST8nF4sFWGuLjQCt17Q/EubpGGSNKYn1tsTCPZxqHhHCfVURu7UA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.64.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/playwright-core": { + "version": "1.64.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.64.1.tgz", + "integrity": "sha512-BC4s8y6SEVA6Q1rSxZTto8hI1KUI3xXlHGZgvGqP4IqPdI/a6FX9H29IDNz7vKo9l21b6LfYosScPL6M3xxyDQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/postcss": { + "version": "8.5.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.32.tgz", + "integrity": "sha512-LJlKCCAUFKOuZxipUdYw1NzIITEsPcgyOG9LkvRJvuKj/bRzbuRY0ARXvL0pWGpsZvn8jku+LMep2eU0seHp8g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.20", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/react": { + "version": "19.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-19.3.1.tgz", + "integrity": "sha512-QNhWdt7nrgVWWQG58QuGsAR3jv3Hbe4mb4vz7w2csnHavciZJgda1CPNaldF6eVxv90ud3jUXpKlHL69gO38yw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.3.1.tgz", + "integrity": "sha512-Y0bARz53lhEC1NMCASs0/j+faB/zqt3R8hpvg1e8+61ZVJ4UL0UdC4cBbXfZMcIuhrfgeILTLe+ZeBCavQPtKQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.28.0" + }, + "peerDependencies": { + "react": "^19.3.1" + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true, + "license": "MIT" + }, + "node_modules/react-refresh": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz", + "integrity": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/rollup": { + "version": "4.66.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.66.0.tgz", + "integrity": "sha512-Onq6/qO4ARhxIs+jYiHE0pYehadLyMECAiGEqQ+0/aWND3+2PmifJIIqBLYtuBODqHTlOUEQFtIVPyCy0Lck7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@napi-rs/lzma-linux-x64-gnu": "1.5.1", + "@rollup/rollup-android-arm-eabi": "4.66.0", + "@rollup/rollup-android-arm64": "4.66.0", + "@rollup/rollup-darwin-arm64": "4.66.0", + "@rollup/rollup-darwin-x64": "4.66.0", + "@rollup/rollup-freebsd-arm64": "4.66.0", + "@rollup/rollup-freebsd-x64": "4.66.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.66.0", + "@rollup/rollup-linux-arm-musleabihf": "4.66.0", + "@rollup/rollup-linux-arm64-gnu": "4.66.0", + "@rollup/rollup-linux-arm64-musl": "4.66.0", + "@rollup/rollup-linux-loong64-gnu": "4.66.0", + "@rollup/rollup-linux-loong64-musl": "4.66.0", + "@rollup/rollup-linux-ppc64-gnu": "4.66.0", + "@rollup/rollup-linux-ppc64-musl": "4.66.0", + "@rollup/rollup-linux-riscv64-gnu": "4.66.0", + "@rollup/rollup-linux-riscv64-musl": "4.66.0", + "@rollup/rollup-linux-s390x-gnu": "4.66.0", + "@rollup/rollup-linux-x64-gnu": "4.66.0", + "@rollup/rollup-linux-x64-musl": "4.66.0", + "@rollup/rollup-openbsd-x64": "4.66.0", + "@rollup/rollup-openharmony-arm64": "4.66.0", + "@rollup/rollup-win32-arm64-msvc": "4.66.0", + "@rollup/rollup-win32-ia32-msvc": "4.66.0", + "@rollup/rollup-win32-x64-gnu": "4.66.0", + "@rollup/rollup-win32-x64-msvc": "4.66.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup/node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/scheduler": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.28.0.tgz", + "integrity": "sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/source-map-js": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.2.tgz", + "integrity": "sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "dev": true, + "license": "MIT" + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-literal": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.1.0.tgz", + "integrity": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^9.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/strip-literal/node_modules/js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinypool": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.6.tgz", + "integrity": "sha512-u8KszXvGfU68hVcZpRHKG28T0krMuv2G5nDhiHaMLen/gIuFEgIJhaJuO69qjnXg5paSrbPMFfx3brNuN8eVSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.72.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.72.1.tgz", + "integrity": "sha512-3Li9FfPmQp45nxEtFD1ZCrYFI3cYK5kpyNtmm1H7lMagm8u9sy6PTjy3ytwQZs7KNukOyKFHAZ6z6GjYFeaeXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.72.1", + "@typescript-eslint/parser": "8.72.1", + "@typescript-eslint/typescript-estree": "8.72.1", + "@typescript-eslint/utils": "8.72.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/update-browserslist-db": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.4.tgz", + "integrity": "sha512-t8wonIOdQyOjtPd2VktlBu6QjTVTks6v8bSi7kd0r2Vll8TK1JYDZtRRdbmCHOAMphkZgrzK+L+vXK4pyZ8t4A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vite": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.7.tgz", + "integrity": "sha512-AHEzTORMbi7/7aXp7w7KZ5+DCUdSeLsJz0grY8xHpc9DHdYb0vQu6DqJfm2tOw3gDExNgPgnJTXxM6syYFHaCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.27.0 || ^0.28.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", + "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.4.1", + "es-module-lexer": "^1.7.0", + "pathe": "^2.0.3", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vitest": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.7.tgz", + "integrity": "sha512-KrxIJ62Fd89gfysR4WotlgZABiz2dqFPgqGzX7s+CwsqLFomRH7777ZcrOD6+WVAh7khPQP41A+BKbpcJFrdEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/expect": "3.2.7", + "@vitest/mocker": "3.2.7", + "@vitest/pretty-format": "^3.2.7", + "@vitest/runner": "3.2.7", + "@vitest/snapshot": "3.2.7", + "@vitest/spy": "3.2.7", + "@vitest/utils": "3.2.7", + "chai": "^5.2.0", + "debug": "^4.4.1", + "expect-type": "^1.2.1", + "magic-string": "^0.30.17", + "pathe": "^2.0.3", + "picomatch": "^4.0.2", + "std-env": "^3.9.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.2", + "tinyglobby": "^0.2.14", + "tinypool": "^1.1.1", + "tinyrainbow": "^2.0.0", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", + "vite-node": "3.2.4", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/debug": "^4.1.12", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "@vitest/browser": "3.2.7", + "@vitest/ui": "3.2.7", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/debug": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ws": { + "version": "8.22.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.22.0.tgz", + "integrity": "sha512-Ydggc987+RO0AnWtZ/7Wq9FtNvcrL1b/RO0ud9mWjUPgDrsAAwQSF51sm2hm1XofbU/4jkpGEsLFsZZxU+1DOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.6.7", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.6.7.tgz", + "integrity": "sha512-g8W2D2kU6a8untc053fX1uVBKzM7yqAxW/3zwk83+6RyF2+SKOuV+c0wBDhUwzV1PaGapmZH+rmcUzPf+3CGwg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + } + } +} diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 00000000..216739cd --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,49 @@ +{ + "name": "openverifiablellm-site", + "version": "0.3.0", + "private": true, + "type": "module", + "engines": { + "node": ">=20.19.0" + }, + "scripts": { + "data:fetch": "python3 scripts/fetch-evidence.py", + "data": "python3 scripts/build-data.py", + "data:check": "python3 scripts/build-data.py --check && vite-node scripts/check-data.ts", + "dev": "vite", + "lint": "eslint . --max-warnings 0", + "typecheck": "tsc -p . --noEmit", + "test": "vitest run", + "build": "npm run data:check && tsc -p . --noEmit && vite build && vite build --ssr src/entry-server.tsx --outDir dist-ssr && node scripts/prerender.mjs && node scripts/check-budget.mjs", + "test:e2e": "playwright test", + "contrast": "node tools/contrast.mjs", + "preview": "node scripts/static-server.mjs", + "claims:sync": "node scripts/sync-claims.mjs", + "screenshots": "node scripts/screenshots.mjs", + "check": "npm run lint && npm run typecheck && npm test && npm run contrast && npm run build && npm run test:e2e" + }, + "dependencies": { + "react": "^19.3.1", + "react-dom": "^19.3.1" + }, + "devDependencies": { + "@axe-core/playwright": "^4.13.0", + "@eslint/js": "^9.39.5", + "@playwright/test": "^1.64.1", + "@testing-library/dom": "^10.4.2", + "@testing-library/react": "^16.3.3", + "@types/node": "^20.19.43", + "@types/react": "^19.3.0", + "@types/react-dom": "^19.3.0", + "@vitejs/plugin-react": "^5.2.0", + "eslint": "^9.39.5", + "eslint-plugin-react-hooks": "^7.1.1", + "globals": "^17.13.0", + "happy-dom": "^21.0.4", + "typescript": "^6.0.3", + "typescript-eslint": "^8.72.1", + "vite": "^7.3.7", + "vite-node": "^3.2.4", + "vitest": "^3.2.7" + } +} diff --git a/frontend/public/fonts/Inter-OFL.txt b/frontend/public/fonts/Inter-OFL.txt new file mode 100644 index 00000000..40589daa --- /dev/null +++ b/frontend/public/fonts/Inter-OFL.txt @@ -0,0 +1,93 @@ +Copyright 2016 The Inter Project Authors (https://github.com/rsms/inter) Inter-Italic[opsz,wght].ttf: Copyright 2016 The Inter Project Authors (https://github.com/rsms/inter) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/frontend/public/fonts/InterVariable-latin.woff2 b/frontend/public/fonts/InterVariable-latin.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..d15208de03cd1ad7c5199f0a0ce915fe841e4722 GIT binary patch literal 48256 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∾Na#*TBTU(!jF?9zmR-!C*+RdvGrd0&{`| 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 T=ND-DucNQ`tADQ-AuI&|D5jKI literal 0 HcmV?d00001 diff --git a/frontend/public/fonts/SourceSerif4-OFL.txt b/frontend/public/fonts/SourceSerif4-OFL.txt new file mode 100644 index 00000000..046fc664 --- /dev/null +++ b/frontend/public/fonts/SourceSerif4-OFL.txt @@ -0,0 +1,93 @@ +Google Inc. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/frontend/public/fonts/SourceSerif4Variable-latin.woff2 b/frontend/public/fonts/SourceSerif4Variable-latin.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..4c3e6b90c9518de98b75a1565cb2ec0f3865bb6f GIT binary patch literal 50936 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 B>Mj5P literal 0 HcmV?d00001 diff --git a/frontend/scripts/check-budget.mjs b/frontend/scripts/check-budget.mjs new file mode 100644 index 00000000..0fe6387a --- /dev/null +++ b/frontend/scripts/check-budget.mjs @@ -0,0 +1,33 @@ +// Phone performance budget, checked on the real build output (gzip level 9). +import { readFileSync, readdirSync, statSync } from 'node:fs'; +import path from 'node:path'; +import { gzipSync } from 'node:zlib'; + +export const BUDGET = { entryJsKB: 80, totalJsKB: 100, pageJsKB: 12, cssKB: 10, htmlKB: 30, fontsKB: 125, dataKB: 60 }; +const gz = (f) => gzipSync(readFileSync(f), { level: 9 }).length / 1024; +const files = (d) => readdirSync(d).flatMap((f) => (statSync(path.join(d, f)).isDirectory() ? files(path.join(d, f)) : [path.join(d, f)])); +const all = files('dist'); +const html = readFileSync('dist/index.html', 'utf8'); +const entry = /'; + d.exclusion.title = evil; + d.verifications.rows.forEach((r) => (r.machine = evil)); + await serve(page, d); + for (const slug of ['exclusion/', 'verification/']) { + await page.goto(slug); + await ready(page); + expect(await page.evaluate(() => (window as unknown as { __xss?: number }).__xss)).toBeUndefined(); + expect(await page.locator('main img').count()).toBe(0); + } +}); + +test('very long unbroken + RTL/unicode strings in data cause no horizontal overflow at 320', async ({ page }) => { + await page.setViewportSize({ width: 320, height: 800 }); + const d = data() as unknown as { exclusion: { title: string }; verifications: { rows: { machine: string }[] } }; + d.exclusion.title = 'שלום‮عالم' + 'X'.repeat(400) + ' 🧪ẞ'; + d.verifications.rows.forEach((r) => (r.machine = 'm'.repeat(300))); + await serve(page, d); + for (const slug of ['exclusion/', 'verification/']) { + await page.goto(slug); + await ready(page); + expect(await overflow(page), slug).toBeLessThanOrEqual(0); + } +}); + +test('missing optional data field (a section) degrades to the section fallback, not a blank page', async ({ page }) => { + const d = data() as unknown as Record; + delete d.anchor; + await serve(page, d); + await page.goto('downloads/'); + await ready(page); + await expect(page.locator('h1')).toHaveCount(1); + await expect(page.locator('[data-result="MATCH"]').first()).toHaveCount(0); +}); + +test('0 segments is rejected, never shown as an empty-but-valid scoreboard', async ({ page }) => { + const d = data() as unknown as { chain: { segments: number; entries: number; boundaries: unknown[] }; verifications: { tiles: unknown[] } }; + d.chain.segments = 0; d.chain.entries = 1; d.chain.boundaries = d.chain.boundaries.slice(0, 1); d.verifications.tiles = []; + await serve(page, d); + await page.goto(''); + await ready(page); + await expect(page.locator('[data-fallback], [data-fatal]').first()).toBeVisible(); + await expect(page.locator('[data-result="MATCH"]')).toHaveCount(0); +}); + +test('slow data (3 s) keeps the prerendered page readable and then hydrates', async ({ page }) => { + await page.route('**/data/site-data*.json', async (r) => { await new Promise((f) => setTimeout(f, 3000)); await r.continue(); }); + await page.goto('verification/'); + await expect(page.locator('h1')).toBeVisible(); + await ready(page); + await expect(page.locator('.tiles-int button')).toHaveCount(37); +}); + +test('offline after load: client navigation across all six pages still works', async ({ page, context }) => { + await page.goto(''); + await ready(page); + await page.waitForTimeout(2500); // idle prefetch of the other page chunks + await page.waitForLoadState('networkidle'); + await context.setOffline(true); + for (const p of PAGES.slice(1)) { + await page.locator(`nav a[href$="/${p.slug}"]`).first().click(); + await expect(page).toHaveURL(new RegExp(`${p.slug}$`)); + await expect(page.locator('h1')).toHaveCount(1); + await expect(page.locator('[data-fatal]')).toHaveCount(0); + } + await context.setOffline(false); +}); + +test('back/forward restores page and h1 across deep links', async ({ page }) => { + await page.goto('timeline/'); + await ready(page); + const h1t = await page.locator('h1').innerText(); + await page.locator('nav a[href$="/downloads/"]').first().click(); + await expect(page).toHaveURL(/downloads\/$/); + await page.goBack(); + await expect(page).toHaveURL(/timeline\/$/); + await expect(page.locator('h1')).toHaveText(h1t); + await page.goForward(); + await expect(page).toHaveURL(/downloads\/$/); +}); + +test('deep link with hash to a verification row lands on that row', async ({ page }) => { + await page.goto('verification/'); + await ready(page); + const id = await page.locator('main [id]').evaluateAll((els) => els.map((e) => e.id).find((i) => /seg|row/.test(i))); + test.skip(!id, 'no row ids'); + await page.goto('about:blank'); + await page.goto(`verification/#${id}`); + await ready(page); + const top = await page.locator(`[id="${id}"]`).evaluate((e) => e.getBoundingClientRect().top); + expect(top).toBeLessThan(800); +}); + +for (const p of PAGES) { + test(`${p.key}: 400% zoom (320 CSS px) reflows with no horizontal scroll`, async ({ page }) => { + await page.setViewportSize({ width: 320, height: 256 }); + await page.goto(p.slug); + await ready(page); + expect(await overflow(page)).toBeLessThanOrEqual(0); + }); + test(`${p.key}: forced-colors is axe clean and keeps focus visible`, async ({ page }) => { + await page.emulateMedia({ forcedColors: 'active' }); + await page.goto(p.slug); + await ready(page); + const r = await new AxeBuilder({ page }).withTags(['wcag2a', 'wcag2aa', 'wcag22aa']).analyze(); + expect(r.violations.map((v) => v.id)).toEqual([]); + }); + test(`${p.key}: print media hides nav and keeps h1`, async ({ page }) => { + await page.goto(p.slug); + await ready(page); + await page.emulateMedia({ media: 'print' }); + await expect(page.locator('h1')).toBeVisible(); + }); +} + +test('keyboard-only: Tab reaches every nav page and Enter navigates', async ({ page }) => { + await page.goto(''); + await ready(page); + for (const p of PAGES.slice(1)) { + let found = false; + for (let i = 0; i < 400 && !found; i++) { + await page.keyboard.press('Tab'); + found = await page.evaluate((s) => (document.activeElement as HTMLAnchorElement | null)?.closest('nav') !== null && (document.activeElement as HTMLAnchorElement).href?.endsWith('/' + s), p.slug); + } + expect(found, p.slug).toBe(true); + await page.keyboard.press('Enter'); + await expect(page).toHaveURL(new RegExp(`${p.slug}$`)); + } +}); + +test.describe('JS off', () => { + test.use({ javaScriptEnabled: false }); + for (const p of PAGES) { + test(`${p.key}: prerendered content and the claim/source chip are present with no JS`, async ({ page }) => { + await page.goto(p.slug); + await expect(page.locator('h1')).toHaveCount(1); + expect(await page.locator('details.chip').count()).toBeGreaterThan(0); + }); + } +}); + +test('CSP meta is present on every page and nothing violates it', async ({ page }) => { + await page.addInitScript(() => { + (window as unknown as { __csp: string[] }).__csp = []; + document.addEventListener('securitypolicyviolation', (e) => (window as unknown as { __csp: string[] }).__csp.push(`${e.violatedDirective} ${e.blockedURI}`)); + }); + for (const p of PAGES) { + await page.goto(p.slug); + await ready(page); + await expect(page.locator('meta[http-equiv="Content-Security-Policy"]')).toHaveCount(1); + expect(await page.evaluate(() => (window as unknown as { __csp: string[] }).__csp), p.key).toEqual([]); + } +}); + +test('data is fetched from the content-hashed URL named by the build', async ({ page }) => { + const urls: string[] = []; + page.on('request', (r) => urls.push(r.url())); + await page.goto(''); + await ready(page); + const h = await page.locator('meta[name="ovl-data"]').getAttribute('content'); + expect(h).toMatch(/^[0-9a-f]{64}$/); + expect(urls.filter((u) => u.includes('/data/site-data'))).toEqual([expect.stringContaining(`site-data.${h!.slice(0, 16)}.json`)]); +}); From ccee6f0d16dfb80dec0b09dff59b54862501e00f Mon Sep 17 00:00:00 2001 From: Panshul Arora <170356171+panshularora@users.noreply.github.com> Date: Thu, 29 Oct 2026 21:17:56 +0530 Subject: [PATCH 25/75] fix(site): build-data names the missing pinned file and says to run data:fetch --- frontend/scripts/build-data.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frontend/scripts/build-data.py b/frontend/scripts/build-data.py index b83a125f..ac23d627 100644 --- a/frontend/scripts/build-data.py +++ b/frontend/scripts/build-data.py @@ -26,6 +26,8 @@ def fail(msg): def read(p): + if not os.path.exists(os.path.join(RAW, p)): + fail(f"data/raw/{p} is missing: run `npm run data:fetch` first (fresh clones do not include it)") b = open(os.path.join(RAW, p), "rb").read() want = man["files"][p]["sha256"] if hashlib.sha256(b).hexdigest() != want: From 86d1a8573ce0b26d25b7b2ab1cc90cb516d25faf Mon Sep 17 00:00:00 2001 From: Panshul Arora <170356171+panshularora@users.noreply.github.com> Date: Thu, 29 Oct 2026 21:22:30 +0530 Subject: [PATCH 26/75] chore(site): vitest 4.1.12 (dev-only GHSA-5gmw-xhrv-c9v3, GHSA-85c8-ppgw-ccpr); npm audit 0 --- frontend/package-lock.json | 300 ++++++++++++++++--------------------- frontend/package.json | 2 +- 2 files changed, 132 insertions(+), 170 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 6ba71eae..01aa4ea4 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -29,7 +29,7 @@ "typescript-eslint": "^8.72.1", "vite": "^7.3.7", "vite-node": "^3.2.4", - "vitest": "^3.2.7" + "vitest": "^4.1.12" }, "engines": { "node": ">=20.19.0" @@ -1487,6 +1487,13 @@ "win32" ] }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "dev": true, + "license": "MIT" + }, "node_modules/@testing-library/dom": { "version": "10.4.2", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.2.tgz", @@ -1983,39 +1990,40 @@ } }, "node_modules/@vitest/expect": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.7.tgz", - "integrity": "sha512-E8eBXaKibuvH2pSZErOjdVb5vF4PbKYcrnluBTYxEk1l/VhhwZg1kZQsdtjq+CsF5CFydf2Rdkz7jDHKSisi3w==", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.12.tgz", + "integrity": "sha512-vFlTt+YEu9WBpNjdGayNmlMVzrWPi1+sv853/7t2FU7hpO5gAFBKHzQmkCq5Xjpr+evegF2994LQT3hF3mRlqQ==", "dev": true, "license": "MIT", "dependencies": { + "@standard-schema/spec": "^1.1.0", "@types/chai": "^5.2.2", - "@vitest/spy": "3.2.7", - "@vitest/utils": "3.2.7", - "chai": "^5.2.0", - "tinyrainbow": "^2.0.0" + "@vitest/spy": "4.1.12", + "@vitest/utils": "4.1.12", + "chai": "^6.2.2", + "tinyrainbow": "^3.1.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/mocker": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.7.tgz", - "integrity": "sha512-Trr0hYO9CM3Wj6ksWHRhK9IZpIY6wTMO5u/MqXurMxT57sWBaOPEtP3Oq60ihZuh5JsiagKfz95OcxdEP6dBrA==", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.12.tgz", + "integrity": "sha512-fKShNpKZzupWZuY0z7egydvL0sqW4INEZBEExMBMAa6izlENEVHwoXgdaTCaBZ5fwlr4xf2o1wXC83n9RpO+NA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "3.2.7", + "@vitest/spy": "4.1.12", "estree-walker": "^3.0.3", - "magic-string": "^0.30.17" + "magic-string": "^0.30.21" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { "msw": "^2.4.9", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "msw": { @@ -2027,42 +2035,42 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.7.tgz", - "integrity": "sha512-KUHlwqVu0sRlhCdyPdQ/wBoTfRahjUky1MubOmYw9fWfIZy1gNoHpuaaQBPAaMaVYdQYHJLurzj8ECCj5OwTqA==", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.12.tgz", + "integrity": "sha512-XW9O8+Mxx4VpCtkYdMJLZQQwsVryP9wk7cPKDxtXFfwSak6yRh5+2fep/Y0XF/ElBvJHq8bcYdi6aeuai0opZA==", "dev": true, "license": "MIT", "dependencies": { - "tinyrainbow": "^2.0.0" + "tinyrainbow": "^3.1.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/runner": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.7.tgz", - "integrity": "sha512-sB9y4ovltoQP+WaUPwmSxO9WIg9Ig694Di5PalVPsYHklAdE027mehpWF2SQSVq+k6sFgaivbTjTJwZLSHbedA==", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.12.tgz", + "integrity": "sha512-NKlVKCr5QnCe8jijdMnmkpHHU+WTqiLFR6G0pHji9uRjXK9xJl1k1nTw6F3pOOj2PDcsDt2GKQMI7wIsaT491w==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "3.2.7", - "pathe": "^2.0.3", - "strip-literal": "^3.0.0" + "@vitest/utils": "4.1.12", + "pathe": "^2.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/snapshot": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.7.tgz", - "integrity": "sha512-7C+MwShwtBSI5Buwoyg3s/iY1eHL9PKAf+O1wVh/TdnjXUtkoL/9YQtre90i4MtNXM6edP1wJ2zOBpfCyhIS7g==", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.12.tgz", + "integrity": "sha512-ko1y1Qgb/slzQ9mr+b89Cuqud8WG1TKtsPD8r7ZUBdvVOGt85Af2HwCqHujrhwJq95hs/9RM7fcAPg57o1vlzw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.2.7", - "magic-string": "^0.30.17", + "@vitest/pretty-format": "4.1.12", + "@vitest/utils": "4.1.12", + "magic-string": "^0.30.21", "pathe": "^2.0.3" }, "funding": { @@ -2070,28 +2078,25 @@ } }, "node_modules/@vitest/spy": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.7.tgz", - "integrity": "sha512-Q2eQGI6d2L/hBtZ0qNuKcAGid68XK6cv1xsoaIma6PaJhHPoqcEJhYpXZ/5myCMqkNgtP6UKuBhbc0nHKnrkuQ==", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.12.tgz", + "integrity": "sha512-RGq9x4JNGNTZHEJxvN0oSiJjeSCExm0n2gZKKJZHY9cX5AVA6M7VJILBT3ZJ/tJ/0J9uWT7fETV9/btoi//vSg==", "dev": true, "license": "MIT", - "dependencies": { - "tinyspy": "^4.0.3" - }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/utils": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.7.tgz", - "integrity": "sha512-x6BDOd7dyo3PFLY3I9/HJ25X/6OurhGXk2/B9gOZNPF7XDVjeBK4k01lQE5uvDpbuheErh91qYuE1E2OEjK3Rw==", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.12.tgz", + "integrity": "sha512-Q3awXrwOfEV+qc3WmO5ONyE0yO7Q1gQ9/oyHxGLZ/pl7N3NO/ZztqQwKLuwMkV+CA1JYSIeO3gkHnRDIo4AVaA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.2.7", - "loupe": "^3.1.4", - "tinyrainbow": "^2.0.0" + "@vitest/pretty-format": "4.1.12", + "convert-source-map": "^2.0.0", + "tinyrainbow": "^3.1.0" }, "funding": { "url": "https://opencollective.com/vitest" @@ -2320,18 +2325,11 @@ "license": "CC-BY-4.0" }, "node_modules/chai": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", - "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.3.0.tgz", + "integrity": "sha512-XWAtwJ6OHO+tj0EKCs0Y2UamnyOxseZWltU4x2U2wh8g4AigdjwvtUjvLP2tqkA/avxHEtzxNaqGq/YGNwckKg==", "dev": true, "license": "MIT", - "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" - }, "engines": { "node": ">=18" } @@ -2353,16 +2351,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/check-error": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.3.tgz", - "integrity": "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 16" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -2437,16 +2425,6 @@ } } }, - "node_modules/deep-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -3136,13 +3114,6 @@ "dev": true, "license": "MIT" }, - "node_modules/loupe": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", - "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", - "dev": true, - "license": "MIT" - }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -3229,6 +3200,20 @@ "node": ">=18" } }, + "node_modules/obug": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.2.1.tgz", + "integrity": "sha512-XrsrhT5sybtKI6wakr2SPOlGZWWYbUXZ7a0jT8/QOeAPau+1X/bSegNe5YR75oJmEZQbKningirmGOEJCIk61Q==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT", + "engines": { + "node": ">=12.20.0" + } + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -3319,16 +3304,6 @@ "dev": true, "license": "MIT" }, - "node_modules/pathval": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", - "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.16" - } - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -3620,9 +3595,9 @@ "license": "MIT" }, "node_modules/std-env": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", - "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.3.0.tgz", + "integrity": "sha512-OtU/EgQ1kIm5KwqQpBC6ZEMXrZRui11w8zgfTWp8cdO9B8OaPsbA8bTHO2P+HNo1VlUTGMVBwPhydu6poeXiag==", "dev": true, "license": "MIT" }, @@ -3639,26 +3614,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/strip-literal": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.1.0.tgz", - "integrity": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "js-tokens": "^9.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/strip-literal/node_modules/js-tokens": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", - "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", - "dev": true, - "license": "MIT" - }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -3680,11 +3635,14 @@ "license": "MIT" }, "node_modules/tinyexec": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", - "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.1.tgz", + "integrity": "sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=18" + } }, "node_modules/tinyglobby": { "version": "0.2.17", @@ -3703,30 +3661,10 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/tinypool": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", - "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.0.0 || >=20.0.0" - } - }, "node_modules/tinyrainbow": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", - "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinyspy": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.6.tgz", - "integrity": "sha512-u8KszXvGfU68hVcZpRHKG28T0krMuv2G5nDhiHaMLen/gIuFEgIJhaJuO69qjnXg5paSrbPMFfx3brNuN8eVSg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.2.0.tgz", + "integrity": "sha512-LgO3D9yZJjApUiuUfl9iFAwrtaX4+lok3wJIqttGoKCHlWUqHqbQpnxCf82L8FjgKsh4iGo78hqJwgL8F6To2A==", "dev": true, "license": "MIT", "engines": { @@ -3944,65 +3882,79 @@ } }, "node_modules/vitest": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.7.tgz", - "integrity": "sha512-KrxIJ62Fd89gfysR4WotlgZABiz2dqFPgqGzX7s+CwsqLFomRH7777ZcrOD6+WVAh7khPQP41A+BKbpcJFrdEg==", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.12.tgz", + "integrity": "sha512-5eWdz2yb3ajxWF3C8C4TjkXl7FGm3n2E/VlazALrQHzK7nYMSGFnCZto0bbPNl77AwkOZVLk0YnBAejUu0NiWA==", "dev": true, "license": "MIT", "dependencies": { - "@types/chai": "^5.2.2", - "@vitest/expect": "3.2.7", - "@vitest/mocker": "3.2.7", - "@vitest/pretty-format": "^3.2.7", - "@vitest/runner": "3.2.7", - "@vitest/snapshot": "3.2.7", - "@vitest/spy": "3.2.7", - "@vitest/utils": "3.2.7", - "chai": "^5.2.0", - "debug": "^4.4.1", - "expect-type": "^1.2.1", - "magic-string": "^0.30.17", + "@vitest/expect": "4.1.12", + "@vitest/mocker": "4.1.12", + "@vitest/pretty-format": "4.1.12", + "@vitest/runner": "4.1.12", + "@vitest/snapshot": "4.1.12", + "@vitest/spy": "4.1.12", + "@vitest/utils": "4.1.12", + "es-module-lexer": "^2.0.0", + "expect-type": "^1.3.0", + "magic-string": "^0.30.21", + "obug": "^2.1.1", "pathe": "^2.0.3", - "picomatch": "^4.0.2", - "std-env": "^3.9.0", + "picomatch": "^4.0.3", + "std-env": "^4.0.0-rc.1", "tinybench": "^2.9.0", - "tinyexec": "^0.3.2", - "tinyglobby": "^0.2.14", - "tinypool": "^1.1.1", - "tinyrainbow": "^2.0.0", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", - "vite-node": "3.2.4", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.1.0", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", "why-is-node-running": "^2.3.0" }, "bin": { "vitest": "vitest.mjs" }, "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { "@edge-runtime/vm": "*", - "@types/debug": "^4.1.12", - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "@vitest/browser": "3.2.7", - "@vitest/ui": "3.2.7", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.1.12", + "@vitest/browser-preview": "4.1.12", + "@vitest/browser-webdriverio": "^4.1.11", + "@vitest/coverage-istanbul": "4.1.12", + "@vitest/coverage-v8": "4.1.12", + "@vitest/ui": "4.1.12", "happy-dom": "*", - "jsdom": "*" + "jsdom": "*", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "@edge-runtime/vm": { "optional": true }, - "@types/debug": { + "@opentelemetry/api": { "optional": true }, "@types/node": { "optional": true }, - "@vitest/browser": { + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/coverage-istanbul": { + "optional": true + }, + "@vitest/coverage-v8": { "optional": true }, "@vitest/ui": { @@ -4013,9 +3965,19 @@ }, "jsdom": { "optional": true + }, + "vite": { + "optional": false } } }, + "node_modules/vitest/node_modules/es-module-lexer": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.2.tgz", + "integrity": "sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==", + "dev": true, + "license": "MIT" + }, "node_modules/whatwg-mimetype": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", diff --git a/frontend/package.json b/frontend/package.json index 216739cd..578a16e4 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -44,6 +44,6 @@ "typescript-eslint": "^8.72.1", "vite": "^7.3.7", "vite-node": "^3.2.4", - "vitest": "^3.2.7" + "vitest": "^4.1.12" } } From 76938c720b96510f3b0368e3e7f4d9a5412687a6 Mon Sep 17 00:00:00 2001 From: Panshul Arora <170356171+panshularora@users.noreply.github.com> Date: Thu, 29 Oct 2026 21:24:06 +0530 Subject: [PATCH 27/75] fix(site): empty data: favicon so no page logs a 404; test no 4xx on any page --- frontend/index.html | 1 + frontend/tests/e2e/adversarial.spec.ts | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/frontend/index.html b/frontend/index.html index 682484ac..63f2f96e 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -5,6 +5,7 @@ + OpenVerifiableLLM diff --git a/frontend/tests/e2e/adversarial.spec.ts b/frontend/tests/e2e/adversarial.spec.ts index c17e9faf..90d8bcbc 100644 --- a/frontend/tests/e2e/adversarial.spec.ts +++ b/frontend/tests/e2e/adversarial.spec.ts @@ -194,3 +194,13 @@ test('data is fetched from the content-hashed URL named by the build', async ({ expect(h).toMatch(/^[0-9a-f]{64}$/); expect(urls.filter((u) => u.includes('/data/site-data'))).toEqual([expect.stringContaining(`site-data.${h!.slice(0, 16)}.json`)]); }); + +test('no page requests anything that 404s (favicon included)', async ({ page }) => { + const bad: string[] = []; + page.on('response', (r) => r.status() >= 400 && bad.push(`${r.status()} ${r.url()}`)); + for (const p of PAGES) { + await page.goto(p.slug); + await ready(page); + } + expect(bad).toEqual([]); +}); From 3d69d074fcf7036b58da2848e00de91f0cd65a27 Mon Sep 17 00:00:00 2001 From: Panshul Arora <170356171+panshularora@users.noreply.github.com> Date: Thu, 29 Oct 2026 21:24:44 +0530 Subject: [PATCH 28/75] a11y(site): 44px chip summaries on phones, source links announce the new tab, tile detail indexed by position --- frontend/src/components/CoverageMap.tsx | 2 +- frontend/src/components/SourceChip.tsx | 4 ++++ frontend/src/content/ui.json | 3 ++- frontend/src/styles/site.css | 2 +- frontend/tests/e2e/adversarial.spec.ts | 9 +++++++++ 5 files changed, 17 insertions(+), 3 deletions(-) diff --git a/frontend/src/components/CoverageMap.tsx b/frontend/src/components/CoverageMap.tsx index 1c45c778..0bd0d348 100644 --- a/frontend/src/components/CoverageMap.tsx +++ b/frontend/src/components/CoverageMap.tsx @@ -77,7 +77,7 @@ export function CoverageMap({ interactive, strip = false }: { interactive: boole {selected ? ( <>

- +

    {selected.checks.map((i) => ( diff --git a/frontend/src/components/SourceChip.tsx b/frontend/src/components/SourceChip.tsx index b4d28267..dd42e265 100644 --- a/frontend/src/components/SourceChip.tsx +++ b/frontend/src/components/SourceChip.tsx @@ -17,6 +17,10 @@ export function SourceChip({ s }: { s: ClaimSource | Src }) { {s.url ? ( + + {' '} + + ) : null} diff --git a/frontend/src/content/ui.json b/frontend/src/content/ui.json index 5e29cb36..70c29071 100644 --- a/frontend/src/content/ui.json +++ b/frontend/src/content/ui.json @@ -110,5 +110,6 @@ "tile.MATCH": "✓", "tile.MISMATCH": "✗", "tile.pending": "…", - "notfound.home": "Go to the overview page" + "notfound.home": "Go to the overview page", + "newtab": "(opens in a new tab)" } diff --git a/frontend/src/styles/site.css b/frontend/src/styles/site.css index b660c39e..eeb31adb 100644 --- a/frontend/src/styles/site.css +++ b/frontend/src/styles/site.css @@ -116,7 +116,7 @@ tr:target,tr[id^="seg-"]:target{background:var(--stamp-tint);box-shadow:inset 4p tr:target>*{background:transparent} .notfound a{display:inline-flex;align-items:center;min-height:24px} details.more-src>summary{min-height:24px} -@media (max-width:640px){.notfound a,details.more-src>summary{min-height:44px}} +@media (max-width:640px){.notfound a,details.more-src>summary{min-height:44px}details.chip>summary{display:inline-flex;align-items:center;min-height:44px}} button.tile[aria-pressed="true"]{background:var(--project-tint);outline:2px solid var(--ink);outline-offset:1px} .tile[data-checker="independent"]{background:var(--independent);color:var(--surface);border-color:var(--independent)} .tile[data-checker="pending"]{border-style:dashed;color:var(--pending)} diff --git a/frontend/tests/e2e/adversarial.spec.ts b/frontend/tests/e2e/adversarial.spec.ts index 90d8bcbc..d7e54ecb 100644 --- a/frontend/tests/e2e/adversarial.spec.ts +++ b/frontend/tests/e2e/adversarial.spec.ts @@ -204,3 +204,12 @@ test('no page requests anything that 404s (favicon included)', async ({ page }) } expect(bad).toEqual([]); }); + +test('phone: every source chip summary is >= 44px tall; source links announce the new tab', async ({ page }) => { + await page.setViewportSize({ width: 390, height: 844 }); + await page.goto('verification/'); + await ready(page); + for (const h of await page.locator('details.chip > summary').evaluateAll((s) => s.filter((e) => (e as HTMLElement).offsetParent).map((e) => e.getBoundingClientRect().height))) expect(h).toBeGreaterThanOrEqual(44); + await page.locator('details.chip').first().evaluate((d) => ((d as HTMLDetailsElement).open = true)); + await expect(page.locator('details.chip a[target="_blank"]').first()).toHaveAccessibleName(/opens in a new tab/); +}); From 4b4bd5442e76498b8ce82cccea25bebcf1d229e0 Mon Sep 17 00:00:00 2001 From: panshulthinks Date: Fri, 30 Oct 2026 18:25:27 +0530 Subject: [PATCH 29/75] feat(site): light default, brand marks, and phone-smooth chrome Light is the default background; dark is a header toggle. Track favicon.svg and logo.svg so a fresh clone has the brand marks. Developer notes sit behind a chevron. The header sticks, and the phone nav scrolls in one row. VE-07/08 odds come from site-data. Per-page meta and Open Graph tags land at prerender. --- frontend/README.md | 2 +- frontend/index.html | 11 ++-- frontend/public/favicon.svg | 5 ++ frontend/public/logo.svg | 5 ++ frontend/scripts/prerender.mjs | 10 +++- frontend/scripts/screenshots.mjs | 7 ++- frontend/src/App.tsx | 10 +++- frontend/src/components/ClaimBlock.tsx | 7 ++- frontend/src/components/OddsBar.tsx | 8 +-- frontend/src/components/ThemeToggle.tsx | 28 ++++++++++ frontend/src/content/copy.json | 8 +-- frontend/src/content/fill.ts | 4 +- frontend/src/content/ui.json | 23 +++++++-- frontend/src/main.tsx | 3 ++ frontend/src/pages/Check.tsx | 1 + frontend/src/pages/Downloads.tsx | 1 + frontend/src/pages/Exclusion.tsx | 1 + frontend/src/pages/Timeline.tsx | 1 + frontend/src/pages/Verification.tsx | 1 + frontend/src/styles/site.css | 44 ++++++++++++---- frontend/src/theme.ts | 39 ++++++++++++++ frontend/tests/e2e/behaviour.spec.ts | 69 ++++++++++++++++++++++++- frontend/tests/e2e/pages.spec.ts | 7 +-- frontend/tests/e2e/util.ts | 13 +++++ frontend/tests/e2e/v3-fixes.spec.ts | 22 ++++++-- frontend/tests/unit/components.test.tsx | 50 +++++++++++++++++- frontend/tests/unit/fill.test.tsx | 9 +++- frontend/tests/unit/theme.test.ts | 49 ++++++++++++++++++ frontend/tools/contrast.mjs | 2 +- 29 files changed, 398 insertions(+), 42 deletions(-) create mode 100644 frontend/public/favicon.svg create mode 100644 frontend/public/logo.svg create mode 100644 frontend/src/components/ThemeToggle.tsx create mode 100644 frontend/src/theme.ts create mode 100644 frontend/tests/unit/theme.test.ts diff --git a/frontend/README.md b/frontend/README.md index 36c37563..12cddfb7 100644 --- a/frontend/README.md +++ b/frontend/README.md @@ -38,7 +38,7 @@ phone budget. Set `BASE_PATH=/OpenVerifiableLLM/` to build for a sub-path. ## Counts in copy Headlines never type a segment or check count. `copy.json` uses placeholders filled from `site-data.json`: -`{matched}` `{total}` `{independent}` `{rows}` `{second}` `{training}` `{fresh}` (OV-04, VE-01, VE-03). A line +`{matched}` `{total}` `{independent}` `{rows}` `{second}` `{training}` `{fresh}` `{m95}` `{m99}` `{N}` (OV-04, VE-01, VE-03, VE-07, VE-08). A line that says "{matched} of {total}" or "all matched" is withheld (scoped error) when the data disagrees. The ledger keeps its literal numbers; `tests/unit/fill.test.tsx` fails if a filled value is not in that claim's ledger text. COPY.md must carry the same placeholders, or `npm run claims:sync` reverts them (the test fails). diff --git a/frontend/index.html b/frontend/index.html index 63f2f96e..9aac5169 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -3,9 +3,14 @@ - - - + + + + + + + + OpenVerifiableLLM diff --git a/frontend/public/favicon.svg b/frontend/public/favicon.svg new file mode 100644 index 00000000..9cf34e79 --- /dev/null +++ b/frontend/public/favicon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/frontend/public/logo.svg b/frontend/public/logo.svg new file mode 100644 index 00000000..9cf34e79 --- /dev/null +++ b/frontend/public/logo.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/frontend/scripts/prerender.mjs b/frontend/scripts/prerender.mjs index ef74f7a7..d2e3fe38 100644 --- a/frontend/scripts/prerender.mjs +++ b/frontend/scripts/prerender.mjs @@ -7,6 +7,8 @@ import { pathToFileURL } from 'node:url'; const { renderAll } = await import(pathToFileURL(path.resolve('dist-ssr/entry-server.js')).href); const template = readFileSync('dist/index.html', 'utf8'); if (!template.includes('
    ')) throw new Error('prerender: root marker not found'); +const ui = JSON.parse(readFileSync('src/content/ui.json', 'utf8')); +const attr = (s) => String(s).replace(/&/g, '&').replace(/"/g, '"').replace(/`; const titleOf = (html, key) => (new RegExp(`data-label="${key === 'notfound' ? 'notfound' : `nav.${key}`}">([^<]*)<`).exec(html)?.[1] ?? ''); for (const r of renderAll(data)) { + const pageTitle = titleOf(r.html, r.key); + const fullTitle = pageTitle ? `${pageTitle} · OpenVerifiableLLM` : 'OpenVerifiableLLM'; + const desc = ui[`meta.${r.key}`] ?? ui['meta.default'] ?? ''; const html = template .replace('
    ', `
    ${r.html}
    `) - .replace('OpenVerifiableLLM', `${titleOf(r.html, r.key)} · OpenVerifiableLLM`) + .replace('OpenVerifiableLLM', `${attr(fullTitle)}`) + .replace(//, ``) + .replace(//, ``) + .replace(//, ``) .replace('', ` ${dataMeta}\n `) .replace(/()/, `$1\n ${cspMeta}`); // 404.html is static: no app script, no preloads, so it never fetches site-data.json. diff --git a/frontend/scripts/screenshots.mjs b/frontend/scripts/screenshots.mjs index c3dbce40..72dc98a7 100644 --- a/frontend/scripts/screenshots.mjs +++ b/frontend/scripts/screenshots.mjs @@ -10,8 +10,13 @@ mkdirSync(out, { recursive: true }); const browser = await chromium.launch(); for (const scheme of ['light', 'dark']) { for (const width of [1440, 390]) { - const ctx = await browser.newContext({ viewport: { width, height: 900 }, colorScheme: scheme, reducedMotion: 'reduce', deviceScaleFactor: width === 390 ? 2 : 1 }); + const ctx = await browser.newContext({ viewport: { width, height: 900 }, reducedMotion: 'reduce', deviceScaleFactor: width === 390 ? 2 : 1 }); const page = await ctx.newPage(); + await page.addInitScript((t) => { + document.documentElement.dataset.theme = t; + document.documentElement.style.colorScheme = t; + try { localStorage.setItem('ovl-theme', t); } catch { /* ignore */ } + }, scheme); for (const [name, slug] of pages) { await page.goto(base + slug); await page.waitForSelector('footer [data-path="revShort"]'); diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index a63e73fd..8edae9e4 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -1,8 +1,9 @@ import { useEffect, useRef, type ComponentType, type MouseEvent } from 'react'; import { DataContext, type DataState } from './data/context'; -import { ROUTES, hrefOf, type RouteDef } from './routes'; +import { BASE, ROUTES, hrefOf, type RouteDef } from './routes'; import { L, V } from './components/text'; import { ErrorBoundary } from './components/Section'; +import { ThemeToggle } from './components/ThemeToggle'; export interface AppProps { state: DataState | { error: string } | 'loading'; @@ -26,6 +27,7 @@ function Shell({ route, navigate, children, pinned }: { route: RouteDef | null;
    onNav(e, hrefOf(ROUTES[0]!))}> +
+
{children} @@ -69,6 +72,11 @@ export function App({ state, route, Page, navigate }: AppProps) {

+

+ +

); diff --git a/frontend/src/components/ClaimBlock.tsx b/frontend/src/components/ClaimBlock.tsx index 7e6c7796..4c41107d 100644 --- a/frontend/src/components/ClaimBlock.tsx +++ b/frontend/src/components/ClaimBlock.tsx @@ -33,7 +33,12 @@ export function ClaimBlock({ id, children, heading, hideLimit = false, asLimit = ) : asLimit ? :

{plain}

} {c.who ? : null} {/* A ledger line with a number the pinned data does not support is withheld (see ledger-issues.json). */} - {developer === null || plain === null || KNOWN_ISSUES.some((i) => i.id === id && i.part === 'developer') ? null :

{developer}

} + {developer === null || plain === null || KNOWN_ISSUES.some((i) => i.id === id && i.part === 'developer') ? null : ( +
+ +

{developer}

+
+ )} {c.verbatim ? : null} {children} {c.limit && !hideLimit && !KNOWN_ISSUES.some((i) => i.id === id && i.part === 'limit') ? ( diff --git a/frontend/src/components/OddsBar.tsx b/frontend/src/components/OddsBar.tsx index 42ddb692..e9a4b43f 100644 --- a/frontend/src/components/OddsBar.tsx +++ b/frontend/src/components/OddsBar.tsx @@ -32,16 +32,16 @@ export function OddsBar() {
  • - :
  • -
  • -
  • -
diff --git a/frontend/src/components/ThemeToggle.tsx b/frontend/src/components/ThemeToggle.tsx new file mode 100644 index 00000000..9233aad3 --- /dev/null +++ b/frontend/src/components/ThemeToggle.tsx @@ -0,0 +1,28 @@ +import { useState } from 'react'; +import { L } from './text'; +import { useHydrated } from './hydrated'; +import { label } from '../content/ui'; +import { readTheme, writeTheme, type Theme } from '../theme'; + +/** Shown only after JavaScript runs, so a no-JS page stays light with no dead control. */ +export function ThemeToggle() { + const hydrated = useHydrated(); + const [theme, setTheme] = useState(() => (typeof document === 'undefined' ? 'light' : readTheme())); + if (!hydrated) return null; + const next: Theme = theme === 'dark' ? 'light' : 'dark'; + return ( + + ); +} diff --git a/frontend/src/content/copy.json b/frontend/src/content/copy.json index 37c89193..9319212b 100644 --- a/frontend/src/content/copy.json +++ b/frontend/src/content/copy.json @@ -104,12 +104,12 @@ "developer": "P(detect) = 1 − ((N−1)/N)^M; one checker doing k distinct segments: k/N." }, "VE-07": { - "plain": "110 independent random checks of 37 segments would catch one forged segment 95% of the time. Only the project has checked.", - "developer": "Smallest M with p≥0.95 at N=37 is 110 (p=0.95090)." + "plain": "{m95} independent random checks of {total} segments would catch one forged segment 95% of the time. Only the project has checked.", + "developer": "Smallest M with p≥0.95 at N={total} is {m95} (p=0.95090)." }, "VE-08": { - "plain": "169 independent random checks would give a 99% chance. So far only the project has checked.", - "developer": "Smallest M with p≥0.99 at N=37 is 169 (p=0.99025)." + "plain": "{m99} independent random checks would give a 99% chance. So far only the project has checked.", + "developer": "Smallest M with p≥0.99 at N={total} is {m99} (p=0.99025)." }, "VE-09": { "plain": "Independent checks so far: 0. Every check to date was run by the project.", diff --git a/frontend/src/content/fill.ts b/frontend/src/content/fill.ts index a1426807..a92c597f 100644 --- a/frontend/src/content/fill.ts +++ b/frontend/src/content/fill.ts @@ -1,14 +1,16 @@ import type { SiteData } from '../data/types'; -/** Fill {matched} {total} {independent} {rows} {second} {training} {fresh} in a copy line from site-data.json. Returns null (the caller +/** Fill {matched} {total} {independent} {rows} {second} {training} {fresh} {m95} {m99} {N} in a copy line from site-data.json. Returns null (the caller * withholds the line) when it would be false for this data: "{matched} of|/ {total}" while they differ, * any "all match…" while a row is not MATCH (EX-* reads the exclusion data), or an unknown placeholder. */ export function fillCounts(id: string, text: string, d: SiteData): string | null { const v = d.verifications; + const o = d.odds; const rowsOf = (c: string) => v.groups.find((g) => g.checker === c)?.rows ?? NaN; const n: Record = { matched: v.segmentsMatched, total: d.chain.segments, independent: v.independentChecks, rows: v.rowCount, second: rowsOf(v.secondMachine), fresh: rowsOf(v.freshMachine), training: rowsOf('project training pod'), + m95: o.m95, m99: o.m99, N: o.N, }; if (/\{matched\}( of |\/)\{total\}/.test(text) && n.matched !== n.total) return null; if (/\ball match/i.test(text) && !(id.startsWith('EX-') ? d.exclusion.allMatch : v.allMatch)) return null; diff --git a/frontend/src/content/ui.json b/frontend/src/content/ui.json index 70c29071..2fc20f69 100644 --- a/frontend/src/content/ui.json +++ b/frontend/src/content/ui.json @@ -38,7 +38,7 @@ "independent.label": "Independent checks:", "limit": "Limit", "source": "Source", - "developer": "For developers", + "developer": "Exact record", "who.project": "the project", "who.independent": "independent", "who.pending": "no check yet", @@ -79,6 +79,7 @@ "phase.conversation": "Conversation", "odds.now": "now", "odds.checks": "independent checks", + "odds.gives": "gives", "download": "Download", "release.simple-run": "Released model", "release.unlearning-3i-atlas": "Verifiable exclusion fork", @@ -92,7 +93,7 @@ "error.retry": "Reload the page", "loading": "Loading evidence…", "empty": "No rows recorded.", - "footer": "Made with ♥ by AOSSIE Community", + "footer": "Made by the AOSSIE community", "footer.data": "Evidence pinned at", "notfound": "Page not found.", "brief": "project brief (not public)", @@ -111,5 +112,21 @@ "tile.MISMATCH": "✗", "tile.pending": "…", "notfound.home": "Go to the overview page", - "newtab": "(opens in a new tab)" + "newtab": "(opens in a new tab)", + "theme.group": "Switch colour scheme", + "theme.toDark": "Dark", + "theme.toLight": "Light", + "check.lead": "Three ways in: a two-minute demo, a ten-minute consistency check, then a bit-for-bit check you run yourself.", + "verification.lead": "The project recomputed every segment on a second machine. Independent checks: none yet.", + "timeline.lead": "How training ran, and the two events the project recomputed across.", + "exclusion.lead": "A second training run without one Wikipedia article that the first run had not reached.", + "downloads.lead": "The published files, each with the SHA-256 the project recorded.", + "meta.default": "Evidence pinned to the published files, and how to check it yourself.", + "meta.overview": "A small Wikipedia-only model the project recomputed bit for bit. Independent checks: none yet.", + "meta.check": "Try the model, run a consistency check, or recompute a segment yourself.", + "meta.verification": "Every recorded check, the detection odds, and which hardware reproduces the bits.", + "meta.timeline": "The training record: boundaries, a host restart, and a code change, both matched.", + "meta.exclusion": "The project trained a fork without one article that training had not reached.", + "meta.downloads": "Pinned files with SHA-256, the GitHub release, Hugging Face, and Ollama.", + "meta.notfound": "This page is not on the site." } diff --git a/frontend/src/main.tsx b/frontend/src/main.tsx index 3da35508..31fb6c3b 100644 --- a/frontend/src/main.tsx +++ b/frontend/src/main.tsx @@ -4,8 +4,11 @@ import { App, type AppProps } from './App'; import { loadData } from './data/load'; import { ROUTES, routeFor } from './routes'; import { label } from './content/ui'; +import { applyStoredTheme } from './theme'; import './styles/site.css'; +applyStoredTheme(); + /** The data file failed (missing, malformed, wrong shape, aborted). Keep the prerendered page and replace * only the evidence that depends on that data, so nothing is shown as checked. */ function scopeFailure() { diff --git a/frontend/src/pages/Check.tsx b/frontend/src/pages/Check.tsx index 619b99d3..8df0240e 100644 --- a/frontend/src/pages/Check.tsx +++ b/frontend/src/pages/Check.tsx @@ -6,6 +6,7 @@ export default function Check() { return ( <>

+

diff --git a/frontend/src/pages/Downloads.tsx b/frontend/src/pages/Downloads.tsx index b833d87b..d945f28e 100644 --- a/frontend/src/pages/Downloads.tsx +++ b/frontend/src/pages/Downloads.tsx @@ -15,6 +15,7 @@ export default function Downloads() { return ( <>

+

{hfFiles.map((c) => )}
diff --git a/frontend/src/pages/Exclusion.tsx b/frontend/src/pages/Exclusion.tsx index e8d8af7e..27e94638 100644 --- a/frontend/src/pages/Exclusion.tsx +++ b/frontend/src/pages/Exclusion.tsx @@ -8,6 +8,7 @@ export default function Exclusion() { return ( <>

+

diff --git a/frontend/src/pages/Timeline.tsx b/frontend/src/pages/Timeline.tsx index 257eb4f3..3f94aa7b 100644 --- a/frontend/src/pages/Timeline.tsx +++ b/frontend/src/pages/Timeline.tsx @@ -7,6 +7,7 @@ export default function Timeline() { return ( <>

+

diff --git a/frontend/src/pages/Verification.tsx b/frontend/src/pages/Verification.tsx index 41338100..73e9b8ed 100644 --- a/frontend/src/pages/Verification.tsx +++ b/frontend/src/pages/Verification.tsx @@ -26,6 +26,7 @@ export default function Verification() { return ( <>

+

diff --git a/frontend/src/styles/site.css b/frontend/src/styles/site.css index eeb31adb..99496a48 100644 --- a/frontend/src/styles/site.css +++ b/frontend/src/styles/site.css @@ -4,7 +4,7 @@ @font-face{font-family:"JetBrains Mono";src:url(/fonts/JetBrainsMono-Regular-latin.woff2) format("woff2");font-weight:400;font-display:swap} :root{ - color-scheme: light dark; + color-scheme: light; --font-serif:"Source Serif 4",Georgia,serif; --font-sans:"Inter",system-ui,-apple-system,"Segoe UI",sans-serif; --font-mono:"JetBrains Mono",ui-monospace,SFMono-Regular,Menlo,monospace; @@ -25,7 +25,8 @@ --focus:#FFCD00; --focus-ink:#16181D; --ease:cubic-bezier(.2,0,0,1); --dur-fast:120ms; --dur:180ms; } -@media (prefers-color-scheme:dark){:root{ +html[data-theme="dark"]{ + color-scheme: dark; --bg:#111317; --surface:#181B20; --sunk:#0C0E11; --line:#2C3038; --ink:#ECEDEF; --ink-2:#C4C8CF; --muted:#9AA0AA; --link:#8DB1FF; --match:#5CCFA2; --match-tint:#0F2A21; @@ -35,10 +36,11 @@ --pending:#9AA0AA; --pending-tint:#22252B; --stamp:#F2C14E; --stamp-tint:#2E2410; --focus-ink:#111317; -}} +} *,*::before,*::after{box-sizing:border-box} -html{-webkit-text-size-adjust:100%} +html{-webkit-text-size-adjust:100%;scroll-padding-top:6rem} +h1,h2,h3,.ev,[id^="seg-"]{scroll-margin-top:6rem} body{margin:0;background:var(--bg);color:var(--ink);font:400 var(--fs-body)/var(--lh-body) var(--font-sans);font-feature-settings:"cv11"} h1,h2,h3{font-family:var(--font-serif);line-height:var(--lh-head);font-weight:600;letter-spacing:-.01em;max-width:var(--measure)} h1{font-size:var(--fs-h1);overflow-wrap:anywhere;margin:var(--space-8) 0 var(--space-2)} @@ -51,12 +53,16 @@ code,pre,.hash code{font-family:var(--font-mono);font-size:max(12px,.9em)} .sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap} .muted{color:var(--muted)} -.skip{position:absolute;left:var(--space-2);top:-3rem;background:var(--surface);padding:var(--space-2) var(--space-3);z-index:10} +.skip{position:absolute;left:var(--space-2);top:-3rem;background:var(--surface);padding:var(--space-2) var(--space-3);z-index:30} .skip:focus{top:var(--space-2)} -.top{display:flex;flex-wrap:wrap;gap:var(--space-2) var(--space-6);align-items:baseline;padding:var(--space-4) max(var(--space-4),calc((100% - var(--wide))/2));border-bottom:1px solid var(--line);background:var(--surface)} -.wordmark{font-family:var(--font-serif);font-weight:700;font-size:1.25rem;color:var(--ink);text-decoration:none} +.top{display:flex;flex-wrap:wrap;gap:var(--space-2) var(--space-6);align-items:center;padding:var(--space-4) max(var(--space-4),calc((100% - var(--wide))/2));border-bottom:1px solid var(--line);background:var(--surface);position:sticky;top:0;z-index:20} +.wordmark{display:inline-flex;align-items:center;gap:var(--space-2);font-family:var(--font-serif);font-weight:700;font-size:1.25rem;color:var(--ink);text-decoration:none} +.wordmark img{width:1.75rem;height:1.75rem;flex-shrink:0} .top ul{display:flex;flex-wrap:wrap;gap:var(--space-1) var(--space-4);list-style:none;margin:0;padding:0;font-size:var(--fs-label)} .top a[aria-current="page"]{color:var(--ink);font-weight:600;text-decoration-thickness:2px;text-underline-offset:.3em} +.theme-btn{margin-left:auto;align-self:center;font:inherit;font-size:var(--fs-label);color:var(--ink);background:var(--surface);border:1px solid var(--line);border-radius:var(--radius-sm);padding:.25rem .75rem;cursor:pointer;min-height:44px} +.theme-btn[aria-pressed="true"]{border-color:var(--ink-2)} +.lead{max-width:var(--measure);color:var(--ink-2);margin:0 0 var(--space-6)} main{max-width:var(--wide);margin:0 auto;padding:0 var(--space-4) var(--space-12)} main:focus{outline:none} .foot{display:flex;flex-wrap:wrap;gap:var(--space-4);justify-content:space-between;padding:var(--space-6) max(var(--space-4),calc((100% - var(--wide))/2));border-top:1px solid var(--line);font-size:var(--fs-label)} @@ -68,6 +74,9 @@ main:focus{outline:none} .ev{margin:var(--space-6) 0;padding:var(--space-4) 0;border-bottom:1px solid var(--line)} .ev .plain{font-family:var(--font-serif);font-size:1.2rem;line-height:1.4;margin:0 0 var(--space-2);max-width:var(--measure)} .ev .dev{font-family:var(--font-mono);font-size:var(--fs-label);color:var(--muted);margin:var(--space-2) 0;max-width:var(--measure);overflow-wrap:anywhere} +details.dev-box{margin:var(--space-2) 0;max-width:var(--measure)} +details.dev-box>summary{cursor:pointer;font-size:var(--fs-meta);color:var(--muted);min-height:24px} +details.dev-box[open]>.dev{animation:fade var(--dur) var(--ease)} .limit{margin:var(--space-4) 0;padding:var(--space-2) var(--space-4);border-left:var(--rule-w) solid var(--muted);background:var(--sunk);font:inherit;max-width:var(--measure)} .limit strong{font-weight:600} .chips{display:flex;flex-wrap:wrap;gap:var(--space-2);margin-top:var(--space-2)} @@ -83,6 +92,12 @@ main:focus{outline:none} .result-MISMATCH{color:var(--mismatch);background:repeating-linear-gradient(45deg,var(--mismatch-tint) 0 4px,var(--surface) 4px 8px);border:1px solid var(--mismatch)} .result-MISMATCH::before{content:"✕ "} +details>summary{list-style:none} +details>summary::-webkit-details-marker,details>summary::marker{display:none;content:none} +details.dev-box>summary,details.table-fallback>summary{display:inline-flex;align-items:center;gap:.4em} +details.dev-box>summary:hover,details.table-fallback>summary:hover{color:var(--ink)} +details.dev-box>summary::after,details.table-fallback>summary::after{content:"";width:.35em;height:.35em;border-inline-end:1.5px solid currentColor;border-bottom:1.5px solid currentColor;transform:rotate(-45deg);transition:transform var(--dur) var(--ease);flex-shrink:0} +details.dev-box[open]>summary::after,details.table-fallback[open]>summary::after{transform:rotate(45deg)} details.chip{font-size:var(--fs-meta);max-width:100%} details.chip>summary{cursor:pointer;font-family:var(--font-mono);color:var(--link);border:1px solid var(--line);border-radius:var(--radius-sm);padding:.1rem .45rem;display:inline-block;max-width:100%;overflow-wrap:anywhere} details.chip>summary::before{content:"↗ "} @@ -92,7 +107,7 @@ details[open]>.panel{animation:fade var(--dur) var(--ease)} @keyframes fade{from{opacity:0}to{opacity:1}} .cmd{margin:var(--space-3) 0;display:grid;gap:var(--space-2);justify-items:start} -.cmd pre{margin:0;width:100%;overflow-x:auto;padding:var(--space-3);background:var(--sunk);border:1px solid var(--line);border-radius:var(--radius)} +.cmd pre{margin:0;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;padding:var(--space-3);background:var(--sunk);border:1px solid var(--line);border-left-width:var(--rule-w);border-left-color:var(--ink-2);border-radius:var(--radius)} .btn{font:inherit;font-size:var(--fs-label);padding:.3rem .8rem;border:1px solid var(--ink-2);border-radius:var(--radius-sm);background:var(--surface);color:var(--ink);cursor:pointer;min-height:44px} .btn-small{min-height:32px;padding:.1rem .6rem;font-size:var(--fs-meta)} .cmd-status{font-size:var(--fs-meta);color:var(--muted)} @@ -130,7 +145,7 @@ button.tile[aria-pressed="true"]{background:var(--project-tint);outline:2px soli table{border-collapse:collapse;width:100%;font-size:var(--fs-label)} th,td{text-align:left;padding:var(--space-2) var(--space-3);border-bottom:1px solid var(--line);vertical-align:top} thead th{color:var(--muted);font-weight:600} -.scroll{overflow-x:auto;max-width:100%} +.scroll{overflow-x:auto;max-width:100%;-webkit-overflow-scrolling:touch} .table-fallback>summary{cursor:pointer;color:var(--link);margin:var(--space-2) 0} .cell-item{display:inline-block} .group h3 .count{font-family:var(--font-mono);color:var(--muted);font-size:var(--fs-label)} @@ -145,7 +160,6 @@ thead th{color:var(--muted);font-weight:600} .odds .tick.now circle{fill:var(--independent)} .odds-list{list-style:none;padding:0;margin:var(--space-2) 0;font-size:var(--fs-label)} .odds-list .now{font-weight:600} -.arrow::before{content:"→"} .hw-cards{display:none;list-style:none;padding:0;gap:var(--space-3)} .card{border:1px solid var(--line);border-radius:var(--radius);padding:var(--space-3);background:var(--surface)} @@ -177,7 +191,15 @@ details.more-src .more-open,details.more-src[open] .more-closed{display:none} details.more-src[open] .more-open{display:inline} .section{display:contents} .top a,.foot a{display:inline-flex;align-items:center;min-height:24px} -@media (max-width:640px){.top a,.foot a{min-height:44px}} +@media (max-width:640px){ + .top{padding-top:var(--space-3);padding-bottom:var(--space-2);gap:var(--space-1) var(--space-4)} + .top a,.foot a,.btn-small,.theme-btn,details.dev-box>summary,details.table-fallback>summary{min-height:44px} + details.dev-box>summary,details.table-fallback>summary{display:inline-flex;align-items:center} + .top nav{flex:1 1 100%;order:3;min-width:0;overflow-x:auto;overscroll-behavior-x:contain;-webkit-overflow-scrolling:touch;scrollbar-width:none} + .top nav::-webkit-scrollbar{display:none} + .top ul{flex-wrap:nowrap;padding-inline-end:var(--space-6)} + .top ul a{white-space:nowrap} +} /* Strip: one row of 37 where it fits; below that, even rows (19 + 18, or 13 + 13 + 11 at 320px). */ .tiles-strip{display:grid;gap:2px;grid-template-columns:repeat(19,minmax(0,1fr))} @media (min-width:1100px){.tiles-strip{grid-template-columns:repeat(37,minmax(0,1fr))}} diff --git a/frontend/src/theme.ts b/frontend/src/theme.ts new file mode 100644 index 00000000..a4e759ad --- /dev/null +++ b/frontend/src/theme.ts @@ -0,0 +1,39 @@ +/** Light is the default background. Only these two values are ever written to the document or storage. */ +export const THEME_KEY = 'ovl-theme'; +export type Theme = 'light' | 'dark'; +/** Matches --bg in site.css. One colour, not prefers-color-scheme: dark is a toggle, not the OS. */ +export const THEME_COLOR: Record = { light: '#FBFAF7', dark: '#111317' }; + +export function isTheme(v: unknown): v is Theme { + return v === 'light' || v === 'dark'; +} + +export function applyTheme(t: Theme): void { + if (typeof document === 'undefined') return; + document.documentElement.dataset.theme = t; + document.documentElement.style.colorScheme = t; + document.querySelector('meta[name="theme-color"]')?.setAttribute('content', THEME_COLOR[t]); +} + +export function readTheme(): Theme { + try { + const v = localStorage.getItem(THEME_KEY); + return isTheme(v) ? v : 'light'; + } catch { + return 'light'; + } +} + +export function writeTheme(t: Theme): void { + applyTheme(t); + try { + localStorage.setItem(THEME_KEY, t); + } catch { + /* private mode: theme still applies for this page */ + } +} + +/** Call from the client entry before React paints. Ignores any value that is not light or dark. */ +export function applyStoredTheme(): void { + applyTheme(readTheme()); +} diff --git a/frontend/tests/e2e/behaviour.spec.ts b/frontend/tests/e2e/behaviour.spec.ts index bdc92600..037697a6 100644 --- a/frontend/tests/e2e/behaviour.spec.ts +++ b/frontend/tests/e2e/behaviour.spec.ts @@ -1,6 +1,6 @@ import { expect, test } from '@playwright/test'; import { label } from '../../src/content/ledger'; -import { data, ready } from './util'; +import { data, ready, PAGES } from './util'; test('keyboard: skip link first, then into main; tiles are focusable buttons operated with Enter and Space', async ({ page }) => { await page.goto('verification/'); @@ -177,3 +177,70 @@ test('an injected MISMATCH never shows "37 of 37" and causes no hydration error' } expect(errors.filter((e) => /418|hydrat/i.test(e))).toEqual([]); }); + +test('background is light by default; the toggle switches to dark and keeps it across pages', async ({ page }) => { + await page.goto(''); + await ready(page); + expect(await page.evaluate(() => getComputedStyle(document.body).backgroundColor)).toBe('rgb(251, 250, 247)'); + const toggle = page.locator('[data-theme-toggle]'); + await expect(toggle).toHaveText(label('theme.toDark')); + await toggle.click(); + await expect(page.locator('html')).toHaveAttribute('data-theme', 'dark'); + expect(await page.evaluate(() => getComputedStyle(document.body).backgroundColor)).toBe('rgb(17, 19, 23)'); + await page.getByRole('navigation').getByRole('link', { name: label('nav.check') }).click(); + await ready(page); + await expect(page.locator('html')).toHaveAttribute('data-theme', 'dark'); + await expect(page.locator('[data-theme-toggle]')).toHaveText(label('theme.toLight')); + await page.locator('[data-theme-toggle]').click(); + await expect(page.locator('html')).toHaveAttribute('data-theme', 'light'); +}); + +test('a hostile theme value in storage is ignored and the page stays light', async ({ page }) => { + await page.addInitScript(() => { + try { + localStorage.setItem('ovl-theme', ''); + } catch { + /* ignore */ + } + }); + await page.goto(''); + await ready(page); + expect(await page.evaluate(() => document.documentElement.dataset.theme)).toBe('light'); + expect(await page.evaluate(() => getComputedStyle(document.body).backgroundColor)).toBe('rgb(251, 250, 247)'); +}); + +test('every source chip on every page opens to a quoted panel', async ({ page }) => { + for (const p of PAGES) { + await page.goto(p.slug); + await ready(page); + const chips = page.locator('main details.chip'); + expect(await chips.count(), p.key).toBeGreaterThan(0); + const first = chips.first(); + await expect(first.locator('.panel')).toBeHidden(); + await first.locator(':scope > summary').click(); + await expect(first.locator('.panel')).toBeVisible(); + expect(((await first.locator('.panel').innerText()) ?? '').trim().length, p.key).toBeGreaterThan(0); + await first.locator(':scope > summary').click(); + await expect(first.locator('.panel')).toBeHidden(); + } +}); + +test('check: commands are outlined, copyable, and source chips next to them open', async ({ page }) => { + await page.goto('check/'); + await ready(page); + const cmds = page.locator('.cmd pre[data-verbatim="command"]'); + expect(await cmds.count()).toBeGreaterThanOrEqual(5); + for (const pre of await cmds.all()) { + const text = (await pre.textContent()) ?? ''; + expect(text.trim().length).toBeGreaterThan(10); + const left = await pre.evaluate((el) => getComputedStyle(el).borderLeftWidth); + expect(parseFloat(left)).toBeGreaterThanOrEqual(3); + } + await expect(page.locator('.cmd .btn').first()).toBeVisible(); + await expect(page.locator('[data-claim="CK-01"] .cmd pre')).toHaveText('ollama run ryoari/openverifiablellm'); + await expect(page.locator('[data-claim="CK-02"] .cmd pre')).toContainText('--branch v1.0.1'); + const chip = page.locator('[data-claim="CK-01"] details.chip').first(); + await chip.locator(':scope > summary').click(); + await expect(chip.locator('.panel')).toBeVisible(); +}); + diff --git a/frontend/tests/e2e/pages.spec.ts b/frontend/tests/e2e/pages.spec.ts index d32f5523..7b33cd65 100644 --- a/frontend/tests/e2e/pages.spec.ts +++ b/frontend/tests/e2e/pages.spec.ts @@ -4,7 +4,7 @@ import { expect, test } from '@playwright/test'; import { formatValue, type Fmt } from '../../src/data/format'; import { getPath } from '../../src/data/path'; import { bannedIn, claims, ui } from '../../src/content/ledger'; -import { PAGES, WIDTHS, data, ready } from './util'; +import { PAGES, WIDTHS, data, ready, useTheme } from './util'; import { fillCounts } from '../../src/content/fill'; for (const scheme of ['light', 'dark'] as const) { @@ -14,7 +14,8 @@ for (const scheme of ['light', 'dark'] as const) { const errors: string[] = []; page.on('console', (m) => m.type() === 'error' && errors.push(m.text())); page.on('pageerror', (e) => errors.push(String(e))); - await page.emulateMedia({ colorScheme: scheme, reducedMotion: 'reduce' }); + await useTheme(page, scheme); + await page.emulateMedia({ reducedMotion: 'reduce' }); await page.setViewportSize({ width: w, height: 900 }); await page.goto(p.slug); await ready(page); @@ -106,5 +107,5 @@ test('links: every internal link resolves on the static build; external links ar if (h.includes('huggingface.co/datasets/')) expect(h, h).toContain(d.revision); if (h.includes('github.com/AOSSIE-Org/OpenVerifiableLLM/blob/')) expect(h, h).toContain(d.upstream.commit); } - for (const f of ['fonts/InterVariable-latin.woff2', 'data/site-data.json']) expect((await request.get(f)).status()).toBe(200); + for (const f of ['fonts/InterVariable-latin.woff2', 'data/site-data.json', 'favicon.svg', 'logo.svg']) expect((await request.get(f)).status()).toBe(200); }); diff --git a/frontend/tests/e2e/util.ts b/frontend/tests/e2e/util.ts index 6880a631..f55e7e37 100644 --- a/frontend/tests/e2e/util.ts +++ b/frontend/tests/e2e/util.ts @@ -19,3 +19,16 @@ export async function ready(page: Page) { await page.waitForFunction(() => document.querySelector('[data-fatal]') || document.querySelector('footer code [data-path="revShort"]')); await page.waitForLoadState('networkidle'); } + +/** Pin the background before navigation. Light is the site default; dark is only via this or the header toggle. */ +export async function useTheme(page: Page, scheme: 'light' | 'dark') { + await page.addInitScript((t) => { + document.documentElement.dataset.theme = t; + document.documentElement.style.colorScheme = t; + try { + localStorage.setItem('ovl-theme', t); + } catch { + /* ignore */ + } + }, scheme); +} diff --git a/frontend/tests/e2e/v3-fixes.spec.ts b/frontend/tests/e2e/v3-fixes.spec.ts index 1b5d1fc5..109dc034 100644 --- a/frontend/tests/e2e/v3-fixes.spec.ts +++ b/frontend/tests/e2e/v3-fixes.spec.ts @@ -1,7 +1,7 @@ import AxeBuilder from '@axe-core/playwright'; import { expect, test, type Page } from '@playwright/test'; import { label } from '../../src/content/ledger'; -import { PAGES, ready } from './util'; +import { PAGES, ready, useTheme } from './util'; const PINNED_GH = '1049d2a7'; const PINNED_HF = '96dc282a'; @@ -50,12 +50,27 @@ test.describe('layout', () => { await page.goto(''); await ready(page); const min = w <= 640 ? 44 : 24; - for (const a of await page.locator('header.top a:not(.skip), footer.foot a').all()) { + for (const a of await page.locator('header.top a:not(.skip), footer.foot a, [data-theme-toggle]').all()) { const b = (await a.boundingBox())!; expect(b.height, await a.textContent() ?? '').toBeGreaterThanOrEqual(min); } }); } + + for (const w of [320, 390, 1440]) { + test(`copy buttons are at least ${w <= 640 ? 44 : 32}px tall @${w}`, async ({ page }) => { + await page.setViewportSize({ width: w, height: 900 }); + await page.goto('downloads/'); + await ready(page); + const min = w <= 640 ? 44 : 32; + const btns = page.locator('.hash .btn, .cmd .btn'); + expect(await btns.count()).toBeGreaterThan(0); + for (const b of await btns.all()) { + const box = (await b.boundingBox())!; + expect(box.height, await b.textContent() ?? '').toBeGreaterThanOrEqual(min); + } + }); + } }); test.describe('without JavaScript', () => { @@ -135,7 +150,7 @@ test('404 page: real status, navigation and a link home', async ({ page }) => { test.describe('dark mode, everything expanded', () => { for (const p of PAGES) { test(`${p.key}: axe clean`, async ({ page }) => { - await page.emulateMedia({ colorScheme: 'dark' }); + await useTheme(page, 'dark'); await page.goto(p.slug); await ready(page); await page.evaluate(() => document.querySelectorAll('details').forEach((d) => (d.open = true))); @@ -292,6 +307,7 @@ test.describe('targeted segment row, JS off', () => { test.use({ javaScriptEnabled: false }); for (const scheme of ['light', 'dark'] as const) { test(`${scheme}: the row a tile link lands on is highlighted with the stamp tokens`, async ({ page }) => { + await useTheme(page, scheme); await page.emulateMedia({ colorScheme: scheme }); await page.goto('verification/'); await page.locator('.tiles-int a.tile').nth(21).click(); diff --git a/frontend/tests/unit/components.test.tsx b/frontend/tests/unit/components.test.tsx index 727a9f61..e6c72ff8 100644 --- a/frontend/tests/unit/components.test.tsx +++ b/frontend/tests/unit/components.test.tsx @@ -23,7 +23,12 @@ import type { SiteData } from '../../src/data/types'; import { fresh } from './helpers'; import { fillCounts } from '../../src/content/fill'; -afterEach(cleanup); +afterEach(() => { + cleanup(); + localStorage.removeItem('ovl-theme'); + document.documentElement.removeAttribute('data-theme'); + document.documentElement.style.colorScheme = ''; +}); const PAGES: [string, ComponentType][] = [['overview', Overview], ['check', Check], ['verification', Verification], ['timeline', Timeline], ['exclusion', Exclusion], ['downloads', Downloads]]; function mount(Page: ComponentType, data: SiteData = fresh(), errors: SectionErrors = {}) { @@ -55,6 +60,11 @@ describe.each(PAGES)('%s page', (key, Page) => { if (lt) expect(lt.textContent).toBe(limitParts(plain).rest); else expect(ev.querySelector('[data-claim-part="plain"]')!.textContent).toBe(plain); expect(ev.querySelector('details.chip')).not.toBeNull(); + const dev = ev.querySelector('[data-claim-part="developer"]'); + if (dev) { + expect(dev.closest('details.dev-box')).not.toBeNull(); + expect(ev.querySelector('details.dev-box > summary')!.textContent).toBe(label('developer')); + } const order = [...ev.querySelectorAll('.plain, .limit, .chips')].map((n) => n.className); expect(order[0]).toBe('plain'); if (c.limit) expect(order.indexOf('limit')).toBeLessThan(order.indexOf('chips')); @@ -133,6 +143,23 @@ describe('verification rows', () => { }); }); +describe('Check page sections', () => { + it('renders CK-02 through CK-07 when check data is valid', () => { + const { container } = mount(Check); + for (const id of ['CK-02', 'CK-03', 'CK-04', 'CK-05', 'CK-06', 'CK-07']) { + expect(container.querySelector(`[data-claim="${id}"]`)).not.toBeNull(); + } + expect(container.querySelector('[data-fallback]')).toBeNull(); + }); + it('falls back those claims only when the check section failed validation', () => { + const { container } = mount(Check, fresh(), { check: 'missing' }); + expect(container.querySelectorAll('[data-fallback]').length).toBeGreaterThan(0); + expect(container.querySelector('[data-claim="CK-01"]')).not.toBeNull(); + expect(container.querySelector('[data-claim="CK-08"]')).not.toBeNull(); + expect(container.querySelector('[data-claim="CK-02"]')).toBeNull(); + }); +}); + describe('Section error boundary', () => { it('contains a render crash to its own section', () => { const Boom = () => { @@ -160,6 +187,7 @@ describe('App states', () => { it('shows the error page and never a MATCH when data fails', () => { const { container } = render(); expect(screen.getByRole('alert').textContent).toContain(label('error.title')); + expect(screen.getByRole('button', { name: label('error.retry') })).toBeTruthy(); expect(container.querySelectorAll('.result-MATCH, [data-result="MATCH"]')).toHaveLength(0); }); it('shows a loading state that claims nothing', () => { @@ -172,6 +200,26 @@ describe('App states', () => { const current = document.querySelector('nav a[aria-current="page"]')!; expect(current.textContent).toBe(label('nav.verification')); }); + it('shows the brand mark next to the site title', () => { + const { container } = render(); + const img = container.querySelector('.wordmark img'); + expect(img).not.toBeNull(); + expect(img!.getAttribute('src')).toMatch(/logo\.svg$/); + expect(img!.getAttribute('alt')).toBe(''); + expect(container.querySelector('.wordmark')!.textContent).toContain(label('site.title')); + }); + it('shows a background toggle that only switches light and dark', () => { + const { container } = render(); + const btn = container.querySelector('[data-theme-toggle]'); + expect(btn).not.toBeNull(); + expect(btn!.getAttribute('aria-label')).toBe(label('theme.group')); + expect(btn!.getAttribute('aria-pressed')).toBe('false'); + fireEvent.click(btn!); + expect(btn!.getAttribute('aria-pressed')).toBe('true'); + expect(document.documentElement.dataset.theme).toBe('dark'); + fireEvent.click(btn!); + expect(document.documentElement.dataset.theme).toBe('light'); + }); }); describe('loadData', () => { diff --git a/frontend/tests/unit/fill.test.tsx b/frontend/tests/unit/fill.test.tsx index 083b1e6f..1a9ff001 100644 --- a/frontend/tests/unit/fill.test.tsx +++ b/frontend/tests/unit/fill.test.tsx @@ -76,7 +76,12 @@ describe('shipped copy.json, filled from the shipped data, agrees with the ledge } } }); - it('templated claim ids are exactly OV-04, VE-01, VE-03', () => { - expect(Object.entries(copy).filter(([, v]) => Object.values(v).some((t) => /\{\w+\}/.test(t))).map(([id]) => id)).toEqual(['OV-04', 'VE-01', 'VE-03']); + it('templated claim ids are exactly OV-04, VE-01, VE-03, VE-07, VE-08', () => { + expect(Object.entries(copy).filter(([, v]) => Object.values(v).some((t) => /\{\w+\}/.test(t))).map(([id]) => id)).toEqual(['OV-04', 'VE-01', 'VE-03', 'VE-07', 'VE-08']); + }); + it('fills detection-odds copy from site-data.json, not literals', () => { + const d = fresh(); + expect(fillCounts('VE-07', copy['VE-07']!.plain, d)).toContain(`${d.odds.m95} independent random checks of ${d.chain.segments} segments`); + expect(fillCounts('VE-08', copy['VE-08']!.plain, d)).toContain(`${d.odds.m99} independent random checks`); }); }); diff --git a/frontend/tests/unit/theme.test.ts b/frontend/tests/unit/theme.test.ts new file mode 100644 index 00000000..668c738d --- /dev/null +++ b/frontend/tests/unit/theme.test.ts @@ -0,0 +1,49 @@ +import { afterEach, describe, expect, it } from 'vitest'; +import { applyStoredTheme, isTheme, readTheme, THEME_COLOR, THEME_KEY, writeTheme } from '../../src/theme'; + +afterEach(() => { + localStorage.removeItem(THEME_KEY); + document.documentElement.removeAttribute('data-theme'); + document.documentElement.style.colorScheme = ''; +}); + +describe('theme', () => { + it('accepts only light and dark', () => { + expect(isTheme('light')).toBe(true); + expect(isTheme('dark')).toBe(true); + expect(isTheme('system')).toBe(false); + expect(isTheme('
diff --git a/frontend/public/theme-boot.js b/frontend/public/theme-boot.js new file mode 100644 index 00000000..f2d935f4 --- /dev/null +++ b/frontend/public/theme-boot.js @@ -0,0 +1,11 @@ +// Applies the stored theme before first paint. External file so a strict CSP (script-src 'self') allows it. +// Only "light" or "dark" is ever used; any other stored value is ignored. Mirrors src/theme.ts. +(function () { + var t = 'light'; + try { var v = localStorage.getItem('ovl-theme'); if (v === 'light' || v === 'dark') t = v; } catch { /* storage blocked */ } + var h = document.documentElement; + h.setAttribute('data-theme', t); + h.style.colorScheme = t; + var m = document.querySelector('meta[name="theme-color"]'); + if (m) m.setAttribute('content', t === 'dark' ? '#1A1816' : '#F0EEE9'); +})(); diff --git a/frontend/scripts/prerender.mjs b/frontend/scripts/prerender.mjs index f879c7b7..dc0ddc00 100644 --- a/frontend/scripts/prerender.mjs +++ b/frontend/scripts/prerender.mjs @@ -33,8 +33,8 @@ for (const r of renderAll(data)) { .replace(//, () => ``) .replace('', () => ` ${dataMeta}\n `) .replace(/()/, (_, m) => `${m}\n ${cspMeta}`); - // 404.html is static: no app script, no preloads, so it never fetches site-data.json. - if (r.slug.endsWith('.html')) writeFileSync(path.join('dist', r.slug), html.replace(/