<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ajnas N B</title>
    <description>The latest articles on DEV Community by Ajnas N B (@ajnasnb7717).</description>
    <link>https://dev.to/ajnasnb7717</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4045989%2F3a4d7187-8891-45a9-bfef-c07f85bca6c3.png</url>
      <title>DEV Community: Ajnas N B</title>
      <link>https://dev.to/ajnasnb7717</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ajnasnb7717"/>
    <language>en</language>
    <item>
      <title>What you save when project context stops repeating</title>
      <dc:creator>Ajnas N B</dc:creator>
      <pubDate>Tue, 11 Aug 2026 03:20:45 +0000</pubDate>
      <link>https://dev.to/ajnasnb7717/what-you-save-when-project-context-stops-repeating-19ao</link>
      <guid>https://dev.to/ajnasnb7717/what-you-save-when-project-context-stops-repeating-19ao</guid>
      <description>&lt;p&gt;Qarinah compiles a compact, cited project-memory pack instead of asking every new coding-agent session to replay the entire available history.&lt;/p&gt;

&lt;h2&gt;
  
  
  The published estimate
&lt;/h2&gt;

&lt;p&gt;Across six committed software-task fixtures, the full-history baseline contained &lt;strong&gt;442,113 portable estimated input-context tokens&lt;/strong&gt;. The Qarinah path used &lt;strong&gt;5,682&lt;/strong&gt;. Every required target was still directly covered in the top five results.&lt;/p&gt;

&lt;p&gt;That is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;436,431 fewer&lt;/strong&gt; estimated input-context tokens;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;98.71% less&lt;/strong&gt; repeated context; and&lt;/li&gt;
&lt;li&gt;a &lt;strong&gt;77.81:1&lt;/strong&gt; baseline-to-pack ratio.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The ratio is not a claim that every provider bill drops by 98.71%, or that an agent session lasts 77.81 times longer. It measures the compared input-context volume in the published six-fixture estimate.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the same token rate would cost
&lt;/h2&gt;

&lt;p&gt;The table applies four flat, uncached input-token rates to the same two token estimates. It is arithmetic, not a provider invoice.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Flat uncached input rate&lt;/th&gt;
&lt;th&gt;Full-history baseline&lt;/th&gt;
&lt;th&gt;Qarinah pack&lt;/th&gt;
&lt;th&gt;Estimated saving&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;$1 / million tokens&lt;/td&gt;
&lt;td&gt;$0.442113&lt;/td&gt;
&lt;td&gt;$0.005682&lt;/td&gt;
&lt;td&gt;$0.436431&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$3 / million tokens&lt;/td&gt;
&lt;td&gt;$1.326339&lt;/td&gt;
&lt;td&gt;$0.017046&lt;/td&gt;
&lt;td&gt;$1.309293&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$5 / million tokens&lt;/td&gt;
&lt;td&gt;$2.210565&lt;/td&gt;
&lt;td&gt;$0.028410&lt;/td&gt;
&lt;td&gt;$2.182155&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$15 / million tokens&lt;/td&gt;
&lt;td&gt;$6.631695&lt;/td&gt;
&lt;td&gt;$0.085230&lt;/td&gt;
&lt;td&gt;$6.546465&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The calculation is:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;estimated tokens / 1,000,000 x flat input rate&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;It deliberately excludes provider-native tokenization, caching, output tokens, reasoning tokens, tool calls, retrieval, hosting, and fixed fees. Real cost depends on the provider, model, cache behavior, context composition, and how often the same history would otherwise be resent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the pack remains useful
&lt;/h2&gt;

&lt;p&gt;Compression only matters if the next task can still find its evidence. The benchmark checks both volume and retrieval coverage: every required target had to be directly present in the top five. Qarinah preserves the source event ID and content hash for selected context, so a later agent receives a bounded handoff that can be inspected instead of an opaque story.&lt;/p&gt;

&lt;p&gt;Qarinah also passed &lt;strong&gt;380 of 380 deterministic file-specific exact and typo-tolerant queries&lt;/strong&gt; across 40-, 50-, and 100-file projects. Those tests verify retrieval behavior; they do not establish universal task quality or a ranking against every memory system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reproduce it
&lt;/h2&gt;

&lt;p&gt;The methodology, fixture records, costs, and exclusions are public:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://qarinah.io/docs/public-metrics/" rel="noopener noreferrer"&gt;Public metrics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qarinah.io/metrics.json" rel="noopener noreferrer"&gt;Machine-readable metrics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/AjnasNB/qarinah" rel="noopener noreferrer"&gt;Qarinah on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Qarinah is Apache-2.0 and local-first. It works with Codex, Claude Code, Cursor, CLI tools, and compatible MCP clients. Project capture is opt-in, metadata-only by default, and does not capture hidden reasoning.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Would you trust agent memory more if every selected item pointed back to its source?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>ai</category>
      <category>productivity</category>
      <category>devtools</category>
    </item>
    <item>
      <title>A 50-capability map for governed web crawling and AI agents</title>
      <dc:creator>Ajnas N B</dc:creator>
      <pubDate>Sun, 09 Aug 2026 15:23:12 +0000</pubDate>
      <link>https://dev.to/ajnasnb7717/a-50-capability-map-for-governed-web-crawling-and-ai-agents-2c6i</link>
      <guid>https://dev.to/ajnasnb7717/a-50-capability-map-for-governed-web-crawling-and-ai-agents-2c6i</guid>
      <description>&lt;p&gt;Giving an agent “web access” sounds like one feature. In practice, it is a stack of separate decisions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How does the system discover URLs?&lt;/li&gt;
&lt;li&gt;Which destinations can it contact?&lt;/li&gt;
&lt;li&gt;Does it need a browser, or is static HTTP enough?&lt;/li&gt;
&lt;li&gt;What turns the response into agent-ready data?&lt;/li&gt;
&lt;li&gt;Where are request, byte, depth, and time limits enforced?&lt;/li&gt;
&lt;li&gt;What evidence comes back with the extracted content?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Treating all of that as one unrestricted browser capability makes systems difficult to reason about. A better approach is to choose the smallest acquisition surface that completes the job, then make its authority explicit.&lt;/p&gt;

&lt;p&gt;This article maps 50 current Cockroach Crawler capabilities into seven jobs. It is also a practical checklist you can use with another crawler: if a capability matters to your workflow, identify its input contract, output contract, failure behavior, and authority boundary before an agent depends on it.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Disclosure: I’m Ajnas N B, the developer of Cockroach Crawler. The project is open source under the MIT license.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Start with a finite crawl contract
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;next&lt;/code&gt; channel currently contains the reviewed &lt;code&gt;0.7.0-rc.1&lt;/code&gt; prerelease. A bounded documentation crawl can start like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;cockroach-crawler@next
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;crawlDetailed&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cockroach-crawler&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;crawlDetailed&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;seeds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://docs.example.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;allowedOrigins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://docs.example.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;include&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/guides/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/reference/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;exclude&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/archive/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;traversal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bfs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;obeyRobots&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;maxPages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;maxRequests&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;120&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;maxDepth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;maxTotalBytes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="nx"&gt;_000_000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;maxDurationMs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="nx"&gt;_000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;concurrency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pages&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;contentHash&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;markdown&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important part is not the number of options. It is ownership: the creator of the agent sets the origins and ceilings. Model-facing input can narrow that contract, but it should not be able to expand it.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Crawl and discover — 15 capabilities
&lt;/h2&gt;

