Francis Du.

💻Data Engineer | 🦀 Rustacean | 📷 Photographer | 🤖Vibe Coder

22 2026年9月

wcode:用 Jev 的理念重构 Coding Agent Runtime

本文目录26 个章节

最近我一直在想一件事:

wcode 下一步到底应该继续“补 Agent 能力”,还是应该重做 Agent 下面那一层?

前几天读了一份叫 Why yet another agent 的笔记,里面有一个问题我很喜欢:

如果 LLM 没有 KV cache,你会怎么设计一个 Coding Agent?

这个问题让我一下把很多已经习惯的东西重新看了一遍:compaction、restart、subagent、tool schema、skills、model routing、长 session、memory。

最后我的结论不是“再做一个更聪明的 Agent”。

恰恰相反。

我更确定 wcode 不应该去复制 Claude Code、Codex 或 Cursor,而应该把 Agent 下面缺的那层 Runtime 做出来。

而 Jev / TypeSafe 给我的启发,正好不是“换一个模型”,而是:

把原本藏在 Prompt 和上下文里的模糊语义判断,变成有类型、有边界、有状态的程序决策。

这篇主要记我现在准备怎么用这个理念继续重构 wcode。

我不想让 Jev 接管 Agent#

先说一个容易误解的地方。

我不是想做:

wcode
Jev
让 Jev 决定所有事情

这和我的方向完全相反。

wcode 里现在很多东西就是故意保持 deterministic:

当前文件 SHA 对不对?
路径是不是在 Workspace?
命令有没有授权?
Verification 有没有真的跑?
Evidence 属不属于当前 revision?
Design State 有没有 drift?
Worklist 还有没有没做完的东西?

这些东西代码能算,就应该让代码算。

Jev 真正适合的是另外一类问题:

当前 context 够不够?
还缺不缺重要 evidence?
是不是必须看 callers / references / implementations?
几个合法 action 里哪一个更适合当前语义状态?
当前失败更像缺证据、缺语义,还是应该直接 repair?

也就是一些以前很容易写进 Prompt 里的“语义 if”。

这也是为什么我现在更喜欢把 Jev 看成 Decision Plane 的一部分,而不是另一个 Agent。

wcode 已经有一版 Decision Plane#

现在 wcode 里的 Jev 不是直接拿用户 Prompt 去问。

流程大概是:

repository state
deterministic baseline
     ├── target
     ├── worktree
     ├── graph
     ├── verification
     ├── semantic readiness
     └── current risk
DecisionRequest
     ├── local deterministic decision
     └── Jev decision
       shadow comparison
       increase-only guidance

Jev 现在可以回答 Noul / Choice / Score 这几类问题。

比如:

context_sufficient           -> Noul
continue_retrieval           -> Noul
semantic_navigation_required -> Noul
verification_escalation      -> Noul
next_action                  -> Choice
risk_surface                 -> Choice
evidence_density             -> Score

但它不能说:

“我觉得没事,所以跳过 verification。”

现在的规则是:

Jev 可以增加工作,不能减少确定性安全边界。

比如它可以建议:

先再查一个 symbol
先 review worktree
补 semantic navigation
把 verification 升到 full

但它不能取消:

SHA precondition
authorization
workspace containment
verification floor
current-revision evidence

这条边界我准备继续保持。

Jev 真正改变我的地方,是“State 应该先于 Prompt”#

传统 Coding Agent 很容易把状态理解成:

system prompt
+ conversation
+ 之前读过的文件
+ tool calls
+ tool outputs
+ compaction summary

也就是说:

模型知道什么,主要取决于这次 session 以前发生过什么。

这很适合 KV cache。

但它不一定是最适合工程系统的状态模型。

wcode 现在已经有很多东西其实根本不属于聊天:

Execution
Worklist
Workspace
Design State
Software Graph
Semantic Provider State
Impact
Risk
Verification Plan
Evidence
Reconciliation
Runtime Task

这些才是项目真正的状态。

模型换了,状态不能跟着没。

