<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Release | Francis Du</title>
    <link>https://francisdu.com/en/tags/release/</link>
      <atom:link href="https://francisdu.com/en/tags/release/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, 19 Sep 2026 15:33:00 +0800</lastBuildDate>
    <item>
      <title>wcode 0.8: I Started Treating the Repository as an Engineering Digital Twin</title>
      <link>https://francisdu.com/en/blog/wcode-v0-8/</link>
      <pubDate>Sat, 19 Sep 2026 15:33:00 +0800</pubDate>
      <guid>https://francisdu.com/en/blog/wcode-v0-8/</guid>
      <description>&lt;p&gt;By the end of 0.7, wcode could already give an agent bounded repository context, edit files with SHA preconditions, run verification, and keep Design State, Software Graph, Evidence, and Reconciliation around the work.&lt;/p&gt;
&lt;p&gt;But when I used it myself, one gap was still obvious:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;An agent being able to operate a repository does not mean a human can quickly understand the state of that repository.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I still kept going back to an IDE to inspect the tree, callers, tests, and Git changes, then back to wcode for verification and evidence. Each view was useful, but they were not really one engineering model.&lt;/p&gt;
&lt;p&gt;That became the main idea behind 0.8.&lt;/p&gt;
&lt;p&gt;I did not want another batch of MCP tools. I wanted to pull the existing pieces toward one thing:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;an Engineering Digital Twin of the repository that can be inspected, queried, revisited, and explicit about the precision of its evidence.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The current release is &lt;strong&gt;v0.8.1&lt;/strong&gt;. v0.8.0 built the main structure; v0.8.1 tightened the Decision Plane and Jev boundaries immediately afterwards.&lt;/p&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;The wcode engineering intelligence stack, from repository facts to graph relationships and verification evidence&#34;loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/figure&gt;&lt;h2 id=&#34;a-code-graph-is-only-useful-if-it-admits-what-it-knows&#34;&gt;A Code Graph is only useful if it admits what it knows&lt;a class=&#34;heading-anchor&#34; href=&#34;#a-code-graph-is-only-useful-if-it-admits-what-it-knows&#34; aria-label=&#34;Permalink to section: A Code Graph is only useful if it admits what it knows&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I have always been a little suspicious of code graphs.&lt;/p&gt;
&lt;p&gt;The easy version is to draw every file, symbol, and module as a large connected ball. It looks impressive and becomes difficult to use almost immediately.&lt;/p&gt;
&lt;p&gt;The questions I actually care about are more boring:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Where did this relationship come from?&lt;/li&gt;
&lt;li&gt;Was it observed by Tree-sitter or confirmed by LSP?&lt;/li&gt;
&lt;li&gt;Was it declared in Design State or seen at runtime?&lt;/li&gt;
&lt;li&gt;Does it belong to the current graph revision?&lt;/li&gt;
&lt;li&gt;Is it related to the current Working Tree change?&lt;/li&gt;
&lt;li&gt;Is there proof or a test behind it?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In 0.8, Code Graph became a workbench inside &lt;strong&gt;Engineering Architecture&lt;/strong&gt; rather than another top-level workspace.&lt;/p&gt;
&lt;p&gt;Architecture remains the primary model. The graph is a deeper observable layer.&lt;/p&gt;
&lt;p&gt;From a symbol, I can now inspect bounded callers, callees, references, dependencies, implementation ownership, tests, requirements, and verification/proof context.&lt;/p&gt;
&lt;p&gt;Calls, Impact, and All Evidence modes all have hard depth, node, and edge limits. The UI uses upstream → focus → downstream lanes instead of allowing an unbounded node-ball.&lt;/p&gt;
&lt;p&gt;More importantly, every retained relation keeps its &lt;strong&gt;provenance&lt;/strong&gt; and &lt;strong&gt;precision&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Declared, syntax, semantic/LSP, runtime, deterministic, and heuristic evidence do not get flattened into a single vague confidence number.&lt;/p&gt;
&lt;p&gt;I would rather see “this edge is syntax-derived” than have a clean graph hide uncertainty from me.&lt;/p&gt;
&lt;h3 id=&#34;graph-history-is-part-of-the-same-view&#34;&gt;Graph History is part of the same view&lt;a class=&#34;heading-anchor&#34; href=&#34;#graph-history-is-part-of-the-same-view&#34; aria-label=&#34;Permalink to section: Graph History is part of the same view&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The Code Graph can also open a stored Graph History snapshot.&lt;/p&gt;
&lt;p&gt;That gives me read-only graph time travel: I can ask whether a caller, dependency, or proof relationship existed in an earlier graph revision without rebuilding the repository or mutating current state.&lt;/p&gt;
&lt;p&gt;For an agent this is useful context. For me it is mostly an engineering history tool.&lt;/p&gt;
&lt;h2 id=&#34;the-observatory-is-quieter-now&#34;&gt;The Observatory is quieter now&lt;a class=&#34;heading-anchor&#34; href=&#34;#the-observatory-is-quieter-now&#34; aria-label=&#34;Permalink to section: The Observatory is quieter now&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The old Observatory could become noisy because a browser trying to get fresh state could trigger groups of relatively heavy snapshots.&lt;/p&gt;
&lt;p&gt;That was technically correct and operationally annoying.&lt;/p&gt;
&lt;p&gt;In 0.8, each Workspace allows at most one background Observatory rebuild at a time. Cached responses are revision-stamped and explicitly say whether the state is cached, current, or refreshing.&lt;/p&gt;
&lt;p&gt;The browser renders useful cached state first and uses bounded lightweight probes instead of fanning out more heavy snapshot work.&lt;/p&gt;
&lt;p&gt;I also reworked the information hierarchy.&lt;/p&gt;
&lt;p&gt;Project Pulse and state are first-glance information. Metrics, relationships, and timelines come next. Evidence and inspectors are the third layer.&lt;/p&gt;
&lt;p&gt;Stale, Unknown, Inconclusive, Failed, and Unverified are not allowed to look like current passing proof.&lt;/p&gt;
&lt;p&gt;That sounds like a UI detail, but for an engineering control plane it is a trust boundary:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;the interface should never look more certain than the evidence underneath it.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;why-i-finally-started-using-the-phrase-engineering-digital-twin&#34;&gt;Why I finally started using the phrase Engineering Digital Twin&lt;a class=&#34;heading-anchor&#34; href=&#34;#why-i-finally-started-using-the-phrase-engineering-digital-twin&#34; aria-label=&#34;Permalink to section: Why I finally started using the phrase Engineering Digital Twin&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I avoided that phrase for a while.&lt;/p&gt;
&lt;p&gt;If all I had was a code index with graph edges, “Digital Twin” would feel inflated.&lt;/p&gt;
&lt;p&gt;0.8 is the first version where the name feels closer to what the system is actually doing:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Design State
    ↓
