<?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: Tang Weigang</title>
    <description>The latest articles on DEV Community by Tang Weigang (@doramagic).</description>
    <link>https://dev.to/doramagic</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%2F3936036%2F9206ba55-8d8f-457e-a399-6e3316ef715f.png</url>
      <title>DEV Community: Tang Weigang</title>
      <link>https://dev.to/doramagic</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/doramagic"/>
    <language>en</language>
    <item>
      <title>AgentLock's First Test Should Be Provenance, Not Prompt Filtering</title>
      <dc:creator>Tang Weigang</dc:creator>
      <pubDate>Wed, 22 Jul 2026 02:06:38 +0000</pubDate>
      <link>https://dev.to/doramagic/agentlocks-first-test-should-be-provenance-not-prompt-filtering-9a6</link>
      <guid>https://dev.to/doramagic/agentlocks-first-test-should-be-provenance-not-prompt-filtering-9a6</guid>
      <description>&lt;p&gt;Disclosure: This article was prepared with AI assistance and checked against the linked Doramagic project page, manual, and upstream README. It is an independent engineering interpretation, not official AgentLock documentation.&lt;/p&gt;

&lt;p&gt;The tempting AgentLock demo is easy to write: put an injection in a web page, ask the agent to send an email, and check whether the call is blocked. That demo misses the more important variable. The same tool call can be safe or unsafe depending on where its parameters and session context came from.&lt;/p&gt;

&lt;p&gt;The current upstream README models that variable explicitly. Context items are classified as authoritative, derived, or untrusted. The gate then combines three controls:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a session write-gate that blocks consequential writes after untrusted context enters;&lt;/li&gt;
&lt;li&gt;parameter lineage that checks whether tool arguments trace to untrusted material;&lt;/li&gt;
&lt;li&gt;deferred commit that re-decides consequential actions against the complete session provenance.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is a better first test than comparing two prompt strings.&lt;/p&gt;

&lt;p&gt;Install the package in a disposable environment and record the version before reading any benchmark result:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;python -m pip install agentlock
python -m pip show agentlock
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Then register a fake high-risk tool, such as send_email, and authorize the same call twice. In the first session, write only a user instruction and record the decision. In the second, add a web page or email as session context before authorizing the identical parameters. Keep the tool call text constant. The expected difference, if the policy covers the path, should be explained by provenance rather than wording.&lt;/p&gt;

&lt;p&gt;The surrounding Doramagic manual gives a useful decision vocabulary for this test: ALLOW, DENY, and DEFER. DEFER is not a flaky failure. It is the outcome that says the current policy cannot safely decide without a reviewer or a higher tier. Treating it as an implicit allow is an integration bug.&lt;/p&gt;

&lt;p&gt;There is a version trap here. The Doramagic manual documents an AgentLock v1.2.1 reference snapshot with 847 tests and a 99.5/A benchmark grade. The current upstream README lists v1.5.0, whose highlights include grant basis, execution confirmation, provenance on denials, and deferred-resolution logging, with 1141 tests. Those are different evidence snapshots. Record the installed package version and read the matching upstream release notes before making a security claim.&lt;/p&gt;

&lt;p&gt;The README is also unusually direct about limits. A write-gate cannot stop persuasion achieved in model text without a tool call. It does not cover every harmful read. And selective action-class gating is only as sound as the trusted tool registrations behind it. A tool left undeclared can become an unreviewed gap; a tool classified too conservatively can make benign workflows unusable.&lt;/p&gt;

&lt;p&gt;My acceptance record has six fields: package version, policy hash, session provenance, tool/action class, decision and reason, and receipt or replay result. “The injection was blocked” is a useful observation, but it is not a deployment proof. The useful question is whether the decision can be reproduced after the policy, context, and tool registration are inspected.&lt;/p&gt;

&lt;p&gt;Sources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Doramagic project page: &lt;a href="https://doramagic.ai/en/projects/agentlock/" rel="noopener noreferrer"&gt;https://doramagic.ai/en/projects/agentlock/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Doramagic manual: &lt;a href="https://doramagic.ai/en/projects/agentlock/manual/" rel="noopener noreferrer"&gt;https://doramagic.ai/en/projects/agentlock/manual/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Upstream repository: &lt;a href="https://github.com/webpro255/agentlock" rel="noopener noreferrer"&gt;https://github.com/webpro255/agentlock&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>provenance</category>
    </item>
    <item>
      <title>The First Letta Run Should Test Memory Isolation, Not Just Recall</title>
      <dc:creator>Tang Weigang</dc:creator>
      <pubDate>Tue, 21 Jul 2026 00:34:28 +0000</pubDate>
      <link>https://dev.to/doramagic/the-first-letta-run-should-test-memory-isolation-not-just-recall-2pef</link>
      <guid>https://dev.to/doramagic/the-first-letta-run-should-test-memory-isolation-not-just-recall-2pef</guid>
      <description>&lt;p&gt;Disclosure: This article was prepared with AI assistance and checked against the linked Doramagic project page, manual, and upstream README. It is an independent engineering interpretation, not official Letta documentation.&lt;/p&gt;