&lt;p&gt;These capabilities decide what enters the queue, what is contacted, and when the job stops.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Static HTTP crawling&lt;/strong&gt; — fetch public HTTP(S) pages without starting a browser.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multiple seeds&lt;/strong&gt; — begin one bounded job from several explicit entry points.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Breadth-first traversal&lt;/strong&gt; — cover each depth level before going deeper.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Depth-first traversal&lt;/strong&gt; — follow the newest admitted path first.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best-first traversal&lt;/strong&gt; — rank admitted links against a bounded relevance query.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Adaptive relevance traversal&lt;/strong&gt; — reprioritize the queue as relevant page text appears.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sitemap discovery&lt;/strong&gt; — read robots-declared and conventional sitemap locations, including nested indexes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Robots enforcement&lt;/strong&gt; — evaluate robots policy before page contact and preserve the decision.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Include and exclude filters&lt;/strong&gt; — admit only the paths that belong to the job.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validated redirects&lt;/strong&gt; — inspect and admit every redirect destination before following it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Concurrency and politeness&lt;/strong&gt; — combine exact concurrent work with per-origin delays and global ceilings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deadlines and cancellation&lt;/strong&gt; — stop by wall-clock budget or &lt;code&gt;AbortSignal&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Persistent cache&lt;/strong&gt; — reuse hash-verified results inside an explicit namespace, TTL, entry, and byte budget.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compact fetch-validated site maps&lt;/strong&gt; — return URL metadata without retaining complete page bodies.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Searchable fetch-validated site maps&lt;/strong&gt; — rank only entries already admitted and fetched under the crawl policy.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For discovery work, the key distinction is between &lt;em&gt;ranking&lt;/em&gt; and &lt;em&gt;authority&lt;/em&gt;. A relevance score may reorder already admitted links; it must not broaden the origin policy or resource budget.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Render and capture — 9 capabilities
&lt;/h2&gt;

&lt;p&gt;Static HTTP should remain the default when it works. Browser execution is useful when content genuinely depends on client-side rendering or bounded interaction.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;JavaScript rendering&lt;/strong&gt; through optional Chromium.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Selector waits and bounded clicks&lt;/strong&gt; for explicit page states and interactions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Infinite and virtual scroll&lt;/strong&gt; with finite steps and stability checks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open Shadow DOM flattening&lt;/strong&gt; into a bounded extraction snapshot.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Readable same-origin iframe flattening&lt;/strong&gt; while preserving cross-origin isolation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full-page screenshots&lt;/strong&gt; with format, size, and SHA-256 evidence metadata.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PDF generation&lt;/strong&gt; with explicit print settings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trusted operator page hooks&lt;/strong&gt; that are reviewed configuration, not model input.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Explicit persistent browser profiles&lt;/strong&gt; using a dedicated directory rather than discovering a personal browser profile.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Browser mode is not a process sandbox. Host isolation, egress policy, CPU and memory limits, and sensitive-data separation still belong to the deployment.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Extract agent-ready data — 8 capabilities
&lt;/h2&gt;

&lt;p&gt;Retrieval is not finished when bytes arrive. Agents need a bounded record that preserves enough source identity to verify or revisit the result.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Readable Markdown through the dependency-light core or opt-in Node quality backend.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CSS schema extraction&lt;/strong&gt; for visible text, cleaned HTML, and named attributes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;XPath extraction&lt;/strong&gt; for deterministic fields in inactive markup.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Restricted regex extraction&lt;/strong&gt; with safe flags and hard input, item, value, and total ceilings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Optional host-model JSON Schema extraction&lt;/strong&gt; where returned JSON must validate against the supplied schema.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local PDF parsing&lt;/strong&gt; with signature, page, byte, and text ceilings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Links and page metadata&lt;/strong&gt; including canonical URL, title, description, language, status, ETag, and Last-Modified.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evidence hashes and retrieval provenance&lt;/strong&gt; including SHA-256, fetch time, parent, depth, and redirect history.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Deterministic extraction and model-assisted extraction are different contracts. If a host model is used, its output should be treated as untrusted until it passes the supplied schema and size limits.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Reach public sources — 6 capabilities
&lt;/h2&gt;

&lt;p&gt;Provider integrations should say what access state they require before dispatch. “Supported” is not enough if the operator cannot tell whether a route is public, credentialed, session-backed, or unavailable.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Public GitHub repository and issue reads.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;YouTube search and metadata without a developer API key through an optional reviewed route.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Official YouTube, X, and Reddit provider adapters.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Optional read-only session providers for X, Reddit, Facebook, Instagram, LinkedIn, and Xiaohongshu.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Offline RSS and Atom parsing.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Provider doctor, capability reporting, and deterministic routing.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Run the doctor before choosing a source route:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx cockroach-sources doctor &lt;span class="nt"&gt;--json&lt;/span&gt;
npx cockroach-reach doctor &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Optional session providers are operator-installed read routes. They do not expose posting, liking, following, messaging, deleting, cookie extraction, or personal profile discovery.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Connect agents — 3 capabilities
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Strict creator-bounded agent tool&lt;/strong&gt; whose model input may narrow but cannot broaden host-owned origins and budgets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Native MCP stdio server&lt;/strong&gt; with crawl, map, extraction, and machine-readable capability surfaces.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Optional Maqam policy, approval, trace, and evidence integration&lt;/strong&gt; for registered crawler operations.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A minimal MCP launch keeps authority in environment configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;COCKROACH_ALLOWED_ORIGINS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://docs.example.com &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nv"&gt;COCKROACH_MAX_PAGES&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;10 &lt;span class="se"&gt;\&lt;/span&gt;
npx cockroach-mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  6. Deploy and operate — 4 capabilities
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Authenticated Node.js and Docker API&lt;/strong&gt; for health, playground, crawl, map, and extraction routes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Responsive dashboard and browser playground&lt;/strong&gt; for local inspection.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bounded process-local asynchronous jobs&lt;/strong&gt; with concurrency, pending, retained-result, and result-byte ceilings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fixed-origin Cloudflare Worker profile&lt;/strong&gt; for a small deployment-configured HTTPS fetch tier.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The process-local queue is intentionally not presented as a durable distributed queue. If a workflow needs cross-machine durability, retries across restarts, or independent worker scaling, connect external infrastructure rather than pretending an in-memory queue provides it.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Keep authority bounded — 5 capabilities
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Public-network admission and SSRF defenses&lt;/strong&gt; that reject unsafe schemes, credentials, private ranges, and metadata destinations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DNS pinning and explicit origin policy&lt;/strong&gt; for the Node transport.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exact resource ceilings&lt;/strong&gt; across pages, requests, queue, depth, bytes, retries, redirects, callbacks, and duration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fixed self-hosted proxy-gateway adapter&lt;/strong&gt; that does not accept model-selected endpoints or credentials.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Challenge-aware provider escalation that stops without access-control bypass.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The fixed-origin Worker profile is a smaller deployment tier and does not provide the Node transport’s DNS-resolution and pinning guarantees. That boundary matters when deciding where a job may run.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to choose the smallest useful surface
&lt;/h2&gt;

&lt;p&gt;Use this order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Start with static HTTP and deterministic extraction.&lt;/li&gt;
&lt;li&gt;Add sitemap or relevance traversal only when the queue needs better discovery.&lt;/li&gt;
&lt;li&gt;Add browser rendering only when the target content cannot be obtained correctly without it.&lt;/li&gt;
&lt;li&gt;Add bounded interaction only for a specific, reviewed state transition.&lt;/li&gt;
&lt;li&gt;Add provider adapters only after capability inspection reports the expected access state.&lt;/li&gt;
&lt;li&gt;Give an agent the strict tool or MCP surface only after the host fixes origins and budgets.&lt;/li&gt;
&lt;li&gt;Preserve hashes, redirects, warnings, and retrieval metadata beside the content.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This makes failures easier to interpret. A robots refusal, origin denial, byte ceiling, extraction warning, provider-unavailable state, and browser challenge are not the same failure and should not collapse into “the crawler returned nothing.”&lt;/p&gt;

