<?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: Nick Yeo</title>
    <description>The latest articles on DEV Community by Nick Yeo (@nickyeolk).</description>
    <link>https://dev.to/nickyeolk</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%2F3938354%2Fd8fc4775-8272-4491-af36-1e4f7448e9e0.jpeg</url>
      <title>DEV Community: Nick Yeo</title>
      <link>https://dev.to/nickyeolk</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nickyeolk"/>
    <language>en</language>
    <item>
      <title>Is That an LLM in Your Harness, or Are You Just Glad to See Me?</title>
      <dc:creator>Nick Yeo</dc:creator>
      <pubDate>Sat, 18 Jul 2026 08:52:08 +0000</pubDate>
      <link>https://dev.to/nickyeolk/is-that-an-llm-in-your-harness-or-are-you-just-glad-to-see-me-58k4</link>
      <guid>https://dev.to/nickyeolk/is-that-an-llm-in-your-harness-or-are-you-just-glad-to-see-me-58k4</guid>
      <description>&lt;h2&gt;
  
  
  Benchmarking the Claude Code harness (and three rivals) on agentic knowledge management
&lt;/h2&gt;

&lt;p&gt;Harness engineering is having a moment. Mitchell Hashimoto kicked it off in February with &lt;a href="https://mitchellh.com/writing/my-ai-adoption-journey" rel="noopener noreferrer"&gt;a post&lt;/a&gt; arguing that when an agent makes a mistake, you should engineer the environment so it can never make that mistake again. A few weeks later, &lt;a href="https://openai.com/index/harness-engineering/" rel="noopener noreferrer"&gt;OpenAI&lt;/a&gt; and &lt;a href="https://www.anthropic.com/engineering/effective-harnesses-for-long-running-agents" rel="noopener noreferrer"&gt;Anthropic&lt;/a&gt; had published their own harness engineering guides, &lt;a href="https://martinfowler.com/articles/harness-engineering.html" rel="noopener noreferrer"&gt;Martin Fowler&lt;/a&gt; weighed in, and the term acquired &lt;a href="https://en.wikipedia.org/wiki/Agent_harness" rel="noopener noreferrer"&gt;a Wikipedia page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Not everyone agrees about the impact of the harness. The LangChain team &lt;a href="https://www.langchain.com/blog/improving-deep-agents-with-harness-engineering" rel="noopener noreferrer"&gt;moved their coding agent from 52.8% to 66.5% on Terminal Bench 2.0&lt;/a&gt; without touching the model, purely by reworking the harness. Meanwhile Boris Cherny, the creator of Claude Code, &lt;a href="https://aimultiple.com/agent-harness" rel="noopener noreferrer"&gt;says the opposite&lt;/a&gt;: the harness is "the thinnest possible wrapper over the model", and the secret sauce is all in the model. The two claims seem contradictory: "the harness is the moat" and "the harness is a napkin". Sounds like something worth testing.&lt;/p&gt;

&lt;p&gt;I took the four major agent harness SDKs, Anthropic's Claude Agent SDK (which runs the actual Claude Code binary), OpenAI's Agents SDK, Google's ADK, and Microsoft's Agent Framework, and gave them all the same evaluation task: answering 133 questions buried in 85 years of U.S. Treasury Bulletins. No retrieval pipeline nor vector database. Just an agent, a pile of documents, and three tools to find things with. It is a standard question-answering test over a document archive, a knowledge management problem every company has.&lt;/p&gt;

&lt;p&gt;To keep the fight fair, everything is pinned: the same question set, the exact same three tools backed by a single shared implementation, the same prompt, the same grader. Only two things vary. The harness SDK, and the model inside it, each vendor's big model and its smaller, cheaper sibling. If the harness is the moat, that should show up in the numbers. If it is all model, that shows up too. As it turns out, both matter, they just matter for different things, and the small models produce the most expensive surprise in the article.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Agentic navigation over a raw document corpus works: the best stacks answer 64% of a hard grounded-reasoning benchmark at 1% numeric tolerance, with no index, no chunking, and no embeddings.&lt;/li&gt;
&lt;li&gt;The model is the biggest variable by far. Every vendor's frontier model beats its small sibling by a landslide; GPT-5.5 scores 16x GPT-5.4-mini on the same harness.&lt;/li&gt;
&lt;li&gt;The GPT minis are false economy. Per correct answer in actual billed cost, GPT-5.4-mini costs about twice as much as GPT-5.5 on the same harness, because it thrashes: twice the tool calls, a tenth of the accuracy. Claude's Haiku dodges this on unit cost thanks to aggressive caching, but only answers a quarter of the questions.&lt;/li&gt;
&lt;li&gt;The harness is a real variable too. The same GPT-5.5, same tools, same prompt scored a statistical tie on OpenAI's Agents SDK and Microsoft's Agent Framework, but Microsoft's run finished with zero errors, roughly 17% fewer tokens, and a roughly 19% smaller per-question bill.&lt;/li&gt;
&lt;li&gt;Every harness fails in its own accent: turn-limit exhaustion here, hallucinated tool names there. If you are choosing the foundation for a knowledge assistant, the error log matters as much as the accuracy column.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Knowledge management is becoming an agent problem
&lt;/h2&gt;