&lt;p&gt;An agent remembering a detail is a demo. The first useful Letta test asks where that detail was stored, which session can read it, what tools share the boundary, and how the state can be removed.&lt;/p&gt;

&lt;p&gt;There is a version trap before the first command. The upstream README says this repository contains the legacy Letta server and that active development moved to &lt;code&gt;letta-ai/letta-code&lt;/code&gt;. The current CLI path is Node.js 22.19+ plus:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdir -p /tmp/letta-trial
cd /tmp/letta-trial
node --version
npm install -g @letta-ai/letta-code
letta --help
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;That is not the same installation as the Python repository snapshot, whose &lt;code&gt;pyproject.toml&lt;/code&gt; reports &lt;code&gt;letta&lt;/code&gt; 0.16.8 and Python &lt;code&gt;&amp;gt;=3.11,&amp;lt;3.14&lt;/code&gt;. The Agent SDK is a third surface and can target cloud, local, or self-hosted backends. I record the exact surface and backend before interpreting any result.&lt;/p&gt;

&lt;p&gt;My first run uses synthetic or disposable data and one test identity. I capture the provider/model, agent and session identifiers, memory write/read behavior, tool permissions, sandbox mode, and what remains after cleanup. A coherent answer is not evidence that memory is isolated. A successful tool call is not evidence that the same policy applies across the CLI, SDK, and server.&lt;/p&gt;

&lt;p&gt;The Doramagic manual separates provider compatibility, hierarchical memory/data, agents/tools/sandbox, and server/REST API. That is a useful debugging order. Provider failures belong to one gate; cross-session state leakage belongs to another; MCP refresh or tool configuration belongs to another. Repeating prompts until the transcript looks right only hides which gate failed.&lt;/p&gt;

&lt;p&gt;The project page keeps community evidence visible: reports involving encrypted Bedrock or VLLM credentials, cross-session memory poisoning, MCP schema/refresh behavior, context compaction, and provider error handling. These are review inputs, not a blanket security verdict. They are enough to justify a disposable first run before real data or a primary configuration directory enters the system.&lt;/p&gt;

&lt;p&gt;My acceptance packet contains the install command, runtime/version, exact product surface, provider/model, test data location, raw output, memory boundary, failure log, and rollback action. “It remembers me” is the start of the test, not the end.&lt;/p&gt;

&lt;p&gt;Manual: &lt;a href="https://doramagic.ai/en/projects/letta/manual/" rel="noopener noreferrer"&gt;https://doramagic.ai/en/projects/letta/manual/&lt;/a&gt;&lt;br&gt;&lt;br&gt;
Upstream: &lt;a href="https://github.com/letta-ai/letta" rel="noopener noreferrer"&gt;https://github.com/letta-ai/letta&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>opensource</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Browser-use's Real Risk Surface Is the Browser Session</title>
      <dc:creator>Tang Weigang</dc:creator>
      <pubDate>Mon, 20 Jul 2026 02:20:25 +0000</pubDate>
      <link>https://dev.to/doramagic/browser-uses-real-risk-surface-is-the-browser-session-5181</link>
      <guid>https://dev.to/doramagic/browser-uses-real-risk-surface-is-the-browser-session-5181</guid>
      <description>&lt;p&gt;The first browser-use test should not be “can the agent click the button?” It should be “what exactly did the agent get permission to see, change, and reuse?”&lt;/p&gt;

&lt;p&gt;The project has three different surfaces: the Python library (&lt;code&gt;Agent&lt;/code&gt;, &lt;code&gt;Browser&lt;/code&gt;, &lt;code&gt;ChatBrowserUse&lt;/code&gt;), Browser Use CLI 2.0 for coding agents, and the lower-level Actor API (&lt;code&gt;BrowserSession&lt;/code&gt;, &lt;code&gt;Page&lt;/code&gt;, &lt;code&gt;Element&lt;/code&gt;, &lt;code&gt;Mouse&lt;/code&gt;). CLI 2.0 uses a persistent daemon and direct Chrome DevTools Protocol communication. That can reduce orchestration overhead, but it also makes the daemon socket, session history, browser profile, and local process permissions part of the security review.&lt;/p&gt;

&lt;p&gt;My first run is deliberately boring:&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; venv .venv
&lt;span class="nb"&gt;source&lt;/span&gt; .venv/bin/activate
pip &lt;span class="nb"&gt;install &lt;/span&gt;browser-use
python &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"from browser_use import Agent, Browser, ChatBrowserUse; print('imports ok')"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then I use a disposable profile and a test account for one read-only navigation. I keep the final URL, page title, model output, and any file or JavaScript action as evidence. A page opening is not proof of task correctness.&lt;/p&gt;

&lt;p&gt;The version boundary matters. The manual records that v0.12.5 stopped installing &lt;code&gt;litellm&lt;/code&gt; as a core dependency after a supply-chain incident. v0.12.8 added owner-only Unix socket permissions and refused &lt;code&gt;evaluate()&lt;/code&gt; on restricted browser profiles. A copied tutorial that says “install everything and reuse Chrome” is hiding two decisions you still need to make.&lt;/p&gt;