&lt;h2&gt;
  
  
  The current extraction measurement
&lt;/h2&gt;

&lt;p&gt;The published &lt;code&gt;0.7.0-rc.1&lt;/code&gt; quality path reports the following on the 511-page observed WCEB partition:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;precision: &lt;strong&gt;0.894101&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;recall: &lt;strong&gt;0.926022&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;macro F1: &lt;strong&gt;0.890524&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That partition is labeled observed development evidence because the project had previously iterated against it. It is useful for reproducing the published candidate, but it is not an untouched confirmatory test set and it does not support a universal “0.90” or best-crawler claim.&lt;/p&gt;

&lt;p&gt;The complete benchmark method, artifacts, hashes, and wider 1,497-page development result are published separately so the number can be inspected in context.&lt;/p&gt;

&lt;h2&gt;
  
  
  Inspect, reproduce, or contribute
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Complete 50-capability library: &lt;a href="https://cockroachcrawler.com/docs/capabilities/" rel="noopener noreferrer"&gt;https://cockroachcrawler.com/docs/capabilities/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Documentation: &lt;a href="https://cockroachcrawler.com/docs/" rel="noopener noreferrer"&gt;https://cockroachcrawler.com/docs/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Benchmark and artifacts: &lt;a href="https://cockroachcrawler.com/benchmark/" rel="noopener noreferrer"&gt;https://cockroachcrawler.com/benchmark/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Source and issues: &lt;a href="https://github.com/AjnasNB/cockroach-crawler" rel="noopener noreferrer"&gt;https://github.com/AjnasNB/cockroach-crawler&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;npm stable and prerelease channels: &lt;a href="https://www.npmjs.com/package/cockroach-crawler" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/cockroach-crawler&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Technical paper: &lt;a href="https://doi.org/10.5281/zenodo.21851008" rel="noopener noreferrer"&gt;https://doi.org/10.5281/zenodo.21851008&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Contributor guide: &lt;a href="https://github.com/AjnasNB/cockroach-crawler/blob/main/CONTRIBUTING.md" rel="noopener noreferrer"&gt;https://github.com/AjnasNB/cockroach-crawler/blob/main/CONTRIBUTING.md&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Useful contributions include documentation examples, public conformance fixtures, provider diagnostics, reproducible browser cases, and narrowly scoped bug reports with a URL pattern and expected boundary. If you test one capability, include the package version, runtime, exact input contract, observed output, and whether the route was static, browser-rendered, official-provider, or session-backed.&lt;/p&gt;

&lt;p&gt;The goal of a capability map is not to make a crawler look bigger. It is to let a developer identify the smallest surface that does the job—and know exactly where that surface stops.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>opensource</category>
      <category>webdev</category>
      <category>ai</category>
    </item>
    <item>
      <title>Evidence-linked memory for coding agents: a reproducible alternative to replaying project history</title>
      <dc:creator>Ajnas N B</dc:creator>
      <pubDate>Sun, 09 Aug 2026 07:20:34 +0000</pubDate>
      <link>https://dev.to/ajnasnb7717/evidence-linked-memory-for-coding-agents-a-reproducible-alternative-to-replaying-project-history-3lkc</link>
      <guid>https://dev.to/ajnasnb7717/evidence-linked-memory-for-coding-agents-a-reproducible-alternative-to-replaying-project-history-3lkc</guid>
      <description>&lt;p&gt;Coding agents often inherit project context in one of two ways:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;replay a long transcript or project history, which is expensive and noisy; or&lt;/li&gt;
&lt;li&gt;pass along a short summary, which is compact but difficult to audit.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;There is a useful third design: keep an authoritative local record, derive searchable views from it, and compile a small task-specific context pack whose claims point back to exact evidence.&lt;/p&gt;

&lt;p&gt;This article explains that pattern through &lt;a href="https://qarinah.io/" rel="noopener noreferrer"&gt;Qarinah&lt;/a&gt;, an open-source implementation for software projects. The interesting part is not a particular CLI. It is the separation of &lt;strong&gt;authority&lt;/strong&gt;, &lt;strong&gt;retrieval&lt;/strong&gt;, and &lt;strong&gt;model-facing context&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The core idea: memory is a compiler, not a transcript
&lt;/h2&gt;

&lt;p&gt;Treat retained project activity as source material rather than as the prompt itself.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;permitted events and decisions
            |
            v
authoritative append-only ledger
            |
            +--&amp;gt; rebuildable SQLite / graph / Markdown views
            |
            v
bounded, task-specific retrieval
            |
            v
cited context pack for the next agent
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The ledger answers: &lt;em&gt;What was actually retained, by whom, and in what order?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The projections answer: &lt;em&gt;How can we search and navigate it efficiently?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The context compiler answers: &lt;em&gt;What is the smallest complete evidence set this task should receive?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Keeping those questions separate prevents a convenient index—or an opaque rolling summary—from silently becoming the source of truth.&lt;/p&gt;

&lt;h2&gt;
  
  
  Five architecture choices that make the pattern auditable
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Capture is explicit and scoped
&lt;/h3&gt;

&lt;p&gt;Qarinah initializes per workspace. A machine-local permit controls whether allowed metadata or reviewed content may be retained. It does not scrape hidden reasoning or private transcript stores.&lt;/p&gt;

&lt;p&gt;That boundary matters: a memory system should not gain authority merely because an agent can call it.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. One event chain is authoritative
&lt;/h3&gt;

&lt;p&gt;Canonical JSONL events bind identifiers, provenance, confidence, typed relations, the previous hash, a content hash, and a record hash. The chain establishes continuity relative to a verified checkpoint.&lt;/p&gt;

&lt;p&gt;It does &lt;strong&gt;not&lt;/strong&gt; magically prove every recorded claim is true. Provenance and truth are different properties, and the data model keeps confidence classes such as &lt;code&gt;claimed&lt;/code&gt;, &lt;code&gt;inferred&lt;/code&gt;, and &lt;code&gt;verified&lt;/code&gt; distinct.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Search state is disposable
&lt;/h3&gt;

&lt;p&gt;SQLite FTS5, a graph, lexical indexes, Markdown views, project-structure views, and OKF exports are derived from the ledger. If a projection becomes stale, it can be rebuilt after the authoritative chain verifies.&lt;/p&gt;

&lt;p&gt;This is a practical reliability rule: optimize the read path aggressively, but never make the optimization irreplaceable.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Retrieval composes relevance with authority
&lt;/h3&gt;

&lt;p&gt;The retrieval path combines lexical ranking, typo tolerance, graph relations, time, freshness, repository identity, conflicts, supersession, diversity, evidence coverage, and complete-output budgets.&lt;/p&gt;

&lt;p&gt;Optional semantic rerankers can reorder already admitted evidence, but they cannot introduce authority. This distinction lets teams experiment with retrieval without allowing a model or embedding service to widen the disclosure boundary.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. The output carries citations and may fail closed
&lt;/h3&gt;

&lt;p&gt;Each selected item records an event ID and hash. Callers can require direct evidence coverage. If the complete cited pack cannot satisfy that requirement within the configured boundary, the query can abstain rather than return a confident-looking partial memory.&lt;/p&gt;

&lt;p&gt;For agent workflows, an explicit “insufficient evidence” result is often more useful than an uncited answer that merely sounds continuous.&lt;/p&gt;

&lt;h2&gt;
  
  
  A minimal local setup
&lt;/h2&gt;