&lt;p&gt;Every organization sits on a pile of documents that people need answers from: filings, reports, policies, contracts, decades of archived PDFs. The default architecture for the last few years has been retrieval-augmented generation: split the documents into chunks, embed them, store vectors, retrieve the most similar passages, and hope the answer is inside the top-k.&lt;/p&gt;

&lt;p&gt;That architecture has known failure modes, and they cluster where enterprise archives are hardest:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Near-duplicate documents defeat similarity search.&lt;/strong&gt; An archive of monthly bulletins contains hundreds of documents with nearly identical structure and vocabulary. An embedding can tell "budget table" from "poetry", but not the January 1941 issue from the February 1941 issue.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tables do not chunk.&lt;/strong&gt; The answer to a numeric question is one cell whose meaning depends on the row label, the column header, the units note above the table, and sometimes a footnote below it. Chunking scatters those across fragments.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retrieval is one-shot.&lt;/strong&gt; If the right passage is not in the top-k, a classic pipeline has no way to notice and try a different query.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The agentic alternative skips the pipeline entirely. Give the model a small set of read-only tools over the raw corpus, the same primitives a human analyst (or a coding agent like Claude Code) uses: list files, search their contents, open and page through them. Let the model decide what to look for, follow leads, recover from dead ends, and stop when it has the answer. No index to build or keep fresh, no chunking decisions, and citations that point at an exact file and line.&lt;/p&gt;

&lt;p&gt;The question is whether that actually works, and what it costs. That requires a benchmark built for it.&lt;/p&gt;

&lt;h2&gt;
  
  
  OfficeQA: a benchmark for navigating documents, not retrieving them
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/databricks/officeqa" rel="noopener noreferrer"&gt;OfficeQA&lt;/a&gt; (Databricks) is an end-to-end grounded-reasoning benchmark: 133 questions (the "Pro" subset) that can only be answered from dense financial tables scattered across 85 years of U.S. Treasury Bulletins, a corpus of roughly 460 MB of parsed text.&lt;/p&gt;

&lt;p&gt;It is almost adversarial to embedding retrieval, in precisely the ways enterprise archives are: hundreds of structurally near-identical monthly issues, answers living in single table cells, questions that hinge on dates, units, and fiscal-versus-calendar distinctions. There is no shortcut. An agent has to work out which bulletin is relevant, open it, find the right table, and produce a number graded at 1% relative-error tolerance.&lt;/p&gt;

&lt;p&gt;That makes it a good proxy for the agentic knowledge management task in general: if a harness-plus-model stack can navigate this archive with three file tools, it can plausibly navigate yours.&lt;/p&gt;

&lt;h2&gt;
  
  
  The experiment
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;One toolset, one prompt, one grader.&lt;/strong&gt; Every harness got the same three read-only tools, backed by a single shared implementation; only the SDK-specific registration layer differs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;glob(pattern)&lt;/code&gt;: list corpus filenames matching a pattern&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;grep(pattern, ...)&lt;/code&gt;: regex search across files&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;read_file(filename, offset, limit)&lt;/code&gt;: read a file with line paging&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the canonical minimal set used by coding agents, applied to a document archive. Every run used the same system prompt, the same &lt;code&gt;&amp;lt;FINAL_ANSWER&amp;gt;&lt;/code&gt; output contract, a 30-turn cap, and OfficeQA's official &lt;code&gt;reward.py&lt;/code&gt; scorer at four tolerances (exact, 0.1%, 1%, 5%).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Four vendor stacks, two model tiers each.&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Vendor stack&lt;/th&gt;
&lt;th&gt;Frontier&lt;/th&gt;
&lt;th&gt;Small&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Anthropic, Claude Agent SDK&lt;/td&gt;
&lt;td&gt;Claude Opus 4.7&lt;/td&gt;
&lt;td&gt;Claude Haiku 4.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenAI, Agents SDK&lt;/td&gt;
&lt;td&gt;GPT-5.5&lt;/td&gt;
&lt;td&gt;GPT-5.4-mini&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Microsoft, Agent Framework&lt;/td&gt;
&lt;td&gt;GPT-5.5&lt;/td&gt;
&lt;td&gt;GPT-5.4-mini&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google, ADK (via LiteLLM)&lt;/td&gt;
&lt;td&gt;Gemini 3.1 Pro&lt;/td&gt;
&lt;td&gt;Gemini 3.5 Flash&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The design measures each vendor's stack as a unit (its SDK running its own models), plus the frontier-versus-small gap within each stack. Microsoft's Agent Framework has no first-party frontier model, so it runs OpenAI's, which conveniently puts the same model on two harnesses: an experiment of pure harness comparison.&lt;/p&gt;

