<?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: Coding-Dev-Tools</title>
    <description>The latest articles on DEV Community by Coding-Dev-Tools (@coding-dev-tools).</description>
    <link>https://dev.to/coding-dev-tools</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%2F4222174%2Fbfa3fce8-0f4a-4529-8fde-f396b206ea42.jpg</url>
      <title>DEV Community: Coding-Dev-Tools</title>
      <link>https://dev.to/coding-dev-tools</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/coding-dev-tools"/>
    <language>en</language>
    <item>
      <title>MCP server ownership: the checklist I use before an agent touches production</title>
      <dc:creator>Coding-Dev-Tools</dc:creator>
      <pubDate>Tue, 03 Nov 2026 02:22:35 +0000</pubDate>
      <link>https://dev.to/coding-dev-tools/mcp-server-ownership-the-checklist-i-use-before-an-agent-touches-production-2lac</link>
      <guid>https://dev.to/coding-dev-tools/mcp-server-ownership-the-checklist-i-use-before-an-agent-touches-production-2lac</guid>
      <description>&lt;p&gt;A local MCP server starts as a convenience. Someone adds it to a config file, points it at a database, and uses it to speed up a task. Six months later, nobody remembers who owns it, what it can read, or why it has a write token.&lt;/p&gt;

&lt;p&gt;That is the point where an MCP server stops being a helper and becomes infrastructure. Infrastructure needs an owner, a scope, logs, and a way to turn it off.&lt;/p&gt;

&lt;p&gt;This is the checklist I use before an agent gets access to anything that matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Name an owner and a backup
&lt;/h2&gt;

&lt;p&gt;Every MCP server needs one person who is accountable for it and one person who can revoke it. Put both names in the repository, next to the server configuration.&lt;/p&gt;

&lt;p&gt;If the owner leaves the team, the server should not become a mystery. The backup should be able to explain what the server does, which credentials it uses, and how to disable it.&lt;/p&gt;

&lt;p&gt;A simple line in the repo is enough:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Server: postgres-read
Owner: Dana
Backup: Miguel
Purpose: read-only customer lookup for support agents
Kill switch: remove the tool from the MCP config and revoke the database role
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Write down the exact tool surface
&lt;/h2&gt;

&lt;p&gt;Do not describe the server as "database access." List the tools and what each one can do.&lt;/p&gt;

&lt;p&gt;For each tool, record:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the input it accepts&lt;/li&gt;
&lt;li&gt;the data it returns&lt;/li&gt;
&lt;li&gt;whether it reads or writes&lt;/li&gt;
&lt;li&gt;the maximum result size&lt;/li&gt;
&lt;li&gt;the scope it can reach&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A tool that runs &lt;code&gt;SELECT&lt;/code&gt; against a read replica is a different risk from a tool that runs migrations. A tool that returns 50 rows is a different risk from a tool that returns the whole table.&lt;/p&gt;

&lt;p&gt;If the tool list is too long to review, the server is too broad.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Scope credentials to the minimum
&lt;/h2&gt;

&lt;p&gt;Use a separate credential for each MCP server. Do not reuse an admin token because it is convenient.&lt;/p&gt;

&lt;p&gt;For a read-only server, use a read-only role. For a write-capable server, restrict it to the tables or actions it actually needs. If the server only creates draft records, it should not be able to delete them.&lt;/p&gt;

&lt;p&gt;Store the credential in the environment or the OS credential store, not in the repository. Rotate it on a schedule and after any suspected exposure.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Log reads and writes separately
&lt;/h2&gt;

&lt;p&gt;Most teams log errors and ignore successful tool calls. That makes it hard to answer basic questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which customer records did the agent read?&lt;/li&gt;
&lt;li&gt;Which records did it change?&lt;/li&gt;
&lt;li&gt;Which agent session made the change?&lt;/li&gt;
&lt;li&gt;What did the human verify before the change was accepted?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Log the tool name, the scope, the record IDs, and the session. Do not log raw secrets or full customer records. Separate read logs from write logs so a write review does not get buried in read noise.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Record provenance in the pull request
&lt;/h2&gt;

&lt;p&gt;"The agent used the database" is not provenance. The pull request should say which server, which record, and what the human checked.&lt;/p&gt;