&lt;p&gt;Install Qarinah inside a project and opt in to the hosts and capture mode you want:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--save-dev&lt;/span&gt; qarinah
npx qarinah setup &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--codex&lt;/span&gt; &lt;span class="nt"&gt;--claude&lt;/span&gt; &lt;span class="nt"&gt;--cursor&lt;/span&gt; &lt;span class="nt"&gt;--capture&lt;/span&gt; content &lt;span class="nt"&gt;--allow-query&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;--capture content&lt;/code&gt; flag is an explicit choice. Use metadata-only capture when event bodies should not be retained.&lt;/p&gt;

&lt;p&gt;Record a reviewed decision, rebuild the derived views, and request a directly cited pack:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx qarinah record &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--kind&lt;/span&gt; decision &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--title&lt;/span&gt; &lt;span class="s2"&gt;"Keep releases provenance-bound"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--body&lt;/span&gt; &lt;span class="s2"&gt;"Publish only the reviewed artifact."&lt;/span&gt;

npx qarinah scan
npx qarinah build
npx qarinah query &lt;span class="s2"&gt;"release provenance"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--minimum-coverage&lt;/span&gt; direct &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--format&lt;/span&gt; markdown
npx qarinah doctor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important behavior is not that a search result exists. It is that the result fits a declared budget, exposes its evidence identities, and can be regenerated from the verified local record.&lt;/p&gt;

&lt;h2&gt;
  
  
  Measuring context reduction without overstating it
&lt;/h2&gt;

&lt;p&gt;“Uses fewer tokens” is easy to claim and surprisingly easy to measure badly. A useful evaluation must say exactly what was replaced and what remained constant.&lt;/p&gt;

&lt;p&gt;Qarinah's committed software-task fixture creates &lt;strong&gt;240 retained project-history records&lt;/strong&gt; and evaluates six reproducible scenarios:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a React accessibility edit;&lt;/li&gt;
&lt;li&gt;a database schema migration;&lt;/li&gt;
&lt;li&gt;a repository-wide TypeScript refactor;&lt;/li&gt;
&lt;li&gt;web research leading to implementation;&lt;/li&gt;
&lt;li&gt;production regression debugging; and&lt;/li&gt;
&lt;li&gt;governed release preparation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For every scenario, both paths receive the same current-task source snippets. The baseline additionally receives the complete retained history; the Qarinah path receives the cited pack compiled for that task.&lt;/p&gt;

&lt;p&gt;The evaluator uses the portable estimate &lt;code&gt;ceil(characters / 4)&lt;/code&gt;. It is deterministic, but it is not a provider billing receipt.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Compared context slice&lt;/th&gt;
&lt;th&gt;Estimated tokens&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Full-history replay across six tasks&lt;/td&gt;
&lt;td&gt;442,113&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qarinah packs plus the identical task sources&lt;/td&gt;
&lt;td&gt;5,682&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reduction&lt;/td&gt;
&lt;td&gt;98.7148%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compression ratio&lt;/td&gt;
&lt;td&gt;77.81:1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Every required target in this fixture had direct evidence coverage in the top five, and the packs contained zero model-written summary records.&lt;/p&gt;

&lt;p&gt;Those qualifications belong beside the number. The result measures repeated input-context volume on this fixed fixture. It does not establish universal model quality, latency, provider-native usage, total application cost, or the same reduction on every repository.&lt;/p&gt;

&lt;p&gt;You can inspect the &lt;a href="https://qarinah.io/docs/benchmarks/" rel="noopener noreferrer"&gt;benchmark method and limitations&lt;/a&gt;, the &lt;a href="https://github.com/AjnasNB/qarinah/blob/main/bench/results/software-task-context-0.1.1.json" rel="noopener noreferrer"&gt;machine-readable six-task result&lt;/a&gt;, and the evaluator in the repository. To reproduce it from source:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/AjnasNB/qarinah.git
&lt;span class="nb"&gt;cd &lt;/span&gt;qarinah
npm ci
npm run evaluate:software-tasks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What this design changes in an agent workflow
&lt;/h2&gt;

&lt;p&gt;A cross-agent handoff no longer has to mean “copy the conversation.” The next tool can receive a compact pack containing the relevant decision, implementation outcome, conflict, source identity, and evidence hash.&lt;/p&gt;

&lt;p&gt;That has several useful consequences:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Agent changes are less disruptive.&lt;/strong&gt; Codex, Claude Code, Cursor, a CLI client, or an MCP client can query the same project-local record through supported integration boundaries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Derived memory is reviewable.&lt;/strong&gt; A human can inspect the Markdown or dashboard view without treating it as a second authority.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Corrections stay visible.&lt;/strong&gt; Supersession and contradiction are relations, not destructive edits to history.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Temporal queries become possible.&lt;/strong&gt; A query can resolve what was valid at a chosen time rather than flattening every old and new claim together.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repository boundaries remain explicit.&lt;/strong&gt; Cross-repository relationships aid navigation without merging permissions or evidence authority.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is not a replacement for source code, tests, logs, or the current task's working set. It is a way to avoid repeatedly shipping unrelated retained history alongside those sources.&lt;/p&gt;

&lt;h2&gt;
  
  
  Design lessons you can reuse without Qarinah
&lt;/h2&gt;

&lt;p&gt;If you are building your own agent-memory layer, four questions expose most architectural problems:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;What is authoritative?&lt;/strong&gt; If the vector database disappears, can you reconstruct the memory from a verified record?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Who grants capture and disclosure authority?&lt;/strong&gt; Can agent input widen its own scope?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Can every model-facing item name its evidence?&lt;/strong&gt; A citation should be part of the output contract, not a post-processing decoration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What exactly does the benchmark replace?&lt;/strong&gt; Keep current-task sources constant, publish the estimator, commit the fixtures, and state what the result does not prove.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A smaller prompt is valuable. A smaller prompt whose contents can be traced, rebuilt, and refused when incomplete is much more useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  Explore, reproduce, or contribute
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://qarinah.io/" rel="noopener noreferrer"&gt;Qarinah website and documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/AjnasNB/qarinah" rel="noopener noreferrer"&gt;Source code and issues on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com/package/qarinah" rel="noopener noreferrer"&gt;&lt;code&gt;qarinah&lt;/code&gt; on npm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://doi.org/10.5281/zenodo.21850747" rel="noopener noreferrer"&gt;Published technical paper on Zenodo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qarinah.io/docs/benchmarks/" rel="noopener noreferrer"&gt;Benchmark methodology&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/AjnasNB/qarinah/blob/main/CONTRIBUTING.md" rel="noopener noreferrer"&gt;Contribution guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Qarinah was created and is maintained by &lt;strong&gt;Ajnas N B&lt;/strong&gt;. Contributions are welcome—especially reproducible fixtures, retrieval edge cases, integration feedback, documentation improvements, and reviews of evidence or privacy boundaries.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>opensource</category>
      <category>productivity</category>
      <category>ai</category>
    </item>
    <item>
      <title>Three open-source building blocks for AI agents: memory, safer tools, and web access</title>
      <dc:creator>Ajnas N B</dc:creator>
      <pubDate>Mon, 27 Jul 2026 11:02:43 +0000</pubDate>
      <link>https://dev.to/ajnasnb7717/three-open-source-building-blocks-for-ai-agents-memory-safer-tools-and-web-access-50oh</link>
      <guid>https://dev.to/ajnasnb7717/three-open-source-building-blocks-for-ai-agents-memory-safer-tools-and-web-access-50oh</guid>
      <description>&lt;p&gt;AI agents are becoming capable enough to work across whole projects, but three practical gaps keep appearing: they forget why decisions were made, tool approvals can drift away from the action that was reviewed, and web access is often either too limited or too broad.&lt;/p&gt;

&lt;p&gt;I have been building three open-source projects around those gaps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qarinah - evidence-linked project memory
&lt;/h2&gt;