&lt;p&gt;All model traffic was routed through &lt;a href="https://openrouter.ai" rel="noopener noreferrer"&gt;OpenRouter&lt;/a&gt; so provider-side serving is as comparable as we could make it. (The Claude Agent SDK required a small local proxy that stubs Anthropic-API endpoints OpenRouter does not implement.) Tool calls were counted at the shared tool layer, identically across SDKs. Runs were performed in late May 2026.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to read the accuracy numbers.&lt;/strong&gt; All accuracy figures in this article count harness errors (turn-limit exhaustion, crashes) as wrong answers, so every stack is graded on the same 133 questions. The Errors column shows how many of each run's misses were harness failures rather than wrong answers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Vendor stack&lt;/th&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Errors&lt;/th&gt;
&lt;th&gt;Acc@0%&lt;/th&gt;
&lt;th&gt;Acc@1%&lt;/th&gt;
&lt;th&gt;Acc@5%&lt;/th&gt;
&lt;th&gt;Latency med (s)&lt;/th&gt;
&lt;th&gt;Tool calls/q&lt;/th&gt;
&lt;th&gt;Prompt tok/q&lt;/th&gt;
&lt;th&gt;Billed cost/q&lt;/th&gt;
&lt;th&gt;$/correct answer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Claude Agent SDK&lt;/td&gt;
&lt;td&gt;Opus 4.7&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;.489&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;.639&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;.692&lt;/td&gt;
&lt;td&gt;79&lt;/td&gt;
&lt;td&gt;9.0&lt;/td&gt;
&lt;td&gt;n/a*&lt;/td&gt;
&lt;td&gt;$0.69&lt;/td&gt;
&lt;td&gt;$1.08&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Agent SDK&lt;/td&gt;
&lt;td&gt;Haiku 4.5&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;.128&lt;/td&gt;
&lt;td&gt;.271&lt;/td&gt;
&lt;td&gt;.308&lt;/td&gt;
&lt;td&gt;88&lt;/td&gt;
&lt;td&gt;16.2&lt;/td&gt;
&lt;td&gt;n/a*&lt;/td&gt;
&lt;td&gt;$0.28&lt;/td&gt;
&lt;td&gt;$1.04&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenAI Agents SDK&lt;/td&gt;
&lt;td&gt;GPT-5.5&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;.481&lt;/td&gt;
&lt;td&gt;.617&lt;/td&gt;
&lt;td&gt;.662&lt;/td&gt;
&lt;td&gt;103&lt;/td&gt;
&lt;td&gt;9.9&lt;/td&gt;
&lt;td&gt;312.5K&lt;/td&gt;
&lt;td&gt;$0.61&lt;/td&gt;
&lt;td&gt;$0.99&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenAI Agents SDK&lt;/td&gt;
&lt;td&gt;GPT-5.4-mini&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;.008&lt;/td&gt;
&lt;td&gt;.038&lt;/td&gt;
&lt;td&gt;.090&lt;/td&gt;
&lt;td&gt;29&lt;/td&gt;
&lt;td&gt;18.8&lt;/td&gt;
&lt;td&gt;399.6K&lt;/td&gt;
&lt;td&gt;$0.08&lt;/td&gt;
&lt;td&gt;$2.14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MS Agent Framework&lt;/td&gt;
&lt;td&gt;GPT-5.5&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;.519&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;.639&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;.707&lt;/td&gt;
&lt;td&gt;94&lt;/td&gt;
&lt;td&gt;9.2&lt;/td&gt;
&lt;td&gt;261.4K&lt;/td&gt;
&lt;td&gt;$0.50&lt;/td&gt;
&lt;td&gt;$0.78&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MS Agent Framework&lt;/td&gt;
&lt;td&gt;GPT-5.4-mini&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;.030&lt;/td&gt;
&lt;td&gt;.045&lt;/td&gt;
&lt;td&gt;.113&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;18.2&lt;/td&gt;
&lt;td&gt;329.7K&lt;/td&gt;
&lt;td&gt;$0.07&lt;/td&gt;
&lt;td&gt;$1.61&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google ADK&lt;/td&gt;
&lt;td&gt;Gemini 3.1 Pro&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;.248&lt;/td&gt;
&lt;td&gt;.308&lt;/td&gt;
&lt;td&gt;.316&lt;/td&gt;
&lt;td&gt;182&lt;/td&gt;
&lt;td&gt;35.2&lt;/td&gt;
&lt;td&gt;2,836K&lt;/td&gt;
&lt;td&gt;$2.50&lt;/td&gt;
&lt;td&gt;$8.11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google ADK&lt;/td&gt;
&lt;td&gt;Gemini 3.5 Flash&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;.150&lt;/td&gt;
&lt;td&gt;.195&lt;/td&gt;
&lt;td&gt;.195&lt;/td&gt;
&lt;td&gt;194&lt;/td&gt;
&lt;td&gt;44.2&lt;/td&gt;
&lt;td&gt;1,771.8K&lt;/td&gt;
&lt;td&gt;$1.13&lt;/td&gt;
&lt;td&gt;$5.80&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;* &lt;strong&gt;Why the Claude token cells are blank.&lt;/strong&gt; The Anthropic API reports cached input separately from uncached input, and our harness recorded only the uncached slice (8 to 111 prompt tokens per multi-turn run, obviously not the full picture), so the token columns would be misleading. The costs are unaffected: they come straight from the billing export. The billing also quietly confirms the caching story, since Claude's actual charges are about 4x what its recorded uncached tokens alone would cost, with cache reads at a tenth of the base rate making up the difference.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The headline for knowledge management: &lt;strong&gt;agentic navigation works, with no retrieval pipeline at all.&lt;/strong&gt; The best stacks answer nearly two-thirds of a deliberately hard archive benchmark to within 1%, using nothing but list, search, and read over raw text files. The rest of the findings are about what separates the stacks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding 1: the model is the biggest lever, and it is not close
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdzezazfyk01xllafs6xe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdzezazfyk01xllafs6xe.png" alt=" " width="799" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Within each vendor's own stack, dropping from the frontier model to the small one is catastrophic on this task: GPT-5.5 to GPT-5.4-mini falls from 63.9% to 4.5% (Microsoft) and 61.7% to 3.8% (OpenAI). Opus 4.7 to Haiku 4.5 falls from 63.9% to 27.1%. Gemini 3.1 Pro to 3.5 Flash falls from 30.8% to 19.5%.&lt;/p&gt;