Implementation ownership
    ↓
Syntax / Semantic / Runtime relations
    ↓
Working Tree changes
    ↓
Drift / Risk / Impact
    ↓
Verification / Evidence
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is not a second mutable project database.&lt;/p&gt;
&lt;p&gt;Source, Git, Design State, runtime providers, and Evidence remain their own sources of truth. The Digital Twin is a read-only engineering view that composes them without pretending they have the same precision.&lt;/p&gt;
&lt;p&gt;That distinction matters. The moment a twin becomes a second mutable project state, I have created a new consistency problem instead of solving one.&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 wcode engineering loop connecting context, graph, changes, verification, and evidence&#34;loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/figure&gt;&lt;h2 id=&#34;the-decision-plane-became-a-real-subsystem-in-08&#34;&gt;The Decision Plane became a real subsystem in 0.8&lt;a class=&#34;heading-anchor&#34; href=&#34;#the-decision-plane-became-a-real-subsystem-in-08&#34; aria-label=&#34;Permalink to section: The Decision Plane became a real subsystem in 0.8&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The other large piece of 0.8 is the &lt;strong&gt;Decision Plane&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Coding agents make many small decisions that do not necessarily require the main reasoning model:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Is the current context sufficient?&lt;/li&gt;
&lt;li&gt;Should retrieval continue?&lt;/li&gt;
&lt;li&gt;Are semantic relationships necessary evidence before a safe edit?&lt;/li&gt;
&lt;li&gt;Should verification become deeper?&lt;/li&gt;
&lt;li&gt;Is this state clear enough to act, or should it abstain?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;0.8 represents these as provider-neutral structured Probability, Choice, and Score signals.&lt;/p&gt;
&lt;p&gt;But the important part is not that I can plug a smaller model into the path.&lt;/p&gt;
&lt;p&gt;The important part is that the Decision Plane still does &lt;strong&gt;not&lt;/strong&gt; own the deterministic engineering boundary.&lt;/p&gt;
&lt;p&gt;Authorization, Workspace boundaries, SHA preconditions, Evidence, risk-derived verification, and human approval stay deterministic.&lt;/p&gt;
&lt;p&gt;A provider can say “retrieve more.” It cannot say:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Confidence is 0.93, so skip the SHA check.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That would defeat most of the work I have done on wcode.&lt;/p&gt;
&lt;h2 id=&#34;engineering-fitness-stopped-using-wcodes-own-readiness-as-truth&#34;&gt;Engineering Fitness stopped using wcode&amp;rsquo;s own readiness as truth&lt;a class=&#34;heading-anchor&#34; href=&#34;#engineering-fitness-stopped-using-wcodes-own-readiness-as-truth&#34; aria-label=&#34;Permalink to section: Engineering Fitness stopped using wcode’s own readiness as truth&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A Decision Plane is not useful if it grades itself.&lt;/p&gt;
&lt;p&gt;For context sufficiency, 0.8 calibrates against independently authored &lt;strong&gt;Engineering Fitness Gold&lt;/strong&gt; instead of using wcode readiness fields as the answer.&lt;/p&gt;
&lt;p&gt;I care about four different things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Did retrieval find the required identity?&lt;/li&gt;
&lt;li&gt;Did the agent receive the complete source body?&lt;/li&gt;
&lt;li&gt;Is the SHA fresh?&lt;/li&gt;
&lt;li&gt;If the task is actually writable, are all required edit inputs present?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;On the 60-case model-free diagnostic used for the 0.8.0 release, the 1K cold and warm runs both reached &lt;strong&gt;100%&lt;/strong&gt; required identity recall, complete-body recall, and fresh-SHA recall. All &lt;strong&gt;58/58&lt;/strong&gt; eligible writable cases received the required edit inputs.&lt;/p&gt;
&lt;p&gt;The decision baseline had a Brier score of &lt;strong&gt;0.018846&lt;/strong&gt;, with zero false stops and zero false continues.&lt;/p&gt;
&lt;p&gt;I do not read those numbers as “context engineering is solved.”&lt;/p&gt;
&lt;p&gt;They are a baseline I can use when I change retrieval, ranking, budgets, or the Decision Plane. At least I can detect when I have broken a basic property without needing a large reasoning model to judge the result.&lt;/p&gt;
&lt;h2 id=&#34;jev-got-narrower-again-in-081&#34;&gt;Jev got narrower again in 0.8.1&lt;a class=&#34;heading-anchor&#34; href=&#34;#jev-got-narrower-again-in-081&#34; aria-label=&#34;Permalink to section: Jev got narrower again in 0.8.1&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;v0.8.0 already supported comparing a baseline Decision Plane provider with a candidate on the same request.&lt;/p&gt;
&lt;p&gt;In v0.8.1, I cleaned up the naming:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the local model-free layer is the &lt;strong&gt;Decision Plane&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;the external semantic provider is &lt;strong&gt;Jev&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;the main large model is the &lt;strong&gt;Reasoning Model&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;More importantly, I rewrote the questions.&lt;/p&gt;
&lt;p&gt;A broad question such as:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Would semantic navigation be useful?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;is almost always answered “yes” in a coding task. Looking at more relationships is usually useful.&lt;/p&gt;
&lt;p&gt;The narrower 0.8.1 boundary is closer to:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Are semantic relationships necessary evidence before a safe edit?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Choice criteria now define positive and negative boundaries, and other_review exists for states that should abstain instead of pretending to be edit-ready.&lt;/p&gt;
&lt;p&gt;The current Agent Context Jev question set is wcode.agent_context@3.&lt;/p&gt;
&lt;h3 id=&#34;jev-is-increase-only&#34;&gt;Jev is increase-only&lt;a class=&#34;heading-anchor&#34; href=&#34;#jev-is-increase-only&#34; aria-label=&#34;Permalink to section: Jev is increase-only&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Jev may ask for more retrieval, semantic navigation, deeper verification, or more reasoning.&lt;/p&gt;
&lt;p&gt;It may not reduce deterministic work.&lt;/p&gt;
&lt;p&gt;A Jev edit_then_verify recommendation is suppressed unless the deterministic baseline already selected the same action. Unknown edit readiness goes to other_review rather than silently becoming edit-ready.&lt;/p&gt;
&lt;p&gt;If the Jev advisory block would overflow the Agent Context budget, the advisory is dropped first. Source, SHA preconditions, tests, and deterministic risk evidence keep priority.&lt;/p&gt;
&lt;p&gt;That gives me a failure mode I am comfortable with:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;if Jev disappears, wcode loses advice; it does not lose safety.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;shadow-ab-is-more-useful-to-me-than-replacing-the-baseline&#34;&gt;Shadow A/B is more useful to me than replacing the baseline&lt;a class=&#34;heading-anchor&#34; href=&#34;#shadow-ab-is-more-useful-to-me-than-replacing-the-baseline&#34; aria-label=&#34;Permalink to section: Shadow A/B is more useful to me than replacing the baseline&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I did not make Jev the Decision Plane authority.&lt;/p&gt;
&lt;p&gt;The baseline and candidate see the same immutable DecisionRequest, and wcode records shared and missing signals, probability and score deltas, Choice disagreements, shape mismatches, and safety-policy violations.&lt;/p&gt;
&lt;p&gt;That is closer to Shadow A/B.&lt;/p&gt;
&lt;p&gt;I want to see where a provider disagrees with the deterministic baseline before I give it any authority over runtime behavior.&lt;/p&gt;
&lt;p&gt;It is slower than “API connected, enable it by default,” but much easier to reason about.&lt;/p&gt;
&lt;h2 id=&#34;repository-scanning-finally-shares-ignore-semantics&#34;&gt;Repository scanning finally shares Ignore semantics&lt;a class=&#34;heading-anchor&#34; href=&#34;#repository-scanning-finally-shares-ignore-semantics&#34; aria-label=&#34;Permalink to section: Repository scanning finally shares Ignore semantics&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This is less visible than the Digital Twin, but it has a large effect on everyday use.&lt;/p&gt;
&lt;p&gt;Source scanning, search, indexing, status, and subspace discovery used to have slightly different traversal paths. That creates silly cases where one subsystem ignores target and another walks straight through it.&lt;/p&gt;
&lt;p&gt;0.8 moves repository-wide walking onto shared ignore-aware behavior.&lt;/p&gt;
&lt;p&gt;By default it respects .gitignore, .ignore, Git info exclude, Git global exclude, and protected paths. Heavy generated trees such as target, node_modules, caches, and common build outputs are pruned before traversal.&lt;/p&gt;
&lt;p&gt;Explicit intent still wins. If I directly ask wcode to read or search an ignored path, bounded operations can still access it.&lt;/p&gt;
&lt;p&gt;Performance rules should not silently override an explicit user request.&lt;/p&gt;
&lt;h2 id=&#34;the-tui-became-more-task-first&#34;&gt;The TUI became more task-first&lt;a class=&#34;heading-anchor&#34; href=&#34;#the-tui-became-more-task-first&#34; aria-label=&#34;Permalink to section: The TUI became more task-first&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I removed some permanent engineering telemetry from the main TUI.&lt;/p&gt;
&lt;p&gt;Wide terminals now use a 70/30 layout: Workspace Activity is the main canvas, while engineering and connection state live in a compact control rail.&lt;/p&gt;
&lt;p&gt;The rail is reduced to four independent lines:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ARCH
DRIFT
PROOF
MODEL
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Medium and narrow terminals drop the permanent Engineering Pulse entirely so task rows keep the space.&lt;/p&gt;
&lt;p&gt;The TUI is increasingly about three questions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What is the agent doing now?&lt;/li&gt;
&lt;li&gt;Is it blocked by authorization, verification, or runtime state?&lt;/li&gt;
&lt;li&gt;When do I need to intervene?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Detailed architecture and proof still live in the Engineering Console.&lt;/p&gt;
&lt;h2 id=&#34;081-also-fixed-two-looks-correct-ui-bugs&#34;&gt;0.8.1 also fixed two &amp;ldquo;looks correct&amp;rdquo; UI bugs&lt;a class=&#34;heading-anchor&#34; href=&#34;#081-also-fixed-two-looks-correct-ui-bugs&#34; aria-label=&#34;Permalink to section: 0.8.1 also fixed two “looks correct” UI bugs&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;These were good examples of why observability has to be part of correctness.&lt;/p&gt;
&lt;p&gt;Code Graph requests are parameterized by query, mode, depth, and snapshot. A late response is not safe to render just because it succeeded; all four request semantics must still match the current view.&lt;/p&gt;
&lt;p&gt;The Access page has a similar rule. Workspaces, commands, and authorizations are now published atomically. If one response fails shape validation, the group remains Unknown instead of showing a partially truthful state.&lt;/p&gt;
&lt;p&gt;The dangerous UI is not the one that crashes.&lt;/p&gt;
&lt;p&gt;It is the one that displays a coherent-looking answer made from mismatched state.&lt;/p&gt;
&lt;h2 id=&#34;the-old-boundaries-are-still-the-boundaries&#34;&gt;The old boundaries are still the boundaries&lt;a class=&#34;heading-anchor&#34; href=&#34;#the-old-boundaries-are-still-the-boundaries&#34; aria-label=&#34;Permalink to section: The old boundaries are still the boundaries&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;wcode has changed a lot between 0.3 and 0.8, but I have not changed the basic rules I started with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Workspace Root remains a boundary;&lt;/li&gt;
&lt;li&gt;edits remain SHA-bound;&lt;/li&gt;
&lt;li&gt;Full Access is an explicit operator decision;&lt;/li&gt;
&lt;li&gt;the Decision Plane cannot grant authorization;&lt;/li&gt;
&lt;li&gt;Jev cannot lower verification;&lt;/li&gt;
&lt;li&gt;cancellation is not rollback;&lt;/li&gt;
&lt;li&gt;verification evidence belongs to an exact revision.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Engineering Digital Twin is read-only observability. A graph relationship does not grant permission to mutate anything.&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;The wcode verification mesh keeps checks, independent review, and evidence bound to repository state&#34;loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/figure&gt;&lt;h2 id=&#34;the-release-was-larger-than-i-expected&#34;&gt;The release was larger than I expected&lt;a class=&#34;heading-anchor&#34; href=&#34;#the-release-was-larger-than-i-expected&#34; aria-label=&#34;Permalink to section: The release was larger than I expected&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;From v0.7.6 to v0.8.0, the Git diff touched &lt;strong&gt;135 files, about +7,364 / -775 lines&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;I originally thought 0.8 would mostly be “Code Graph plus a better Observatory.”&lt;/p&gt;
&lt;p&gt;Instead it pulled on the whole path:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Repository scan
    ↓