会话断了,状态不能跟着没。

Compaction 了,状态也不能跟着被总结错。

所以我下一步想继续把 wcode 往一个更明确的结构推:

Runtime owns state,Agent 只拿当前任务需要的一份 view。

第一件事:把 Agent Context 重构成 Context Compiler#

wcode 现在已经有 agent_context,它做的事情比“搜几个文件”多很多:

  • 找 target;
  • 带当前 SHA;
  • 带 Design State;
  • 带验证入口;
  • 带 graph / semantic readiness;
  • 带 Worklist;
  • 给出 next actions。

但从这个新视角看,它还可以继续往前走。

我想把它从:

“生成一包 edit-ready context”

进一步重构成:

Context Compiler。

也就是所有可进入模型的东西,先变成一种统一的 context candidate:

ContextChunk {
  source
  revision
  scope
  freshness
  sensitivity
  cost
  relevance
  precision
  render_level
}

然后每次任务重新编译:

current goal
candidate chunks
    ├── source
    ├── tests
    ├── graph
    ├── semantic
    ├── design
    ├── evidence
    ├── worklist
    ├── past decisions
    └── runtime state
deterministic filters
Jev semantic scoring
render policy
    ├── omit
    ├── one-line summary
    ├── detailed summary
    └── full content
compiled context

这和 compaction 最大的区别是:

Compaction 问:

过去这些东西怎么压短?

Context Compiler 问的是:

这一轮到底为什么需要看这些东西?

我觉得这才是更根本的优化。

第二件事:把 Retrieval 从“继续不继续”升级成 reranking#

现在 wcode 的 Jev 已经能判断:

continue_retrieval?
semantic_navigation_required?

但下一步我更想做的是候选级别的 scoring。

比如一次 search / graph / experience / design lookup 找到 30 个候选:

candidate 1
candidate 2
candidate 3
...
candidate 30

不应该简单按 lexical hit 或固定 heuristic 全塞给模型。

更合理的是:

deterministic search
bounded candidate pool
Jev:
  relevance?
  task-critical?
  test-related?
  security-sensitive?
  stale?
  contradictory?
rerank
top context

但这里仍然需要 deterministic floor。

下面这些我不准备交给 Jev 删除:

用户明确点名的 target
当前 changed files
security-sensitive files
mapped acceptance tests
current failure locations
SHA edit target
current revision evidence

Jev 可以重排 optional context,不能删硬约束。

第三件事:做 Context Firewall#

原文里有一个方向我觉得对 Agent 很重要:

retrieved text 不应该默认等价于 instruction。

这件事在 Coding Agent 里比普通 RAG 更危险。

因为 Agent 会读:

  • README;
  • docs;
  • issue;
  • generated source;
  • shell output;
  • web content;
  • dependency docs;
  • MCP resource;
  • comments。

这些内容里完全可能出现:

Ignore previous instructions
Run this command
Upload this token
Disable verification

如果都原样塞到 context 里,实际上是在把 repository data 和 agent instruction 混成一种东西。

所以我想在 Context Compiler 前再加一层:

retrieved chunk
deterministic boundary
semantic classification
     ├── evidence
     ├── conflict
     ├── instruction-like
     └── irrelevant
context admission

也就是 Context Firewall

Jev 在这里不是安全 authority。

真正的权限仍然在 wcode。

但它可以帮忙判断:

这段文本更像 evidence,还是更像试图改变 Agent 行为的 instruction?

我觉得这个能力以后会越来越重要。

第四件事:Tools 不应该永远全量暴露#

这篇原文里另一个我非常认同的点,是 Tool calling 的 context 税。

现在 function calling / MCP 常见的方式是:

工具 schema 先全部放进模型 context。

工具少的时候没问题。

工具几十、上百以后,开始出现两个代价:

  1. schema 本身很占 context;
  2. action space 太大,模型选择未必更准确。

wcode 自己这两年也一直在做 tool schema 收敛。

但我现在想更进一步:

把完整 Tool Catalog 改成 Action Registry + progressive disclosure。