&lt;p&gt;No harness choice in this experiment moves accuracy anywhere near that much. For a knowledge assistant, the model tier is the first decision and the main budget line: the navigation loop (form a hypothesis about where the answer lives, search, read, revise) is exactly the multi-step reasoning that separates frontier models from their small siblings.&lt;/p&gt;

&lt;p&gt;The degradation profile also differs by family: Haiku keeps 42% of Opus's accuracy and Flash keeps 63% of Gemini Pro's, but GPT-5.4-mini keeps only about 7% of GPT-5.5's. "Small" means very different things across vendors on this kind of task.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding 2: small models are false economy per correct answer
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqwfla9fay2i5i6a7tzm9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqwfla9fay2i5i6a7tzm9.png" alt=" " width="799" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The small GPT models look absurdly cheap per question ($0.07 to $0.08 in actual charges, versus $0.50 to $0.61 for GPT-5.5). But a knowledge assistant is bought to produce answers, not attempts, and per correct answer the ordering flips:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stack&lt;/th&gt;
&lt;th&gt;Correct (of 133)&lt;/th&gt;
&lt;th&gt;$/correct answer (billed)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MS Agent Framework + GPT-5.5&lt;/td&gt;
&lt;td&gt;85&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0.78&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenAI SDK + GPT-5.5&lt;/td&gt;
&lt;td&gt;82&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0.99&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude SDK + Haiku 4.5&lt;/td&gt;
&lt;td&gt;36&lt;/td&gt;
&lt;td&gt;$1.04&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude SDK + Opus 4.7&lt;/td&gt;
&lt;td&gt;85&lt;/td&gt;
&lt;td&gt;$1.08&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MS Agent Framework + GPT-5.4-mini&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;$1.61&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenAI SDK + GPT-5.4-mini&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;$2.14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google ADK + Gemini 3.5 Flash&lt;/td&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;td&gt;$5.80&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google ADK + Gemini 3.1 Pro&lt;/td&gt;
&lt;td&gt;41&lt;/td&gt;
&lt;td&gt;$8.11&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The GPT minis cost about twice as much per correct answer as GPT-5.5 on the same harness (2.1x on both). One honesty note: with only 5 or 6 correct answers, the mini estimates are noisy, and at the luckiest edge of a 95% confidence interval the gap narrows toward parity. What is not noisy is what you get for the money: a stack that answers 4% of questions is not a knowledge assistant at any price.&lt;/p&gt;

&lt;p&gt;The Claude rows tell a different small-model story. Haiku lands at cost parity with Opus per correct answer ($1.04 vs $1.08), because the Claude harness's aggressive caching makes even Haiku's thrashing cheap. It still answers only 27% of the questions, so the false economy shows up as coverage rather than unit cost. And Google's stack is expensive at both tiers: Flash comes in about 28% cheaper per correct answer than Gemini 3.1 Pro, but both cost 6x to 10x more than the GPT-5.5 stacks. The mechanism behind the minis' false economy is visible in the telemetry:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqrzhyjklbt9vlue6yf8t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqrzhyjklbt9vlue6yf8t.png" alt=" " width="799" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The small models do not fail quickly, they thrash: roughly double the tool calls per question (18 to 19, versus about 9), a similar or larger prompt bill (context still accumulates on every one of those turns), and a tenth of the accuracy. Capability shows up not just in answer quality but in search efficiency. A strong model finds the right bulletin in a few probes; a weak model wanders the archive at your expense. In a deployed knowledge assistant, that waste compounds with a hidden cost this benchmark can grade but users cannot: a wrong number delivered confidently.&lt;/p&gt;

&lt;p&gt;The Google stack's numbers deserve their own note: 35 to 44 tool calls and 0.7M to 2.8M prompt tokens per question, an order of magnitude above the other stacks, making it the most expensive way to get an answer in this experiment ($2.50 per question in actual charges for Gemini 3.1 Pro, 4x to 5x the GPT-5.5 stacks, for half the accuracy). In this round the Google stack is measured as a unit (ADK plus Gemini); how much of the bill is the harness's context-accumulation strategy versus the model's search style is exactly what the sequel's crossed grid will separate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding 3: "close" is only a consolation prize for frontier models
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgy8zpuyo4z8smx0xsreb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgy8zpuyo4z8smx0xsreb.png" alt=" " width="800" height="488"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Loosening the grader from exact match to 5% relative error moves the frontier stacks by 15 to 20 points (Opus: 48.9% exact, 69.2% at 5%). These models usually find the right table and occasionally fumble precision: units, rounding, fiscal versus calendar year. The GPT minis barely move (0.8% to 9%): when they are wrong, they are not almost right, they are lost.&lt;/p&gt;