&lt;p&gt;The useful failure split is also concrete: blank Chromium can be a missing key or wrong model; stale imports are a documentation/version problem; Ollama empty structured output is a model compatibility problem; canvas hover may require a different action surface. Treating all of those as “browser automation is flaky” loses the diagnosis.&lt;/p&gt;

&lt;p&gt;Manual: &lt;a href="https://doramagic.ai/en/projects/browser-use/manual/" rel="noopener noreferrer"&gt;https://doramagic.ai/en/projects/browser-use/manual/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>security</category>
    </item>
    <item>
      <title>Your MCP Config Can Be Risky Before Any Tool Runs</title>
      <dc:creator>Tang Weigang</dc:creator>
      <pubDate>Sat, 18 Jul 2026 23:56:06 +0000</pubDate>
      <link>https://dev.to/doramagic/your-mcp-config-can-be-risky-before-any-tool-runs-2bke</link>
      <guid>https://dev.to/doramagic/your-mcp-config-can-be-risky-before-any-tool-runs-2bke</guid>
      <description>&lt;h1&gt;
  
  
  Your MCP Config Can Be Risky Before Any Tool Runs
&lt;/h1&gt;

&lt;p&gt;An MCP server does not need to execute a tool to create an operational problem. A local config can already expose a listener, carry a plaintext token, grant &lt;code&gt;*&lt;/code&gt;-shaped tool scope, or pull an unpinned package.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ai-agentic-mcpscan&lt;/code&gt; turns that pre-runtime surface into a report. Its &lt;code&gt;mcpscan&lt;/code&gt; CLI discovers local MCP servers, audits several agent-host config formats, scores exposure, credential hygiene, tool-scope breadth, and version pinning, and can emit JSON, HTML, or SARIF 2.1.0.&lt;/p&gt;

&lt;p&gt;The useful first command is deliberately boring:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mcpscan inventory
mcpscan scan &lt;span class="nt"&gt;--root&lt;/span&gt; ~/project &lt;span class="nt"&gt;--json&lt;/span&gt; report.json &lt;span class="nt"&gt;--sarif&lt;/span&gt; results.sarif
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inventory tells you what the host appears to contain. Scan tells you which config facts deserve attention. Start in a disposable checkout and read the report before changing the host. The default static path is offline and read-only; &lt;code&gt;--online&lt;/code&gt; is an explicit OSV/PyPI enrichment decision, not a harmless flag.&lt;/p&gt;

&lt;p&gt;The mutation boundary is also explicit. &lt;code&gt;mcpscan --fix&lt;/code&gt; is limited to selected over-broad tool-scope grants and backs up each file. It does not invent a secret manager or choose a safe package version for you. That is the right asymmetry: scope can be narrowed mechanically, while credential rotation and pin selection require context.&lt;/p&gt;

&lt;p&gt;My acceptance rule is three artifacts, not one green command: the exact commit and Python version, the redacted report, and a before/after comparison showing the backup and the scope change. A clean static report still says nothing about runtime behavior, prompt injection, or whether the upstream project fits production.&lt;/p&gt;

&lt;p&gt;This is an independent Doramagic reading of &lt;code&gt;IRsoctierDT/ai-agentic-mcpscan&lt;/code&gt;, not a security certification. Source and manual: &lt;a href="https://doramagic.ai/en/projects/ai-agentic-mcpscan/manual/" rel="noopener noreferrer"&gt;https://doramagic.ai/en/projects/ai-agentic-mcpscan/manual/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tags: ai, security, mcp, devtools, python, opensource, codequality, devops&lt;/p&gt;

</description>
    </item>
    <item>
      <title>An MCP Server Is Not Safe Just Because It Started</title>
      <dc:creator>Tang Weigang</dc:creator>
      <pubDate>Sat, 18 Jul 2026 00:03:42 +0000</pubDate>
      <link>https://dev.to/doramagic/an-mcp-server-is-not-safe-just-because-it-started-25i2</link>
      <guid>https://dev.to/doramagic/an-mcp-server-is-not-safe-just-because-it-started-25i2</guid>
      <description>&lt;p&gt;The first useful question after adding an MCP server is not “did the process start?” It is “what did the host actually expose, and what can I roll back?”&lt;/p&gt;

&lt;p&gt;modelcontextprotocol/servers is a reference-server monorepo covering filesystem, memory, git, fetch, everything, sequential thinking, and time. That makes it a map of MCP surfaces, not a production safety certificate. Doramagic lists npx -y @modelcontextprotocol/server-memory as a first entry point, but an install command is not runtime or permission evidence.&lt;/p&gt;

&lt;p&gt;My first-use check is deliberately boring: create a temporary host configuration, use no real credentials, verify the host transport and Node/Python runtime, then read back the tools, resources, and prompts the host actually discovers. Test one allowed action, one out-of-scope action, and a rollback to the previous configuration. Record the package/version, host, allowed paths, observed capabilities, and failure output.&lt;/p&gt;