&lt;p&gt;A useful line looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Source: postgres-read, customer 1842, subscription status changed on 2026-10-30
Human check: verified the cancellation reason in the billing dashboard
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That line gives the reviewer something to inspect. It also makes the agent's reasoning auditable after the fact.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Test revocation before you need it
&lt;/h2&gt;

&lt;p&gt;Revocation is not a document. It is a test.&lt;/p&gt;

&lt;p&gt;Pick one server and walk through the shutdown:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Remove the tool from the agent configuration.&lt;/li&gt;
&lt;li&gt;Revoke the credential.&lt;/li&gt;
&lt;li&gt;Confirm the agent can no longer call the tool.&lt;/li&gt;
&lt;li&gt;Confirm the audit log shows the failed attempt.&lt;/li&gt;
&lt;li&gt;Record how long the process took.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If the test takes an hour, the real incident will take longer. Do it while the system is calm.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Set a review cadence
&lt;/h2&gt;

&lt;p&gt;MCP servers drift. A token that was read-only last quarter may have been widened for a demo. A tool that was internal may now be exposed to a customer-facing agent.&lt;/p&gt;

&lt;p&gt;Review the server every quarter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is the owner still on the team?&lt;/li&gt;
&lt;li&gt;Is the credential still scoped correctly?&lt;/li&gt;
&lt;li&gt;Are the tools still necessary?&lt;/li&gt;
&lt;li&gt;Are the logs still complete?&lt;/li&gt;
&lt;li&gt;Has the server been used in the last 30 days?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If nobody uses it, remove it. An unused server with a live credential is pure risk.&lt;/p&gt;

&lt;h2&gt;
  
  
  A read versus write example
&lt;/h2&gt;

&lt;p&gt;Consider a memory server for a coding agent.&lt;/p&gt;

&lt;p&gt;A read-only version can recall decisions and return the source. The worst case is a bad answer that a human catches.&lt;/p&gt;

&lt;p&gt;A write-capable version can store a new decision, close an old one, or change the scope of a memory. The worst case is a corrupted project record that later agents treat as true.&lt;/p&gt;

&lt;p&gt;The tool surface should make that difference obvious. The read tools should be separate from the write tools. The write tools should require an explicit scope and return a receipt.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Engraphis handles this
&lt;/h2&gt;

&lt;p&gt;Engraphis is the local-first memory server I built for coding agents. The governance model is the part I care about most.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Memories are scoped by workspace, repository, and session.&lt;/li&gt;
&lt;li&gt;Every record keeps its provenance and temporal history.&lt;/li&gt;
&lt;li&gt;Superseded facts are closed, not silently overwritten.&lt;/li&gt;
&lt;li&gt;Recall is bounded and cited.&lt;/li&gt;
&lt;li&gt;The local dashboard lets you inspect, correct, and review conflicts.&lt;/li&gt;
&lt;li&gt;The local core is Apache-2.0 and free. Pro adds hosted memory health and sync.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The retrieval is useful. The ownership model is what makes it safe to leave running.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you want the setup done for you
&lt;/h2&gt;

&lt;p&gt;I do a fixed-scope MCP setup for teams. It includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;clean setup of Claude Code, Cursor, or Codex&lt;/li&gt;
&lt;li&gt;integration of up to three MCP servers&lt;/li&gt;
&lt;li&gt;environment, credential, and security configuration&lt;/li&gt;
&lt;li&gt;a one-page runbook with the owner, scope, logs, and revocation steps&lt;/li&gt;
&lt;li&gt;seven days of async text support&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The price is $250, the turnaround is 24 hours, and the delivery is text only. No calls or screen sharing.&lt;/p&gt;

&lt;p&gt;Start here: &lt;a href="https://engraphis.com" rel="noopener noreferrer"&gt;https://engraphis.com&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Disclosure: I built Engraphis. This checklist comes from building and operating it, not from a certification or a vendor audit.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>devops</category>
      <category>security</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Your coding agent has amnesia. Here's the memory architecture that fixes it.</title>
      <dc:creator>Coding-Dev-Tools</dc:creator>
      <pubDate>Mon, 02 Nov 2026 11:03:41 +0000</pubDate>
      <link>https://dev.to/coding-dev-tools/your-coding-agent-has-amnesia-heres-the-memory-architecture-that-fixes-it-4496</link>
      <guid>https://dev.to/coding-dev-tools/your-coding-agent-has-amnesia-heres-the-memory-architecture-that-fixes-it-4496</guid>
      <description>&lt;p&gt;Every coding-agent demo looks the same: a clean repo, a fresh context window, and a task that fits in one prompt.&lt;/p&gt;