&lt;p&gt;For knowledge management this cuts two ways. If your use case tolerates approximate figures, a frontier stack gets a meaningful boost for free. And the frontier failure mode (right document, wrong precision) is the kind a citation-checking or unit-verification step can catch, whereas "never found the right page" is not.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding 4: same model, different harness: the accuracy ties, the bill does not
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fc2ofbcucl0zs5a0m0hl0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fc2ofbcucl0zs5a0m0hl0.png" alt=" " width="799" height="253"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The one deliberately crossed cell in this experiment: GPT-5.5 with identical tools and prompts on OpenAI's Agents SDK and Microsoft's Agent Framework. Accuracy is a statistical tie (61.7% versus 63.9%, a 3-question gap on 133). There is clear harness-driven distinction in every other metric:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reliability:&lt;/strong&gt; Microsoft's harness completed all 133 questions without a single hard error, in both the frontier and mini runs. OpenAI's SDK dropped 4 questions to turn-limit exhaustion in each.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tokens:&lt;/strong&gt; roughly 17% fewer prompt tokens and 44% fewer completion tokens on Microsoft's harness, for the same model, tools, and questions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Money:&lt;/strong&gt; $0.50 versus $0.61 per question in actual charges, about 19% cheaper for the identical job (on the cache-aware split of the shared billing bucket).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The harness did not change how smart the model was. It changed what the intelligence cost and whether the run finished, which is exactly the operational layer a knowledge management deployment lives or dies on, and where a reliable harness can shine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding 5: every harness fails in its own accent
&lt;/h2&gt;

&lt;p&gt;The error logs are practically a fingerprint of each SDK's design philosophy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Agent SDK:&lt;/strong&gt; all failures were turn-budget exhaustion ("Reached max turns"), 4 for Opus and 15 for Haiku. The harness never crashed; the agent just ran out of runway.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenAI Agents SDK:&lt;/strong&gt; &lt;code&gt;MaxTurnsExceeded&lt;/code&gt;, plus one JSON-decode error deep in a tool-call payload.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Microsoft Agent Framework:&lt;/strong&gt; zero hard errors across all 266 questions it ran.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google ADK:&lt;/strong&gt; the most revealing failures. The model repeatedly hallucinated tool names (&lt;code&gt;Tool 'grey' not found&lt;/code&gt;, &lt;code&gt;Tool 'view_esf1_sept_2022' not found&lt;/code&gt;) and ADK surfaced them as run-fatal errors rather than feeding a correction back to the model. The other SDKs' stricter tool-schema enforcement never let an invalid tool name through.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Outside of accuracy, this is the next most important metric, and a critical part of AI Engineering harnesses for knowledge management.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limitations
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;One corpus, one domain.&lt;/strong&gt; OfficeQA is numeric, table-heavy, and English. It stresses the navigation loop hard, but agentic knowledge management over contracts or policies may rank the stacks differently. Additionally, some of the questions required access to a sandbox for calculations and analysis. No compute or sandbox was made available to the harnesses.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this means for agentic knowledge management
&lt;/h2&gt;

&lt;p&gt;Three practical takeaways, pending the sequel's crossed grid:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;You may not need a retrieval pipeline.&lt;/strong&gt; Three file tools and a frontier model answered 64% of a benchmark built to punish retrieval, with exact file-and-line provenance for every answer. For archives full of near-duplicate, table-heavy documents, agentic navigation is a serious architecture, not a demo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spend on the model, not on attempts.&lt;/strong&gt; The GPT minis are cheaper per question and roughly twice as expensive per correct answer. Budget on cost per correct answer and the frontier tier usually wins; the exception (Haiku at unit-cost parity with Opus, thanks to caching) still only answers a quarter of the questions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pick the harness for operations.&lt;/strong&gt; Accuracy ties across harnesses running the same model, but errors, tokens, latency, and caching behaviour do not. The harness is an infrastructure choice; evaluate it like one.&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;em&gt;Benchmark: &lt;a href="https://github.com/databricks/officeqa" rel="noopener noreferrer"&gt;OfficeQA&lt;/a&gt; (Databricks), Pro subset, N=133, scored with the official &lt;code&gt;reward.py&lt;/code&gt; at 1% relative-error tolerance unless noted. Harness code, prompts, and per-question results available in the accompanying repo. Pricing: OpenRouter model pages for &lt;a href="https://openrouter.ai/openai/gpt-5.5" rel="noopener noreferrer"&gt;GPT-5.5&lt;/a&gt;, &lt;a href="https://openrouter.ai/openai/gpt-5.4-mini" rel="noopener noreferrer"&gt;GPT-5.4-mini&lt;/a&gt;, &lt;a href="https://openrouter.ai/anthropic/claude-opus-4.7" rel="noopener noreferrer"&gt;Claude Opus 4.7&lt;/a&gt;, &lt;a href="https://openrouter.ai/anthropic/claude-haiku-4.5" rel="noopener noreferrer"&gt;Claude Haiku 4.5&lt;/a&gt;, &lt;a href="https://openrouter.ai/google/gemini-3.1-pro-preview" rel="noopener noreferrer"&gt;Gemini 3.1 Pro&lt;/a&gt;, &lt;a href="https://openrouter.ai/google/gemini-3.5-flash" rel="noopener noreferrer"&gt;Gemini 3.5 Flash&lt;/a&gt;, retrieved July 2026.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>claude</category>
      <category>openai</category>
    </item>
    <item>
      <title>Think with your second brain: a proper Claude Code harness for Obsidian</title>
      <dc:creator>Nick Yeo</dc:creator>
      <pubDate>Wed, 20 May 2026 13:56:29 +0000</pubDate>
      <link>https://dev.to/nickyeolk/think-with-your-second-brain-a-proper-claude-code-harness-for-obsidian-2c0o</link>
      <guid>https://dev.to/nickyeolk/think-with-your-second-brain-a-proper-claude-code-harness-for-obsidian-2c0o</guid>
      <description>&lt;p&gt;An agentic doc harness is a set of Claude Code skills that turn an Obsidian vault into a structured workspace, letting an LLM walk wikilinks the way a coding agent walks imports — without vector-RAG retrieval. On a 99-note evaluation vault it beat a vector-RAG baseline on faithfulness +0.27, grounding +0.80, insight novelty +1.00, answer relevancy +0.40 (Claude-as-judge, 0–3 scale).&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/nickyeolk/agentic_doc_harness" rel="noopener noreferrer"&gt;github.com/nickyeolk/agentic_doc_harness&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I built it
