Benchmarks & Results
Structuring 794 Sanskrit books: what one agent run revealed

Title block
- Published
- 2026-08-18
- Updated
- 2026-08-18
- Author
- Yash Bonde
- Category
- Benchmarks & Results
- Reading time
- 11 min
Lede
We gave a single agent the raw GRETIL dump — 794 works, no consistent markup — and asked for a queryable corpus. It came back with 4,054,517 occurrence records whose foreign keys all resolved: referential integrity 1.0, JSONL validity 1.0. The verifier scored the submission 0.000. The philology was largely right; the delivery contract was not, and the contract is the part that decides whether anyone can use the output.
Context
GRETIL is the best free archive of machine-readable Sanskrit and it is also a museum of thirty years of transcription conventions. The 794 pages we pull from it share almost nothing structurally: verse numbers appear as || 2.16 ||, [16], 16. and bare right-aligned digits; some files interleave commentary with root text without marking the switch; six different encodings appear, three of them undeclared.
Structuring that is not a parsing problem with one right answer. It is several hundred small editorial decisions — where a chapter starts, whether a colophon is a passage, what to do when an edition renumbers — each of which has to be made consistently or the resulting IDs are worthless.
That is exactly the shape of task we built the benchmark around: long-horizon, weakly specified, verifiable only at the end. The question is not "can a model read Sanskrit" but "can it hold one convention across 794 files and ship the result in a form someone else can load".
Body
The run lasted just under eleven hours of wall clock. The agent chose a sensible architecture unprompted: a normalising pass to UTF-8 NFC, a per-file convention detector, then a streaming writer emitting one JSONL file per record type. It wrote its own regression check that re-read every emitted passage and confirmed the ID resolved back to a byte offset in the source file — a check we had not asked for.
The record schema it settled on:
{"type":"passage",
"id":"bg.2.2.16",
"doc_id":"bg",
"section":"2",
"ordinal":612,
"text_dev":"नासतो विद्यते भावो …",
"text_iast":"nāsato vidyate bhāvo …",
"src":{"file":"sa_bhagavadgita.htm","offset":184213,"len":118}}
{"type":"occurrence",
"id":"occ.bg.2.2.16.3",
"passage_id":"bg.2.2.16",
"surface":"विद्यते",
"lemma":"vid",
"analysis_id":"an.vid.pres3sg.pass",
"dict_refs":["mw.0963.2"]}Every passage_id, analysis_id and dict_ref in the submission resolves — 4,054,517 occurrences pointing into 541,021 analyses and 1,101,446 dictionary entries with zero dangling keys. That is the hard part of this task and the agent did it.
What it did not do: keep the output under the 512 MiB budget (the uncompressed drop was 1.9 GiB, largely because text_iast was duplicated onto every occurrence), emit a valid manifest.json, or leave behind a build command that ran. The submission contract asked for all three in the task statement. Two of the three failures are one-line fixes; the size overrun is a schema decision made in hour one and never revisited.
Because the harness scores the delivered artefact rather than the intermediate work, a run that got the linguistics substantially right scored the same as one that produced nothing. That is deliberate, and it is the finding: agents on long tasks optimise the part they can see themselves succeeding at, and drift off the part that only gets checked at the end.
Evidence
| Metric | Score | Weight | Note |
|---|---|---|---|
| reward | 0.000 | — | Aggregate; gated on hard checks |
| within_512_mib | 0.0 | gate | 1.9 GiB uncompressed |
| referential_integrity | 1.0 | 0.20 | Zero dangling foreign keys |
| jsonl_valid | 1.0 | 0.10 | All lines parse |
| schema | 0.700 | 0.15 | Three required fields missing on analysis |
| analysis_quality | 0.667 | 0.15 | Sampled against hand annotation |
| submission_contract | 0.625 | 0.15 | Layout and naming partially followed |
| source_coverage | 0.5 | 0.15 | 359 of 794 works processed |
| manifest_valid | 0.0 | gate | No manifest.json emitted |
| build_executable | 0.0 | gate | Build command exited 127 |
- Documents
- 359
- Passages
- 170,488
- Dictionary entries
- 1,101,446
- Analyses
- 541,021
- Occurrences
- 4,054,517
All three gate metrics scoring 0.0 forces the aggregate reward to 0.000 regardless of the weighted components. Raw metrics JSON ships with the dataset tarball.
Limitations
One run. n=1. We have no variance estimate; a second run could plausibly clear the manifest gate by accident and score 0.6.
One model, one harness. These numbers describe a single model under a single scaffold with a single tool set. They are not a statement about agents in general, and cross-model comparison on this task is not yet meaningful.
Timeout confound. The run hit the wall-clock ceiling at 359 of 794 works. The 0.5 source_coverage score therefore measures throughput, not capability, and the missing manifest may simply be work that was scheduled last and never reached.
Verifier immaturity. analysis_quality is sampled against roughly 2,000 hand-annotated tokens. That is enough to rank, not enough to trust a difference of a few points.
Reproduce it
- Repo
- github.com/yashbonde/artha-bench
- Commit
- a7f3c19
- Harness
- artha-bench v1
- Wall clock
- 10h 52m
curl -O https://data.yashbonde.com/artha-bench/v1/yashbonde-artha-bench.tar.zst tar --zstd -xf yashbonde-artha-bench.tar.zst cd artha-bench && git checkout a7f3c19 python -m artha_bench.run --task structure-794 --out ./submission python -m artha_bench.verify ./submission --report metrics.json
Dataset: data.yashbonde.com/artha-bench/v1/yashbonde-artha-bench.tar.zst — 3.4 GiB compressed, sources plus the frozen verifier fixtures.
Related
- The Sanskrit AI agent benchmarkTask definition, verifier weights and the running scoreboard.
- The libraryWhat the corpus looks like when the structuring works: 794 works, addressable.
- Concept: dharmaAn example of the cross-text linking this pipeline is meant to produce.
Citation
Bonde, Yash. "Structuring 794 Sanskrit books: what one agent run revealed." Project Artha, 18 August 2026. projectartha.xyz/blog/structuring-794-sanskrit-books.
@misc{bonde2026structuring,
author = {Bonde, Yash},
title = {Structuring 794 Sanskrit books: what one agent run revealed},
year = {2026},
url = {https://projectartha.xyz/blog/structuring-794-sanskrit-books}
}