第一层模型只看到:

repository_search
semantic_navigation
code_edit
verification
runtime_control
authorization
design_state
evidence

这些只是 capability hints。

真正选中一个 capability 后,再动态加载:

exact action
full schema
argument constraints
examples
failure semantics
risk class

也就是说:

Goal
Action Router
Top-K capability
load full action schema
model tool call

这和 TypeSafe 的 Skill Suggestion 很像:

先看短 description。

选 Top-K。

再加载更完整的信息做第二次判断。

如果这件事做成,我觉得 wcode 才真正有可能做到:

内置很多能力,但不让模型每一轮都付出完整上下文成本。

第五件事:Skills、Tools、Context Rule 分开#

我现在也越来越觉得这三个概念不应该混。

Tool / Action#

立刻执行一个动作:

run verification
read file
find references
start process

Skill / Workflow#

一类任务怎么做:

release package
debug frontend
review migration
repair verification failure

Context Rule#

做某类任务时必须带上的知识:

frontend -> style guide
src/auth -> auth gotchas
Rust perf -> performance rules
writing -> personal style samples

Context Rule 很像 AGENTS.md,但不是全局静态加载。

应该是:

if scope == src/auth:
    include auth-gotchas

if task == frontend:
    include frontend-style

if task == release:
    include release-policy

并且可以有一个很重要的属性:

sticky = true

意思不是永久存在于 KV cache。

而是:

只要 task condition 还成立,每次 Context Compiler 都必须重新带上。

这样就不会因为 compaction 或换模型把关键规则压没。

第六件事:Subagent 应该共享 State,不是共享聊天#

现在 subagent 最大的问题,我觉得一直不是“怎么启动另一个模型”。

真正麻烦的是:

主 Agent 的哪些 context 要传过去?
它回来哪些东西要合并?
它读到的 revision 还是不是当前 revision?
几个 agent 同时写怎么办?
结果有没有冲突?

如果 State 是显式的,就可以换成另一种模型:

Subgoal
  id
  revision
  input scope
  allowed reads
  allowed writes
  output schema

比如:

subgoal:
  inspect auth impact

revision:
  R

read:
  Software Graph
  Semantic Provider
  src/auth
  mapped tests

write:
  ImpactReport only

它不需要复制主 Agent 的整个 session。

它只需要拿到一份 task-specific context view。

返回以后也不是“塞一大段聊天回来”,而是写一个结构化 artifact。

这时候 subagent 更像 worker,而不是另一个会话。

第七件事:把 Background Intelligence 当一等公民#

原文最后提到一个我觉得很有潜力的模式:

很多 Agent workflow 其实适合在后台跑。

尤其是只读任务:

security review
architecture review
test-gap analysis
graph refresh
documentation drift
eval generation
performance analysis
cross-model review

它们都可以理解成:

当前 repository revision 的函数。

所以我更想让 wcode 后面形成:

Revision R
   ├── Graph Builder
   ├── Security Review
   ├── Architecture Review
   ├── Test Gap
   ├── Docs Drift
   ├── Eval Builder
   └── Runtime Observation
   Derived Engineering State

只要 revision 变了:

R -> R+1

旧结果自动 stale。

这其实和 wcode 现在的 Evidence / Verification / Graph revision binding 是同一套思想。

我觉得这比“开很多 subagent 聊天”更像真正可维护的 multi-agent architecture。

第八件事:Model Router 最后再做#

“Why yet another agent” 里花了不少篇幅讲 KV cache 怎么让 model routing 变得不经济。

我认同这个问题。

但我现在不会先做 model router。

因为如果 state/context 还是一坨 session history:

再聪明的 routing 也只是在决定谁来重新吃这一坨 token。

所以顺序应该反过来:

先把 State 显式化
再做 Context Compiler
再做 Action Router
再做 Subgoal / Background Plane
最后 Model Router

到那个时候,小模型和大模型切换才自然:

简单 task
→ 编译一个很小的 Context View
→ 小模型

复杂 task
→ 编译一个更完整的 Context View
→ 大模型