&lt;/h2&gt;

&lt;p&gt;I used to have OneNote as my main note keeping app, supplemented by Google Keep for quick notes. As my notes grew, and OneNote's android app withered, I experienced two problems: OneNote was way too slow, and there was no easy way for an AI agent to organically plug into it.&lt;br&gt;
The idea was to make use of a coding agent's capability to understand code, and use it to understand notes instead.&lt;br&gt;
I consolidated years of notes from OneNote into Obsidian. It worked ok-ish at first, but then I quickly started to encounter limits to the way claude grepped and grokked its way through my 'notebase'. Coding agents depend on code structure to jump from object to object, this did not exist in my disjointed notes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vector RAG vs vault harness
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftm0cor023qq3zbyece93.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftm0cor023qq3zbyece93.png" alt="Difference between RAG and an agentic harness for context retrieval" width="800" height="560"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Same input, same model, different navigation.&lt;/p&gt;

&lt;p&gt;Vector RAG embeds the vault, retrieves k chunks by cosine similarity, hands them to the LLM. Chunks arrive as sentence-level fragments with no provenance.&lt;/p&gt;

&lt;p&gt;The harness reads &lt;code&gt;VAULT_INDEX.md&lt;/code&gt; (a generated map of the vault), routes to an entry note, walks outbound wikilinks, surfaces a few topically-similar but unlinked notes. Notes arrive whole, in their original structure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Harness structure
&lt;/h2&gt;

&lt;p&gt;Four Claude Code skills plus a small set of generated files.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgwp17vtjlfhbokqs84rt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgwp17vtjlfhbokqs84rt.png" alt="The entire architecture of the harness skills" width="800" height="484"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;/harness-init&lt;/code&gt;&lt;/strong&gt; (one-time). Walks the vault, classifies sections, detects hub-candidate notes by inbound mention count, asks 5 clarifying questions, generates &lt;code&gt;VAULT_INDEX.md&lt;/code&gt; (the map), root and per-section &lt;code&gt;CLAUDE.md&lt;/code&gt; files (orientation), and a small config.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;/vault-discover&lt;/code&gt;&lt;/strong&gt; (graph builder). Four modes. Mode 1 ranks notes by inbound mention frequency to surface hub candidates. Mode 2 finds every unlinked mention of a hub and proposes adding &lt;code&gt;[[wikilinks]]&lt;/code&gt;. Mode 3 detects orphan notes and classifies them. Mode 4 groups by shared vocabulary to find clusters that need a MOC.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;vault-context&lt;/code&gt;&lt;/strong&gt; (runtime navigator). Used every session. Depth Mode for directed tasks (1–2 hops). Synthesis Mode for cross-domain queries (multi-hub traversal). Hybrid Mode (opt-in) layers in embedding-aware filtering when Smart Connections is installed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;/obsidian-tooling&lt;/code&gt;&lt;/strong&gt; (optional). Installs the Smart Connections plugin and pre-configures it. The harness then reads &lt;code&gt;.smart-env/multi/*.ajson&lt;/code&gt; directly to use embeddings without any Python ML dependency.&lt;/p&gt;

&lt;p&gt;The harness instructs Claude &lt;em&gt;about&lt;/em&gt; the vault. It never prescribes what's &lt;em&gt;in&lt;/em&gt; the vault.&lt;/p&gt;

&lt;h2&gt;
  
  
  Eval
&lt;/h2&gt;

&lt;p&gt;Synthetic vault: 99 notes representing a fictional marketing consultant pursuing an MS Marketing degree with a family. Five folders. Generator emits zero wikilinks — flat import state.&lt;/p&gt;

&lt;p&gt;Baseline: LlamaIndex vector RAG with &lt;code&gt;nomic-embed-text&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Harness: pure wikilink traversal first, Hybrid Mode after one iteration.&lt;/p&gt;

&lt;p&gt;15 synthesis tasks (single-domain, cross-domain, trap queries). Each response scored by a Claude Sonnet judge on faithfulness, grounding, insight novelty, answer relevancy (0–3 each).&lt;/p&gt;

