Time to Index

How long a newly published fact takes to become retrievable through each web-search API, and how often the API confidently returns the answer it replaced. Generated 2026-10-19 06:50 UTC.

This run does not support an ordering of these arms. The table below has 4 arm(s) over at most 29 event(s), and none of the 6 pairwise comparisons reaches significance after adjustment. Read it as what each arm did, not as which arm is faster.

Rendered rather than withheld, because the instrument working on a small run is itself worth showing — and because a page that quietly waits until the numbers look conclusive is a page that only ever publishes flattering ones. Are the differences real below is the panel that answers this properly, and tti power says how many more events each comparison would need.

Pre-registered. Plan bac218770f209b20 (v1, registered 2026-08-31) was locked to this run on its first probe and has not changed since.

Declared in the plan, not enabled in this run: serper/search, tavily/basic. No key was set, so no probe was ever dispatched to these arms. That is a configuration state, not a result — they did not fail, they were never asked.

The plan: what was promised, and what would falsify it
idhypothesisthresholdfalsified if
H1Arms differ in time-to-index by more than sampling noise. p < 0.05p >= 0.05, or the estimated hazard ratio between the fastest and slowest arm has a confidence interval containing 1.
H2ABSENT and STALE are not interchangeable: at least one arm returns the superseded answer, rather than nothing, for more than 20% of its not-yet-FRESH observations at the 1-hour rung. lower bound of the Wilson interval > 0.20 for at least one armEvery arm's upper Wilson bound at rung 3600 is at or below 0.20. That result would mean retrieval misses are overwhelmingly silent, and the distinction this project is built on would not matter in practice. It is a real possible outcome and is stated here so it cannot later be quietly dropped.
H3Time-to-index depends on the origin page's render posture. p < 0.05p >= 0.05, or fewer than 15 events land in any class being compared, in which case the comparison is reported as underpowered rather than null.
H4The pipeline's own false-positive rate is small enough that the recall ordering between arms is not an artifact of it. the upper bound is below half the smallest recall gap that the leaderboard is used to claim Any arm's false-positive upper bound exceeds a recall difference the leaderboard reports as meaningful. In that case the ordering is reported as unresolved rather than as a result, and the grader is the thing that needs work, not the write-up.

Primary endpoint. Median time from publication to first FRESH answer, per provider arm, estimated by the Turnbull NPMLE over interval-censored observations and reported as a bracket between adjacent ladder rungs with a bootstrap confidence interval on the bracket's upper edge.

Stopping rule. Collection stops at the earlier of: 30 days of wall-clock, or the point at which the number of events reaches the Schoenfeld requirement for the smallest effect declared interesting (HR 1.5, 191 events). The leaderboard is not to be inspected for the purpose of deciding when to stop; `tti forecast` projects the stopping date from collection rate alone, before any scoring.

armmedian TTI 95% CI
on the median
p9024h recall 24h recall
vs origin
stalenessp50 latency text served
chars / result
$/1k events $/1k fresh
answers
events
brave/web10m–3.0d3.0d · unreached in 41%10m–3.0d0% (0–79)0% (0–20)16% (6–38)572ms310$5.17no answers29
parallel/fast10m–3.0d3.0d · unreached in 36%10m–3.0d67% (21–94)0% (0–22)11% (3–33)611ms1.0k$1.04$14.5028
exa/auto>10m10m · unreached in 84%>10m100% (44–100)13% (4–38)29% (13–53)1610ms1.5k$7.00$67.6729
parallel/advanced>3.0d7m–7m · unreached in 84%>3.0d90% (60–98)0% (0–22)32% (15–54)3481ms935$5.18$16.1128

The CI column is a nonparametric bootstrap on the median bracket's upper edge. It is here because a median printed without one is the most common way a short run gets over-read: at forty events, a bracket can land a rung either side on luck alone, and the ordering of this table is exactly what that luck moves. Where an arm's median is not reached inside the 72-hour window in some resamples, the share is printed rather than hidden — for a slow arm that number, not the point estimate, is the finding.

Two cost columns, because they can disagree and the disagreement is the point. Cost per event is what you pay to ask; cost per fresh answer is what you pay to get one, and a provider that returns nothing does it very cheaply. A freshness win bought at 5× the price is a different product decision than a freshness win at parity, and a leaderboard that hides the denominator is advertising.