&lt;p&gt;The boundary matters most for filesystem and repository-facing servers. “It can read a file” is not acceptance unless the allowed root, denied path behavior, and recovery path are recorded. Doramagic has recorded source, Quick Start, and sandbox-install checks for this pack; community evidence still needs a refresh, so this post does not claim every server/host/version combination works.&lt;/p&gt;

&lt;p&gt;Project page: &lt;a href="https://doramagic.ai/zh/projects/servers/" rel="noopener noreferrer"&gt;https://doramagic.ai/zh/projects/servers/&lt;/a&gt;&lt;br&gt;
Manual: &lt;a href="https://doramagic.ai/zh/projects/servers/manual/" rel="noopener noreferrer"&gt;https://doramagic.ai/zh/projects/servers/manual/&lt;/a&gt;&lt;br&gt;
Upstream: &lt;a href="https://github.com/modelcontextprotocol/servers" rel="noopener noreferrer"&gt;https://github.com/modelcontextprotocol/servers&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Disclosure: this is an independent Doramagic resource package, not an upstream release, endorsement, or security certification.&lt;/p&gt;

</description>
      <category>devtools</category>
      <category>ai</category>
      <category>agents</category>
      <category>mcp</category>
    </item>
    <item>
      <title>Your AI Coding Policy Needs a Receipt, Not Just an AGENTS.md</title>
      <dc:creator>Tang Weigang</dc:creator>
      <pubDate>Thu, 16 Jul 2026 23:43:28 +0000</pubDate>
      <link>https://dev.to/doramagic/your-ai-coding-policy-needs-a-receipt-not-just-an-agentsmd-4h95</link>
      <guid>https://dev.to/doramagic/your-ai-coding-policy-needs-a-receipt-not-just-an-agentsmd-4h95</guid>
      <description>&lt;p&gt;An AGENTS.md file can explain a rule. It cannot prove that an agent saw the rule, that a proposed action was evaluated, or that a rejected change left a usable recovery trail. That is the useful question behind coding-ethos.&lt;/p&gt;

&lt;p&gt;coding-ethos splits the problem into policy, agents, hooks, and code intelligence. &lt;code&gt;coding_ethos.yml&lt;/code&gt; describes the mechanics; ETHOS.md and the coding-ethos standards carry the values; AGENTS.md and CLAUDE.md describe agent contracts. The hooks runner receives lifecycle events, routes them to the relevant evaluator or MCP tool, and normalizes the result.&lt;/p&gt;

&lt;p&gt;The v0.3.0 line is interesting for three concrete reasons: policy extension seams let downstream rules plug in without rewriting the compiler; routing is centralized instead of duplicated in every hook; and remediation evidence is persisted in the code-intel store. A denied action should be testable as a structured verdict plus a remediation payload, not just a red log line.&lt;/p&gt;

&lt;p&gt;My first-use check is deliberately small: run &lt;code&gt;uvx coding-ethos&lt;/code&gt; against a disposable repository, exercise one allowed action and one denied action, read the rule id and evidence payload, retry after remediation, then remove the temporary configuration and verify rollback. A visible MCP tool list is not proof of enforcement, and a legacy path that bypasses &lt;code&gt;hooks/runner&lt;/code&gt; can silently drop evidence.&lt;/p&gt;

&lt;p&gt;The Doramagic pack also records community reports about Bubblewrap provisioning, git amend policy, MCP stdio coverage, and agent-proxy work. Those are source-backed checks to revisit, not claims that Doramagic reproduced every issue. Project notes: &lt;a href="https://doramagic.ai/en/projects/coding-ethos/manual/" rel="noopener noreferrer"&gt;https://doramagic.ai/en/projects/coding-ethos/manual/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Disclosure: this is an independent Doramagic capability pack, not an official coding-ethos release or endorsement.&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>programming</category>
      <category>agents</category>
    </item>
    <item>
      <title>agent-workspace-linux Is Not Computer Use: Verify the Workspace Boundary First</title>
      <dc:creator>Tang Weigang</dc:creator>
      <pubDate>Thu, 16 Jul 2026 01:33:36 +0000</pubDate>
      <link>https://dev.to/doramagic/agent-workspace-linux-is-not-computer-use-verify-the-workspace-boundary-first-4mbp</link>
      <guid>https://dev.to/doramagic/agent-workspace-linux-is-not-computer-use-verify-the-workspace-boundary-first-4mbp</guid>
      <description>&lt;p&gt;Most computer-use failures start before the model acts: the agent is operating inside the user's real browser, clipboard, focus, or files. &lt;code&gt;agent-workspace-linux&lt;/code&gt; takes the opposite route. It creates an agent-owned Linux desktop backed by Xvfb and openbox, with a separate browser and clipboard.&lt;/p&gt;

