<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>MCP | Francis Du</title>
    <link>https://francisdu.com/en/tags/mcp/</link>
      <atom:link href="https://francisdu.com/en/tags/mcp/index.xml" rel="self" type="application/rss+xml" />
    <description>💻Data Engineer | 🦀 Rustacean | 📷 Photographer | 🤖Vibe Coder</description>
    <generator>Hugo 0.166.0</generator><language>en-US</language><copyright>© Francis Du</copyright><lastBuildDate>Sat, 12 Sep 2026 05:41:00 +0800</lastBuildDate>
    <item>
      <title>How wcode Grew Past the MCP Bridge I Started With</title>
      <link>https://francisdu.com/en/blog/what-is-wcode/</link>
      <pubDate>Sat, 12 Sep 2026 05:41:00 +0800</pubDate>
      <guid>https://francisdu.com/en/blog/what-is-wcode/</guid>
      <description>&lt;p class=&#34;project-logo&#34;&gt;&lt;a href=&#34;https://wcode.francis.run/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; title=&#34;wcode documentation&#34;&gt;&lt;img src=&#34;https://francisdu.com/img/wcode/wcode-logo.svg&#34; alt=&#34;wcode&#34; width=&#34;320&#34; height=&#34;96&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p class=&#34;project-links&#34;&gt;&lt;a href=&#34;https://github.com/francis-du/wcode&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;GitHub ↗&lt;/a&gt;&lt;a href=&#34;https://wcode.francis.run/docs/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Docs ↗&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I did not start wcode because I wanted to build another coding agent.&lt;/p&gt;
&lt;p&gt;The first idea was simple: use the models already available in web products for coding, while giving them a way to work with the real repository on my machine. The model was in the browser; the code was local. Anything beyond a tiny question meant copying files, uploading an archive, explaining the directory structure, and doing it again as soon as the repository changed.&lt;/p&gt;
&lt;p&gt;The first version of wcode was therefore a bridge. It let a browser-based model search local files, read code, make changes, and run checks through tools. MCP later gave that connection a more standard shape, but getting the connection to work was not the part that kept me working on the project.&lt;/p&gt;
&lt;p&gt;Once the bridge worked, another problem became much harder to ignore: how was the agent actually reading the codebase?&lt;/p&gt;
&lt;p&gt;A lot of code-CLI discovery starts with &lt;code&gt;grep&lt;/code&gt;, &lt;code&gt;ripgrep&lt;/code&gt;, file listings, and shell-style repository scans. There is nothing wrong with that. I use those tools all the time, and for finding a string, filename, or obvious symbol they are often exactly the right choice.&lt;/p&gt;
&lt;p&gt;The problem is what happens next.&lt;/p&gt;
&lt;p&gt;A search returns matching text. The model still has to reconstruct which definition matters, whether two same-named symbols are related, who calls what, what a change might affect, which test covers the behavior, and whether a relationship is merely plausible from text or actually resolved by a language-aware tool.&lt;/p&gt;
&lt;p&gt;Stronger models can reconstruct more of that from snippets, but the repository-understanding work is still being pushed back into the context window. As the codebase grows, repeated names, cross-module calls, generated code, and incomplete slices make that reconstruction increasingly fragile.&lt;/p&gt;
&lt;p&gt;That is where wcode changed direction. I stopped only adding commands and started treating repository reading as its own engineering problem.&lt;/p&gt;
&lt;h2 id=&#34;then-i-started-working-on-how-the-agent-reads-the-repository&#34;&gt;Then I started working on how the agent reads the repository&lt;a class=&#34;heading-anchor&#34; href=&#34;#then-i-started-working-on-how-the-agent-reads-the-repository&#34; aria-label=&#34;Permalink to section: Then I started working on how the agent reads the repository&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;wcode still uses text search. Cheap localization should stay cheap. If the question is “where is &lt;code&gt;FooConfig&lt;/code&gt;?”, starting a semantic pipeline just to look sophisticated would be wasteful.&lt;/p&gt;
&lt;p&gt;But once the question becomes “who calls this?”, “what implements it?”, “what does this rename affect?”, or “which test proves this behavior?”, matching text is no longer enough. wcode can use Tree-sitter for stable syntax structure, upgrade to a warm LSP session when cross-file semantic relationships matter, and combine that with the current Git state, Design State, tests, and known graph relationships.&lt;/p&gt;
&lt;p&gt;What reaches the model is therefore not only a pile of source snippets. It can be a bounded task context containing relevant symbols and exact ranges, references or calls, associated tests, current changes, project constraints, and the provenance, precision, and revision of those facts.&lt;/p&gt;
&lt;p&gt;A rough way to think about the two paths is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Common text-discovery loop:&lt;/strong&gt; task → &lt;code&gt;grep/ripgrep&lt;/code&gt; / file slices → matching text → model reconstructs the code relationships.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;wcode repository-reading path:&lt;/strong&gt; task → cheap localization → syntax/semantic relationships when needed → task-ready evidence → model reasons over context with explicit provenance and precision.&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&#34;content-image&#34;&gt;
  &lt;img src=&#34;https://francisdu.com/img/wcode/wcode-intro-intelligence-stack.svg&#34; alt=&#34;Comparison between text-search code discovery and wcode&#39;s repository-reading path&#34; width=&#34;1600&#34; height=&#34;960&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;figcaption&gt;wcode is not trying to replace grep. Search is often the right tool for exact localization; stronger structure and semantics are added when the task asks about relationships, impact, or proof.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Take a routine change such as adding a status filter to a list endpoint. Searching the endpoint name may find the handler, but that does not guarantee the parameter definition, query construction, callers, and regression tests are all in view. &lt;code&gt;agent_context&lt;/code&gt; gathers the implementation, tests, project guidance, and verification entry points that look relevant to the current task. If the task explicitly needs callers, references, implementations, or impact, readiness can then direct the agent to semantic navigation.&lt;/p&gt;