&lt;p&gt;Qarinah keeps project decisions, code structure, tool outcomes, approvals, and sources in a local record. For each task it compiles a compact, cited context pack instead of replaying the entire project history.&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://qarinah.io" rel="noopener noreferrer"&gt;https://qarinah.io&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/AjnasNB/qarinah" rel="noopener noreferrer"&gt;https://github.com/AjnasNB/qarinah&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Maqam - policy and exact approval for tool calls
&lt;/h2&gt;

&lt;p&gt;Maqam checks policy before registered operations, binds approval to the exact run, tool, and input, and records traces and evidence after execution. It is designed to sit around agent workflows rather than replace the framework or model you already use.&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://maqamagent.com" rel="noopener noreferrer"&gt;https://maqamagent.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/AjnasNB/maqam" rel="noopener noreferrer"&gt;https://github.com/AjnasNB/maqam&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Cockroach Crawler - web access for AI agents
&lt;/h2&gt;

&lt;p&gt;Cockroach Crawler is a JavaScript toolkit for static and browser crawling, structured extraction, PDFs, screenshots, site maps, source adapters, MCP, Docker, and agent integrations. It gives agents useful web reach while keeping network authority and resource limits with the host application.&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://cockroachcrawler.com" rel="noopener noreferrer"&gt;https://cockroachcrawler.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/AjnasNB/cockroach-crawler" rel="noopener noreferrer"&gt;https://github.com/AjnasNB/cockroach-crawler&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why they fit together
&lt;/h2&gt;

&lt;p&gt;Qarinah remembers what happened and why. Maqam decides whether a registered action may run. Cockroach Crawler collects web evidence the agent can use. Each project is independently usable, but together they form a practical memory, action, and research layer for agent systems.&lt;/p&gt;

&lt;p&gt;All three are open source. I am looking for developers who will run them in real workflows, report failures, challenge the boundaries, improve adapters and documentation, and contribute code.&lt;/p&gt;

&lt;p&gt;If you build with AI agents, which problem is most painful in your current stack: memory, tool safety, or web access?&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>agents</category>
      <category>showdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>I stopped replaying my entire codebase to Codex and Claude Code</title>
      <dc:creator>Ajnas N B</dc:creator>
      <pubDate>Sat, 25 Jul 2026 14:13:03 +0000</pubDate>
      <link>https://dev.to/ajnasnb7717/i-stopped-replaying-my-entire-codebase-to-codex-and-claude-code-5ha0</link>
      <guid>https://dev.to/ajnasnb7717/i-stopped-replaying-my-entire-codebase-to-codex-and-claude-code-5ha0</guid>
      <description>&lt;p&gt;I kept hitting the same problem in long Codex and Claude Code sessions: the agent was capable, but the project memory was expensive.&lt;/p&gt;

&lt;p&gt;A new task would trigger another repository scan. Decisions from older sessions had to be explained again. Tool results were buried in transcripts. A summary was smaller, but I could not always tell which source supported a statement or whether a newer decision had replaced it.&lt;/p&gt;

&lt;p&gt;So I built Qarinah, an Apache-2.0 local project-memory compiler for coding agents.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem is not only context size
&lt;/h2&gt;

&lt;p&gt;A large context window can hold more text, but it does not answer four important questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which facts matter to the current task?&lt;/li&gt;
&lt;li&gt;Where did each fact come from?&lt;/li&gt;
&lt;li&gt;Has a newer decision superseded an older one?&lt;/li&gt;
&lt;li&gt;Can another coding agent verify the same answer?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Replaying the full history preserves information, but it also sends large amounts of irrelevant material. A single generated summary is smaller, but it becomes another authority that can omit or blur evidence. Ordinary embedding retrieval finds similar text, but similarity is not the same as authority, recency, or approval.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Qarinah does differently
&lt;/h2&gt;

&lt;p&gt;Qarinah keeps the source record and the context pack separate.&lt;/p&gt;

&lt;p&gt;Permitted decisions, tool outcomes, approvals, project structure, and evidence become typed events. Relations connect records such as supersedes, supports, blocks, and produced-by. Deterministic Markdown and JSON views remain inspectable in the repository. When a task begins, Qarinah retrieves a bounded pack and includes citations back to event IDs, hashes, and sources.&lt;/p&gt;

&lt;p&gt;The result is not one giant memory prompt. It is a small evidence-linked pack built for the current task.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Useful for&lt;/th&gt;
&lt;th&gt;What remains difficult&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Full-history replay&lt;/td&gt;
&lt;td&gt;Maximum raw recall&lt;/td&gt;
&lt;td&gt;Repeated tokens, noise, stale decisions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AGENTS.md or CLAUDE.md&lt;/td&gt;
&lt;td&gt;Stable instructions&lt;/td&gt;
&lt;td&gt;Tool outcomes and changing decisions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Embedding retrieval&lt;/td&gt;
&lt;td&gt;Similar passages&lt;/td&gt;
&lt;td&gt;Authority, supersession, exact provenance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Generated summary&lt;/td&gt;
&lt;td&gt;Small handoff&lt;/td&gt;
&lt;td&gt;Verifying omissions and source claims&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qarinah&lt;/td&gt;
&lt;td&gt;Compact project memory&lt;/td&gt;
&lt;td&gt;Requires explicit workspace opt-in and capture policy&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Reproduce the basic flow
&lt;/h2&gt;

&lt;p&gt;Install it inside one project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--save-dev&lt;/span&gt; qarinah
npx qarinah init &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--capture&lt;/span&gt; content
npx qarinah scan
npx qarinah doctor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Record a decision:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx qarinah record &lt;span class="nt"&gt;--kind&lt;/span&gt; decision &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--title&lt;/span&gt; &lt;span class="s2"&gt;"Use additive database migrations"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--body&lt;/span&gt; &lt;span class="s2"&gt;"Add, backfill, switch, then remove. Never rename a production column in place."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then Codex, Claude Code, a CLI workflow, or an MCP client can request the smallest cited pack relevant to a task. The project owns the files. Qarinah does not require uploading the repository to a hosted Qarinah backend.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the published evaluator measured
&lt;/h2&gt;

&lt;p&gt;The committed evaluator compared full-history input with bounded Qarinah packs across six software tasks covering React editing, database migration, TypeScript refactoring, web research, production debugging, and governed release work.&lt;/p&gt;

&lt;p&gt;The compared input changed from 442,113 estimated input-context tokens to 5,682. That is 98.71% less repeated context, or 77.81:1 compression, while every required target ranked in the top five. The repository includes the inputs, arithmetic, methodology, and machine-readable result.&lt;/p&gt;

&lt;p&gt;This is a result for that task set, not a promise that every repository or total provider bill drops by exactly 98.71%. Output tokens, caching, tool calls, and provider pricing are separate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Codex and Claude Code
&lt;/h2&gt;

&lt;p&gt;Qarinah ships installable plugins for both hosts.&lt;/p&gt;

&lt;p&gt;Codex:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;codex plugin marketplace add AjnasNB/qarinah &lt;span class="nt"&gt;--ref&lt;/span&gt; v0.1.1
codex plugin add qarinah@qarinah
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude Code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude plugin marketplace add AjnasNB/qarinah@v0.1.1 &lt;span class="nt"&gt;--scope&lt;/span&gt; user
claude plugin &lt;span class="nb"&gt;install &lt;/span&gt;qarinah@qarinah &lt;span class="nt"&gt;--scope&lt;/span&gt; user
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both can read the same opted-in local project memory. This does not copy private provider chat history between services. It gives both agents access to the same project-owned evidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would like help testing
&lt;/h2&gt;