Text served is the median number of characters the grader read per returned result. Every arm is asked for the same 1,500; only the APIs that take a characters parameter honour it, and a snippet API returns ~150 regardless. The grader reads whatever came back, because that is what an agent gets — but a tenfold difference in this column is a tenfold difference in the surface a version string can appear on, and part of any recall gap lives there. The snippet-window sensitivity variant below re-grades every arm as though it had returned short snippets.

Median is a Turnbull nonparametric MLE for interval-censored data, reported as the interval the estimate actually pins down. An arm seen absent at 15m and fresh at 1h indexed somewhere in (15m, 1h] — it did not index at 1h, and printing a point would invent precision the ladder cannot supply. Events still un-indexed at 72h are censored, not dropped: discarding them reports every provider as faster than it is, and unevenly, since the bias is largest for whoever has the most un-indexed events. >72h means the arm never accumulated half its mass inside the window, which is a different statement from "slow".

Pipeline false-positive rate

Every stored payload re-graded against a counterfactual answer: a version-shaped token of the same form as the real one that was never published. A FRESH verdict against it is a false positive by construction. This is recall's error bar, which is why it sits here and not in a footnote.

armpayloads re-gradedfalse positives rate (95% CI)of this arm's FRESH verdicts
that could be spurious
brave/web1700.0% (0–18)up to 18%
exa/auto1600.0% (0–19)up to 19%
parallel/advanced1600.0% (0–19)up to 19%
parallel/fast1600.0% (0–19)up to 19%

Two causes, both invisible in a leaderboard: the grader matching a version-shaped token in unrelated prose, or a provider's answer layer inventing one. Zero observed is not a zero rate — the last column is the Wilson upper bound, and it is the number that belongs beside each arm's recall. This render did not ask any registry whether the counterfactuals are really unpublished — the page is built offline. tti decoy does, and its figure is the one to quote. 27 event(s) could not be decoyed: 27 not a plain semantic version. The origin control's own re-grade: 0 of 21 page fetches matched the counterfactual (upper bound 15%) — the grader's rate on raw page bytes, with no provider in the loop.

Time to index

1m 5m 15m 1h 6h 24h 72h 0% 25% 50% 75% 100% lag since publication (log scale) · shaded band = 95% CI
brave/webparallel/fastexa/autoparallel/advanced

The control arm

At every rung, each event's canonical URL is also fetched directly, with robots.txt honoured, and checked for the answer token. Of the events in this run, 20 were confirmed retrievable from their own origin within 24 hours.

origin outcomeeventswhat it means
found21fetchable, and the answer was in the served bytes
not_found14page fetched, answer not in it — nobody could index it from here

Without this arm, every ABSENT is ambiguous: a provider that does not return the fact might have a slow crawler, or the fact might not be fetchable from its own page yet. The 24h recall vs origin column asks the question only of events the control proved were on the web, and it is the column that is actually about the provider. Origins that refused us or that robots.txt excludes are omitted from that denominator rather than guessed at.

Where the fact lived

armapi onlyserver html
brave/web0/8 (0%)0/7 (0%)
exa/auto1/8 (12%)1/7 (14%)
parallel/advanced0/7 (0%)0/7 (0%)
parallel/fast0/7 (0%)0/7 (0%)
classmeaning
api onlythe crawler-facing page did not answer; an API fallback did
server htmlin the page's visible text — readable without executing anything

24-hour recall split by where the answer sat in its own document. The control arm already fetches every page, so this axis costs nothing, and it is the one that turns "provider X missed it" into something a buyer can act on. A fact in an <h1> and a fact buried in a __NEXT_DATA__ blob are different retrieval problems. An arm strong on the first and weak on the second is not slow — it does not execute JavaScript, and that is a sourcing decision, not a latency one. Denominators are events the control arm confirmed were on the web.

Estimator check

armTurnbull (reported)Kaplan–Meier on the rung overstatement
brave/web10m–3.0d>3.0dup to 3.0d
parallel/fast10m–3.0d>3.0dup to 3.0d
exa/auto>10m>3.0d—
parallel/advanced>3.0d>3.0d—

Kaplan–Meier needs a point event time, so feeding it the rung records an arm as indexing at the probe that first saw it. That overstates every latency by up to a bracket width, and it cannot represent a widened interval at all when a probe is dropped for budget, rung slip, or a provider error. This column is kept visible rather than deleted: if the overstatement is ever small, the ladder is fine enough that the choice of estimator does not matter, and that is worth knowing too.

Staleness

Across every probe where the provider had not yet indexed the new answer and the question had a superseded one, it returned the superseded answer 22% of the time (16 of 73 opportunities).