&lt;p&gt;That distinction matters to me: &lt;strong&gt;not every question should pay for the heaviest analysis, but the agent should know when search has stopped being enough.&lt;/strong&gt; wcode reports only the precision it actually has. Tree-sitter syntax is not presented as compiler semantics, and an unavailable LSP does not become a fake claim that every caller was found.&lt;/p&gt;
&lt;h2 id=&#34;making-an-edit-without-losing-someone-elses-work&#34;&gt;Making an edit without losing someone else&amp;rsquo;s work&lt;a class=&#34;heading-anchor&#34; href=&#34;#making-an-edit-without-losing-someone-elses-work&#34; aria-label=&#34;Permalink to section: Making an edit without losing someone else’s work&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Back to the filter example. The agent reads a file and starts preparing a change. Meanwhile, I might edit the same file.&lt;/p&gt;
&lt;p&gt;Writing the agent&amp;rsquo;s older version back could lose my work. To prevent that, wcode returns a SHA when it reads a file—a fingerprint of the contents. An edit must carry that fingerprint. If the contents have changed, the old edit is rejected and the agent has to read again.&lt;/p&gt;
&lt;p&gt;Operations also need an appropriate scope and order. Reading several unrelated files can happen in parallel. Two changes to the same file need coordination. After editing, &lt;code&gt;review_changes&lt;/code&gt; examines the diff and &lt;code&gt;verify_project&lt;/code&gt; runs the project&amp;rsquo;s checks.&lt;/p&gt;
&lt;figure class=&#34;content-image&#34;&gt;
  &lt;img src=&#34;https://francisdu.com/img/wcode/wcode-intro-engineering-loop.svg&#34; alt=&#34;The path through a change: gather context, edit, check the result, and decide what comes next&#34; width=&#34;1600&#34; height=&#34;900&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;figcaption&gt;At the end of a task, I want to know what changed, what was checked, and what remains uncertain.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The documentation calls this an engineering control plane. In everyday use, it means keeping the files, operations, and check results connected. The next task can inspect what happened, even if I switch models or clients.&lt;/p&gt;