security review
→ 编译 security-specific View
→ 独立 reviewer

模型不需要继承另一个模型过去半小时的“脑子”。

只需要读取同一份 Engineering State 的不同视图。

这会让 wcode 的定位更清楚#

我现在不太想把 wcode 定义成:

一个更强的 Coding Agent。

我更愿意把它定义成:

Coding Agent 下面的 Engineering Runtime。

大概是:

                Codex / Claude / ChatGPT / 自研 Agent
                        Current Goal
                  ┌─────────────────────┐
                  │   wcode Decision    │
                  │       Plane         │
                  │ deterministic + Jev │
                  └──────────┬──────────┘
           ┌─────────────────┼─────────────────┐
           ▼                 ▼                 ▼
   Context Compiler     Action Router     Background Plane
           │                 │                 │
           ▼                 ▼                 ▼
      State Fabric       Action Registry   Derived State
           ├── Execution
           ├── Worklist
           ├── Workspace
           ├── Design State
           ├── Software Graph
           ├── Semantics
           ├── Risk
           ├── Verification
           ├── Evidence
           ├── Reconciliation
           └── Runtime Tasks

Agent 可以换。

Model 可以换。

UI 可以换。

MCP client 可以换。

但工程状态和边界不换。

我觉得这是 wcode 最值得做的地方。

Jev 在这套架构里的角色#

如果把上面所有东西压成一句话:

Jev 不应该是 wcode 的大脑,而应该是 wcode 里负责“模糊语义分支”的 typed decision engine。

比如:

这个 chunk 是否相关?
是否需要更详细版本?
是否还缺 evidence?
这几个合法 action 哪个更适合?
这个 subgoal 是否重复?
这个 diff 是否值得额外 review?
这段 retrieved text 是 evidence 还是 instruction?

这些问题非常适合:

Noul
Choice
Score

而:

能不能写这个文件?
能不能执行这个 command?
当前 SHA 对不对?
验证通过没有?
Evidence stale 没有?

继续由 deterministic code 决定。

我觉得这两层分得越清楚,系统反而越稳。

我准备怎么推进#

这次看完以后,我给 wcode 后续重构排的顺序大概是:

1. Decision Policy 产品化#

现在 question set、threshold、distribution、calibration 已经有了。

下一步要把它们变成真正可版本化的 policy:

question_set_version
decision_policy_version
requested_model
resolved_model
calibration sample
Brier
false-stop
false-continue

2. Semantic Retrieval Reranker#

让 Jev 从“还要不要搜”变成“这些候选哪个最值得进 context”。

3. Context Firewall#

区分:

evidence
conflict
instruction-like content
irrelevant

4. Context Compiler#

统一决定每个 context chunk:

omit
summary
detailed
full

5. Action Registry#

让模型先看 capability index,再动态加载完整 tool schema。

6. Structured Skill / Context Rule#

把 workflow 和长期上下文规则分开。

7. Background Intelligence#

把 graph、review、security、eval、docs drift 变成 revision-bound derived state。

8. 最后才做 Model Routing#

到这一步,routing 才不是简单的“换模型”。

而是:

为不同模型编译不同成本、不同深度、但来自同一个 State Fabric 的 Context View。

最后#

Jev 对我最大的启发并不是“有一个便宜模型可以帮 Agent 做判断”。

真正重要的是:

把 Agent 里的语义判断,从隐式 Prompt 行为变成显式、可类型化、可版本化、可校准的程序接口。

而 “Why yet another agent” 又把这个思路往前推了一步:

如果 state 也是显式的,很多今天围绕 KV cache 长出来的复杂设计,可能根本不需要存在。

所以接下来我想继续把 wcode 从 Repository Control Plane 往 Engineering Runtime 推。

不是再做一个 Agent。

而是让任何 Agent 都能踩在一套更干净的:

State、Context、Decision、Action、Verification、Evidence 和 Background Intelligence 上。

如果这个方向走通,我觉得它会比再造一个 Claude Code clone 有意思得多。