&lt;p&gt;The first run should be boring and observable. Install the Linux dependencies from the upstream README, then run &lt;code&gt;agent-workspace-linux doctor&lt;/code&gt;. Use &lt;code&gt;workspace start --dry-run&lt;/code&gt; before &lt;code&gt;workspace start --ack-hidden-workspace --purpose "QA run"&lt;/code&gt;. Open the viewer, launch one test app, save &lt;code&gt;workspace observe --screenshot --output /tmp/ws.png&lt;/code&gt;, and finish with &lt;code&gt;workspace stop&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Do not call the viewer a security boundary. &lt;code&gt;--permissions&lt;/code&gt; or &lt;code&gt;AGENT_WORKSPACE_PERMISSIONS&lt;/code&gt; is the hard ceiling for networks, mounts, and apps; without bubblewrap, those policies may only be declared. The project is pre-1.0, and issues #21 and #22 cover live-control and clipboard risks. I would use it first for GUI QA or disposable browser profiles, not production credentials.&lt;/p&gt;

&lt;p&gt;Project: &lt;a href="https://doramagic.ai/en/projects/agent-workspace-linux/" rel="noopener noreferrer"&gt;https://doramagic.ai/en/projects/agent-workspace-linux/&lt;/a&gt;&lt;br&gt;
Manual: &lt;a href="https://doramagic.ai/en/projects/agent-workspace-linux/manual/" rel="noopener noreferrer"&gt;https://doramagic.ai/en/projects/agent-workspace-linux/manual/&lt;/a&gt;&lt;br&gt;
Upstream: &lt;a href="https://github.com/agent-sh/agent-workspace-linux" rel="noopener noreferrer"&gt;https://github.com/agent-sh/agent-workspace-linux&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Independent Doramagic resource pack; not an official upstream release or endorsement.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>linux</category>
      <category>mcp</category>
      <category>security</category>
    </item>
    <item>
      <title>Sverklo Is Not Just Grep with Embeddings: Verify the Code-Memory Evidence Chain</title>
      <dc:creator>Tang Weigang</dc:creator>
      <pubDate>Wed, 15 Jul 2026 01:57:05 +0000</pubDate>
      <link>https://dev.to/doramagic/sverklo-is-not-just-grep-with-embeddings-verify-the-code-memory-evidence-chain-3j69</link>
      <guid>https://dev.to/doramagic/sverklo-is-not-just-grep-with-embeddings-verify-the-code-memory-evidence-chain-3j69</guid>
      <description>&lt;p&gt;Many coding agents do not fail because a model forgot a sentence from the previous chat. They fail because the agent has no context layer that can explain where a code fact came from, how wide it applies, and whether it is still fresh. Sverklo is interesting as an engineering hypothesis: a local-first MCP server that combines repository indexing, symbol graphs, dependency tracing, diff-aware review, and persistent memory. The useful question is not whether it sounds like an intelligent search box. It is whether an agent can receive repository context that a human can replay and verify.&lt;/p&gt;

&lt;p&gt;The upstream entry point is &lt;code&gt;npm install -g sverklo&lt;/code&gt;, with Node.js &amp;gt;= 24 as the stated runtime. A successful install only proves that the CLI can be found. It does not prove that the index is complete, that the current repository is being served, or that the MCP client is calling the intended tool. I would start in a disposable test repository instead of binding the first run to a production workspace or the global registry.&lt;/p&gt;

&lt;p&gt;I would make the first acceptance run observable at four layers. First, file discovery: does the index include the expected paths, honor ignore rules, and produce a plausible file count after reindexing? Second, code structure: can &lt;code&gt;lookup&lt;/code&gt; find a known symbol, and do &lt;code&gt;refs&lt;/code&gt;, &lt;code&gt;deps&lt;/code&gt;, and &lt;code&gt;impact&lt;/code&gt; return relationships rather than a list of filenames? Third, context delivery: does the &lt;code&gt;context&lt;/code&gt; tool provide a useful onboarding bundle, and does a supplied token &lt;code&gt;budget&lt;/code&gt; produce a smaller PageRank-pruned repository map? Fourth, the memory ledger: can a memory with a project scope, kind, related file, and time metadata be recalled, and does changing that file make the memory visibly stale?&lt;/p&gt;

&lt;p&gt;Sverklo is not described as a single vector retriever. The Doramagic manual maps its retrieval surface to BM25 keywords, ONNX embeddings, and a PageRank symbol graph fused across signals. Search hits expose &lt;code&gt;found_by&lt;/code&gt;, which gives the operator a way to tell whether multiple retrievers agree. There is an important boundary here: exact strings still belong to Grep/Read. Sverklo is better suited to exploration, dependency graphs, refactor blast radius, and semantic questions. Sending every query through embeddings would make the workflow less predictable and contradict the server's own MCP guidance.&lt;/p&gt;