&lt;h2 id=&#34;a-passing-test-belongs-to-a-particular-change&#34;&gt;A passing test belongs to a particular change&lt;a class=&#34;heading-anchor&#34; href=&#34;#a-passing-test-belongs-to-a-particular-change&#34; aria-label=&#34;Permalink to section: A passing test belongs to a particular change&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The filter is implemented and its tests pass. Then the parameter parsing changes, but the tests are not run again. The earlier pass describes the earlier code.&lt;/p&gt;
&lt;p&gt;wcode associates check results with the code and design revisions they ran against. Its interface distinguishes finding a corresponding test from executing it, getting a pass, and having a result that still applies to the current version.&lt;/p&gt;
&lt;figure class=&#34;content-image&#34;&gt;&lt;img src=&#34;https://francisdu.com/img/wcode/wcode-intro-evidence_hu_53064a9df2e7669f.webp&#34; alt=&#34;wcode Verification page: whether checks ran, what they returned, and whether they match the current revision&#34;loading=&#34;lazy&#34; decoding=&#34;async&#34; srcset=&#34;https://francisdu.com/img/wcode/wcode-intro-evidence_hu_53064a9df2e7669f.webp 960w, https://francisdu.com/img/wcode/wcode-intro-evidence_hu_3aad68b05435b458.webp 1800w&#34; sizes=&#34;(max-width: 900px) calc(100vw - 32px), 900px&#34; width=&#34;3420&#34; height=&#34;2426&#34;&gt;&lt;/figure&gt;&lt;p&gt;The checks also need to answer the right question. This blog is built with Hugo. After editing Markdown, I need an actual build to establish that both language pages were generated, their images exist, and the public URLs stayed intact. Reading the text cannot establish those things.&lt;/p&gt;
&lt;p&gt;A code project needs its corresponding build, tests, or other project checks. Higher-risk work can use more extensive verification when configured. The diagram shows available lanes; it does not mean every change must run all of them.&lt;/p&gt;
&lt;figure class=&#34;content-image&#34;&gt;
  &lt;img src=&#34;https://francisdu.com/img/wcode/wcode-intro-verification-mesh.svg&#34; alt=&#34;How wcode selects checks for a change and retains results for the corresponding revision&#34; width=&#34;1600&#34; height=&#34;940&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;figcaption&gt;The project and verification plan determine which checks are required. An optimistic review cannot replace missing execution results.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Successful work from an earlier task can help locate relevant files next time. Its test results cannot be reused indefinitely. That is one of the details I want wcode to keep track of.&lt;/p&gt;