&lt;p&gt;Qarinah is open source and early. I am looking for real failure cases, especially:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;repositories with conflicting or superseded architecture decisions&lt;/li&gt;
&lt;li&gt;multi-agent handoffs&lt;/li&gt;
&lt;li&gt;large monorepos&lt;/li&gt;
&lt;li&gt;trust-policy and provenance review&lt;/li&gt;
&lt;li&gt;retrieval quality under very small token budgets&lt;/li&gt;
&lt;li&gt;Codex and Claude Code interoperability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Website: &lt;a href="https://qarinah.io/" rel="noopener noreferrer"&gt;https://qarinah.io/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Source: &lt;a href="https://github.com/AjnasNB/qarinah" rel="noopener noreferrer"&gt;https://github.com/AjnasNB/qarinah&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Technical paper: &lt;a href="https://qarinah.io/paper/" rel="noopener noreferrer"&gt;https://qarinah.io/paper/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you test it, I would rather receive one reproducible failure than ten generic compliments. That is the fastest way to make the project useful.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>ai</category>
      <category>opensource</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Solution for the Web Access Dilemma for AI Agents Too Much Power, Too Little Control</title>
      <dc:creator>Ajnas N B</dc:creator>
      <pubDate>Fri, 24 Jul 2026 18:48:02 +0000</pubDate>
      <link>https://dev.to/ajnasnb7717/i-gave-open-claw-and-codex-the-whole-internet-without-any-api-keys-using-this-tool-and-it-was-never-4c38</link>
      <guid>https://dev.to/ajnasnb7717/i-gave-open-claw-and-codex-the-whole-internet-without-any-api-keys-using-this-tool-and-it-was-never-4c38</guid>
      <description>&lt;p&gt;AI agents can reason about the web.&lt;/p&gt;

&lt;p&gt;But giving an agent unrestricted browser or network access creates a serious authority problem.&lt;/p&gt;

&lt;p&gt;The obvious solution is to restrict the tools available to the agent.&lt;/p&gt;

&lt;p&gt;Then I kept running into the opposite problem:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Once the tool became sufficiently restricted, it lost many of the capabilities required to complete real work.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I wanted both sides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enough power to crawl, render, navigate, extract, capture, and investigate the web&lt;/li&gt;
&lt;li&gt;Explicit operator control over origins, credentials, budgets, browser hooks, profiles, and evidence&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I built &lt;strong&gt;Cockroach Crawler&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It is an open-source Node.js and TypeScript toolkit for AI agents, RAG pipelines, documentation indexing, research, QA, and web-data workflows.&lt;/p&gt;

&lt;p&gt;I connected it to &lt;strong&gt;OpenClaw&lt;/strong&gt; and &lt;strong&gt;Codex&lt;/strong&gt;, and the difference was honestly wild.&lt;/p&gt;

&lt;p&gt;Instead of giving the agents one narrow search tool, I gave them a bounded web-research layer that could crawl websites, inspect JavaScript applications, extract structured data, process PDFs, take screenshots, generate PDFs, inspect public sources, and return evidence with provenance.&lt;/p&gt;

&lt;p&gt;And for many public workflows, I did not need to configure a separate API key for every source.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/AjnasNB/cockroach-crawler" rel="noopener noreferrer"&gt;https://github.com/AjnasNB/cockroach-crawler&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Documentation: &lt;a href="https://cockroachcrawler.com/docs/" rel="noopener noreferrer"&gt;https://cockroachcrawler.com/docs/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;npm: &lt;a href="https://www.npmjs.com/package/cockroach-crawler" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/cockroach-crawler&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What changed after I connected it to OpenClaw and Codex?
&lt;/h2&gt;

&lt;p&gt;Before this, the agents could reason well, but their web access was limited.&lt;/p&gt;

&lt;p&gt;They could answer questions, write code, and work with the context I gave them. But once a task required deeper live-web investigation, I still had to manually combine several tools.&lt;/p&gt;

&lt;p&gt;After connecting Cockroach Crawler, they could:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Crawl public websites&lt;/li&gt;
&lt;li&gt;Render JavaScript-heavy pages&lt;/li&gt;
&lt;li&gt;Follow sitemaps&lt;/li&gt;
&lt;li&gt;Search and map documentation sites&lt;/li&gt;
&lt;li&gt;Extract readable Markdown&lt;/li&gt;
&lt;li&gt;Extract structured fields with CSS, XPath, or restricted regular expressions&lt;/li&gt;
&lt;li&gt;Read local and remote PDFs&lt;/li&gt;
&lt;li&gt;Generate PDFs&lt;/li&gt;
&lt;li&gt;Take screenshots&lt;/li&gt;
&lt;li&gt;Handle bounded clicks and scrolling&lt;/li&gt;
&lt;li&gt;Inspect open Shadow DOM&lt;/li&gt;
&lt;li&gt;Read same-origin iframe content&lt;/li&gt;
&lt;li&gt;Collect canonical URLs and redirect history&lt;/li&gt;
&lt;li&gt;Preserve content hashes and retrieval metadata&lt;/li&gt;
&lt;li&gt;Return warnings, failures, and crawl statistics&lt;/li&gt;
&lt;li&gt;Work through MCP&lt;/li&gt;
&lt;li&gt;Use Docker or a local dashboard&lt;/li&gt;
&lt;li&gt;Inspect public provider availability before dispatch&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It stopped feeling like I had given the agents a simple browser.&lt;/p&gt;

&lt;p&gt;It felt like I had given them an actual web-research system.&lt;/p&gt;




&lt;h2&gt;
  
  
  The core idea
&lt;/h2&gt;

&lt;p&gt;The design principle is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Give AI agents the web. Keep the keys.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent gets useful capabilities.&lt;/p&gt;

&lt;p&gt;The host application keeps authority.&lt;/p&gt;

&lt;p&gt;That means model-facing input can narrow a job, but it cannot silently add:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;New origins&lt;/li&gt;
&lt;li&gt;New credentials&lt;/li&gt;
&lt;li&gt;New proxy endpoints&lt;/li&gt;
&lt;li&gt;New browser hooks&lt;/li&gt;
&lt;li&gt;New persistent profiles&lt;/li&gt;
&lt;li&gt;Larger resource limits&lt;/li&gt;
&lt;li&gt;Broader network authority&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This matters because an agent should not be able to expand its own permissions simply by generating a more aggressive tool call.&lt;/p&gt;




&lt;h2&gt;
  
  
  What can Cockroach Crawler do?
&lt;/h2&gt;

&lt;p&gt;Cockroach Crawler currently provides &lt;strong&gt;50 documented capabilities&lt;/strong&gt; across crawling, browser automation, extraction, providers, agent integration, deployment, and security.&lt;/p&gt;