&lt;p&gt;Real work doesn't fit.&lt;/p&gt;

&lt;p&gt;You make an architectural decision on Monday. On Tuesday the context compacts, the agent forgets why the decision was made, and it confidently proposes the opposite. You paste the schema again. You paste the ADR again. You explain, for the fifth time, that the auth service migrated from JWT to PASETO and &lt;em&gt;why&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The model isn't the only problem. The interface is. A context window is a scratchpad, not a memory system.&lt;/p&gt;

&lt;p&gt;I built &lt;a href="https://engraphis.com" rel="noopener noreferrer"&gt;Engraphis&lt;/a&gt; to fix this for my own workflow. This article is the architecture I landed on, the failure modes it addresses, and the parts I would measure before trusting any memory layer, including mine.&lt;/p&gt;

&lt;h2&gt;
  
  
  The failure mode: context is not memory
&lt;/h2&gt;

&lt;p&gt;A coding agent has three kinds of state:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The current task&lt;/strong&gt;, what you asked for, right now.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The working context&lt;/strong&gt;, files, tool outputs, and conversation that fit in the window.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Durable project knowledge&lt;/strong&gt;, decisions, constraints, invariants, and history that must survive the session.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Most agent setups treat all three as one thing: a growing transcript. That works until the transcript is compacted, truncated, or replaced by a new session. Then the third category disappears.&lt;/p&gt;

&lt;p&gt;The usual workarounds have predictable costs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Paste everything into the prompt.&lt;/strong&gt; Expensive, noisy, and still incomplete. A schema dump is not a decision record.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write a giant &lt;code&gt;CLAUDE.md&lt;/code&gt; / &lt;code&gt;AGENTS.md&lt;/code&gt;.&lt;/strong&gt; Good for stable rules, bad for facts that change per repository, per branch, or per customer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use a vector database of chat logs.&lt;/strong&gt; Retrieval finds similar text, not the decision that is still valid, who made it, or which repository it applies to.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rely on the vendor's memory feature.&lt;/strong&gt; Great when it works, but it is usually opaque, account-scoped, and not inspectable by the team that owns the code.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result is the same: the agent has information, but not &lt;em&gt;context with provenance&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four properties of useful agent memory
&lt;/h2&gt;

&lt;p&gt;Before choosing a database or a retrieval algorithm, define what the memory has to do.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Durable
&lt;/h3&gt;

&lt;p&gt;A decision should survive a new session, a new branch, and a new machine. It should not depend on the current context window, a single chat thread, or a vendor's retention policy.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Scoped
&lt;/h3&gt;

&lt;p&gt;"Use PostgreSQL" is not a universal fact. It might be true for one service, false for another, and irrelevant to a third. Memory needs workspace, repository, and session boundaries. Without scope, retrieval becomes a source of confident wrong answers.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Provenanced
&lt;/h3&gt;

&lt;p&gt;Every recalled fact should be traceable to its source: the file, the commit, the conversation, or the decision record. If the agent can't show why it believes something, you can't debug it, and you shouldn't trust it with a destructive change.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Bounded
&lt;/h3&gt;

&lt;p&gt;Retrieval should return the smallest useful context, not the most. A hard token budget forces the system to rank, compress, and omit. That is a feature. Dumping 50 KB of search results into a 200 K context window is how agents get slower, more expensive, and less accurate at the same time.&lt;/p&gt;

&lt;p&gt;There is a fifth property that matters in practice: &lt;strong&gt;inspectable&lt;/strong&gt;. You should be able to open a dashboard, search the memory, see its history, and correct it. A memory system you can't audit is a liability.&lt;/p&gt;

&lt;h2&gt;
  
  
  The architecture
&lt;/h2&gt;

&lt;p&gt;Engraphis is deliberately boring at the storage layer and careful at the retrieval layer.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────┐
│  Claude Code / Cursor / Codex / any MCP     │
│  client                                     │
└──────────────────────┬──────────────────────┘
                       │ MCP
┌──────────────────────▼──────────────────────┐
│  Memory service                             │
│  - remember / recall / session               │
│  - conflict review / history                │
│  - hard context budget                      │
└──────────────────────┬──────────────────────┘
                       │
