# TuataraSum benchmarks (2026-10-28) Evidence for the Python port of the Tuatara Vector Summarizer (`src/services/tuatarasum`): an extractive, deterministic, CPU-only summarizer that reproduces the 2015 Tcl TuataraSum GS1 stage for stage and adds the GS2 association-space scoring and the best-of-breed options measured here. Nothing in the engine calls an outside model. `summary.json` is the one evidence file; every other file is a raw run of `scripts/tuatarasum_bench.py` and can be regenerated with the command in its header. ## Protocol - Settings were frozen on a seeded random sample (seed 20261028) of the CNN/DailyMail VALIDATION split, then run once on seeded samples of the TEST splits. Nothing was chosen on test data. - Baselines run in the same harness: Lead-k (NLTK punkt sentences); TextRank, LexRank, LSA, Luhn from `sumy` 0.11 with the English Porter stemmer. - ROUGE from `rouge-score` with stemming; `rougeLsum` over newline-separated sentences; F1 unless marked recall. Tokens are whitespace tokens of the extract. - The HuggingFace `abisee/cnn_dailymail` splits list every CNN article before the DailyMail ones. A head slice is CNN-only, where Lead-3 scores about 29 R1 against about 41 on DailyMail. The `*_head_*` files are the runs taken before this was noticed and are kept as the record; the reported rows use the seeded sample, on which in-harness Lead-3 (40.04) agrees with the published 40.34. ## CNN/DailyMail 3.0.0 test, seeded sample of 1,000, three sentences (`cnn_test_seeded.json`) | System | R1 | R2 | RL | RLsum | tokens | ms/doc | |---|---|---|---|---|---|---| | Lead-3 | 40.04 | 17.67 | 25.18 | 36.47 | 78 | 30 | | TuataraSum `tuned-best` (gs1+gs2 fusion, lead prior 8, length norm 1) | 39.51 | 17.34 | 25.06 | 35.91 | 80 | 461 | | TuataraSum `tuned` (gs1, lead prior 4, length norm 1) | 38.56 | 16.63 | 24.90 | 35.03 | 78 | 153 | | TuataraSum `faithful` (the 2015 CGI, unchanged) | 37.02 | 15.09 | 23.06 | 31.13 | 78 | 188 | | TuataraSum `gs1` (no priors) | 36.01 | 15.04 | 23.11 | 32.64 | 96 | 163 | | LexRank | 34.10 | 12.09 | 20.99 | 30.44 | 85 | 281 | | TuataraSum `best` (fusion, no priors) | 33.74 | 13.07 | 21.15 | 30.36 | 104 | 509 | | Luhn | 32.68 | 12.35 | 20.60 | 29.24 | 103 | 310 | | TuataraSum `gs2` | 30.66 | 10.53 | 18.88 | 27.51 | 104 | 555 | | LSA | 30.51 | 9.43 | 18.64 | 27.18 | 68 | 995 | | TextRank | 29.77 | 10.01 | 18.55 | 26.50 | 107 | 288 | Reading: on news the lead is hard to beat and the tuned fusion lands half a point under it; every TuataraSum row, including the unmodified 2015 algorithm, is above the classical unsupervised extractors run under the same conditions. Published bars on the full test set (Zheng and Lapata 2019, Table 2, CNN+DM, re-read from the PDF 2026-10-28): Lead-3 40.5 / 17.7 / 36.7, TextRank (tf-idf) 33.2 / 11.8 / 29.6, PacSum (BERT) 40.7 / 17.8 / 36.9; See et al. 2017 Table 1: Lead-3 40.34 / 17.70 / 36.57. (An earlier revision of this page quoted a LexRank row of 34.7 / 12.7 / 31.3 from that table; the table has no LexRank row and the figure is withdrawn.) The listed model's readiness gate holds the served default to the TextRank row on ROUGE-1/2/L and to the in-harness XSum Lead-1 floor (`summary.json` `metrics`, `items.csv` per system and metric). ## XSum test, seeded sample of 1,000, one sentence (`xsum_test_seeded.json`) | System | R1 | R2 | RL | tokens | ms/doc | |---|---|---|---|---|---| | TuataraSum `gs1` | 18.93 | 2.65 | 13.10 | 32 | 88 | | TuataraSum `best` | 18.72 | 2.65 | 12.95 | 34 | 213 | | TuataraSum `faithful` | 18.55 | 2.39 | 12.90 | 25 | 113 | | LexRank | 18.48 | 2.52 | 13.13 | 26 | 227 | | TuataraSum `tuned` | 18.39 | 2.30 | 13.21 | 23 | 85 | | Luhn | 18.35 | 2.46 | 13.00 | 33 | 228 | | TextRank | 18.29 | 2.47 | 13.05 | 34 | 253 | | TuataraSum `gs2` | 17.91 | 2.34 | 12.49 | 36 | 220 | | TuataraSum `tuned-best` | 17.39 | 1.79 | 12.57 | 22 | 211 | | Lead-1 | 16.55 | 1.46 | 12.11 | 21 | 9 | | LSA | 16.02 | 1.67 | 11.31 | 22 | 570 | Reading: XSum references are abstractive one-liners, so every extractor is low and the lead is last; the news position prior that helps on CNN/DailyMail costs here, and plain `gs1` is the best row in the harness. ## Fidelity at a token ratio, CNN/DailyMail test, seeded sample of 300 (`cnn_curve_seeded.json`) ROUGE-1 / ROUGE-2 RECALL of the extract against the reference, by the share of the document's tokens kept (`ratio` is a share of sentences; `tokens_retained` is what was actually kept). | ratio | gs1 tokens kept | gs1 R1 rec | gs1 R2 rec | fusion tokens kept | fusion R1 rec | fusion R2 rec | |---|---|---|---|---|---|---| | 0.1 | 14% | 47.8 | 19.0 | 15% | 47.6 | 18.6 | | 0.2 | 27% | 63.8 | 28.5 | 28% | 63.3 | 27.2 | | 0.3 | 38% | 72.1 | 34.7 | 40% | 71.6 | 33.3 | | 0.4 | 49% | 77.9 | 39.6 | 51% | 77.4 | 38.3 | | 0.5 | 60% | 81.5 | 42.6 | 61% | 81.5 | 42.2 | Reading: at 38% of the tokens the extract still contains 72% of the reference's unigrams; at 27% of the tokens, 64%. The curve is the number a caller on a routing service needs: what is lost at a given share of the input price. ## Parity with the Tcl source 70 of 70 (document, configuration) pairs reproduce the Tcl CGI's RAW, cleaned text, term frequencies, sentence scores, picks and summary exactly (`scripts/tuatarasum_parity_all.py`; 45 of them are committed as golden fixtures under `tests/fixtures/tuatarasum` and replayed by `tests/test_tuatarasum_parity.py`). ## Revision note The GS2 single-term expansion fix (every sentence is expanded, a one-term sentence included) was applied after the first publication of this page; the `gs2`, `best` and `tuned-best` rows and the curve were re-run on the same seeded samples and replaced. The change moved `tuned-best` by 0.01 R1 on CNN/DailyMail and nothing on XSum; timings differ because the box was less loaded on the re-run. ## Long documents: arXiv and PubMed (2026-10-29) `longdoc-2026-10-29.md` (raw `arxiv_test_seeded.json`, `pubmed_test_seeded.json`): seeded 1,000 papers per set from the ccdv mirrors, k fixed on validation (arXiv 6, PubMed 7). The served `auto` mode scores 41.60 / 14.11 / 21.71 (R1 / R2 / RL) on arXiv and 41.90 / 16.02 / 22.26 on PubMed, above the in-harness LexRank (38.85 / 13.02 / 19.85 and 41.57 / 15.68 / 21.72) on every measure and above every published row of Cohan et al. 2018 on R1 and R2 (different population and toolkit; quoted for scale). ## Context control on question answering (2026-10-29) `context-qa-2026-10-29.md` (raw `context_qa.json`): SQuAD v1.1 validation, 1,000 seeded questions, term = the question's head noun. Under the served `auto` presets' position prior the term changed no pick on a five-sentence passage (fixed: `auto` + term now runs the fusion without the prior); without the prior the term lowers answer survival by 0 to 3 points rather than raising it, and the ratio is the lever that moves survival (0.44 at ratio 0.2 to 0.71 at 0.5). ## Load test and cost (2026-10-29) `load-test-2026-10-29.md` beside this file (raw results `load_test_green.json`, `load_test_public.json`): the declared 300 requests a minute per key held for two minutes with no error (p50 286 ms, p99 1.9 s on ~620-token articles); the 301st request in a window is an early 429; one slot saturates near 7.5 requests a second (about 4,500 prompt tokens a second); engine cost 0.278 CPU-s per 1,000 tokens, about $0.002-0.003 per million tokens on the Osaka host against the listed $0.02.