← 返回首页

从 DeepSeek Code 到 Orcana Runtime——一个编程智能体的三个月

··11 分钟·
#AI Agent#Orcana#TypeScript#开源

不是重写,是重构

DeepSeek Code 最早是一个 Python 方案——280 行引擎,8 个核心模块。那是计划。

真正建成的是一个 TypeScript 项目。108 个源文件,19,183 行生产代码,17 个模块。用 Bun 1.3 跑,用 bun:test 测。8 天时间,8 次 git 提交,全在本地,没推远程。

当时的架构

17 个模块不是平均分配的。最大的三个:

Agent 引擎(33 文件,6,722 行)

  • Flash Triage:一次调用替代 4 个意图判断模块,路由、分类、任务追踪三合一
  • Flash Judge:覆盖输出门 + 证据门的语义,在任务真正结束前拦住不完整的回答
  • 规划门 + 完成门 + 权限配置(9 层优先级链)

工具系统(13 文件,2,047 行)

  • 文件编辑、Shell 沙箱、Git、搜索、TypeScript 类型分析
  • CodeGraph MCP、LSP、WebFetch、事务修复
  • Service 工具(长时间运行的 agent 服务)

记忆与思考(8 文件,2,010 行)

  • 混合上下文引擎:Hot/Warm/Cold 三层缓存,实测命中率 98-100%
  • 思考链持久化到 SQLite,跨会话复用推理链
  • 压缩器 + 蒸馏门,上下文窗口动态管理

其他模块:Provider 层(DeepSeek/OpenAI/Anthropic 多模型路由,1,668 行)、Ripple 涟漪引擎(TypeScript 类型级语义分析,1,010 行)、沙箱(Windows Job Object 进程树终止 + 路径守护)、TUI 命令行界面(Ink/React + Token HUD + 11 个命令)。

当时文章结尾的"还没做的"是这样写的:还没接 DeepSeek API key 实测、CodeGraph MCP 在开发中、混合上下文缓存需要更多场景验证。

三个月后回看,这三条全部过时了。这篇文章是补记——从 6 月 16 日到现在的完整时间线。

更名:DeepSeek Code → Orcana Runtime

第一个变化是名字。DeepSeek Code 从一开始就不是"DeepSeek 的官方产品",它是我自己的项目——只是恰好最初围绕 DeepSeek 的模型能力设计。随着 Provider 层扩展(DeepSeek/OpenAI/Anthropic 多模型路由),名字开始失真。于是更名 Orcana Runtime(npm 包 orcana-runtime,CLI orcana),定位也写清了:

model-agnostic agent runtime for evidence-gated recursive self-evolution.

兼容层做得比较克制:旧 DEEPSEEK_* 环境变量启动时自动镜像到 ORCANA_*(API key 类保留原名),旧 ~/.deepseek-code 配置目录保留读取 fallback,旧 bin 别名 deprecated 转发。老用户无感,新名字干净。

版本号从 0.3.4 一路走到 0.8.26.2,门禁从最早的几十个测试到现在 318/318 全绿。

两条计划线:ALK 与 Harness

更名之后,开发进入按计划线推进的阶段。每一条计划线有独立的文档、阶段划分和验收门禁,推完一个阶段 commit 一次,门禁全绿才继续。

ALK(Agent Loop Kernel 重构):把阶段编排器从 loop.ts 里的隐式 if-else 链,重构为显式的阶段体集合(src/agent/kernel/)。L0–L7 全部完成,Golden Trace 保持不变——重构的纪律是"行为不能变,结构可以变"。

Harness 2.0:生产入口强制收敛。所有入口必须走 AgentHarness → LegacyLoopAdapter → agentLoop,直接调用 agentLoop() 被禁止。这条线的重点不是入口本身,而是入口背后装上的那一整套东西——文件状态门、证据链、钩子系统、完成编排器。H0–H12 加 R1 收口全部完成,Harness 线冻结(封版),后续工作在 Graph Runtime(typed execution graph)上继续。

Strong Single v1.0:一次自我收敛

7 月底我做了个重要决策:先不做多 Agent。

当时 T3R(Typed Event 驱动的多 Agent 架构)的计划已经写得很完整——Planner/Coder/Reviewer 三分、协议先行。但我给这个决定按下了暂停键,转而收敛到"强单代理":

  • Runtime bootstrap / 事件边界统一
  • 文件状态机(FreshnessGate):fresh / partial / truncated / deleted 全场景 fail-close
  • HookSystem 2.0:警告累积、链式替换、处理器异常 fail-closed
  • 证据链(CompletionOrchestrator + EvidenceLedger):最终轮真实性检查、提交历史指纹、回滚感知失效
  • PatchTransaction / Rewind:审批快照、冲突回滚、提交即证据
  • 70 个确定性回放场景 + H12 脚本化 E2E(12/12)+ mini benchmark(pass@1 100%,false done rate 0%)

理由很简单:多 Agent 的正确性建立在单 Agent 的正确性之上。一个会"假完成"的单体,拆成三个就是三个会假完成的单体。先把单体做到证据门不撒谎,再谈分工。

这套收敛还带来一个副产品:门禁矩阵。9 个 PR 把 typecheck / core / test / build / replay / benchmark 全部变成可重复、有基线的检查,306→318 项全绿。验收口径也定下来了:代码、测试、运行时接线三者同时在场才算 Done。

LR2:把执行做成协议

Strong Single 收敛完之后,下一个计划线是 LR2(Linux Runtime 2.0)——把"执行"从进程函数升级成协议。

LR2-0 做了 ExecutionGateway 统一入口(Intent/Context/SpecBuilder),run_process / run_shell_script 全部迁移,shadow parity 评测。LR2-1 做的是 execd——一个常驻的 daemon:

  • Unix socket + SO_PEERCRED 进程级认证(不需要 token,内核背书身份)
  • SQLite 13 表状态存储,append-only cell_events,WAL 崩溃安全
  • Cell 状态机 14 态,Submit 幂等,取消/清理真实终止进程树
  • LeaseManager:Acquire/Renew/Release,过期即失效
  • Recovery:非终态扫描收敛,SIDE_EFFECT_UNKNOWN 是终态
  • systemd user service 部署

L1-A 到 L1-H 八个阶段全部完成并验收,318/318 门禁继续全绿。LR2-1 还没完——还剩收尾阶段。

评测与开源

另外两条线也在推进:

评测线(orcana-evals):E2E-001 authority blackout 完成,002–011 排队中(证据衰减、重放分叉、重试级联、lost update、缓存双生、审批漂移……)。每一个都是真实场景的对抗性场景。

OTS(agent-runtime-torture-suite):我把"折磨 agent"的规范做成了开源套件(v0.1,12 条规范冻结),第一个被测对象就是 orcana 自己——结果发现了三个内部测试看不见的缺陷(OTS-002 set -m job-control 逃逸、OTS-003 工作区外写无审计、OTS-005 崩溃后识别而不回收)。拿自己的产品当第一个测试对象,痛,但真实。随后 E2E-001(权威断电)15/15 硬门禁把执行权威命题闭环。

现在的状态

  • 版本:v0.8.26.2,门禁 318/318 全绿
  • Harness 线已冻结,Graph Runtime 是下一站
  • LR2-1 execd 收尾中
  • 模型配置:deepseek-v4-flash 实测运行(代理问题也根治了)

三个月前那篇"还没做的",现在看像一张旧地图。好的一点是:地图上的地方,基本都走到了。