{
 "schema": "s2s-bench-v1",
 "kind": "counting-rules",
 "exhibit": "llms-txt",
 "note": "Every rule that governs a figure on the exhibit page, in one file. Rules marked registered were written down before the data existed; rules marked post-hoc were not, and say so. The plan of record is not published whole because it names working-copy paths and internal repo slugs on the machines that ran it; the parts that bind a published figure are extracted here verbatim instead, which is the same disposition the open call's kit records for the same reason.",
 "movement_three_log_count": {
  "status": "registered",
  "rule_verbatim": "requests whose log line contains the UA token, one request per line, summed across the twenty vhost logs, each log covering from its own first entry to the read date.",
  "why_verbatim": "the published-numbers law: the 30-day re-measure must reuse this sentence unchanged or the two runs do not reconcile and any movement in the figure is manufactured by the counting rule rather than by the world.",
  "headline_framing": "AI-associated crawlers only: 9,483 requests, 664 robots.txt, 0 llms.txt.",
  "wider_framing_also_printed": "including Googlebot and bingbot: 10,878 requests, 956 robots.txt, 0 llms.txt.",
  "limits": [
   "the counts are line matches on a user-agent substring, not a parsed UA field; a token appearing in a referrer or a URL would inflate a count, and spot checks found none",
   "user agents are self-reported and trivially forgeable: these counts measure claimed identity",
   "the windows are per-log, not one window: the research vhost's log begins 2026-08-11 and contributes five days",
   "our own llms.txt files were about thirty-two hours old at measurement, so the registered claim is 'the path was never requested in the window', never 'our files were ignored'",
   "the raw access logs are not published: they hold visitors' IP addresses"
  ],
  "re_measure_commitment": "2026-09-16, same rule, published beside this figure whether or not the zero moves."
 },
 "movement_two_estate_probe": {
  "status": "registered",
  "rule": "hosts are classified on CONTENT, not on status code: one host answers 200 with its HTML shell for every path, and a status-only probe records that as a file. A host counts as serving only when the body is genuine markdown; a 200 that byte-matches a nonsense control path on the same host is a phantom.",
  "as_of": "2026-08-16T14:41:23Z",
  "counts": {
   "probed": 16,
   "serving": 14,
   "phantom": 1,
   "absent": 1,
   "serving_and_repo_matched": 11
  },
  "note": "an earlier, pre-fix inventory (2026-08-16T13:40Z) is what movement two's seven-real-files figure comes from; the two numbers are three hours and one estate fix apart, and both carry their timestamps on the page."
 },
 "bench_denominators": {
  "status": "registered",
  "scored_cells": 576,
  "grid": "8 arms x 3 conditions x 24 items",
  "total_wire_calls": 674,
  "wire_call_decomposition": {
   "scored": 576,
   "warmups_discarded": 24,
   "flake_probe": 72,
   "metered_output_probes": 2
  },
  "headline_set": 20,
  "headline_rule": "the four refusal-bait items are stamped proxy and are NEVER added to the twenty exact-key items; the headline denominator is 20 items per arm per condition",
  "not_collected": {
   "cells": 19,
   "arm": "openai-gpt-5.5",
   "condition": "C-NONE",
   "reason": "BUDGET",
   "rule": "an uncollected cell is a hole in the denominator, never a zero in the measurement, and every denominator re-prints"
  }
 },
 "contamination_exclusion": {
  "status": "registered",
  "rule": "a question is excluded when >=2 arms from >=2 different families answer it correctly closed-book. Exclusion is GLOBAL — one filtered set for every arm — because per-arm exclusion would give every roster row a different denominator.",
  "single_arm_rule": "a single arm's correct closed-book answer is a candidate guess, not evidence of knowledge: it is flagged, published, excluded from the headline, and the headline re-prints with it included as a sensitivity row.",
  "result": {
   "excluded": 0,
   "core_frozen_total": 14,
   "single_arm_hits": [
    "C14"
   ],
   "sensitivity_denominator": 19,
   "verdict": "ARMOR HELD"
  },
  "registered_bound": "the filter removes OUTRIGHT knowledge. It cannot remove the case where prior knowledge is partial and a served block acts as a retrieval cue; that interaction survives the filter, is not measurable from the closed-book leg alone, and is a standing bound on what the difference between conditions can be said to mean."
 },
 "pooled_discordance": {
  "status": "registered",
  "rule": "per arm, publish b (C-MAP correct and C-HTML wrong) and c (the reverse) as counts with no verdict word — this instrument does not resolve a direction at n=20. Pooled across arms the discordant pairs clear the house counting floor (PERCENT_FLOOR = 30: counts under N=30, never percentages), so the pooled split may print as a percentage.",
  "registered_band": "a direction is called only if the discordant pairs split at least 60/40; inside that band the exhibit prints WITHIN BAND.",
  "result": {
   "b": 64,
   "c": 40,
   "pairs": 104,
   "larger_side": 0.6154,
   "reading": "C-MAP DIRECTION"
  },
  "basis": "the arms share items and are therefore NOT independent, so this figure describes these eight arms, not a population. It is a statement about the instrument's resolution at this N, not a p-value and not a tie between the representations.",
  "composition_note": "b came back as exactly 8 for every one of the eight arms — the eight MAP-ONLY items — so the pooled share is close to the ratio of MAP-ONLY to HTML-ONLY items in a set we wrote, and the answer-presence audit had predicted every item's stratum before a model was called."
 },
 "structural_sensitivity": {
  "status": "POST-HOC — NOT PRE-REGISTERED, published for transparency only",
  "finding": "the registered extractor keeps visible text only, so href attributes are dropped and the C-HTML block carries no URLs; every navigation item is unanswerable from it by construction.",
  "urls": {
   "c_map_occurrences": 50,
   "c_map_distinct": 36,
   "c_map_markdown_link_targets": 49,
   "c_html": 0,
   "rule": "count of `http://` or `https://` occurrences in the served block file, and the count of distinct addresses after trimming trailing punctuation. Both are reproducible from block-c-map.txt with one grep.",
   "correction": "CORRECTED 2026-08-16, before publication. This block previously read `c_map: 61`, a figure no counting rule was ever attached to and which cannot be reproduced from the served block: the block holds 50 URL occurrences, 36 of them distinct, and 49 markdown link targets. Nothing in the file yields 61. The corrected counts and the rule that produces them are above; the original figure is named here rather than deleted. No scored result depended on it — it sizes the extractor's thumb, and the b/c/pairs figures beside it are unchanged."
  },
  "cut": "remove the 6 navigation items, leaving 14",
  "result": {
   "b": 16,
   "c": 40,
   "pairs": 56,
   "larger_side": 0.7143,
   "reading": "C-HTML DIRECTION"
  },
  "caveat": "removing six of twenty items is a large intervention and this figure is NOT the bench's result. It is the size of the extractor's thumb, stated so nobody has to estimate it.",
  "evidence_files": {
   "per_crawler_table": "fetch-receipts.md §4 — the per-crawler request table",
   "head_receipts": "fetch-receipts.md §1 — the publisher HEAD probes",
   "history_sources": "history-sources.md — every source with its date and quote"
  }
 },
 "strata": {
  "status": "registered",
  "rule": "per-stratum results publish separately and are NEVER pooled with each other. Strata are assigned by an answer-presence audit computed before the first model call, at zero model cost, on evidence spans rather than bare keys.",
  "registered_minima": {
   "HTML-ONLY": 3,
   "NEITHER": 4,
   "MAP-STALE": 1
  },
  "result": {
   "MAP-ONLY": 8,
   "HTML-ONLY": 5,
   "BOTH": 2,
   "NEITHER": 5,
   "MAP-STALE": 0
  },
  "shortfall": "MAP-STALE returned VACANT against a registered minimum of 1: the frozen corpus contains no map/page contradiction to build the stratum from, because the estate fix repaired that drift four days before the corpus froze. Published as a reduction with its cause, per the plan's own registered disposition for an unmeetable minimum, and written into the seal manifest — the bench sealed on 11 of its 12 preconditions."
 },
 "scoring": {
  "status": "registered",
  "extraction_rule": "the checker reads the reply's first non-empty line, falling back to whole-reply containment only where the item's own docstring says so.",
  "no_alternatives_rule": "a reply containing more than one candidate from the key's own domain — more than one URL for a navigation item, more than one number for a numeric item — FAILS. Without it, a model that lists five guesses including the right one scores as correct.",
  "stamps": "every item is stamped exact (20) or proxy (4) and the two subtotals are never added together.",
  "audition": "every checker was run before sealing against its canonical key, hand-written correct paraphrases, and plausible wrong answers: 335 cases, 0 failures. A checker that failed any key or paraphrase, or passed any decoy, would not have sealed.",
  "abstention_is_proxy": "abstention scoring is irreducibly proxy in both directions: a model that abstains because it did not read carefully scores as honest, and a model that says something true about the page without naming the absence scores as unhonest. The prompt also gave every arm the abstention sentence to use, so the refusal-bait figure measures whether an arm took the exit, not whether it found it.",
  "no_judges": "no judged or rubric scoring anywhere in this bench."
 },
 "fences": {
  "status": "registered",
  "transport_floor": "an arm with >20% transport failures in a condition is UNRANKED for that condition, reported rather than hidden.",
  "response_contract": "an arm whose replies cannot be parsed by the registered extraction rule above 20% publishes UNMEASURABLE for that condition — a verdict about the serving stack, not the model.",
  "context_truncation": "an arm whose measured prompt-token count in a condition falls below 0.80 x the field median for that condition was not shown the same bytes as everybody else, whatever was sent: CONTEXT-TRUNCATED, UNRANKED. Cloud windows record as 'server' — unknown, not large.",
  "result": "no arm tripped any fence in any condition."
 },
 "token_budget": {
  "status": "registered",
  "rule": "the two served blocks are matched on ONE named reference tokenizer, reading prompt_eval_count at num_ctx 32768 and num_predict 1, with a +/-5% band. Per-arm actual prompt-token counts publish beside it and are NEVER pooled: tokenizers differ per family, and the band is a property of the reference, not of any arm.",
  "result": {
   "c_map_tokens": 3211,
   "c_html_tokens": 3088,
   "band": [
    3051,
    3371
   ],
   "verdict": "in band"
  },
  "c_html_composition": "front pages first — deliberately a handicap on our own file, since the research front page text-extracted is a curated exhibit list with descriptions, structurally an llms.txt wearing HTML. The extractor un-escapes HTML entities, a choice that helps the control. The byte offset of the cut, the last block included and the first block excluded all publish in slice-receipt.json."
 },
 "bill": {
  "status": "registered",
  "pricing_rule": "priced at the UNCACHED rates — an upper bound by construction (house rule). Prefix caching likely fired on the repeated context block and the real cost is lower; the ledger does not claim the lower number.",
  "total_usd": 1.8688,
  "ceiling_usd": 4.0,
  "per_arm_sub_caps": {
   "cloud-kimi-k3": 0.9,
   "openai-gpt-5.5": 2.6
  },
  "budget_event": "gpt-5.5's closed-book leg halted on the registered 900-output-token line — a measured median of 3,633, four times over — not on its dollar cap, which it never approached ($0.4642 of $2.60). The pre-leg probe registered to price that arm sampled a grounded prompt and measured a 58-token median: a probe that only samples the grounded condition is blind to the ungrounded one."
 },
 "forbidden_claims": {
  "status": "registered before the first reply existed",
  "note": "reproduced verbatim; the roster grew from seven arms to eight by an orchestrator ruling after this list was written, so read #5 as eight.",
  "claims": [
   "'llms.txt works' / 'llms.txt helps AI find your site' — the bench measures a conditional downstream of adoption and says nothing about fetching.",
   "'Crawlers ignored our llms.txt files.' They are days old. The claim is 'the path was never requested in the window'.",
   "Any cross-arm pooled accuracy quoted without its per-arm table and class column.",
   "Any percentage over a denominator under 30.",
   "'This is what llms.txt does for websites.' It is what these two files did for these seven arms on this site, on one day, at one runtime version.",
   "That the contamination filter removed contamination. It removed outright knowledge; the partial-knowledge interaction survives it and is a registered bound on the delta's meaning.",
   "That the site implements llms.txt v2. It implements half of it: describedby discovery, no markdown page alternates.",
   "Any claim sourced only to SEO Depths' dates or the unverified '19 log sets / 41 requests' figure — verify or drop."
  ]
 },
 "titling_constraint": {
  "status": "registered",
  "text": "This is a served-context bench. It measures, at a fixed token budget, which representation of a site carries more answerable information, and whether a model can route from a description to the right page. It does not measure crawling, fetching, adoption, or agent behaviour in the wild. The page title, the dek and the social card all carry the conditional."
 }
}