&lt;h2 id=&#34;giving-project-rules-somewhere-to-live&#34;&gt;Giving project rules somewhere to live&lt;a class=&#34;heading-anchor&#34; href=&#34;#giving-project-rules-somewhere-to-live&#34; aria-label=&#34;Permalink to section: Giving project rules somewhere to live&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Some requirements are invisible when looking at one function or file.&lt;/p&gt;
&lt;p&gt;On this blog, Chinese pages stay at the root and English pages live under &lt;code&gt;/en/&lt;/code&gt;. The photography Gallery has its own page and scripts. Editing an article should preserve its public address. An assistant unaware of those rules could finish the immediate task while changing something else I wanted to keep.&lt;/p&gt;
&lt;p&gt;wcode can record these requirements under &lt;code&gt;.wcode/&lt;/code&gt; in the repository. The documentation calls this Design State: requirements, components, constraints, and acceptance criteria. Later tasks can retrieve them while inspecting the project or assessing a change.&lt;/p&gt;
&lt;p&gt;The Engineering Observatory opens on its architecture view. It shows which source belongs to a component, related requirements, and dependencies found by the analysis tools.&lt;/p&gt;
&lt;figure class=&#34;content-image&#34;&gt;&lt;img src=&#34;https://francisdu.com/img/wcode/wcode-intro-architecture_hu_a639e2cce8d6a6c5.webp&#34; alt=&#34;wcode Engineering architecture page: components, source ownership, requirements, and dependencies&#34;loading=&#34;lazy&#34; decoding=&#34;async&#34; srcset=&#34;https://francisdu.com/img/wcode/wcode-intro-architecture_hu_a639e2cce8d6a6c5.webp 960w, https://francisdu.com/img/wcode/wcode-intro-architecture_hu_76554f90b45fd0d1.webp 1800w&#34; sizes=&#34;(max-width: 900px) calc(100vw - 32px), 900px&#34; width=&#34;3420&#34; height=&#34;2850&#34;&gt;&lt;/figure&gt;&lt;p&gt;These records need maintenance as the project changes. A diagram does not establish that an architecture is correct. It gives me a place to compare information that would otherwise be scattered across files and conversations.&lt;/p&gt;
&lt;h2 id=&#34;deciding-what-the-assistant-can-access&#34;&gt;Deciding what the assistant can access&lt;a class=&#34;heading-anchor&#34; href=&#34;#deciding-what-the-assistant-can-access&#34; aria-label=&#34;Permalink to section: Deciding what the assistant can access&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;wcode works within a selected Workspace: the project scope available for this task. File operations check paths, protected locations, and unsafe links. Edits to existing files also check the content fingerprint.&lt;/p&gt;
&lt;p&gt;Commands have their own rules. Common development commands with bounded behavior can run directly. Operations requiring additional trust go through local authorization, where the operator can inspect and allow the request. Broader session grants and Full Access also require an explicit operator choice.&lt;/p&gt;
&lt;figure class=&#34;content-image&#34;&gt;
  &lt;img src=&#34;https://francisdu.com/img/wcode/wcode-intro-security-boundary.svg&#34; alt=&#34;Checks between an AI client and the repository: connection authentication, command authorization, and file access&#34; width=&#34;1600&#34; height=&#34;920&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;
  &lt;figcaption&gt;Connecting to wcode does not grant permission to run arbitrary commands or access arbitrary files.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&#34;content-image&#34;&gt;&lt;img src=&#34;https://francisdu.com/img/wcode/wcode-intro-access_hu_b12189c6e90c7fb.webp&#34; alt=&#34;wcode Access management page: the current project’s permissions and pending authorization requests&#34;loading=&#34;lazy&#34; decoding=&#34;async&#34; srcset=&#34;https://francisdu.com/img/wcode/wcode-intro-access_hu_b12189c6e90c7fb.webp 960w, https://francisdu.com/img/wcode/wcode-intro-access_hu_2dedf3cc804655ae.webp 1800w&#34; sizes=&#34;(max-width: 900px) calc(100vw - 32px), 900px&#34; width=&#34;3420&#34; height=&#34;2290&#34;&gt;&lt;/figure&gt;&lt;p&gt;A local client can start wcode over stdio. A remote client uses OAuth to connect to a running service. Both reach the same repository tools. File operations happen on the repository&amp;rsquo;s machine; with a cloud model, code that is read still reaches the corresponding client as a tool result.&lt;/p&gt;