┌──────────────────────▼──────────────────────┐
│  Local SQLite                               │
│  - scoped records                           │
│  - temporal validity                        │
│  - provenance                               │
│  - vector + lexical indexes                 │
└─────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Local SQLite, not a hosted vector store
&lt;/h3&gt;

&lt;p&gt;The core stores memory in SQLite. That gives you a single file you can back up, inspect, and move. It works offline. There is no account requirement for the local core, and no data has to leave the machine.&lt;/p&gt;

&lt;p&gt;The vector index is local too. The installed service uses a small local embedding model (about 80 MB on first download) with a deterministic offline fallback. The point is not to win a benchmark; the point is to keep the default path private and reliable.&lt;/p&gt;

&lt;h3&gt;
  
  
  Hybrid retrieval
&lt;/h3&gt;

&lt;p&gt;A single retrieval mode is easy to demo and easy to break.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Vector search&lt;/strong&gt; finds semantically related memories even when the wording changes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lexical search&lt;/strong&gt; catches exact identifiers, error strings, and API names that embeddings blur.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Graph traversal&lt;/strong&gt; follows relationships between memories, files, and entities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code-aware search&lt;/strong&gt; understands that a symbol in a repository is different from the same word in a paragraph.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Engraphis combines these signals, then ranks and packs the result. The important design choice is that retrieval quality is measured separately from context size. A system that returns less context but loses the answer is not efficient; it is just wrong with fewer tokens.&lt;/p&gt;

&lt;h3&gt;
  
  
  Temporal history instead of silent overwrite
&lt;/h3&gt;

&lt;p&gt;Facts change. A memory system that replaces the old value destroys the audit trail and makes it impossible to answer "what did we believe last month?"&lt;/p&gt;

&lt;p&gt;Engraphis keeps history. A superseded decision can be closed rather than deleted, and the timeline can show what was valid at a given point. That matters for incident review, onboarding, and any agent that is about to change production code.&lt;/p&gt;

&lt;h3&gt;
  
  
  A hard context budget
&lt;/h3&gt;

&lt;p&gt;Recall returns a bounded context package. The service ranks candidates, compresses them, and stops at a budget you set. The output includes the memory, its scope, and its provenance so the agent can cite it or abstain.&lt;/p&gt;

&lt;p&gt;This is the difference between "search" and "memory." Search returns matches. Memory returns a defensible answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  The MCP surface
&lt;/h2&gt;

&lt;p&gt;The Smart profile exposes nine tools. The ones I use most:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;engraphis_remember&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Store a durable fact with scope and provenance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;engraphis_recall_context&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Retrieve compact project context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;engraphis_session&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Start or end a memory session&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;engraphis_get_memory&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Read one governed record&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;engraphis_update_memory&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Edit metadata without losing history&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;engraphis_conflict_review&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Review pending, quarantined, or conflicting memories&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;There is also a Classic profile with 35 direct tools for clients that prefer explicit operations.&lt;/p&gt;

&lt;p&gt;A minimal Claude Code setup looks 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;python &lt;span class="nt"&gt;-m&lt;/span&gt; pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="s2"&gt;"engraphis[mcp]"&lt;/span&gt;
engraphis-init
claude mcp add engraphis &lt;span class="nt"&gt;--&lt;/span&gt; engraphis-mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For the local dashboard:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="s2"&gt;"engraphis[server]"&lt;/span&gt;
engraphis-dashboard
&lt;span class="c"&gt;# http://127.0.0.1:8700&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And the Python service, if you want to embed it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;engraphis.service&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;MemoryService&lt;/span&gt;

&lt;span class="n"&gt;memory&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MemoryService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;engraphis.db&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;remember&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Auth migrated from JWT to PASETO. Reason: issuer-bound tokens and key rotation.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;workspace&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;acme&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;repo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;api&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;hit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;recall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Why did we change auth?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;workspace&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;acme&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;repo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;api&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hit&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;context&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  A worked example
&lt;/h2&gt;

&lt;p&gt;Imagine the agent is about to add a new endpoint to the auth service.&lt;/p&gt;

&lt;p&gt;Without memory, it sees the current code and infers the pattern. It might use JWT because JWT is common. It might miss that the team migrated away from JWT six months ago, or that one service is intentionally still on JWT during a migration window.&lt;/p&gt;