&lt;h3&gt;
  
  
  Crawling and discovery
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Static HTTP crawling&lt;/li&gt;
&lt;li&gt;Multiple crawl seeds&lt;/li&gt;
&lt;li&gt;Breadth-first traversal&lt;/li&gt;
&lt;li&gt;Depth-first traversal&lt;/li&gt;
&lt;li&gt;Best-first traversal&lt;/li&gt;
&lt;li&gt;Adaptive relevance traversal&lt;/li&gt;
&lt;li&gt;Sitemap discovery&lt;/li&gt;
&lt;li&gt;Include and exclude filters&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;robots.txt&lt;/code&gt; enforcement&lt;/li&gt;
&lt;li&gt;Redirect validation&lt;/li&gt;
&lt;li&gt;Persistent hash-verified cache&lt;/li&gt;
&lt;li&gt;Searchable site maps&lt;/li&gt;
&lt;li&gt;Crawl deadlines and cancellation&lt;/li&gt;
&lt;li&gt;Explicit concurrency and politeness controls&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Browser rendering and capture
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;JavaScript rendering with Chromium&lt;/li&gt;
&lt;li&gt;Selector waits&lt;/li&gt;
&lt;li&gt;Bounded clicks&lt;/li&gt;
&lt;li&gt;Infinite and virtual scrolling&lt;/li&gt;
&lt;li&gt;Open Shadow DOM flattening&lt;/li&gt;
&lt;li&gt;Readable same-origin iframe flattening&lt;/li&gt;
&lt;li&gt;Screenshots&lt;/li&gt;
&lt;li&gt;PDF generation&lt;/li&gt;
&lt;li&gt;Persistent browser profiles&lt;/li&gt;
&lt;li&gt;Explicit operator-supplied page hooks&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Extraction
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Readable Markdown&lt;/li&gt;
&lt;li&gt;CSS extraction&lt;/li&gt;
&lt;li&gt;XPath extraction&lt;/li&gt;
&lt;li&gt;Restricted regular-expression extraction&lt;/li&gt;
&lt;li&gt;Optional host-model schema extraction&lt;/li&gt;
&lt;li&gt;Local PDF parsing&lt;/li&gt;
&lt;li&gt;Links and metadata&lt;/li&gt;
&lt;li&gt;Content hashes&lt;/li&gt;
&lt;li&gt;Provenance records&lt;/li&gt;
&lt;li&gt;Retrieval warnings and failures&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Public sources and providers
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Public GitHub reads&lt;/li&gt;
&lt;li&gt;YouTube search without a developer API key through an optional reviewed provider&lt;/li&gt;
&lt;li&gt;RSS and Atom parsing&lt;/li&gt;
&lt;li&gt;Official provider routes&lt;/li&gt;
&lt;li&gt;Read-only session routes&lt;/li&gt;
&lt;li&gt;Provider doctor and deterministic routing&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Agent integration
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Native MCP server&lt;/li&gt;
&lt;li&gt;Strict agent-tool adapter&lt;/li&gt;
&lt;li&gt;Capability inspection&lt;/li&gt;
&lt;li&gt;Maqam integration for policy, approvals, traces, and evidence&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Deployment
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Authenticated Docker API&lt;/li&gt;
&lt;li&gt;Dashboard and playground&lt;/li&gt;
&lt;li&gt;Bounded asynchronous jobs&lt;/li&gt;
&lt;li&gt;Restricted Cloudflare Worker deployment&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Security and authority
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Public-network admission&lt;/li&gt;
&lt;li&gt;Private-network blocking&lt;/li&gt;
&lt;li&gt;Redirect validation&lt;/li&gt;
&lt;li&gt;DNS validation&lt;/li&gt;
&lt;li&gt;Explicit origin policy&lt;/li&gt;
&lt;li&gt;Credential isolation&lt;/li&gt;
&lt;li&gt;Resource ceilings&lt;/li&gt;
&lt;li&gt;Challenge-aware escalation&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Start with one command
&lt;/h2&gt;

&lt;p&gt;Install the package:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;cockroach-crawler@0.5.2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run a bounded crawl:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx cockroach-crawl https://example.com/docs &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--max-pages&lt;/span&gt; 20 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--max-requests&lt;/span&gt; 80 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--jsonl&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The result includes extracted content plus the information an agent or developer needs to verify it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Canonical URL&lt;/li&gt;
&lt;li&gt;Parent URL&lt;/li&gt;
&lt;li&gt;Crawl depth&lt;/li&gt;
&lt;li&gt;Redirect history&lt;/li&gt;
&lt;li&gt;Response status&lt;/li&gt;
&lt;li&gt;Content type&lt;/li&gt;
&lt;li&gt;Content hash&lt;/li&gt;
&lt;li&gt;Retrieval metadata&lt;/li&gt;
&lt;li&gt;Warnings&lt;/li&gt;
&lt;li&gt;Failures&lt;/li&gt;
&lt;li&gt;Crawl statistics&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Use it from JavaScript
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;crawlDetailed&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cockroach-crawler&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;crawlDetailed&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;seeds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://example.com/docs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;maxPages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;maxRequests&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;maxDurationMs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="nx"&gt;_000&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pages&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;contentHash&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;failures&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stats&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The application owns the limits.&lt;/p&gt;

&lt;p&gt;The model can request less.&lt;/p&gt;

&lt;p&gt;It cannot silently request more.&lt;/p&gt;




&lt;h2&gt;
  
  
  Deep crawling strategies
&lt;/h2&gt;

&lt;p&gt;Different jobs need different traversal behavior.&lt;/p&gt;

&lt;h3&gt;
  
  
  Breadth-first crawling
&lt;/h3&gt;

&lt;p&gt;Use breadth-first crawling when you want broad coverage near the seed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;crawlDetailed&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;seeds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://example.com/docs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;strategy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bfs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;maxPages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Depth-first crawling
&lt;/h3&gt;

&lt;p&gt;Use depth-first crawling for narrow or hierarchical documentation paths:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;crawlDetailed&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;seeds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://example.com/docs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;strategy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;dfs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;maxPages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Best-first and adaptive relevance crawling
&lt;/h3&gt;

&lt;p&gt;Best-first and adaptive traversal prioritize pages that appear more useful for the current task while remaining inside the configured crawl budget.&lt;/p&gt;

&lt;p&gt;This is useful when an agent needs to investigate a large documentation site without blindly downloading everything.&lt;/p&gt;




&lt;h2&gt;
  
  
  Render JavaScript applications
&lt;/h2&gt;

&lt;p&gt;Static HTTP is fast, but many modern applications require a real browser.&lt;/p&gt;

&lt;p&gt;Cockroach Crawler provides optional Playwright integration for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JavaScript rendering&lt;/li&gt;
&lt;li&gt;Waiting for selectors or page states&lt;/li&gt;
&lt;li&gt;Explicit clicks&lt;/li&gt;
&lt;li&gt;Bounded scrolling&lt;/li&gt;
&lt;li&gt;Shadow DOM inspection&lt;/li&gt;
&lt;li&gt;Readable same-origin frames&lt;/li&gt;
&lt;li&gt;Screenshots&lt;/li&gt;
&lt;li&gt;PDF output&lt;/li&gt;
&lt;li&gt;Dedicated profiles&lt;/li&gt;
&lt;li&gt;Reviewed page hooks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Install the optional browser peer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;cockroach-crawler playwright
npx playwright &lt;span class="nb"&gt;install &lt;/span&gt;chromium
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Browser mode still uses explicit origins and resource ceilings.&lt;/p&gt;

&lt;p&gt;Enabling Chromium does not give the agent unrestricted operating-system or network authority.&lt;/p&gt;




&lt;h2&gt;
  
  
  Extract structured data
&lt;/h2&gt;

&lt;p&gt;Readable Markdown is useful for agents and RAG pipelines.&lt;/p&gt;

&lt;p&gt;But many applications need deterministic fields.&lt;/p&gt;

&lt;p&gt;Cockroach Crawler supports bounded:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CSS extraction&lt;/li&gt;
&lt;li&gt;XPath extraction&lt;/li&gt;
&lt;li&gt;Restricted regular-expression extraction&lt;/li&gt;
&lt;li&gt;Optional model-assisted schema extraction&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The model-assisted route still remains host-controlled.&lt;/p&gt;

&lt;p&gt;The operator supplies the model adapter, and the final output must pass JSON Schema validation.&lt;/p&gt;

&lt;p&gt;Model input cannot choose arbitrary credentials, origins, hooks, or execution authority.&lt;/p&gt;




&lt;h2&gt;
  
  
  Search and map an entire site
&lt;/h2&gt;

&lt;p&gt;The crawler can create compact, fetch-validated site maps and optionally search them.&lt;/p&gt;

