Your Coding Agent Knows the Internet's Average. Here's How to Make It Know Yours. A developer building agentproto argues that coding agents trained on public internet data produce generic answers, and the only way to make an agent specific to a team's codebase is to attach a custom knowledge base. The post outlines three tiers of knowledge integration, from no knowledge base to a served, queryable system, and claims retrieval quality is the dominant factor in agent performance. Disclosure up front: I build agentproto , whose knowledge and operator primitives are the back half of this piece. The problem in the first half stands on its own, and the walkthrough uses real, checkable commands. Corrections welcome — file an issue. Open Claude Code. Open Codex. Open a cheap local model in the same repo. Ask all three the same question about your codebase — your retry convention, your deploy runbook, why that one service is the way it is. You'll get three fluent, confident, near-identical answers. And all three will be wrong in the same way: they'll describe how a reasonable team does it, not how yours does. They're all running the same frontier weights, trained on the same public internet, so out of the box they all know exactly the same thing. The one idea, if you remember nothing else: The weights are everyone's. Your knowledge base is the only part of the stack that'syours— and the only thing that makes the agent yours instead of the internet's average. Here's the shift most people missed while arguing about benchmarks. The gap between the best model and the tenth-best is collapsing — the hub piece https://dev.to/agentiknet/you-can-parallelize-the-typing-you-cant-parallelize-the-trust-2fkd has the Stanford AI Index receipt the 1-to- 10 spread fell from 11.9% to 5.4% in a year . When the weights converge, the weights stop being your edge. What replaces them is system design. One widely-cited 2026 essay on the evolution of agents put it bluntly: agent capability has moved from model quality to system design — from writing a clever prompt to engineering what the model can The receipt that reframes the whole market.In a production-readiness comparison of agent frameworks, one finding held across every orchestration style tested:retrieval quality dominates knowledge-agent performanceYou can have the best planner-worker-judge regardless of orchestration. topology in the world; if the agent is retrieving from the internet's average instead of your world, it answers like a stranger. So the interesting question stopped being "which model?" and became "what does it know that no one else's does?" JetBrains' framing is useful here: some agents are action-first their value is what they do and some are data-first their value is what they can access . A coding agent for your team is data-first whether you designed it that way or not. The uncomfortable part: if you haven't attached your knowledge to your agent, you're shipping the stranger. Run the self-diagnosis before you build anything. There are three tiers, and most teams are stuck on the first two without noticing. Tier 0 — no knowledge base. The agent knows what the pre-training run knew: public GitHub, Stack Overflow, docs up to some cutoff. Ask it about your world and it pattern-matches to the nearest public example. It's confident and it's generic. Ceiling: it will never know a single thing that isn't already on the internet. Tier 1 — pasted into context. You dump the runbook, the conventions doc, a few past PRs into the prompt or a CLAUDE.md and hope. It works — until the context fills up. Anthropic's context-engineering post is direct about why this caps out: you have to treat context as a finite attention budget , because recall decays as the window grows "context rot" . Why Tier 1 has a hard ceiling.The same post prescribes the fix —keep, not pre-load everything. lightweight references and retrieve just-in-time Pasting your whole knowledge base into every prompt is the exact anti-pattern: it's expensive, it rots, and it doesn't scale past a handful of documents. A KB you paste is a KB you'll soon truncate. Tier 2 — a served, queryable knowledge base. Your knowledge lives in one place, gets indexed, and every agent queries it on demand — pulling only the three relevant entries for the question at hand, with their sources attached. This is just-in-time retrieval, done properly, shared across every agent you run. The jump from Tier 1 to Tier 2 is the whole game — and it's the "who equips the agents" question from the files-with-contracts piece, pointed straight at knowledge. Let's build it. Start with the packaged shape, because it shows the target. In agentproto, an operator the AIP-9 OPERATOR.md is a persona plus policies plus a set of bound tools — and one of those tools is a knowledge binding. operators/house-engineer/OPERATOR.md — persona + policies + a KB binding --- name: House Engineer id: house-engineer profile: role: Answer and act using OUR conventions and past incidents, never generic defaults. voice: Concrete, cites the runbook or incident it's drawing from. tools: - knowledge-query ← the bound knowledge tool - shell policies: - "policy:engineering/house-rules" metadata: corpus: knowledgeViews: - corpus: engineering filter: { tags: conventions, runbooks, incidents } --- Read what that knowledgeViews block does: it scopes the operator to your engineering corpus, filtered to the tags that matter. The persona decides how it answers; the policies decide what it's allowed to do; the knowledge view decides what it knows . Three separate concerns, one file. This is a real shape, not a mock.The research operators shipped in agentproto's own corpus — source-scout , research-analyst — carry exactly this: tools: knowledge-query, ... plus a metadata.corpus.knowledgeViews binding scoped by domain and quality score. The operator is thepackaging. Underneath it is a tool, and the tool is the part that ports to any agent. An operator is what "give the agent your knowledge" looks like when it's one declared file. Now let's build the tool that backs it — the part that reaches This is the exact move from the files-with-contracts piece https://dev.to/agentiknet/your-claude-skill-is-invisible-to-codex-heres-how-to-fix-it-3l74 , specialized to knowledge: split the contract what the tool promises from the driver the code that answers . Here's the contract — a pure defineTool , no execute body. js // tools/knowledge-search/TOOL.ts — the contract, and nothing else import { defineTool } from "@agentproto/tool" import { z } from "zod" export const knowledgeSearch = defineTool { id: "knowledge.search", description: "Answer from OUR knowledge base: conventions, runbooks, past incidents. " + "Returns refined entries, each with the source it came from.", inputSchema: z.object { query: z.string , tags: z.array z.string .default , limit: z.number .default 5 , } , outputSchema: z.object { entries: z.array z.object { kind: z.string , title: z.string , body: z.string , source: z.string , // provenance — where this knowledge came from } , } , mutates: , // read-only → no approval gate approval: "auto", } Now the driver — the implementation, bound to the contract by implementTool . It reads your corpus workspace off local disk and returns the matching entries. js // drivers/knowledge-corpus.ts — backed by your own corpus workspace import { defineDriver, implementTool } from "@agentproto/driver" import { knowledgeSearch } from "../tools/knowledge-search/TOOL.js" import { resolveKnowledge } from "@agentproto/corpus" import { NodeFsAdapter } from "@agentproto/corpus/fs" export default defineDriver { id: "knowledge.search.corpus", name: "Knowledge search over your corpus workspace", kind: "in-process", implementations: implementTool knowledgeSearch, async { input } = { // the same resolver behind corpus knowledge