&lt;p&gt;With scoped memory, recall returns something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Decision: Auth migrated from JWT to PASETO for the public API.
Scope: workspace=acme, repo=api
Status: current
Reason: issuer-bound tokens and key rotation requirements.
Supersedes: JWT decision (2025-11-03)
Evidence: docs/adr/014-paseto.md, commit 8f2c1a
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the agent has a decision, a scope, a reason, a history, and evidence. It can follow the current pattern or ask a targeted question. It does not have to guess from a partial view of the repository.&lt;/p&gt;

&lt;p&gt;That is the whole product thesis: &lt;strong&gt;the agent should be able to show its work before it changes yours.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What the benchmarks actually show
&lt;/h2&gt;

&lt;p&gt;I am deliberately cautious here. The repository contains three deterministic offline fixtures. They are useful for regression testing the retrieval pipeline, not for claiming general task performance.&lt;/p&gt;

&lt;p&gt;On those fixtures:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mean retrieved context dropped from &lt;strong&gt;740.3 to 214.3 tokens per question&lt;/strong&gt;, a &lt;strong&gt;71.1%&lt;/strong&gt; reduction across 18 questions.&lt;/li&gt;
&lt;li&gt;The serialized JSON-shape proxy dropped from &lt;strong&gt;24,590 to 11,138 tokens&lt;/strong&gt; across 26 payload samples and 260 recalls.&lt;/li&gt;
&lt;li&gt;Candidate and packed retrieval quality (Recall@5, Hit@5, and answer-token recall) were &lt;strong&gt;1.000&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Grounded checks: &lt;strong&gt;5/5&lt;/strong&gt; answerable queries grounded, &lt;strong&gt;6/6&lt;/strong&gt; abstention queries rejected, including a quarantined-evidence probe; &lt;strong&gt;11/11&lt;/strong&gt; decisions correct.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are small fixtures. They do not establish performance on your repository, your language, or your question distribution. MCP transport and provider billing were not measured. The full method, checksum, and reproduction steps are in the repository.&lt;/p&gt;

&lt;p&gt;The right way to evaluate a memory layer is to build a small, labeled set of questions from your own codebase:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pick 20 decisions or invariants that a new engineer would need.&lt;/li&gt;
&lt;li&gt;Write the question a real agent would ask.&lt;/li&gt;
&lt;li&gt;Record the expected answer and the source.&lt;/li&gt;
&lt;li&gt;Measure recall, context size, and whether the agent can cite the source.&lt;/li&gt;
&lt;li&gt;Include unanswerable questions. Abstention is a feature.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If a system can't abstain, it will hallucinate with confidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it, or have it set up for you
&lt;/h2&gt;

&lt;p&gt;The local core is free and Apache-2.0:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="s2"&gt;"engraphis[mcp]"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Repository: &lt;a href="https://github.com/Coding-Dev-Tools/engraphis" rel="noopener noreferrer"&gt;github.com/Coding-Dev-Tools/engraphis&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The optional Pro plan is &lt;strong&gt;$10/month or $100/year&lt;/strong&gt;, with a &lt;strong&gt;7-day trial and no card required&lt;/strong&gt;. It adds hosted memory health views, scheduled upkeep, and optional sync. The local core stays free.&lt;/p&gt;

&lt;p&gt;If you want the done-for-you version, I do a &lt;strong&gt;24-hour Agent &amp;amp; MCP Rapid Setup for $250&lt;/strong&gt;. That includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;clean setup of Claude Code, Cursor, or Codex;&lt;/li&gt;
&lt;li&gt;integration of up to three MCP servers;&lt;/li&gt;
&lt;li&gt;environment, credential, and security configuration;&lt;/li&gt;
&lt;li&gt;a one-page runbook;&lt;/li&gt;
&lt;li&gt;seven days of async text support.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No calls, no video, no screen-sharing. Text only, fixed scope.&lt;/p&gt;

&lt;p&gt;Start here: &lt;a href="https://engraphis.com" rel="noopener noreferrer"&gt;engraphis.com&lt;/a&gt; or DM me with the two or three actions you want your agent to perform.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Disclosure: I built Engraphis. I used AI assistance to draft and edit this article; the architecture, code references, and benchmark numbers come from the Engraphis repository. The benchmark caveats are intentional, small fixtures are not a general performance claim.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Engraphis is live on Product Hunt now. The page is here: &lt;a href="https://www.producthunt.com/products/engraphis" rel="noopener noreferrer"&gt;Engraphis on Product Hunt&lt;/a&gt;. I will answer questions there and in the comments.&lt;/p&gt;

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