Context
    ↓
Graph / Digital Twin
    ↓
Decision Plane
    ↓
Edit boundary
    ↓
Verification
    ↓
Evidence
    ↓
Human observability
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That is why I ended up calling the release &lt;strong&gt;Engineering Digital Twin&lt;/strong&gt; rather than Code Graph.&lt;/p&gt;
&lt;p&gt;The graph is only one entry point into it.&lt;/p&gt;
&lt;h2 id=&#34;the-current-release-is-081&#34;&gt;The current release is 0.8.1&lt;a class=&#34;heading-anchor&#34; href=&#34;#the-current-release-is-081&#34; aria-label=&#34;Permalink to section: The current release is 0.8.1&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;v0.8.0 was the Engineering Digital Twin release on September 19. Later the same day I shipped v0.8.1, tightening Jev decisions, naming, and WebUI state truthfulness.&lt;/p&gt;
&lt;p&gt;The detailed release notes are here:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://wcode.francis.run/docs/releases/v0.8.0/&#34;&gt;v0.8.0 — Engineering Digital Twin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://wcode.francis.run/docs/releases/v0.8.1/&#34;&gt;v0.8.1 — Jev Decision Plane hardening&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If I had to reduce 0.8 to one change, it would be this:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;wcode used to focus mainly on helping an agent operate a repository safely. In 0.8, I started trying to make the human and the agent look at the same evidence-aware engineering state.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That part is nowhere near finished, but the direction finally feels coherent.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>wcode 0.6.2: What 32 Tool Slots Were Hiding</title>
      <link>https://francisdu.com/en/blog/wcode-v0-6-2/</link>
      <pubDate>Sat, 12 Sep 2026 05:35:00 +0800</pubDate>
      <guid>https://francisdu.com/en/blog/wcode-v0-6-2/</guid>
      <description>&lt;p&gt;I spent several days watching wcode sit at 32 tool slots with decent peak occupancy while a few real tasks still felt slow.&lt;/p&gt;
