<feed xmlns='http://www.w3.org/2005/Atom'>
<title>sz-chrome-remote-cdp.git/castle-search/src/search.ts, branch master</title>
<subtitle>pi-browser-harness, patched to drive a Chrome on another host over CDP, with castle_cdp_search web search
</subtitle>
<id>https://git.soarez.net/sz/sz-chrome-remote-cdp.git/atom?h=master</id>
<link rel='self' href='https://git.soarez.net/sz/sz-chrome-remote-cdp.git/atom?h=master'/>
<link rel='alternate' type='text/html' href='https://git.soarez.net/sz/sz-chrome-remote-cdp.git/'/>
<updated>2026-11-06T03:33:30+00:00</updated>
<entry>
<title>castle-search: resolve Google links lazily, in Chrome, not eagerly over plain HTTP</title>
<updated>2026-11-06T03:33:30+00:00</updated>
<author>
<name>Igor Soarez</name>
<email>igor@soarez.org</email>
</author>
<published>2026-11-06T03:33:30+00:00</published>
<link rel='alternate' type='text/html' href='https://git.soarez.net/sz/sz-chrome-remote-cdp.git/commit/?id=561f0ee076c684a79fd5671af1bad0894f33e4de'/>
<id>urn:sha1:561f0ee076c684a79fd5671af1bad0894f33e4de</id>
<content type='text'>
The Node-side resolver sent one curl-like request per result with no
cookies, JS or browser; Google answers that with its 'Verifying your
request' countdown after a handful, and the testing itself triggered it.
A click or direct navigation in Chrome redirects at once (measured).

Search now leaves Google links wrapped and prints the breadcrumb Google
shows for each. castle_cdp_resolve follows one wrapped link in a Chrome tab
when the agent picks it, accepts only google.com/goto?url=&lt;token&gt;, and
reports the verification page instead of waiting it out.
</content>
</entry>
<entry>
<title>castle-search: read Brave again, and report genuine zero-hit searches as such</title>
<updated>2026-11-06T03:18:21+00:00</updated>
<author>
<name>Igor Soarez</name>
<email>igor@soarez.org</email>
</author>
<published>2026-11-06T03:18:21+00:00</published>
<link rel='alternate' type='text/html' href='https://git.soarez.net/sz/sz-chrome-remote-cdp.git/commit/?id=147b3b1507ebcdf5912fbd4c474c9dfb35265148'/>
<id>urn:sha1:147b3b1507ebcdf5912fbd4c474c9dfb35265148</id>
<content type='text'>
Brave: #results no longer exists on the live page; fall back to #main/main.
It was reported as 'no results area at all', i.e. a rate limit.

DuckDuckGo: its 'No results found' notice is itself a .result, so an empty
search looked like broken markup. emptyMarker lets the probe say the engine
itself reported no matches, and the error tells the caller to loosen the
query instead of switching engines.
</content>
</entry>
<entry>
<title>castle-search: read Google results again by resolving its /goto links</title>
<updated>2026-11-06T03:17:16+00:00</updated>
<author>
<name>Igor Soarez</name>
<email>igor@soarez.org</email>
</author>
<published>2026-11-06T03:17:13+00:00</published>
<link rel='alternate' type='text/html' href='https://git.soarez.net/sz/sz-chrome-remote-cdp.git/commit/?id=74ff9fdcb8b49a021b63ac2e6b0191e29754d0f3'/>
<id>urn:sha1:74ff9fdcb8b49a021b63ac2e6b0191e29754d0f3</id>
<content type='text'>
Google now wraps every result as google.com/goto?url=&lt;opaque token&gt;. The
self-host filter discarded all of them, so every Google search failed with
'nothing could be parsed'. Accept /goto, resolve it node-side from the
302 Location, and when Google answers its 'Verifying your request'
interstitial instead, keep the wrapped link and put the displayed
breadcrumb in the snippet.
</content>
</entry>
<entry>
<title>Write up what AI answer blocks would cost before building one</title>
<updated>2026-08-04T14:08:47+00:00</updated>
<author>
<name>Igor Soarez</name>
<email>igor@soarez.org</email>
</author>
<published>2026-08-04T14:08:47+00:00</published>
<link rel='alternate' type='text/html' href='https://git.soarez.net/sz/sz-chrome-remote-cdp.git/commit/?id=bd03d3b8fff9ed18d3cdb104c55908ba5be6c424'/>
<id>urn:sha1:bd03d3b8fff9ed18d3cdb104c55908ba5be6c424</id>
<content type='text'>
Google, Bing and Brave all put a generated answer above their results now,
and none of it is being read. Investigated against castle's Chrome; nothing
in src/ changed, because the cost turned out to be worth deciding on rather
than absorbing.

Two things make it expensive. Google's AI Overview exists only on the
classic layout — udm=14 is the "Web" tab, and having no overview is part of
what that tab is — so enabling it means giving back the clean page the
extractor was built around. And all three stream in after the results are
already parseable: Google settles ~2.3s in, Brave was still growing at 5s,
against an extractor that returns at ~0.5s. The wait is often wasted, since
the blocks are query-dependent — no Google overview for "how does postgres
MVCC vacuum work" after 15s, no Bing answer for "who founded anthropic".

Selectors, the traps behind them (#m-x-content briefly holds ~29k
characters of unrelated page; Google's "Show more" hides only the
disclaimer), the measured timings, three possible designs and their
tradeoffs are all in the doc, so this does not have to be re-measured if
the answer turns out to be yes.
</content>
</entry>
</feed>