&lt;p&gt;An acceptance script can stay small and repeatable:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a temporary repository with a few modules, a test, a README, and one intentionally broken dependency.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;sverklo init&lt;/code&gt;, register the project, and wait for indexing. Record the Node version, project name, index timestamp, and file count.&lt;/li&gt;
&lt;li&gt;Call &lt;code&gt;context&lt;/code&gt; for onboarding and pass a small &lt;code&gt;budget&lt;/code&gt;; check whether the returned map actually contracts with the budget.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;lookup&lt;/code&gt; on a known symbol, then use &lt;code&gt;refs&lt;/code&gt;, &lt;code&gt;deps&lt;/code&gt;, and &lt;code&gt;impact&lt;/code&gt; to trace callers, dependencies, and change scope.&lt;/li&gt;
&lt;li&gt;Write one file-pinned decision with &lt;code&gt;remember&lt;/code&gt;, edit that file, and inspect &lt;code&gt;sverklo://context&lt;/code&gt; or recall for an explicit stale signal.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;review_diff&lt;/code&gt; on a small change and confirm that the result contains both readable Markdown and structured findings with path, line, and severity anchors.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The lifecycle is where a seemingly healthy setup can mislead an automation. Sverklo stores registered projects in &lt;code&gt;~/.sverklo/registry.json&lt;/code&gt;. The manual records issue #74: &lt;code&gt;reindex&lt;/code&gt; can finish while leaving &lt;code&gt;lastIndexed&lt;/code&gt; stale, so the timestamp in &lt;code&gt;sverklo list&lt;/code&gt; is advisory rather than proof that the current index is fresh. After reindexing, automation should register again or read the index status and file evidence directly. Issue #73 reports that unregister takes the internal project name, not an absolute path. A worktree cleanup script should therefore resolve the name from &lt;code&gt;sverklo list&lt;/code&gt; before unregistering.&lt;/p&gt;

&lt;p&gt;MCP naming has another quiet production boundary. Sverklo already exposes internal &lt;code&gt;sverklo_&lt;/code&gt; tool prefixes. If a host also prefixes tool names using the server key, a name such as &lt;code&gt;sverklo_sverklo_impact&lt;/code&gt; can appear. A connected badge is not enough. After integration, enumerate the tools and make one real call to &lt;code&gt;context&lt;/code&gt;, &lt;code&gt;lookup&lt;/code&gt;, or &lt;code&gt;status&lt;/code&gt; so the host's names and response shape are verified.&lt;/p&gt;

&lt;p&gt;My operator rule is to treat Sverklo as an observable local code-context candidate, not as an agent brain that becomes trustworthy after installation. Before putting it in a real workspace, retain four kinds of readback: index scope and freshness, symbol/dependency results, stale-memory behavior, and structured diff-review output. Without those artifacts, the only defensible claim is that the CLI started.&lt;/p&gt;

&lt;p&gt;This is an independent Doramagic capability pack, not an official Sverklo release or endorsement. Project page: &lt;a href="https://doramagic.ai/en/projects/sverklo/" rel="noopener noreferrer"&gt;https://doramagic.ai/en/projects/sverklo/&lt;/a&gt;; Human Manual: &lt;a href="https://doramagic.ai/en/projects/sverklo/manual/" rel="noopener noreferrer"&gt;https://doramagic.ai/en/projects/sverklo/manual/&lt;/a&gt;; upstream: &lt;a href="https://github.com/sverklo/sverklo" rel="noopener noreferrer"&gt;https://github.com/sverklo/sverklo&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>mcp</category>
    </item>
    <item>
      <title>OpenViking Is Not Just a Memory Folder: Verify Hierarchical Context Delivery First</title>
      <dc:creator>Tang Weigang</dc:creator>
      <pubDate>Tue, 14 Jul 2026 01:32:42 +0000</pubDate>
      <link>https://dev.to/doramagic/openviking-is-not-just-a-memory-folder-verify-hierarchical-context-delivery-first-487b</link>
      <guid>https://dev.to/doramagic/openviking-is-not-just-a-memory-folder-verify-hierarchical-context-delivery-first-487b</guid>
      <description>&lt;p&gt;OpenViking is interesting because it puts memory, resources, and skills behind one file-system-shaped context model for agents. That is a useful hypothesis, but an installation that completes does not prove the context database is ready to hold real agent memory.&lt;/p&gt;

&lt;p&gt;The documented entry point is &lt;code&gt;pip install openviking&lt;/code&gt;. I would still start in an isolated directory with three traceable fixtures: one short memory, one resource file, and one skill description. After ingestion, check whether the directory hierarchy and URI remain stable. Then compare a shallow retrieval with a deeper retrieval and inspect how much context is actually delivered at each level. The question is context delivery, not whether a demo returned one similar chunk.&lt;/p&gt;

&lt;p&gt;The project frames its design around a file-system paradigm, hierarchical context delivery, and self-evolving context. That creates three concrete engineering questions: can the hierarchy express relationships between resources, does retrieval move from summaries to deeper evidence, and what happens when a new memory conflicts with an old one? A single successful search is not evidence that long-term memory is safe.&lt;/p&gt;

&lt;p&gt;The upstream issue trail gives useful first-run boundaries. A reported &lt;code&gt;openviking-memory.ts&lt;/code&gt; autoRecall bug needs reproduction; a malformed memory can poison a semantic queue; and multi-user memory isolation needs an explicit test rather than an assumption. I would not start with real conversations or treat self-evolution as trusted automatic writes. Use synthetic records with an owner, source, and timestamp so isolation and rollback are observable.&lt;/p&gt;

&lt;p&gt;My first acceptance sequence would be: install &lt;code&gt;openviking&lt;/code&gt;; confirm Python and host compatibility; ingest one memory with source and owner fields; run one shallow and one deep retrieval; revoke or delete that record and query again; then inject one malformed record and check whether the failure is isolated instead of stopping the whole processing queue. Save the command output, returned URI, retrieved text, and error response at every step.&lt;/p&gt;