&lt;p&gt;First pass, pure wikilink traversal:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Baseline&lt;/th&gt;
&lt;th&gt;Harness (pure)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Faithfulness&lt;/td&gt;
&lt;td&gt;2.067&lt;/td&gt;
&lt;td&gt;2.000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Grounding&lt;/td&gt;
&lt;td&gt;2.133&lt;/td&gt;
&lt;td&gt;2.533&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Insight novelty&lt;/td&gt;
&lt;td&gt;1.533&lt;/td&gt;
&lt;td&gt;2.333&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Answer relevancy&lt;/td&gt;
&lt;td&gt;2.067&lt;/td&gt;
&lt;td&gt;2.400&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Three wins, one loss. Faithfulness regressed below baseline. Diagnosis: wikilink traversal is query-agnostic. From a Studies entry note, the agent followed a link to a Clients note even when the query was strictly about coursework. Cross-domain contamination.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hybrid Mode
&lt;/h2&gt;

&lt;p&gt;Embedding the query at runtime would have required a Python ML stack. I wanted to avoid that.&lt;/p&gt;

&lt;p&gt;Smart Connections (Obsidian plugin) already maintains an embedding cache on every note save. The harness reads it.&lt;/p&gt;

&lt;p&gt;Move one: filter wikilinks by anchor similarity. For each outbound link, compute &lt;code&gt;cosine(entry_note_embedding, candidate_embedding)&lt;/code&gt;. Drop links below threshold. A Studies-to-Studies link scores 0.78–0.80. Studies-to-Clients scores 0.68. Studies-to-Family scores 0.57. Threshold becomes a tunable filter.&lt;/p&gt;

&lt;p&gt;Move two: orphan surfacing. After traversal, take top-k notes vault-wide by similarity to the entry note. Drop anything already loaded. Surface up to 5. These are notes the wikilink graph never reaches but the embedding flags as topical.&lt;/p&gt;

&lt;p&gt;Both moves use Python stdlib only. About 150 lines to walk &lt;code&gt;.smart-env/&lt;/code&gt;'s &lt;code&gt;.ajson&lt;/code&gt; files and compute cosine similarity over embeddings that already exist.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final results
&lt;/h2&gt;

&lt;p&gt;Threshold sweep at {0.55, 0.60, 0.65, 0.70, 0.75}. Orphan surfacing on. Pareto-optimal at t=0.65, orphan-k=5.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Variant&lt;/th&gt;
&lt;th&gt;Faith&lt;/th&gt;
&lt;th&gt;Ground&lt;/th&gt;
&lt;th&gt;Novel&lt;/th&gt;
&lt;th&gt;Relev&lt;/th&gt;
&lt;th&gt;Notes loaded&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Baseline (vector RAG)&lt;/td&gt;
&lt;td&gt;2.067&lt;/td&gt;
&lt;td&gt;2.133&lt;/td&gt;
&lt;td&gt;1.533&lt;/td&gt;
&lt;td&gt;2.067&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pure traversal&lt;/td&gt;
&lt;td&gt;2.000&lt;/td&gt;
&lt;td&gt;2.533&lt;/td&gt;
&lt;td&gt;2.333&lt;/td&gt;
&lt;td&gt;2.400&lt;/td&gt;
&lt;td&gt;8.9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hybrid t=0.65 +orph5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2.333&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2.933&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2.533&lt;/td&gt;
&lt;td&gt;2.467&lt;/td&gt;
&lt;td&gt;11.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hybrid t=0.75 +orph5&lt;/td&gt;
&lt;td&gt;2.333&lt;/td&gt;
&lt;td&gt;2.800&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2.667&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2.533&lt;/td&gt;
&lt;td&gt;9.3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Every Hybrid variant beats baseline AND pure-traversal on every dimension. Per-query latency ~8 seconds (same as pure traversal). Notes loaded up 30%, still within token budget.&lt;/p&gt;

&lt;p&gt;Unexpected finding: stricter wikilink filtering plus orphan surfacing beats permissive filtering. At t=0.75 most wikilinks get cut, the surfaced orphans fill the gap, insight novelty peaks. Orphan surfacing is doing more work than the wikilink filter.&lt;/p&gt;

&lt;p&gt;This might change over time as your links build up, or if you have an extremely structured note structure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this fits in the bigger picture
&lt;/h2&gt;