&lt;p&gt;These are controls at the repository and tool layer. They are not equivalent to an operating-system sandbox.&lt;/p&gt;
&lt;h2 id=&#34;what-the-interface-is-useful-for&#34;&gt;What the interface is useful for&lt;a class=&#34;heading-anchor&#34; href=&#34;#what-the-interface-is-useful-for&#34; aria-label=&#34;Permalink to section: What the interface is useful for&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I mainly use the interface to see where the work has got to.&lt;/p&gt;
&lt;p&gt;The terminal dashboard shows connections, the selected project, tasks, and authorization requests. &lt;code&gt;W&lt;/code&gt; opens the Engineering Observatory; &lt;code&gt;O&lt;/code&gt; opens Setup Hub. The Observatory contains architecture, current changes, requirements, project files, and verification records.&lt;/p&gt;
&lt;p&gt;When a task slows down, &lt;strong&gt;Task activity&lt;/strong&gt; is useful. It separates time spent waiting in a queue from time spent executing, and shows child processes and resource use. Waiting for capacity and running an expensive command are different problems.&lt;/p&gt;
&lt;figure class=&#34;content-image&#34;&gt;&lt;img src=&#34;https://francisdu.com/img/wcode/wcode-intro-activity_hu_2317004a5debedc0.webp&#34; alt=&#34;wcode Task activity page: queued and executing work, tool calls, and resource use&#34;loading=&#34;lazy&#34; decoding=&#34;async&#34; srcset=&#34;https://francisdu.com/img/wcode/wcode-intro-activity_hu_2317004a5debedc0.webp 960w, https://francisdu.com/img/wcode/wcode-intro-activity_hu_43c09591b7bea99a.webp 1800w&#34; sizes=&#34;(max-width: 900px) calc(100vw - 32px), 900px&#34; width=&#34;3420&#34; height=&#34;3328&#34;&gt;&lt;/figure&gt;&lt;p&gt;wcode limits concurrency separately for CPU work, file I/O, and child processes. Independent work can overlap while leaving the machine some room. The useful balance still needs to be checked against real tasks; a concurrency number alone says very little.&lt;/p&gt;
&lt;h2 id=&#34;trying-it-on-a-familiar-project&#34;&gt;Trying it on a familiar project&lt;a class=&#34;heading-anchor&#34; href=&#34;#trying-it-on-a-familiar-project&#34; aria-label=&#34;Permalink to section: Trying it on a familiar project&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If you already have an AI coding assistant you like, start with a project you know. A small change makes it easier to judge whether the assistant found the right code and whether the result makes sense.&lt;/p&gt;
&lt;p&gt;On macOS or Linux, install a release with:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -fsSL https://raw.githubusercontent.com/francis-du/wcode/main/install.sh | sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Windows installation is covered in &lt;a href=&#34;https://wcode.francis.run/docs/getting-started/&#34;&gt;Getting Started&lt;/a&gt;. Then run this from the project directory:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wcode setup
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Choose global or project configuration and reconnect the agent. For local stdio use, the client starts the process. Run &lt;code&gt;wcode&lt;/code&gt; when you want the terminal dashboard, web interface, or remote access. Remote clients use the current MCP address displayed by the program and complete OAuth; the &lt;a href=&#34;https://wcode.francis.run/docs/code-agent-integrations/&#34;&gt;integration guide&lt;/a&gt; has the steps.&lt;/p&gt;
&lt;p&gt;There is no need to configure every feature for the first task. Start with the smallest useful loop:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Have the agent locate one implementation.&lt;/li&gt;
&lt;li&gt;Change one behavior.&lt;/li&gt;
&lt;li&gt;Run the relevant checks.&lt;/li&gt;
&lt;li&gt;Read the diff yourself.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Then add the project rules you find yourself repeating under &lt;code&gt;.wcode/&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&#34;https://github.com/francis-du/wcode&#34;&gt;source is on GitHub&lt;/a&gt;, with installation and integration details in the &lt;a href=&#34;https://wcode.francis.run/docs/&#34;&gt;project documentation&lt;/a&gt;. Your chosen service still provides the model. wcode handles the connection to the repository and the work on that side.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>wcode: How I Connected Web AI to a Local Repository</title>
      <link>https://francisdu.com/en/blog/wcode/</link>
      <pubDate>Sat, 12 Sep 2026 05:33:00 +0800</pubDate>
      <guid>https://francisdu.com/en/blog/wcode/</guid>
      <description>&lt;p class=&#34;project-logo&#34;&gt;&lt;a href=&#34;https://wcode.francis.run/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; title=&#34;Open the wcode documentation&#34;&gt;&lt;img src=&#34;https://francisdu.com/img/wcode/wcode-logo.svg&#34; alt=&#34;wcode&#34; width=&#34;320&#34; height=&#34;96&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p class=&#34;project-links&#34;&gt;&lt;a href=&#34;https://wcode.francis.run/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Documentation ↗&lt;/a&gt;&lt;a href=&#34;https://github.com/francis-du/wcode&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;GitHub ↗&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I use several AI products in the browser. The annoying part starts when I want one of them to work on a repository that is already on my machine: copy files into chat, upload an archive, switch clients, or configure another API key.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/francis-du/wcode&#34;&gt;wcode&lt;/a&gt; started as my way around that friction. It is a Rust runtime that exposes a local workspace through MCP, with OAuth, file boundaries, code indexing, guarded edits, and command policy on the local side.&lt;/p&gt;
