{"articles":[{"schemaVersion":"1.0.0","id":"the-small-agent-playbook","slug":"the-small-agent-playbook","title":"The small-agent playbook","description":"A practical research plan for building agent experiments you can actually reproduce.","category":"Experiments","tags":["Agents","Evaluation","Open source"],"date":"2026-09-29","updated":"2026-09-29","author":"PlainNerd editorial","readTime":3,"illustrationKind":"agent","status":"published","evidenceStatus":"research-plan","locale":"en","originalLocale":"en","content":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Research plan. These experiments have not been run; no measured results are claimed."}]},{"type":"heading","attrs":{"level":2},"content":[{"type":"text","text":"Start with one question"}]},{"type":"paragraph","content":[{"type":"text","text":"Does a smaller, more focused toolset help an agent complete a bounded repository task? That is a question we can investigate. “Which agent is best?” bundles too many decisions into a single answer. Start with a specific task, a fixed repository revision, and a result another person can inspect."}]},{"type":"paragraph","content":[{"type":"text","text":"Our proposed first experiment compares the same agent with two tool configurations. The model, task instructions, source files, budget, and stopping rules stay fixed. This keeps the comparison focused, but model variability and service changes still need to be recorded. Alternate the order of conditions and repeat both before interpreting any difference."}]},{"type":"heading","attrs":{"level":2},"content":[{"type":"text","text":"Write the protocol before the prompt"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Choose tasks with observable acceptance criteria and keep a separate set for evaluation."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Record model identifier, prompt version, repository commit, tool definitions, and environment."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Define what counts as success, failure, timeout, and manual intervention before running."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Keep failed attempts and full tool traces alongside successful ones."}]}]}]},{"type":"paragraph","content":[{"type":"text","text":"A passing test suite is useful evidence, but it may miss unintended behavior. Add a review of the actual patch and report the limitations of each check."}]},{"type":"heading","attrs":{"level":2},"content":[{"type":"text","text":"Keep a run manifest"}]},{"type":"codeBlock","attrs":{"language":"json"},"content":[{"type":"text","text":"{\n  \"protocol\": \"small-agent-v1\",\n  \"repositoryCommit\": \"<record exact commit>\",\n  \"model\": \"<record model identifier>\",\n  \"taskSet\": \"<versioned task file>\",\n  \"toolConfiguration\": \"focused\",\n  \"result\": \"not-run\"\n}"}]},{"type":"paragraph","content":[{"type":"text","text":"Repeat each condition, preserve raw observations, and publish the execution scripts. Record cost and elapsed time as observations rather than treating them as interchangeable with quality."}]},{"type":"heading","attrs":{"level":2},"content":[{"type":"text","text":"What we would publish"}]},{"type":"paragraph","content":[{"type":"text","text":"The deliverable should include the protocol, task set, manifests, traces with secrets removed, evaluation code, and a plain-language account of failures. We have not executed this study. A useful result may be that the narrower toolset makes no reliable difference."}]},{"type":"paragraph","content":[{"type":"text","text":"For a primary reference on defining data and grading criteria, see the evaluation guide below. Our proposed protocol is editorial guidance; it is not a claim about a provider’s benchmark results."}]},{"type":"paragraph","content":[{"type":"text","text":"OpenAI: working with evals","marks":[{"type":"link","attrs":{"href":"https://developers.openai.com/api/docs/guides/evals"}}]}]}]}},{"schemaVersion":"1.0.0","id":"sqlite-at-the-edge","slug":"sqlite-at-the-edge","title":"SQLite at the edge, without the guesswork","description":"A query-first checklist for thinking clearly about D1, indexes, and where latency really comes from.","category":"Guides","tags":["SQLite","Cloudflare","Databases"],"date":"2026-09-29","updated":"2026-09-29","author":"PlainNerd editorial","readTime":3,"illustrationKind":"database","status":"published","evidenceStatus":"reference-guide","locale":"en","originalLocale":"en","content":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Reference guide. This article draws on primary documentation and editorial recommendations; no production measurements are reported."}]},{"type":"heading","attrs":{"level":2},"content":[{"type":"text","text":"Begin with the query"}]},{"type":"paragraph","content":[{"type":"text","text":"Before choosing an architecture, write down the reads and writes your application actually needs. A small editorial site might list published posts, fetch one slug, and append a comment. Those operations tell you more than a generic database comparison."}]},{"type":"paragraph","content":[{"type":"text","text":"Cloudflare D1 offers a managed serverless database with SQLite SQL semantics. That describes its interface; it does not tell you what your application’s end-to-end latency will be."}]},{"type":"heading","attrs":{"level":2},"content":[{"type":"text","text":"Inspect the plan"}]},{"type":"paragraph","content":[{"type":"text","text":"Use SQLite’s EXPLAIN QUERY PLAN to inspect index usage and scan strategy. Read it as a debugging aid: SQLite explicitly warns that its output format can change between releases. The example below assumes an articles table with slug, title, status, and published_at columns; adapt it to your own schema."}]},{"type":"codeBlock","attrs":{"language":"sql"},"content":[{"type":"text","text":"EXPLAIN QUERY PLAN\nSELECT slug, title\nFROM articles\nWHERE status = 'published'\nORDER BY published_at DESC\nLIMIT 20;"}]},{"type":"heading","attrs":{"level":2},"content":[{"type":"text","text":"Measure the whole request"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Use a representative dataset rather than an almost empty database."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Measure application response time separately from database query time."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Record client location, deployment configuration, cache state, and error rate."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Review indexes against both read paths and write costs."}]}]}]},{"type":"paragraph","content":[{"type":"text","text":"Keep local correctness checks separate from remote performance observations. A fast local query cannot establish how a deployed request behaves."}]},{"type":"heading","attrs":{"level":2},"content":[{"type":"text","text":"Keep the first version legible"}]},{"type":"paragraph","content":[{"type":"text","text":"Choose explicit migrations, parameterized statements, and a documented recovery procedure. Before adding replication or caching, describe the consistency your readers need. This guide proposes a checklist; it contains no production performance measurements."}]},{"type":"paragraph","content":[{"type":"text","text":"Cloudflare: D1 overview","marks":[{"type":"link","attrs":{"href":"https://developers.cloudflare.com/d1/"}}]}]},{"type":"paragraph","content":[{"type":"text","text":"SQLite: EXPLAIN QUERY PLAN","marks":[{"type":"link","attrs":{"href":"https://www.sqlite.org/eqp.html"}}]}]}]}},{"schemaVersion":"1.0.0","id":"a-better-home-for-agent-memory","slug":"a-better-home-for-agent-memory","title":"A better home for your agents’ memory","description":"Separate facts, working context, and durable decisions before adding another vector database.","category":"Field notes","tags":["Agents","Memory","Architecture"],"date":"2026-09-29","updated":"2026-09-29","author":"PlainNerd editorial","readTime":3,"illustrationKind":"workflow","status":"published","evidenceStatus":"research-plan","locale":"en","originalLocale":"en","content":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Research plan. These experiments have not been run; no measured results are claimed."}]},{"type":"heading","attrs":{"level":2},"content":[{"type":"text","text":"Memory needs a job description"}]},{"type":"paragraph","content":[{"type":"text","text":"An agent can need several different kinds of information: temporary task context, durable user preferences, source documents, and records of decisions. Putting everything into one undifferentiated store makes retrieval and correction difficult to reason about."}]},{"type":"heading","attrs":{"level":2},"content":[{"type":"text","text":"Design a small memory record"}]},{"type":"paragraph","content":[{"type":"text","text":"Our proposed record includes the claim, its source, when it was observed, who may use it, and when it should be reviewed. Treat inferred preferences as tentative. A correction should supersede an earlier record rather than silently leaving both active."}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Facts need provenance and an explicit owner."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Decisions need the context in which they were made."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Working notes need an expiry or a clear task boundary."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Sensitive material needs an intentional retention policy."}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"type":"text","text":"Do not confuse caching with remembering"}]},{"type":"paragraph","content":[{"type":"text","text":"Prompt caching reuses previously processed prompt prefixes when the provider’s cache requirements are met. It is a different mechanism from deciding which facts should persist across tasks. Cache hits can reduce repeated processing costs, while cache-write costs, lifetime, and model support affect the overall saving. Caching does not make the context accurate or appropriate."}]},{"type":"paragraph","content":[{"type":"text","text":"Anthropic: prompt caching","marks":[{"type":"link","attrs":{"href":"https://platform.claude.com/docs/en/build-with-claude/prompt-caching"}}]}]},{"type":"heading","attrs":{"level":2},"content":[{"type":"text","text":"Test correction, not just recall"}]},{"type":"paragraph","content":[{"type":"text","text":"A useful future experiment would ask an agent to retrieve a fact, incorporate a correction, and stop relying on the earlier value. Include cases where the right answer is that the source is missing or out of date. We have not run this evaluation; the record format and test cases are a research proposal."}]}]}},{"schemaVersion":"1.0.0","id":"a-terminal-for-parallel-work","slug":"a-terminal-for-parallel-work","title":"A quieter terminal for parallel work","description":"Give each change a workspace, a clear owner, and a reviewable finish line.","category":"Guides","tags":["Git","Developer tools","Workflow"],"date":"2026-09-29","updated":"2026-09-29","author":"PlainNerd editorial","readTime":3,"illustrationKind":"terminal","status":"published","evidenceStatus":"reference-guide","locale":"en","originalLocale":"en","content":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Reference guide. This article draws on primary documentation and editorial recommendations; no production measurements are reported."}]},{"type":"heading","attrs":{"level":2},"content":[{"type":"text","text":"One directory, one change"}]},{"type":"paragraph","content":[{"type":"text","text":"Parallel work becomes hard to review when several tasks change the same checkout. Git worktrees let a repository have multiple working trees. Each can hold a separate task without requiring a separate clone of the full repository."}]},{"type":"heading","attrs":{"level":2},"content":[{"type":"text","text":"Name the work"}]},{"type":"paragraph","content":[{"type":"text","text":"Choose a branch and directory name that describes the intended change. Before creating a worktree, inspect the existing branches and working trees. The following is an example for a new branch; replace the names for your repository."}]},{"type":"codeBlock","attrs":{"language":"sh"},"content":[{"type":"text","text":"git worktree list\ngit worktree add -b feature/search ../project-search"}]},{"type":"heading","attrs":{"level":2},"content":[{"type":"text","text":"Make shared resources explicit"}]},{"type":"paragraph","content":[{"type":"text","text":"A separate working tree does not isolate databases, ports, credentials, or external services. Give each development server its own port and use disposable test data where possible. Write down which resources are shared so the next person can predict the effects of a command."}]},{"type":"heading","attrs":{"level":2},"content":[{"type":"text","text":"Close the loop"}]},{"type":"paragraph","content":[{"type":"text","text":"Review the diff, run the checks appropriate to the change, and commit the intended files. Remove a finished worktree only after checking that its work is preserved. Use Git’s worktree commands to manage its bookkeeping rather than deleting directories blindly."}]},{"type":"paragraph","content":[{"type":"text","text":"Git: worktree documentation","marks":[{"type":"link","attrs":{"href":"https://git-scm.com/docs/git-worktree"}}]}]}]}},{"schemaVersion":"1.0.0","id":"the-tools-worth-opening-a-tab-for","slug":"the-tools-worth-opening-a-tab-for","title":"The tools worth opening a new tab for","description":"A short reading list for people building with agents, databases, and the web.","category":"Digest","tags":["Reading list","Tools","Open web"],"date":"2026-09-29","updated":"2026-09-29","author":"PlainNerd editorial","readTime":3,"illustrationKind":"digest","status":"published","evidenceStatus":"reference-guide","locale":"en","originalLocale":"en","content":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Reference guide. This article draws on primary documentation and editorial recommendations; no production measurements are reported."}]},{"type":"heading","attrs":{"level":2},"content":[{"type":"text","text":"A protocol you can inspect"}]},{"type":"paragraph","content":[{"type":"text","text":"The Model Context Protocol architecture documentation is a useful starting point for understanding the roles of hosts, clients, and servers. Read the boundaries before wiring new capabilities into an agent. A protocol connection does not by itself establish that a tool is suitable for your task."}]},{"type":"paragraph","content":[{"type":"text","text":"MCP: architecture overview","marks":[{"type":"link","attrs":{"href":"https://modelcontextprotocol.io/docs/learn/architecture"}}]}]},{"type":"heading","attrs":{"level":2},"content":[{"type":"text","text":"A query plan you can read"}]},{"type":"paragraph","content":[{"type":"text","text":"SQLite’s query plan guide makes a familiar operation more visible. Try it against a representative query from your own project and inspect the scan and index strategy. Do not build a parser that assumes the display format will remain stable."}]},{"type":"paragraph","content":[{"type":"text","text":"SQLite: EXPLAIN QUERY PLAN","marks":[{"type":"link","attrs":{"href":"https://www.sqlite.org/eqp.html"}}]}]},{"type":"heading","attrs":{"level":2},"content":[{"type":"text","text":"A browser that can explain itself"}]},{"type":"paragraph","content":[{"type":"text","text":"MDN’s Performance APIs overview is a map of browser measurement capabilities. Start with the user interaction you care about, then decide which timing data helps explain it. Numbers need a scenario and an environment to be interpretable."}]},{"type":"paragraph","content":[{"type":"text","text":"MDN: Performance APIs","marks":[{"type":"link","attrs":{"href":"https://developer.mozilla.org/en-US/docs/Web/API/Performance_API"}}]}]},{"type":"heading","attrs":{"level":2},"content":[{"type":"text","text":"A reading list, not a leaderboard"}]},{"type":"paragraph","content":[{"type":"text","text":"These are primary documentation starting points selected for this reading list. They are not sponsored placements, benchmark winners, or a claim that we tested every alternative. Keep a note of what you tried and link the source that changed your understanding."}]}]}},{"schemaVersion":"1.0.0","id":"measure-before-you-optimize","slug":"measure-before-you-optimize","title":"Measure before you optimize","description":"A browser performance research plan that starts with a real interaction and ends with evidence.","category":"Experiments","tags":["Performance","Browser","Measurement"],"date":"2026-09-29","updated":"2026-09-29","author":"PlainNerd editorial","readTime":3,"illustrationKind":"browser","status":"published","evidenceStatus":"research-plan","locale":"en","originalLocale":"en","content":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Research plan. These experiments have not been run; no measured results are claimed."}]},{"type":"heading","attrs":{"level":2},"content":[{"type":"text","text":"Pick the moment that matters"}]},{"type":"paragraph","content":[{"type":"text","text":"For an editorial site, a meaningful question is how quickly a reader can open an article and begin reading. For an editor, it may be how long typing takes to appear. Define one scenario, including the device, network conditions, and starting page."}]},{"type":"heading","attrs":{"level":2},"content":[{"type":"text","text":"Capture a baseline"}]},{"type":"paragraph","content":[{"type":"text","text":"Record the application revision and test environment. Keep navigation timing, resource observations, and the visible result together. Repeat the scenario before drawing conclusions: an isolated run can reflect background activity or a warm cache."}]},{"type":"heading","attrs":{"level":2},"content":[{"type":"text","text":"Change one thing"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Choose a hypothesis tied to an observed delay."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Apply one bounded change and keep the baseline revision available."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Repeat the same scenario with the same measurement method."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Inspect visual stability and interaction behavior as well as duration."}]}]}]},{"type":"paragraph","content":[{"type":"text","text":"A smaller asset is only a useful improvement if it helps the actual reading experience without introducing a regression."}]},{"type":"heading","attrs":{"level":2},"content":[{"type":"text","text":"Report uncertainty"}]},{"type":"paragraph","content":[{"type":"text","text":"This is a proposed measurement procedure. We have not collected timings or compared deployments. A future report should publish the raw observations, run conditions, and any cases excluded from analysis."}]},{"type":"paragraph","content":[{"type":"text","text":"MDN: Performance APIs","marks":[{"type":"link","attrs":{"href":"https://developer.mozilla.org/en-US/docs/Web/API/Performance_API"}}]}]}]}},{"schemaVersion":"1.0.0","id":"the-interface-is-a-contract","slug":"the-interface-is-a-contract","title":"The interface is a contract","description":"Why a small tool schema can be the most useful part of an agent system.","category":"Field notes","tags":["MCP","Agents","Design"],"date":"2026-09-29","updated":"2026-09-29","author":"PlainNerd editorial","readTime":3,"illustrationKind":"workflow","status":"published","evidenceStatus":"reference-guide","locale":"en","originalLocale":"en","content":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Reference guide. This article draws on primary documentation and editorial recommendations; no production measurements are reported."}]},{"type":"heading","attrs":{"level":2},"content":[{"type":"text","text":"Make the action understandable"}]},{"type":"paragraph","content":[{"type":"text","text":"A tool name should describe what it does. Its parameters should make required choices explicit, and its result should tell the caller what happened. Ambiguous interfaces shift work into prompts and make failures harder to inspect."}]},{"type":"heading","attrs":{"level":2},"content":[{"type":"text","text":"Describe a useful boundary"}]},{"type":"paragraph","content":[{"type":"text","text":"Prefer a tool that represents one coherent operation. Give inputs clear types, reject unsupported values, and document effects that extend beyond the current task. Separate reading information from changing it when those operations need different permissions."}]},{"type":"heading","attrs":{"level":2},"content":[{"type":"text","text":"Return evidence"}]},{"type":"paragraph","content":[{"type":"text","text":"A useful result includes the outcome and enough context to verify it: a resource identifier, a version, or a structured error. Avoid treating a successfully sent request as proof that a downstream operation completed. Design the failure path as deliberately as the happy path."}]},{"type":"heading","attrs":{"level":2},"content":[{"type":"text","text":"Read the architecture first"}]},{"type":"paragraph","content":[{"type":"text","text":"MCP describes a host-client-server architecture for connecting applications to capabilities and context. Use its primary documentation to understand the transport and lifecycle before inventing application conventions. The interface advice here is an editorial design approach, not a measured comparison."}]},{"type":"paragraph","content":[{"type":"text","text":"MCP: architecture overview","marks":[{"type":"link","attrs":{"href":"https://modelcontextprotocol.io/docs/learn/architecture"}}]}]}]}}],"schemaVersion":"1.0.0","preview":false}