&lt;p&gt;The approach is not entirely novel. It sits inside the confluence of a numbr of trends.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Anthropic dropped vector RAG from Claude Code&lt;/strong&gt; in favor of agentic search. Boris Cherny, Claude Code lead: "Early Claude Code used RAG + a local vector DB, but in the end, we found agentic search to be overwhelmingly better" (&lt;a href="https://newsletter.pragmaticengineer.com/p/building-claude-code-with-boris-cherny" rel="noopener noreferrer"&gt;Pragmatic Engineer interview&lt;/a&gt;, &lt;a href="https://salarysaiyan.com/en/blog/rag-is-dead/" rel="noopener noreferrer"&gt;HN confirmation&lt;/a&gt;). Claude Code now uses &lt;code&gt;Glob&lt;/code&gt;, &lt;code&gt;Grep&lt;/code&gt;, &lt;code&gt;Read&lt;/code&gt; to navigate the way a developer does. The harness extends this pattern from code to prose.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Karpathy's LLM Wiki pattern&lt;/strong&gt; (&lt;a href="https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f" rel="noopener noreferrer"&gt;gist&lt;/a&gt;) describes keeping knowledge as markdown and skipping retrieval infrastructure entirely. Multiple open-source implementations exist: &lt;a href="https://github.com/ussumant/llm-wiki-compiler" rel="noopener noreferrer"&gt;LLM Wiki Compiler&lt;/a&gt;, &lt;a href="https://github.com/kytmanov/obsidian-llm-wiki-local" rel="noopener noreferrer"&gt;obsidian-llm-wiki-local&lt;/a&gt;, &lt;a href="https://github.com/nashsu/llm_wiki" rel="noopener noreferrer"&gt;nashsu/llm_wiki&lt;/a&gt;, &lt;a href="https://github.com/Ar9av/obsidian-wiki" rel="noopener noreferrer"&gt;Ar9av/obsidian-wiki&lt;/a&gt;. The harness shares the anti-RAG stance and traverses progressively rather than dumping the whole corpus into context.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Microsoft's GraphRAG&lt;/strong&gt; (&lt;a href="https://www.microsoft.com/en-us/research/blog/graphrag-unlocking-llm-discovery-on-narrative-private-data/" rel="noopener noreferrer"&gt;blog&lt;/a&gt;, &lt;a href="https://arxiv.org/abs/2404.16130" rel="noopener noreferrer"&gt;arXiv 2404.16130&lt;/a&gt;) builds a knowledge graph from a text corpus, then uses the graph for sensemaking queries. The harness uses the graph the user already built.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Smart Connections&lt;/strong&gt; (&lt;a href="https://github.com/brianpetro/obsidian-smart-connections" rel="noopener noreferrer"&gt;repo&lt;/a&gt;) is the dominant Obsidian-AI plugin and does RAG over the vault. The harness uses Smart Connections' embedding cache as a secondary signal in Hybrid Mode, not as the primary retrieval mechanism.&lt;/p&gt;

&lt;p&gt;The contribution here is synthesis: applying the agentic-search pattern to personal knowledge already structured by the user, with the wikilink graph as the first-class navigation primitive, validated against a vector-RAG baseline with concrete numbers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limitations
&lt;/h2&gt;

&lt;p&gt;Eval is on a synthetic vault. A real personal vault will surface failure modes the synthetic one does not.&lt;/p&gt;

&lt;p&gt;Path 1 anchor scoring uses the entry note's embedding, not the query's. When the entry note is broad and the query is narrow, the anchor does not pick up query intent. A future iteration may add a small local query embedder.&lt;/p&gt;

&lt;p&gt;Entry-point selection runs on routing heuristics generated from the vault. Fragile on first contact with a new vault.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Q: Why not just use Smart Connections?&lt;/strong&gt;&lt;br&gt;
A: Smart Connections is RAG over the vault — embed, retrieve k chunks, chat. Loses the structure. The harness uses the structure first, embeddings second.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: Does this work without Smart Connections?&lt;/strong&gt;&lt;br&gt;
A: Yes. Depth Mode and Synthesis Mode work on wikilinks alone. Hybrid Mode is the opt-in layer that adds Smart Connections.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: Does the harness modify my notes?&lt;/strong&gt;&lt;br&gt;
A: &lt;code&gt;/vault-discover&lt;/code&gt; Mode 2 adds &lt;code&gt;[[wikilinks]]&lt;/code&gt; to your notes, with every change shown before writing. The runtime navigator never writes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: What if my vault has no wikilinks yet?&lt;/strong&gt;&lt;br&gt;
A: The harness handles that case. Designed for the OneNote / Notion / Evernote migration scenario. Mode 1 ranks hub candidates by inbound mention frequency. Mode 2 wires them in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: How does this differ from Karpathy's LLM Wiki?&lt;/strong&gt;&lt;br&gt;
A: LLM Wiki dumps the full knowledge base into the model's context and trusts long context. The harness traverses progressively from an entry point. For vaults larger than the context window, this matters; for small vaults the two converge.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: Why not embed the query at runtime?&lt;/strong&gt;&lt;br&gt;
A: Would require a Python ML stack. The harness is stdlib-only by design. Hybrid Mode achieves most of the win using anchor-based scoring (entry note as the anchor) instead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: What if I want to use this on an existing vault with thousands of notes?&lt;/strong&gt;&lt;br&gt;
A: It should work — &lt;code&gt;vault-context&lt;/code&gt; is bounded by &lt;code&gt;MAX_NOTES_PER_QUERY&lt;/code&gt; (default 12). The harness scales with the entry-point routing, not with vault size. The eval is on 99 notes; larger vaults are untested.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Repo (clone and run): &lt;a href="https://github.com/nickyeolk/agentic_doc_harness" rel="noopener noreferrer"&gt;github.com/nickyeolk/agentic_doc_harness&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.anthropic.com/engineering/effective-context-engineering-for-ai-agents" rel="noopener noreferrer"&gt;Anthropic on effective context engineering&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://newsletter.pragmaticengineer.com/p/building-claude-code-with-boris-cherny" rel="noopener noreferrer"&gt;Boris Cherny on Claude Code's agentic search&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f" rel="noopener noreferrer"&gt;Karpathy's LLM Wiki gist&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.microsoft.com/en-us/research/blog/graphrag-unlocking-llm-discovery-on-narrative-private-data/" rel="noopener noreferrer"&gt;Microsoft GraphRAG&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>obsidian</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