Existing search benchmarks score a miss and a confidently-wrong stale answer identically. In production they are not the same event. An agent that gets nothing back retries, widens, or says it does not know. An agent that gets last quarter's number back cites it, and nothing downstream can tell that it is wrong.

5m 15m 1h 6h 24h 72h 0% 25% 50% 75% 100% lag since publication (log scale) · share of not-yet-fresh probes that returned the superseded answer
brave/webparallel/fastexa/autoparallel/advanced

Staleness should fall as an index catches up, so the shape matters as much as the level. A line that stays flat means the provider is holding a superseded answer with confidence rather than slowly acquiring the new one — a different problem, and a worse one. Only questions with a superseded answer count here; preprints and Federal Register documents have none, so they are excluded by Event.measures_staleness rather than by convention.

By source class

code release

armmedian24h recallstalenessn
brave/web10m–3.0d0% (0–79)17% (3–56)6
parallel/fast10m–3.0d0% (0–79)17% (3–56)6
exa/auto>10m100% (21–100)20% (4–62)6
parallel/advanced>3.0d0% (0–79)57% (25–84)6

gov publication

armmedian24h recallstalenessn
parallel/fast7m–7m100% (34–100)—10
parallel/advanced7m–7m100% (70–100)—10
brave/web>7m——10
exa/auto>7m100% (21–100)—10

package registry

armmedian24h recallstalenessn
brave/web>10m—15% (4–42)13
exa/auto>10m100% (21–100)33% (14–61)13
parallel/advanced>10m—17% (5–45)12
parallel/fast>10m—8% (1–35)12

Does the ranking survive the rules that produced it

rule variantverdict churnrank correlation medians movedarms lost
strict (reported)0.0%1.000/40
naive-substring0.0%1.000/40
no-v-prefix0.0%1.000/40
canonical-token-only0.0%1.000/40
urls-count-as-evidence0.0%1.000/40
titles-only28.9%0.002/42
shallow-walk2.6%0.331/41
snippet-window19.7%0.331/41

'titles-only' (2 of 4) makes arms unmeasurable rather than reordering them — the ranking looks stable under it only because there is nothing left to rank. Among the variants that keep the arms: 'shallow-walk' reorders the leaderboard (tau 0.33). The ranking is partly an artefact of the grading rules and should be published with that stated, not without it

Every grading rule here is a judgement call: match on token boundaries or not, count a v prefix, trust aliases, treat a URL as evidence. Each variant re-grades the stored payloads under one of those calls made differently — no API calls, which is why the raw responses are kept. Rank correlation alone is not enough, and this harness caught that about itself: a variant that reads no content collapses every arm equally, so the order never changes and the correlation comes back perfect for a table that has stopped meaning anything. Arms lost is the column that catches it.

Are the differences real

comparisonhazard ratioeventslog-rank p p adjusted
Holm–Bonferroni
powerread
brave/web vs parallel/fast0.5240.51621.000010%underpowered (10%) — needs ~70 more events (~54d)
brave/web vs exa/auto0.2040.08100.323937%underpowered (37%) — needs ~8 more events (~6d)
brave/web vs parallel/advanced0.11100.01200.071893%well powered, no difference found
parallel/fast vs exa/auto0.7760.73151.00005%underpowered (5%) — needs ~473 more events (~367d)
parallel/fast vs parallel/advanced0.31120.05340.267152%underpowered (52%) — needs ~11 more events (~9d)
exa/auto vs parallel/advanced0.33120.08130.323948%underpowered (48%) — needs ~14 more events (~11d)

6 comparisons, so the adjusted column is the one to read. Judging each pair against a raw α = 0.05 would give a 26% chance that at least one pair is called different when neither is — a leaderboard with six arms invites fifteen comparisons, and that is how a benchmark ships a difference it invented. Holm–Bonferroni rather than plain Bonferroni: same control of the family-wise error rate, uniformly more power, and no independence assumption, which matters because pairs sharing an arm are correlated. The read column uses the adjusted value.

Log-rank rather than a t-test on the indexed subset, because most observations are censored and a test that ignores censoring finds differences that are artefacts of who ran out of window first. The power column is here because the truthful answer early in a run is "not yet", and a leaderboard invites a claim long before the data can carry it: at the observed hazard ratio, Schoenfeld's formula says how many events 80% power would take. A hazard ratio of 2 needs 66 events; a ratio of 1.2 needs 945.