&lt;p&gt;The evidence boundary matters. The Doramagic capability pack supplies a quick start, manual, context pack, pitfall log, and eval route. It does not prove that OpenViking was installed or run on this machine. OpenViking also does not replace a permission model, tenant isolation, retention policy, or human correction loop.&lt;/p&gt;

&lt;p&gt;My operator rule is to treat OpenViking as an observable context-database candidate, not as an automatic replacement for an agent's memory layer. It earns a real workspace only after hierarchical retrieval, provenance, user isolation, revocation behavior, and malformed-data recovery are all recorded.&lt;/p&gt;

&lt;p&gt;This is an independent Doramagic capability pack, not an official OpenViking release or endorsement. Project page: &lt;a href="https://doramagic.ai/en/projects/openviking/" rel="noopener noreferrer"&gt;https://doramagic.ai/en/projects/openviking/&lt;/a&gt;; Human Manual: &lt;a href="https://doramagic.ai/en/projects/openviking/manual/" rel="noopener noreferrer"&gt;https://doramagic.ai/en/projects/openviking/manual/&lt;/a&gt;; upstream: &lt;a href="https://github.com/volcengine/OpenViking" rel="noopener noreferrer"&gt;https://github.com/volcengine/OpenViking&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>opensource</category>
    </item>
    <item>
      <title>Notion MCP: Verify Page Access Before You Trust the Tool List</title>
      <dc:creator>Tang Weigang</dc:creator>
      <pubDate>Mon, 13 Jul 2026 01:28:36 +0000</pubDate>
      <link>https://dev.to/doramagic/notion-mcp-verify-page-access-before-you-trust-the-tool-list-47ef</link>
      <guid>https://dev.to/doramagic/notion-mcp-verify-page-access-before-you-trust-the-tool-list-47ef</guid>
      <description>&lt;p&gt;The first failure mode in a Notion MCP integration is rarely a missing tool. It is assuming that a visible tool name implies access to the whole workspace. &lt;code&gt;makenotion/notion-mcp-server&lt;/code&gt; exposes the official entry point &lt;code&gt;npx @notionhq/notion-mcp-server&lt;/code&gt;, while the independent Doramagic capability pack puts page access checks, workspace boundaries, and tool verification before any serious workflow.&lt;/p&gt;

&lt;p&gt;I would treat the first run as a permission-routing test, not as a successful plugin installation. Start with a temporary workspace or test page. Confirm that the host points at the intended MCP server, confirm that the Notion integration has access to that page, and prove the access with a read-only call. A page visible in the Notion UI is not evidence that the integration token can read it.&lt;/p&gt;

&lt;p&gt;The source map gives a useful debugging route. &lt;code&gt;src/init-server.ts&lt;/code&gt; and &lt;code&gt;scripts/start-server.ts&lt;/code&gt; describe startup; &lt;code&gt;src/openapi-mcp-server/mcp/proxy.ts&lt;/code&gt; maps the OpenAPI description into MCP tools; &lt;code&gt;src/openapi-mcp-server/openapi/parser.ts&lt;/code&gt; handles tool parsing; and &lt;code&gt;src/openapi-mcp-server/auth/&lt;/code&gt; plus &lt;code&gt;client/http-client.ts&lt;/code&gt; define authentication and request boundaries. When a tool appears but a call fails, inspect the layer: host configuration, auth, OpenAPI translation, or the Notion API's permission response.&lt;/p&gt;

&lt;p&gt;My first verification sequence would be deliberately small: run &lt;code&gt;npx @notionhq/notion-mcp-server&lt;/code&gt; only through the documented entry path, read one test page, compare the returned page id with the expected id, then try one minimal update. Record the actual response and the page permission state after every step. Do not use a team knowledge base, private pages, or a production integration token as the first test fixture.&lt;/p&gt;

&lt;p&gt;There is an important evidence boundary here. The pack does not prove that Notion MCP has been installed, run, or successfully called on this machine. Its quick start, Human Manual, and eval files are routes for validation, not runtime output. The pack also flags configuration, installation, runtime, and permission risks, so the official quickstart should be reproduced in an isolated environment. A process that starts is not proof that the target page is readable, and readable is not proof that an agent can safely write.&lt;/p&gt;

&lt;p&gt;My operator rule is simple: give the agent one test page first, then expand the grant. Put the page id, workspace, integration permission, and exact error response into the acceptance record. Only connect a working knowledge base after read, minimal write, and revoked-permission failure are all observable.&lt;/p&gt;