&lt;p&gt;After tracing the queues underneath that number, I stopped treating slot utilization as a performance signal. A slot only says the request got in. CPU work, file I/O, compilers, Git probes, and language servers can still be waiting somewhere deeper.&lt;/p&gt;
&lt;p&gt;0.6.2 grew out of that debugging pass. I changed the resource model, then fixed a few other places where the runtime was reporting something cleaner than the underlying state really was.&lt;/p&gt;
&lt;figure class=&#34;content-image&#34;&gt;&lt;img src=&#34;https://francisdu.com/img/wcode/wcode-observatory-full_hu_2e0fc54b6ad597b6.webp&#34; alt=&#34;wcode Project Observatory&#34;loading=&#34;lazy&#34; decoding=&#34;async&#34; srcset=&#34;https://francisdu.com/img/wcode/wcode-observatory-full_hu_2e0fc54b6ad597b6.webp 960w, https://francisdu.com/img/wcode/wcode-observatory-full_hu_77a4ca195d4c7462.webp 1600w&#34; sizes=&#34;(max-width: 900px) calc(100vw - 32px), 900px&#34; width=&#34;1600&#34; height=&#34;5017&#34;&gt;&lt;/figure&gt;&lt;h2 id=&#34;tool-slots-are-not-cpu-cores&#34;&gt;Tool slots are not CPU cores&lt;a class=&#34;heading-anchor&#34; href=&#34;#tool-slots-are-not-cpu-cores&#34; aria-label=&#34;Permalink to section: Tool slots are not CPU cores&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The outer &lt;code&gt;SLOTS&lt;/code&gt; counter only means a tool request has been admitted. It does not tell you whether a CPU worker is executing useful code, a filesystem operation is waiting on storage, or a child process is queued behind another compiler.&lt;/p&gt;
&lt;p&gt;0.6.2 makes those layers more explicit:&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;Tool admission
&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;Foreground CPU budget
&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;Bounded file-I/O workers
&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;Child-process / Git probe queues
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Foreground CPU parallelism is bounded by hardware, memory-derived limits, a small runtime ceiling, and request concurrency. Blocking work has its own bounded capacity. Independent file modifications use a shared I/O pool. Fixed, read-oriented Git probes have a separate queue from heavier repository processes.&lt;/p&gt;
&lt;p&gt;Starting twenty compilers at once is usually a good way to make one workstation slower, so those inner limits stay deliberately small.&lt;/p&gt;
&lt;h2 id=&#34;i-removed-an-optimization-that-benchmarked-worse&#34;&gt;I removed an optimization that benchmarked worse&lt;a class=&#34;heading-anchor&#34; href=&#34;#i-removed-an-optimization-that-benchmarked-worse&#34; aria-label=&#34;Permalink to section: I removed an optimization that benchmarked worse&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;One experiment moved more read work onto a wider thread pool. It looked like the kind of change that should increase throughput.&lt;/p&gt;
&lt;p&gt;In the local paired workload it was slower, so I reverted it.&lt;/p&gt;
&lt;p&gt;I kept the revert. A wider pool is only an optimization if the paired workload actually improves.&lt;/p&gt;
&lt;p&gt;I also avoided putting an “X% faster” number on the release. Repository size, storage, dependency shape, language servers, and compiler behavior move the result too much for one number to mean much.&lt;/p&gt;
&lt;h2 id=&#34;keep-lightweight-tools-alive-under-command-pressure&#34;&gt;Keep lightweight tools alive under command pressure&lt;a class=&#34;heading-anchor&#34; href=&#34;#keep-lightweight-tools-alive-under-command-pressure&#34; aria-label=&#34;Permalink to section: Keep lightweight tools alive under command pressure&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;There is another failure mode in agent runtimes: a queue of expensive commands consumes every outer tool slot, then the agent cannot even perform a lightweight read or status query needed to understand the queue.&lt;/p&gt;
&lt;p&gt;Execution-class requests in 0.6.2 pass through an additional admission layer before taking the global tool capacity. With the normal 32-slot configuration, command-like work cannot consume all 32 slots; a small amount of capacity remains available for non-execution tools.&lt;/p&gt;
&lt;p&gt;This does not guarantee fixed latency under every kind of saturation. It does prevent one very avoidable form of self-starvation.&lt;/p&gt;
&lt;h2 id=&#34;a-compiler-location-should-beat-a-repository-wide-search&#34;&gt;A compiler location should beat a repository-wide search&lt;a class=&#34;heading-anchor&#34; href=&#34;#a-compiler-location-should-beat-a-repository-wide-search&#34; aria-label=&#34;Permalink to section: A compiler location should beat a repository-wide search&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Performance is also about doing less work.&lt;/p&gt;
&lt;p&gt;Suppose the model already has this diagnostic:&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;error[E0308] at src/runtime/harness/context_budget.rs:33:9
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Older retrieval paths could still begin with broad repository symbol discovery and only later prioritize the explicit location.&lt;/p&gt;
&lt;p&gt;That ordering is backwards.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;agent_context&lt;/code&gt; now recognizes bounded file-and-line anchors first. It resolves them through the workspace safety boundary, preserves the source text and file SHA needed for safe editing, and can defer unnecessary repository-graph expansion for simple location-driven tasks.&lt;/p&gt;
&lt;p&gt;Cross-file callers, impact analysis, architecture questions, and explicit product-scope queries still use the deeper graph and semantic paths.&lt;/p&gt;
&lt;p&gt;So a file-and-line diagnostic now wins the first retrieval step. The broader graph only comes in when the task actually needs it.&lt;/p&gt;
&lt;h2 id=&#34;concurrent-cold-queries-should-share-index-construction&#34;&gt;Concurrent cold queries should share index construction&lt;a class=&#34;heading-anchor&#34; href=&#34;#concurrent-cold-queries-should-share-index-construction&#34; aria-label=&#34;Permalink to section: Concurrent cold queries should share index construction&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Multiple agent branches can ask about the same uncached file at nearly the same time.&lt;/p&gt;
&lt;p&gt;Without coordination they can all notice the cache miss and independently build the same index.&lt;/p&gt;
&lt;p&gt;0.6.2 shares an in-flight index build for the same workspace and file. Different files can still build independently. Invalidation updates the build generation so an old result that finishes late cannot quietly repopulate stale state.&lt;/p&gt;
&lt;p&gt;I did not add incremental parsing here. This change only deduplicates the same cold index build.&lt;/p&gt;
&lt;h2 id=&#34;symbol_context-now-checks-that-its-own-pieces-agree&#34;&gt;&lt;code&gt;symbol_context&lt;/code&gt; now checks that its own pieces agree&lt;a class=&#34;heading-anchor&#34; href=&#34;#symbol_context-now-checks-that-its-own-pieces-agree&#34; aria-label=&#34;Permalink to section: symbol_context now checks that its own pieces agree&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A more serious version of the same problem appears when a symbol index and the source text come from different file revisions.&lt;/p&gt;
&lt;p&gt;A response can look perfectly structured while combining an old signature with new source lines.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;symbol_context&lt;/code&gt; now checks the source identity used by the symbol fact against the content it is about to return. If the index is stale it can refresh once. If the file keeps changing and a stable answer cannot be produced, the operation fails explicitly.&lt;/p&gt;
&lt;p&gt;I would rather return “unstable source” than a polished contradiction.&lt;/p&gt;
&lt;h2 id=&#34;complete-verification-plans-or-no-verification-plan&#34;&gt;Complete verification plans or no verification plan&lt;a class=&#34;heading-anchor&#34; href=&#34;#complete-verification-plans-or-no-verification-plan&#34; aria-label=&#34;Permalink to section: Complete verification plans or no verification plan&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A mixed-language repository can derive a surprisingly large set of checks.&lt;/p&gt;
&lt;p&gt;One older path silently limited a plan to the first eight checks. That is dangerous because the executed prefix can still look like a complete verification report to a higher layer.&lt;/p&gt;
&lt;p&gt;0.6.2 constructs and sorts the complete plan first, with a bounded maximum of 32 checks. If the plan exceeds that bound, the request fails before dispatch. It does not execute a partial prefix and call it full verification.&lt;/p&gt;
&lt;p&gt;Within a request, verification history also shares a source/design revision snapshot instead of repeatedly rescanning the same state for every planned check.&lt;/p&gt;
&lt;p&gt;Evidence remains scope-aware: a narrow success cannot erase a broader failure, and missing or truncated evidence is not interpreted as a pass.&lt;/p&gt;
&lt;h2 id=&#34;verification-can-be-a-durable-mcp-task&#34;&gt;Verification can be a durable MCP task&lt;a class=&#34;heading-anchor&#34; href=&#34;#verification-can-be-a-durable-mcp-task&#34; aria-label=&#34;Permalink to section: Verification can be a durable MCP task&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;verify_project&lt;/code&gt; now reuses the existing persistent Tasks runtime when the client advertises the MCP Tasks extension.&lt;/p&gt;
&lt;p&gt;The server can persist the task and return a &lt;code&gt;taskId&lt;/code&gt; before waiting for the full verification workload. The authenticated owner can query that same task later, even after the creating request has ended.&lt;/p&gt;
&lt;p&gt;A dropped connection does not cause automatic replay. A restarted runtime does not pretend an interrupted operation completed. Already-started blocking work is not advertised as transactionally rollbackable.&lt;/p&gt;
&lt;p&gt;That distinction matters once commands can have side effects. A missing response tells me nothing about whether the command already started or finished.&lt;/p&gt;
&lt;h2 id=&#34;configuration-needed-to-become-smaller-again&#34;&gt;Configuration needed to become smaller again&lt;a class=&#34;heading-anchor&#34; href=&#34;#configuration-needed-to-become-smaller-again&#34; aria-label=&#34;Permalink to section: Configuration needed to become smaller again&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;As wcode accumulated resource controls, the advanced CLI became useful for debugging but unfriendly as a default setup surface.&lt;/p&gt;
&lt;p&gt;0.6.2 introduces three practical performance profiles:&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;balanced
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fast
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;light
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can preview before writing configuration:&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 --performance fast --dry-run
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wcode --show-config
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Advanced overrides still exist, but a normal user no longer needs to understand every internal queue before choosing a sensible starting point.&lt;/p&gt;
&lt;p&gt;The release also adds:&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 help-all
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wcode help-all setup
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wcode help-all --json
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This catalog is generated from the real CLI parser, including advanced options, aliases, defaults, and enumerated values. Normal help stays compact; complete discoverability has a separate entry point.&lt;/p&gt;
&lt;h2 id=&#34;i-cleaned-up-the-observatory-first-screen&#34;&gt;I cleaned up the Observatory first screen&lt;a class=&#34;heading-anchor&#34; href=&#34;#i-cleaned-up-the-observatory-first-screen&#34; aria-label=&#34;Permalink to section: I cleaned up the Observatory first screen&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The Project Observatory received another structural pass.&lt;/p&gt;
&lt;p&gt;The first screen now separates active execution, pending approvals, worktree changes, and verification evidence that is valid for the current revision. Architecture navigation starts from searchable component cards and a detail inspector, while Design / Implementation / Overlay graphs remain available for deeper inspection.&lt;/p&gt;
&lt;p&gt;Fast activity refreshes are separated from slower project refreshes. Hidden pages stop polling. Shared process resources are labeled separately from work that belongs to the selected project. An unavailable sample is not rendered as zero.&lt;/p&gt;
&lt;p&gt;The main rule for the UI is boring: if wcode did not sample something, it should say unknown instead of drawing a zero.&lt;/p&gt;
&lt;h2 id=&#34;what-i-kept-from-this-release&#34;&gt;What I kept from this release&lt;a class=&#34;heading-anchor&#34; href=&#34;#what-i-kept-from-this-release&#34; aria-label=&#34;Permalink to section: What I kept from this release&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I now check a few distinctions explicitly when changing the runtime:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;slot count is not throughput;&lt;/li&gt;
&lt;li&gt;a mapped test is not an executed test;&lt;/li&gt;
&lt;li&gt;task completion is not a passing verification result;&lt;/li&gt;
&lt;li&gt;a missing response is not proof that nothing happened.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;0.6.2 is mostly a pile of fixes around those details. None of them is a headline feature, but they make the runtime easier to trust when a coding session gets long.&lt;/p&gt;
&lt;p&gt;The code is at &lt;a href=&#34;https://github.com/francis-du/wcode&#34;&gt;github.com/francis-du/wcode&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>