&lt;p&gt;The first version mostly stopped there. After I started using it for real edits, I spent more time on repository state than on the bridge itself.&lt;/p&gt;
&lt;p&gt;The questions I kept hitting were:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;What part of the repository does this task belong to?
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Which facts are syntax, and which are compiler-grade semantics?
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Which files are safe to edit right now?
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;What changed since the last verification?
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Did the test result belong to this exact revision?
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Can another model resume the work without rereading the chat?
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Most of the current wcode work comes from those questions.&lt;/p&gt;
&lt;figure class=&#34;content-image&#34;&gt;&lt;img src=&#34;https://francisdu.com/img/wcode/wcode-tui_hu_13e59e78ee0ce797.webp&#34; alt=&#34;wcode terminal observability&#34;loading=&#34;lazy&#34; decoding=&#34;async&#34; srcset=&#34;https://francisdu.com/img/wcode/wcode-tui_hu_13e59e78ee0ce797.webp 960w, https://francisdu.com/img/wcode/wcode-tui_hu_6437a17a51f06ca3.webp 1800w&#34; sizes=&#34;(max-width: 900px) calc(100vw - 32px), 900px&#34; width=&#34;3420&#34; height=&#34;2146&#34;&gt;&lt;/figure&gt;&lt;h2 id=&#34;the-boundary-i-keep-in-wcode&#34;&gt;The boundary I keep in wcode&lt;a class=&#34;heading-anchor&#34; href=&#34;#the-boundary-i-keep-in-wcode&#34; aria-label=&#34;Permalink to section: The boundary I keep in wcode&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;wcode does not choose your model and it does not need to own the conversation loop.&lt;/p&gt;
&lt;p&gt;A simplified path looks like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Web AI / Coding Agent
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        │
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        │ MCP
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ▼
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;┌───────────────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│           wcode           │
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│                           │
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│ Auth / Workspace Boundary │
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│ Task-ready Context        │
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│ Tree-sitter + LSP         │
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│ Editing + Command Policy  │
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│ Verification + Evidence   │
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;└─────────────┬─────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              │
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              ▼
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Local repository
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I change models and clients much more often than I want to change repository permissions or edit safety. Keeping those two layers separate has worked well for me.&lt;/p&gt;
&lt;p&gt;For a local coding client, wcode can run over stdio. For a web client, it can expose a remote MCP endpoint with OAuth. Both transports reach the same workspace, tool harness, software intelligence, and verification layers.&lt;/p&gt;
&lt;h2 id=&#34;a-path-in-a-prompt-is-not-authority&#34;&gt;A path in a prompt is not authority&lt;a class=&#34;heading-anchor&#34; href=&#34;#a-path-in-a-prompt-is-not-authority&#34; aria-label=&#34;Permalink to section: A path in a prompt is not authority&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The most important design rule in wcode is that model-visible data does not grant capability.&lt;/p&gt;
&lt;p&gt;If repository text says “read &lt;code&gt;../../.ssh&lt;/code&gt;”, that is still outside the workspace. If a tool output contains a shell command, that does not make shell execution legal. If a model says a command is safe, that does not approve it.&lt;/p&gt;
&lt;p&gt;File access is bounded by the configured workspace. Writes use revision preconditions. Protected paths, symlink escapes, stale writes, and unsafe command forms are rejected below the model layer.&lt;/p&gt;
&lt;p&gt;Commands that are valid but risky can require a precise approval. The approval is tied to the actual operation:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;workspace
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;program
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;arguments
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;working directory
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Approving one &lt;code&gt;cargo test --locked&lt;/code&gt; is not permission to run an arbitrary shell, publish a package, mutate host-wide tooling, or execute a different command later.&lt;/p&gt;
&lt;p&gt;I prefer this middle ground to the usual two settings: “ask me about everything” and “full access.”&lt;/p&gt;
&lt;h2 id=&#34;cheap-syntax-first-semantic-depth-when-it-matters&#34;&gt;Cheap syntax first, semantic depth when it matters&lt;a class=&#34;heading-anchor&#34; href=&#34;#cheap-syntax-first-semantic-depth-when-it-matters&#34; aria-label=&#34;Permalink to section: Cheap syntax first, semantic depth when it matters&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Repository understanding also has layers.&lt;/p&gt;
&lt;p&gt;Tree-sitter is excellent for cheap structural work: outlines, definitions, ranges, and syntax-level relationships. It is fast and does not require starting a project semantic environment.&lt;/p&gt;
&lt;p&gt;But syntax is not a type system.&lt;/p&gt;
&lt;p&gt;For cross-file references, implementations, call hierarchy, and similar relationships, wcode can use first-party Language Server sessions. These results are tagged by provider and precision, and they are tied to source revisions so stale semantic facts do not quietly survive code changes.&lt;/p&gt;
&lt;p&gt;That distinction sounds small, but it prevents a common failure mode in agent tooling: presenting a heuristic result as if it were authoritative because it makes the output look smarter.&lt;/p&gt;
&lt;p&gt;If wcode only knows something syntactically, it says so.&lt;/p&gt;
&lt;h2 id=&#34;agent_context-packages-the-task-i-am-about-to-run&#34;&gt;&lt;code&gt;agent_context&lt;/code&gt; packages the task I am about to run&lt;a class=&#34;heading-anchor&#34; href=&#34;#agent_context-packages-the-task-i-am-about-to-run&#34; aria-label=&#34;Permalink to section: agent_context packages the task I am about to run&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A coding agent does not only need “more context.” It needs the right context in a form that helps it decide what to do next.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;agent_context&lt;/code&gt; therefore tries to produce a bounded, task-ready package. Depending on the task it can include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;repository guidance;&lt;/li&gt;
&lt;li&gt;product or architecture scope;&lt;/li&gt;
&lt;li&gt;target source and exact file SHA;&lt;/li&gt;
&lt;li&gt;relevant tests and design constraints;&lt;/li&gt;
&lt;li&gt;semantic-provider readiness;&lt;/li&gt;
&lt;li&gt;active work items;&lt;/li&gt;
&lt;li&gt;a minimal-change strategy;&lt;/li&gt;
&lt;li&gt;candidate dependency lanes and parallelism guidance.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I use it to avoid the usual first few tool calls where an agent rediscovers the repository layout before touching the actual target.&lt;/p&gt;
&lt;p&gt;When an error already points to &lt;code&gt;src/runtime/foo.rs:120&lt;/code&gt;, the newest retrieval path starts there instead of paying for a broad repository search first. When the task is genuinely cross-file, the deeper graph and semantic paths remain available.&lt;/p&gt;
&lt;h2 id=&#34;verification-is-attached-to-a-revision&#34;&gt;Verification is attached to a revision&lt;a class=&#34;heading-anchor&#34; href=&#34;#verification-is-attached-to-a-revision&#34; aria-label=&#34;Permalink to section: Verification is attached to a revision&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;“Tests passed” is not a durable engineering artifact.&lt;/p&gt;
&lt;p&gt;Which tests? On which source revision? Did the design state change between the test and the final edit? Was it a quick check or a full project gate? Was the output truncated? Did another process modify the repository while verification was running?&lt;/p&gt;
&lt;p&gt;wcode records verification evidence with provenance and revision identity. Before a result is recorded as current proof, the relevant source and design state are checked again. If the repository changed, the old result is not promoted to the new revision.&lt;/p&gt;
&lt;p&gt;The Project Observatory also distinguishes between a test that is &lt;em&gt;mapped&lt;/em&gt; to a requirement and a test that was actually &lt;em&gt;executed and passed&lt;/em&gt; for the current revision.&lt;/p&gt;
&lt;p&gt;I notice this most after a long session, when there have already been enough edits that “tests passed earlier” is no longer useful.&lt;/p&gt;
&lt;h2 id=&#34;parallelism-is-a-dependency-problem&#34;&gt;Parallelism is a dependency problem&lt;a class=&#34;heading-anchor&#34; href=&#34;#parallelism-is-a-dependency-problem&#34; aria-label=&#34;Permalink to section: Parallelism is a dependency problem&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Recent versions also changed how I think about performance.&lt;/p&gt;
&lt;p&gt;A large concurrency number is not the goal. Useful parallelism comes from independent work.&lt;/p&gt;
&lt;p&gt;Reads of unrelated files can overlap. Independent discovery can overlap. A test that depends on a generated file cannot start early just because a slot is free. Two conflicting writes should not race merely to keep a dashboard busy.&lt;/p&gt;
&lt;p&gt;wcode&amp;rsquo;s parallel scheduler is dependency-driven and completion-driven: a task can proceed when &lt;em&gt;its own&lt;/em&gt; prerequisites are complete, without waiting for an unrelated slow branch in the same conceptual layer.&lt;/p&gt;
&lt;p&gt;The runtime separately accounts for outer tool admission, CPU work, bounded file I/O, and child-process queues. This prevents “32 slots” from being mistaken for “32 useful CPU tasks.”&lt;/p&gt;
&lt;h2 id=&#34;why-build-this-as-a-local-native-runtime&#34;&gt;Why build this as a local native runtime?&lt;a class=&#34;heading-anchor&#34; href=&#34;#why-build-this-as-a-local-native-runtime&#34; aria-label=&#34;Permalink to section: Why build this as a local native runtime?&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Because the boundary I care about is local.&lt;/p&gt;
&lt;p&gt;The repository is local. Uncommitted changes are local. Installed language servers are local. Build tools, credentials, filesystem permissions, and project-specific constraints are local.&lt;/p&gt;
&lt;p&gt;A small native runtime can mediate these things without shipping the entire repository to another orchestration service. wcode is written in Rust and ships as a native binary; it does not require a database or a second agent backend just to expose the local workspace.&lt;/p&gt;
&lt;p&gt;That also makes the failure boundary easier to reason about. The model proposes; the runtime authorizes and executes.&lt;/p&gt;
&lt;h2 id=&#34;what-i-am-working-on-now&#34;&gt;What I am working on now&lt;a class=&#34;heading-anchor&#34; href=&#34;#what-i-am-working-on-now&#34; aria-label=&#34;Permalink to section: What I am working on now&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Most of my recent changes are in retrieval, permissions, parallel scheduling, verification, and project state. The model can already write code well enough to expose mistakes in the surrounding runtime, so that is where I keep finding work.&lt;/p&gt;
&lt;p&gt;I also avoid broad speed claims unless I have a workload that supports them. wcode is still changing quickly, and I would rather publish the exact behavior than turn every release into a benchmark story.&lt;/p&gt;
&lt;p&gt;If that problem is interesting to you, the code is on &lt;a href=&#34;https://github.com/francis-du/wcode&#34;&gt;GitHub&lt;/a&gt; and the current documentation is at &lt;a href=&#34;https://wcode.francis.run/&#34;&gt;wcode.francis.run&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>