Claude Code Build Night Bright Data SF · 20 Oct 2026 · Ray Zahid, Immersive Commons
Search in the age of agents
Where agents get facts, how to check the facts, and how to make your data easy for agents to use.
Four talks and one afternoon of tests, 20 Oct 2026. Each number on these slides has a source file. Pixel loop: decks/meta/media/src/title-search-sky.ts
20 Oct 2026, 1:45 to 2:01 PM PT Netflix posted Q3 results at about 1:01 PM. Then we asked nine sources.
netflix q3 2026 revenue
The answer, from the SEC filing: revenue grew 12% to $12.9B.
ExaAI native search
"Netflix reports results for third quarter of 2026", then the SEC filing, then CNBC from today
the number
LinkupAI native search
"Netflix Q3 Revenue Rises 12% to $12.87 Billion"
the number
ParallelAI native search
CNBC from today, then "Netflix Q3 2026 Earnings: Revenue of $12.87 Billion"
We made this list of six types. It is not a standard. Our research pipeline searches six channels at the same time: ~/.claude/orchestration/workflows/research.yaml
pixel loop made with the stranger-builds engine (PixelPass) · decks/meta/media/src/weights-vs-search.ts
Memory facts that the model learned in training
A model answers from its training and from search results
40 = 40
60 trivia questions. Claude with no search got 40 correct. Claude with Google results also got 40.
27 / 39
The fast lane got 39 answers correct. For 27 of them, the answer was not in the search results. Claude used its memory.
4 / 15
Claude with no search, on news from the last 7 days.
Use search for new events and for facts that the model gets wrong.
research/battle/answers_summary.json (all60 none 40, google 40; fresh none 4) · research/s1s2/mined.json crosstab_snippets_vs_quick (27 of 39)
pixel loop made with the stranger-builds engine · decks/meta/media/src/frozen-recon.ts · numbers: research/battle/answers_summary.json
3.6 Round 3 · only the search results change
On news, search makes the difference
60 trivia questionsthings a model may already know
Memory only, no search 40
Google's top 5 40
Best search: Exa's top 5 45
15 news questions13 to 20 Oct 2026, after the model's training
Memory only, no search 4
Google's top 5 13
Best search: Tavily's top 5 15
On news, search changed the score from 4 to 15.
research/battle/answers_summary.json all60 + fresh (none, google, exa, tavily) · model claude-sonnet-5-5, no tools · graded by eval/grade.py correct
2
Part 2 · Where input comes from
The answer is only as good as the input
1.1 Crawl, index, rank, snippet
Four steps between the web and your agent
results_fresh/*.jsonl fr05 · summary.json s2 (results for 4 of 30, 0 answers) · summary_all60.json answer_in_top1, mean_snippet_chars
1.3 Snippet vs full page · median characters, drawn to scale
A snippet shows a tiny part of the page
One snippetthe lines under a link
154characters
What quick readsquestion + all 8 snippets
1,865characters
One pagethe top Wikipedia article
16,293characters
Snippet"Phasma is the commander of the First Order's force of stormtroopers"
PageThe full Captain Phasma article, which names the actress. Quick never saw it.
What a page shows you the layers that an agent can read
An agent reads a web page in layers
Layer
What it contains
Size (characters)
Title and link
the name and address of the result
a few words
Snippet
the lines under the link
154
AI native extract
longer text that the API selects for a model
487 to 1,534
Results page
the question and all 8 snippets
1,865
Full page
the complete article
16,293
Each lower layer costs more tokens and more time. Each lower layer also contains more answers. When you select a source, you also select the layer that one call gives you.
pixel loop made with the stranger-builds engine · decks/meta/media/src/too-much-context.ts · sizes: research/s1s2/ext_summary.json, research/battle/summary_all60.json (medians)
1.2 Scrape it, rent a scraper, or use a new index
Three ways to get search results
1 · Scrape a results page
Load the page
how
load the page and copy out the links
we used
Google, through an Apify scraper
catch
slow (5.62 s median), breaks when the page changes
2 · Search results API
Rent a scraper
how
a company scrapes the page and sends you the results as data
we used
Serper. Also SerpAPI and Bright Data
catch
short text: 144 characters per result on average
3 · AI native search API
Built for AI
how
its own copy of the web, long text, full pages on request
we used
Exa, Tavily, Linkup, Firecrawl search
catch
each one sees a different part of the web
Claude's WebSearch goes one step further: links plus a summary a model already wrote.
summary_all60.json median_latency_s (google, amortised over a batch), mean_snippet_chars (serper) · content/battle.md C5
Six measures the range that we measured on 20 Oct 2026
No source is the best on all six measures
Measure
The agent asks
Worst
Best
Cost
What do 1,000 searches cost?
about $30
$1
Text per result
How much text must I read?
133 chars
1,534 chars
Freshness
Does it find news from this week? (of 15)
3
14
Relevance
Is the answer in the top 5? (of 60)
7
49
Speed and rate limits
How fast? How many calls can I make?
15.9 s · blocked
0.6 s
Diversity
Does a second source give new links? (shared links)
0.71
0.03
battle: TOS_PRICING.md (Serper $1) · summary_all60.json (claude.cost_usd_total, about $30 per 1,000; mean_snippet_chars; answer_in_top5; median_latency_s; overlap) · summary_fresh.json · results/retried.jsonl (DuckDuckGo blocked 28 of 30; Firecrawl 10 a minute)
3.4 Overlap · how many top 5 links two sources share, 60 trivia
Nine sources, but many show the same pages
Google, Serper, FirecrawlShare most links: 0.59 to 0.71. They seem to use Google's results.
Tavily, partlyAbout 0.4 with the Google group. Similar pages, in its own order.
Exa, Parallel, Linkup, ClaudeEach returns mostly different pages: 0.22 or less with anyone.
1.0 = the same links. 0 = no links in common. Average over 60 questions. Our reading of the links, not a vendor's statement.
research/battle/summary_all60.json overlap.<a|b>.mean_jaccard (n = 60 per pair)
pixel loop made with the stranger-builds engine · decks/meta/media/src/ponds.ts · first links: research/battle/results/<source>.jsonl id nq10 · overlap: summary_all60.json
3.9 Which sites come back · 10 questions people argue about, top 5 each
Each source favours different kinds of sites
Exa
30%
Parallel
28%8%
Tavily
16%10%10%
Google (Apify)
16%8%18%
Serper
16%8%20%
Firecrawl search
16%8%20%
Linkup
100% everything else: blogs, firms, small sites
Claude WebSearch
94% everything else
Wikipedia
100% encyclopedia
government, universities, international bodiesencyclopediaforum / video / socialreview / affiliateeverything else
research/battle/contested_summary.json per_source.shares (50 results each) · classes from a hand made domain list in contested.py
3
Part 3 · Route, agree, check
Select the source, then check the answer
Demo 1 a classifier selects the source before the search
A fast model labels the type of query
This page uses keyword rules. It does not call Jev. Each reason is a test result from today.
# the same task for Jev (about 0.1 s per call)
POST api.typesafe.ai/v1/systemone
{"state": "The user asked: netflix q3 2026 revenue",
"questions": {"kind": {"type": "choice",
"instructions": "What kind of search query is this?",
"criteria": ["recent news",
"fact a model would know", "two-step fact",
"evidence or research", "what people say",
"papers"]}}}
We did not test Jev on this task yet. We have 85 queries with known types for the test.
illustration · pixel loop made with the stranger-builds engine · decks/meta/media/src/sorting-office.ts · routes from research/battle summary_fresh.json, summary_all60.json, contested_summary.json
Routing result same model, same prompt, 75 questions with known answers
Routing gave 2 more correct answers
Policy
60 trivia
15 news
Correct, of 75
Tavily for all questions
38
15
53
Exa for all questions (best single source)
45
13
58
Trivia to Exa, news to Tavily
45
15
60
Routing can also skip search for facts that the model knows. This saves cost and time.
This result assumes a classifier with no errors, on two query types. We tested for one afternoon.
illustration, not test data · pixel loop made with the stranger-builds engine · decks/meta/media/src/council.ts · numbers: research/battle/vote.json
Demo 3 when Google, Tavily and Exa disagree, use deep research
Deep research fixed 1 more of the 13 hard questions
13 questions where sources disagree
Correct
Answer from the first source
6
Deep research: opens pages and searches again
7
All 60 trivia questions
Correct
Vote when sources agree, deep research when they disagree (22% to deep)
41
Deep research for all questions
44
Exa for all questions
45
Talk B used the same 60 questions, so we already had a deep research answer for each question. Of the 13 questions, 7 ask for one fact and 6 ask for two facts. The sample is small: 13 questions.
research/meta/disagree_deep.py reads battle/answers/{core,rest}/*.jsonl and eval/results/deep.jsonl, graded by eval/grade.py
Main result ask the model with no search, then search, then compare
When memory and search agree, the answer is almost always correct
60 trivia · memory and search agreecorrect answers when they agree
Memory and Exa agree, 27 questions 27
Memory and Tavily agree, 30 questions 28
Memory and Google agree, 30 questions 27
When they disagreeold facts: 50/50 · news: search is correct
Trivia, memory and Google disagree: Google correct 13, memory correct 13
News: memory agreed with search on 0 or 1 of 15 questions
If memory and search agree on an old fact, use the answer. If they disagree on news, use the search result.
research/meta/disagree_deep.py over battle/answers/{core,rest,fresh}/{none,exa,tavily,google}.jsonl · "agree" is the text match in vote.py same() · Sonnet 5.5 · talk B: Claude's own confidence, AUC 0.73; Jev 0.61; Laya 0.54
System design lessons from the four talks
Ask memory first. Search one source. Read pages only if they disagree.
Memory
Answer and confidence, no tools
AUC 0.73
→
Classify
Label the query type. Jev, about 0.1 s
selects the source
→
One search
The best source for that type
news: 15 of 15
→
Compare
Old fact and agree: use it. News: use search.
27 of 27
→
Disagree
Search a second source, read the full page, check each quote
System 2
def answer(q):
mem, conf = claude_no_tools(q, ask_confidence=True) # System 1 from memory
kind = jev_choice(q, KINDS) # select the source
found, hits = claude_from(search(SOURCE[kind], q, k=5), q)
if kind == "recent news" or same(mem, found):
return found, cite(hits) # news, or memory and search agree
pages = read_full(top(hits + search(OTHER_WEB[kind], q), 3))
return claude_from(pages, q, quotes_must_match=True) # System 2 only here
We measured each step. We did not run the full loop tonight.
4
Part 4 · Agents that search for your data
Other agents search for your data
Your data each agent gets different search results
Each agent gets different search results. How you publish your data controls if agents find it.
Make sure that your customers, and their agents, get your data correctly. If your data has value, agents can pay for it per call.
illustration · pixel loop made with the stranger-builds engine · decks/meta/media/src/two-webs.ts · the six doors are the agent native stack: research/agentnative/walk.md
1.2 The same search, twice
Search results for a person, and for an agent
For a person · illustration
who is leo messi
Sponsored Football shirts, big sale today …
Lionel Messi Facts | Britannicabritannica.com › factsArgentine footballer, born 1987 in Rosario, who …
Lionel Messi · Wikipediaen.wikipedia.org › wikiLionel Andrés Messi is an Argentine professional …
Messi stats and newsexample-sports.comLatest goals, transfer talk and …
More results
We value your privacy Accept all
I'm not a robot
For an agent · Tavily's documented response shape
{"query": "Who is Leo Messi?", "results": [{ "title": "Lionel Messi Facts | Britannica", "url": "https://www.britannica.com/facts/Lionel-Messi",cite it "content": "<snippet>",read it, no scraping "score": 0.81,rank it "published_date": "Tue, 11 Mar 2025 17:00:00 GMT"}],is it fresh? "usage": {"credits": 1},what did it cost? "request_id": "123e4567-…"}report a failure
Each field is written down, and its name never changes.
docs.tavily.com/documentation/api-reference/endpoint/search (response example) · left panel is an illustration
1.1 What an agent does with search
An agent is an AI that decides its next step and uses a tool to do it
A person does this once and reads the screen. An agent does it thousands of times, alone. If a step needs a person, the agent gets stuck there.
2.1 ora.ai, a public grader of agent readiness · its leaderboard
Most of the web is not ready for agents
ora scores four things out of 100: can an agent find you (20), get in (30), use you (40), pay you (10). Only 28 of 5,204 sites score 90 or more. Two score 100.
ora.ai public leaderboard, pulled 2026-10-17 · research/agentnative/chart-data.json · ora.ai/methodology · IC: ora scan 2026-10-20
2.2 Companies that sell search and web data · ora score of each main site
Companies that sell to agents are ahead
all sites, median 42
Agent Tools category, median 59.5
zenrows.com
96
apify.com
96
tavily.com
92
exa.ai
90
parallel.ai
89
brightdata.comevent host
89
firecrawl.dev
84
linkup.so
64
jina.ai
61
perplexity.ai
59
serper.dev
33
This score measures how ready the site is for agents. It does not measure search quality. Scans dated 2026-09-18 to 2026-10-17.
ora.ai public leaderboard, pulled 2026-10-17 · research/agentnative/chart-data.json (search_and_data_vendors, category_medians)
Live test four public APIs, read only, 20 Oct 2026, 13:18 to 13:30 PT
Agents can find most sellers. Use, access and payment need work.
Mostly done
Discovery
All three search sellers publish llms.txt, OpenAPI and an MCP server. The files are on the docs site. The API host that agents call returns 404 for most files.
In progress
Use
An error must tell the agent what to do. Exa sends a code, a fix and a request id. Tavily sends only "missing or invalid".
Not done
Access
Each sign-in server that we read needs a browser and a person. None of the three has a device-code login.
Started
Payment
One of four APIs replied to a call with no key with a price: Exa, $0.007, x402.
Agent native means that an agent completes each step without a person.
research/agentnative/walk.md (each cell has a source) · Wikipedia has almost none of the new files. Agents can use it today: JSON with no key, errors that name the bad parameter, published limits.
Rate limits what happened during our tests on 20 Oct 2026
Rate limits control which agents can use your data
Source
Result
DuckDuckGo, no key
blocked 28 of 30 queries
OpenAlex, no key
refused 8 of 8: the free daily budget was used
Wikipedia
refused 20 of 30 until we sent a name and contact: 10 calls a minute with no name, 200 with a name
Exa, no key
no block: it sent a price, $0.007 per call
Unknown agent
Limit the rate. Send Retry-After with the time to try again.
Named agent
Give more calls to a client with a name: a User-Agent, a key or a device-code login.
Paying agent
Give access for a price per call (x402).
Each limit must tell the agent what to do next.
battle: summary.json (ddg, openalex), results/retried.jsonl · mediawiki.org/wiki/Wikimedia_APIs/Rate_limits · agentnative: walk/probes.jsonl (Exa 402) · none of the APIs that we tested sends the draft RateLimit headers
illustration · pixel loop made with the stranger-builds engine · decks/meta/media/src/the-door.ts · Wikimedia limits: mediawiki.org/wiki/Wikimedia_APIs/Rate_limits · Exa 402: research/agentnative/walk/probes.jsonl
1.7 Pay · HTTP 402, "Payment Required"
The server names a price. The agent pays, then retries.
The real terms, 20 Oct 2026$0.007 in USD Coin, a stablecoin, on the Base network (eip155:8453), x402Version: 2. The reply on the first slide.
Statusx402 was open sourced by Coinbase in May 2025. It moved to an x402 Foundation at the Linux Foundation on 2026-04-02. check primary Adoption figures conflict, so we quote none.
1.4 How the library picks what you see: two searches, one list
score(d) = Σ w · 1 / (60 + rank)
Hybrid search
Ask a meaning finder and a word finder at once, then merge.
Keyword results (BM25) and meaning results (vectors), merged into one list. BM25 catches exact names and codes. Vectors catch the same idea in other words.
we run three paper retrievers per question
Reciprocal rank fusion
Each list gives points for position. Points add up across lists.
It uses only positions, so different kinds of score never need converting. k = 60. Each of our three searches has weight w = 1/3.
Why it matters to you: any AI that answers from your documents can miss. These moves work on your library too.
1Notice what is missingSearch outside your library. List what it lacks.demo: 0 of 30 relevant papers were there
2Add itGet the full text, not just the title. Cut it into passages.demo: 6 papers, 195 passages
3Check the answerAsk again. Check every quote. Run a fixed test.demo: 11 of 11 quotes found
Then go round again. Each round, the library keeps what it learned.
rag/demo2/20_gap.json (0 of 30) · demo2/33_chunk.txt (195) · demo2/60_after_answer.json (quote check 11 of 11) · ~/.claude/orchestration/workflows/research.yaml
illustration of a real run · pixel loop made with the stranger-builds engine · decks/meta/media/src/library.ts · numbers: research/rag/demo/ (learn_1_seed.txt, learn_3_chunk.txt, before_after_nosession.json)
Move 3 Same questions, asked again · added papers in the top 8
question, written before any search
before
after
the questionHow should a retrieval system split long documents into chunks, and does the way you chunk change the quality of the answers?
0
3 · #1, #2, #3
sub-question 1fixed-size versus semantic chunking of documents for retrieval augmented generation
0
4 · #1, #2, #3, #8
sub-question 2effect of chunk size and overlap on retrieval accuracy and answer quality
0
4 · #1, #3, #4, #7
sub-question 3chunking long documents while keeping context from the surrounding text
0
5 · #1, #2, #3, #5, #8
sub-question 4propositions or sentences versus passages as the unit of retrieval
0
2 · #1, #4
passages the answer readstop 8 after merging all five lists
0 of 8
7 of 8
rag/demo2/11_before_retrieval.json · 50_after_retrieval.json · 70_summary.json · 01_subquestions.json (17:45:57) · research.brain_search k = 8, served path
The payoff Same question, prompt and model · it may use only the top 8 passages
The answer, before and after
before · from surveys and one chunking paper
Chunk size and overlap "play a crucial role in the overall effectiveness of the RAG system."
"Larger chunks can capture more context, but they also generate more noise."
They give no single best chunk size.
quotes found word for word: 7 of 9
after · 7 of 8 passages from the added papers
Fixed-size chunks are the usual method, but this "often fragments context, resulting in incomplete retrieval."
In one clinical test, "Adaptive chunking achieved the highest accuracy": 87%, against a "baseline 50%."
Before: general advice. After: a measured result, with its cost.
rag/demo2/40_before_answer.json · 60_after_answer.json (claude-opus-5-5, both saved in full; lines shown are excerpts) · scripts/demo2_answer.py (quote check: normalised text match) · 87%: Comparative Evaluation of Advanced Chunking … Clinical Decision Support (2025), p = 0.001
Small and large models each row is a test result
Use small models for yes or no. Use large models to copy quotes.
Task
Small model
Large model
Is the fast answer correct?
Jev, about 0.1 s: AUC 0.61 · Laya on CPU, about 3 s: 0.54
Claude rates itself: 0.73
Is this passage relevant?
3B: same score as Claude on an easy test. On a difficult test it accepted 1 in 3 wrong passages.
Claude, difficult test: rejected 94%
Copy quotes from a passage
3B: 19% of quotes were invented
Claude: 0%
Ask the correct question
Jev was good at "Do the snippets contain the answer?" (0.79). It was bad at "Is the fast answer correct?" (0.61).
Use a difficult test
On an easy test, the 3B model and Claude had the same score. On a difficult test, Claude was better.
Divide the work
Small model: a fast yes or no. Large model: text that must match the source.
pixel loop made with the stranger-builds engine · decks/meta/media/src/small-large.ts · invented quote and 19% vs 0%: life/research/experiments/exp002_claim_extraction/README.md · the source passage shown is an example
Six lessons from one afternoon of tests
Six lessons for agent search
The input sets the answer
Same model. News with no search: 4 of 15. With the best source: 15 of 15.
Memory is a source
On old trivia, memory and Google results got the same score: 40 and 40. Ask the model first.
Select the source for each query
No source is the best on all six measures. A classifier can select one in 0.1 seconds.
Compare two answers
Memory and search agreed: 27 of 27 correct. If they disagree, read the full page.
Make your data easy for agents
The median web site scores 42 of 100. Companies that sell to agents score 89 to 96. Set rate limits and prices for agents.
In your library: find, add, check
The 4 key papers: 0 found before, 4 found after. A program checks each quote. Run a fixed test after each change.
Summary Search in the age of agents
An agent's answer is only as good as its sources. Select the source, check the answer, and make your data easy for agents to read.
Ray Zahid · Immersive Commons · all five talks: agent-search-talks.pages.dev · tests from 20 Oct 2026, one afternoon
short cut01 / 01
Overview · arrows + Enter or click · Esc to close
Slide 100:00--:--
Now
Next
Notes
Arrows / space: advance · T: reset timer · this window drives the deck