&lt;p&gt;This is an independent Doramagic capability pack, not official Notion documentation or an endorsement. Project page: &lt;a href="https://doramagic.ai/en/projects/notion-mcp-server/" rel="noopener noreferrer"&gt;https://doramagic.ai/en/projects/notion-mcp-server/&lt;/a&gt;; upstream: &lt;a href="https://github.com/makenotion/notion-mcp-server" rel="noopener noreferrer"&gt;https://github.com/makenotion/notion-mcp-server&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>opensource</category>
    </item>
    <item>
      <title>Graphiti Is Not Just Another RAG Layer: Keep Time and Provenance</title>
      <dc:creator>Tang Weigang</dc:creator>
      <pubDate>Sun, 12 Jul 2026 03:59:32 +0000</pubDate>
      <link>https://dev.to/doramagic/graphiti-is-not-just-another-rag-layer-keep-time-and-provenance-idl</link>
      <guid>https://dev.to/doramagic/graphiti-is-not-just-another-rag-layer-keep-time-and-provenance-idl</guid>
      <description>&lt;p&gt;The hard part of agent memory is often not retrieving a similar sentence. It is deciding whether that sentence is still true. Graphiti approaches the problem as a temporal context graph: entities, relationships, and facts carry validity windows, and facts can be traced back to the episode that produced them.&lt;/p&gt;

&lt;p&gt;That changes the first engineering question. A preference, project configuration, customer relationship, or operational state can be true today and replaced tomorrow. A vector-only retrieval path can still return the old statement because it is semantically close. Graphiti combines semantic retrieval, BM25 keyword matching, and graph traversal, then keeps a path back to the source node used in the result.&lt;/p&gt;

&lt;p&gt;I would not treat it as a drop-in memory plugin. The official entry point is &lt;code&gt;pip install graphiti-core&lt;/code&gt;. The quickstart also involves a Neo4j or FalkorDB connection, index and constraint initialization, episode ingestion, and hybrid search. A wrong database name, driver URI, LLM endpoint, embedding model, or cross-encoder setting can turn an infrastructure mismatch into a misleading “memory did not update” symptom.&lt;/p&gt;

&lt;p&gt;The ontology surface matters too. Graphiti supports custom Pydantic models, while its MCP server includes typed entities such as Requirement, Preference, Procedure, Location, Event, Organization, and Document. That schema is part of the extraction and query contract. It is not a decoration to add after the first demo.&lt;/p&gt;

&lt;p&gt;My first verification pass would stay isolated: install the package; prove the Neo4j/FalkorDB connection and database name; add one episode with a known timeline; run a hybrid query; and verify that the result can be traced to its source node and distinguished from a superseded fact. Until write, retrieval, provenance, and contradiction behavior are observable, I would not connect production conversations or a real agent host. The Doramagic pack flags installation and permission risks as high-priority checks for exactly this reason.&lt;/p&gt;

&lt;p&gt;This is an independent Doramagic capability pack, not official Graphiti documentation or an endorsement. Project page: &lt;a href="https://doramagic.ai/en/projects/graphiti/" rel="noopener noreferrer"&gt;https://doramagic.ai/en/projects/graphiti/&lt;/a&gt;; Human Manual: &lt;a href="https://doramagic.ai/en/projects/graphiti/manual/" rel="noopener noreferrer"&gt;https://doramagic.ai/en/projects/graphiti/manual/&lt;/a&gt;; upstream: &lt;a href="https://github.com/getzep/graphiti" rel="noopener noreferrer"&gt;https://github.com/getzep/graphiti&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>opensource</category>
    </item>
    <item>
      <title>FastMCP: tool discovery is not authorization</title>
      <dc:creator>Tang Weigang</dc:creator>
      <pubDate>Sat, 11 Jul 2026 00:45:39 +0000</pubDate>
      <link>https://dev.to/doramagic/fastmcp-tool-discovery-is-not-authorization-2124</link>
      <guid>https://dev.to/doramagic/fastmcp-tool-discovery-is-not-authorization-2124</guid>
      <description>&lt;p&gt;FastMCP makes it easy to expose Python functions as MCP tools, resources, and prompts. The production question is not whether a client can discover a tool, but what that discovery is allowed to trigger.&lt;/p&gt;

&lt;p&gt;My validation order is deliberately boring:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Start with a side-effect-free function and verify server, client, and host discovery.&lt;/li&gt;
&lt;li&gt;Test input/output contracts, authentication, timeouts, exception mapping, and recovery.&lt;/li&gt;
&lt;li&gt;Only then consider filesystem, network, credential, or production-write permissions.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A working protocol path is evidence that the transport works. It is not evidence that the permission model is safe. Each real tool needs a bounded capability, a reproducible example, and a failure case that has been observed.&lt;/p&gt;

&lt;p&gt;Project: &lt;a href="https://doramagic.ai/en/projects/fastmcp/" rel="noopener noreferrer"&gt;https://doramagic.ai/en/projects/fastmcp/&lt;/a&gt;&lt;br&gt;
Human manual: &lt;a href="https://doramagic.ai/en/projects/fastmcp/manual/" rel="noopener noreferrer"&gt;https://doramagic.ai/en/projects/fastmcp/manual/&lt;/a&gt;&lt;br&gt;
Upstream: &lt;a href="https://github.com/PrefectHQ/fastmcp" rel="noopener noreferrer"&gt;https://github.com/PrefectHQ/fastmcp&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mojo</category>
      <category>opensource</category>
      <category>python</category>
    </item>
  </channel>
</rss>