&lt;p&gt;This is useful for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Documentation discovery&lt;/li&gt;
&lt;li&gt;Migration inventories&lt;/li&gt;
&lt;li&gt;Support knowledge bases&lt;/li&gt;
&lt;li&gt;RAG ingestion&lt;/li&gt;
&lt;li&gt;Broken-link investigation&lt;/li&gt;
&lt;li&gt;Product audits&lt;/li&gt;
&lt;li&gt;Content audits&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Unlike a sitemap assembled only from discovered links, entries can retain retrieval state and source identity for later verification.&lt;/p&gt;




&lt;h2&gt;
  
  
  Connect it to OpenClaw, Codex, or another agent through MCP
&lt;/h2&gt;

&lt;p&gt;Cockroach Crawler includes a native MCP stdio server.&lt;/p&gt;

&lt;p&gt;Example configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"cockroach-crawler"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"cockroach-crawler@0.5.2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"cockroach-mcp"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The MCP surface exposes bounded:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Crawling&lt;/li&gt;
&lt;li&gt;Site mapping&lt;/li&gt;
&lt;li&gt;Structured extraction&lt;/li&gt;
&lt;li&gt;Capability inspection&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The MCP client does not receive control over operator-owned credentials, browser hooks, proxy endpoints, persistent profiles, or origin ceilings.&lt;/p&gt;

&lt;p&gt;That was the important part for me.&lt;/p&gt;

&lt;p&gt;I wanted OpenClaw and Codex to become much more capable without allowing the model to decide its own security boundary.&lt;/p&gt;




&lt;h2&gt;
  
  
  Inspect providers before dispatch
&lt;/h2&gt;

&lt;p&gt;The provider doctor reports what the current machine can actually use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nt"&gt;--package&lt;/span&gt; cockroach-crawler@0.5.2 &lt;span class="se"&gt;\&lt;/span&gt;
  cockroach-sources doctor &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It distinguishes between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Public routes&lt;/li&gt;
&lt;li&gt;Official API routes&lt;/li&gt;
&lt;li&gt;Optional no-key routes&lt;/li&gt;
&lt;li&gt;Explicit read-only session routes&lt;/li&gt;
&lt;li&gt;Missing configuration&lt;/li&gt;
&lt;li&gt;Unsupported operations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A provider is not considered available just because its name appears in a configuration file.&lt;/p&gt;

&lt;p&gt;The route must actually be usable in the current environment.&lt;/p&gt;




&lt;h2&gt;
  
  
  Docker and self-hosting
&lt;/h2&gt;

&lt;p&gt;Cockroach Crawler includes an authenticated Node.js and Docker API with a dashboard and playground.&lt;/p&gt;

&lt;p&gt;It can also run bounded process-local jobs with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Status inspection&lt;/li&gt;
&lt;li&gt;Cancellation&lt;/li&gt;
&lt;li&gt;Result ceilings&lt;/li&gt;
&lt;li&gt;Authentication&lt;/li&gt;
&lt;li&gt;Fixed deployment authority&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For edge deployments, the package includes a separate Cloudflare Worker profile for fixed deployment-owned HTTPS origins.&lt;/p&gt;

&lt;p&gt;That Worker is intentionally treated as a different security boundary from the local Node.js crawler.&lt;/p&gt;




&lt;h2&gt;
  
  
  Public benchmark evidence
&lt;/h2&gt;

&lt;p&gt;The current package was evaluated on all &lt;strong&gt;511 held-out pages&lt;/strong&gt; of the pinned &lt;strong&gt;WCEB v1.0&lt;/strong&gt; test split.&lt;/p&gt;

&lt;p&gt;The published run produced:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;0.7653&lt;/code&gt; macro word F1&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;0.9041&lt;/code&gt; recall&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;87.13%&lt;/code&gt; required-snippet recall&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;25/25&lt;/code&gt; adapted robots dispatch vectors passed&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;101/101&lt;/code&gt; applicable credential-free WPT HTTP(S) URL cases passed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The evaluator, dataset revision, source fingerprint, page-level rows, and machine-readable results are committed to the repository.&lt;/p&gt;

&lt;p&gt;These results describe performance on the named test corpus.&lt;/p&gt;

&lt;p&gt;They are not a claim of universal extraction quality.&lt;/p&gt;

&lt;p&gt;Benchmark details:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://cockroachcrawler.com/benchmark/" rel="noopener noreferrer"&gt;https://cockroachcrawler.com/benchmark/&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What it is not designed to do
&lt;/h2&gt;

&lt;p&gt;Cockroach Crawler is not designed to bypass:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CAPTCHAs&lt;/li&gt;
&lt;li&gt;Access controls&lt;/li&gt;
&lt;li&gt;Private-network restrictions&lt;/li&gt;
&lt;li&gt;Explicit robots policies&lt;/li&gt;
&lt;li&gt;Authentication boundaries&lt;/li&gt;
&lt;li&gt;Platform challenges&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is designed to provide useful web capabilities while keeping authority visible, bounded, and operator-owned.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why this made OpenClaw and Codex feel completely different
&lt;/h2&gt;

&lt;p&gt;The real improvement was not simply that they could fetch more pages.&lt;/p&gt;

&lt;p&gt;It was that they could perform an entire evidence-backed workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Discover the relevant pages&lt;/li&gt;
&lt;li&gt;Render the pages when necessary&lt;/li&gt;
&lt;li&gt;Extract the useful content&lt;/li&gt;
&lt;li&gt;Process PDFs&lt;/li&gt;
&lt;li&gt;Capture screenshots or generated PDFs&lt;/li&gt;
&lt;li&gt;Preserve canonical URLs and hashes&lt;/li&gt;
&lt;li&gt;Return failures instead of silently hiding them&lt;/li&gt;
&lt;li&gt;Stay within explicit origin and budget limits&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That changed the agents from systems that merely &lt;em&gt;talked about the web&lt;/em&gt; into systems that could actually &lt;em&gt;investigate it&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;And honestly, this was the first time it felt like I had given them the whole internet without giving away the keys.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try to break it
&lt;/h2&gt;

&lt;p&gt;If you are building an AI agent, research system, RAG pipeline, documentation indexer, or browser-assisted workflow, test it on something real.&lt;/p&gt;

&lt;p&gt;Open an issue with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Operating system&lt;/li&gt;
&lt;li&gt;Node.js version&lt;/li&gt;
&lt;li&gt;Public test URL&lt;/li&gt;
&lt;li&gt;Smallest reproducible command&lt;/li&gt;
&lt;li&gt;Expected behavior&lt;/li&gt;
&lt;li&gt;Actual behavior&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Install:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;cockroach-crawler@0.5.2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Links:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/AjnasNB/cockroach-crawler" rel="noopener noreferrer"&gt;https://github.com/AjnasNB/cockroach-crawler&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Documentation: &lt;a href="https://cockroachcrawler.com/docs/" rel="noopener noreferrer"&gt;https://cockroachcrawler.com/docs/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Capability index: &lt;a href="https://cockroachcrawler.com/docs/capabilities/" rel="noopener noreferrer"&gt;https://cockroachcrawler.com/docs/capabilities/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Security model: &lt;a href="https://cockroachcrawler.com/security/" rel="noopener noreferrer"&gt;https://cockroachcrawler.com/security/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Benchmark: &lt;a href="https://cockroachcrawler.com/benchmark/" rel="noopener noreferrer"&gt;https://cockroachcrawler.com/benchmark/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;npm: &lt;a href="https://www.npmjs.com/package/cockroach-crawler" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/cockroach-crawler&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Give AI agents the web. Keep the keys.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>browser</category>
      <category>agents</category>
      <category>opensource</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
