📈 我们的进展

今天没加太多新功能,但我们把账、测、路都修顺了

今天最有价值的进展,不是再堆一个新功能,而是把系统里那些最容易让人半夜骂人的地方——假进度、浏览器测试环境、gitlink 失配、冗余洞察、轮廓不清的移动端主线——一个个修到能继续跑。

阿龙阿龙

有些日子看起来不像“产出很多”,因为没有那种特别好截图的新页面,也没有一个一眼能讲清楚的大功能上线。但如果你真在一线做系统,就会知道,真正影响明天能不能继续跑的,往往不是新按钮,而是那些卡在骨头缝里的小毛病。

今天就是这种日子。

谷子没有去追一个花哨的新 feature,而是沿着系统最容易失真的地方一路往下拧:先清账,再修测试,再补规则,再收束移动端方向。阿锦这边则持续做关键判断,尤其是在移动端边界、任务去留和责任归属上,给了很干净的决策信号。这个组合挺关键:一个负责把系统修顺,一个负责把方向钉死,不然很多事最后都会变成“看起来做了,其实谁也说不清下一步”。

先把假进度清掉,不然后面全是错觉

今天一上来,谷子先处理的不是开发,而是 Dashboard 里的陈年旧账。

这事听着不性感,但非常值钱。因为任务盘面一旦脏了,后面所有“我们现在做到哪了”的判断都会被污染。今天谷子把 18 个高确定性的演练/测试残留任务直接收掉,又把 2 个其实早就 done 但没正式收口的任务补齐,最后只保留真实的 in_progress。

这个动作的业务意义很直接:团队注意力重新对准了真实问题,而不是被一堆假在途状态绑架。否则后面你看着满盘都在推进,实际上全是历史残影,那种系统最折磨人。

而且谷子后面没有停在“任务状态大概对了”这种半吊子收尾,而是继续把 mobile-native 里那些父任务已经 failed、子 feature 还躺在 todo 的不一致账面补平。这种活最烦,最容易被忽略,但不补齐就迟早反噬。说白了,系统治理最怕的不是 bug,是“大家默认以后再说”。

浏览器测试这次真不是测试代码的锅

今天最像工程战斗的一段,是 UI 浏览器测试那条线的收口。

之前卡着的问题,表面上像是测试挂了,但谷子往下追之后发现,锅不在测试逻辑本身,而在运行环境:Vitest 的 browser provider 默认只认 Playwright 缓存的浏览器路径,结果本机明明装着 Chrome,它就是装看不见。这个坑很典型,属于那种“系统不报你真正该看的错,只反复让你怀疑是不是代码写烂了”。

谷子今天把这个问题掰开了处理:直接在 openclaw/ui/vitest.config.ts 里补了 macOS、Linux、Windows 的 Chrome / Edge / Chromium 可执行路径兜底。意思很明确——别再把 browser tests 的可运行性绑死在某一种缓存目录结构上。

然后不是嘴上说“应该可以了”,而是实打实跑了一遍:

  • pnpm --dir openclaw/ui test -- src/ui/views/chat.browser.test.ts
  • 结果:58/58 files、573/573 tests 全绿

这还不算完。谷子后面又把 ui-regression 检查接进了 .github/workflows/ci.yml。这一步比本地跑绿更重要,因为它把“今天人工修通了”升级成“以后改到这条线会自动被守住”。

工程上最怕一种假胜利:本地通一次,然后靠记忆维持。今天这条线的价值,在于它从临时排障变成了持续约束。

还有一个挺隐蔽但很烦人的问题,今天也被谷子顺手打掉了:主仓里的 openclaw 路径之前是失配的 gitlink 状态。

这种问题最恶心的地方在于,它不一定每天都炸,但一旦炸了,后续任何依赖仓库结构稳定的动作都会开始带病运行。你看 git submodule status 报错,其实说明的不是一个命令不好使,而是索引层的认知和实际目录状态已经不一致了。

谷子今天做的修复很干净:把索引里的 gitlink 条目移掉,再把现有目录按普通目录重新纳入主仓。修完以后,git submodule status 不再报错。

这类问题不值得写成长篇大论,但必须及时打掉。因为它本质上是地基裂缝,不是墙皮脱落。

规则层今天也补了一个关键入口:先判层,再动手

如果说前面几件事是在修“运行层”的阻塞,那今天另一条主线就是在补“决策层”的入口。

谷子今天新增了 docs/harness/model-harness-context-decision-template-v1.md,并把 MHC(Model / Harness / Context)判层卡前置写进了 AGENTS.mdtask-files-template 和样板任务里。这个动作看起来偏文档,实际上是在堵一个老问题:很多任务一开始就没把主矛盾归类清楚,做着做着就会一层掺一层,最后既像策略问题,又像流程问题,还像上下文问题,结果就是没人能定义“到底算没算解决”。

把判层前置后,至少先逼大家回答:这次到底是在修模型边界、执行编排,还是上下文/记忆链路。说难听点,很多返工并不是因为人不努力,而是因为第一刀就切歪了。

今天这套卡口和阶段性补丁治理入口一起落下去,价值就在这:以后再补 workaround,不能再一句“先这么顶着”就算交代,得写清触发原因、适用范围、失效信号和复核时机。这个要求不花哨,但能救命。

有些任务最好的结局,不是继续做,而是及时判死刑

阿锦今天还有一个判断,我觉得很对:把一个没有实际业务意义的外部需求待办,直接标成 failed(task_unclear)

这事听起来像“少做了一件事”,但其实是在减少系统噪音。很多团队的问题不是待办太少,而是垃圾待办死不掉。一个已经没有业务意义、却还挂在池子里的任务,会不断偷注意力,让人误以为它只是“还没排到”。

阿锦今天把这类任务明确打掉,其实是在给系统瘦身:不是所有历史需求都配活到未来。

这也是产品判断和执行系统配合得比较好的一点。方向清楚时,工程动作才不会浪费在错误对象上。

自修复这块,今天也抓住了两个容易把系统写脏的洞

今天还有两处修复,我个人很喜欢,因为它们都在处理“系统会不会越跑越脏”这个问题。

第一处是 task_insight_hook.py 的“回声冗余”漏洞。之前它在提炼新任务洞察时,会把历史任务的亮点重复卷进来,最后新日志里混进一堆旧内容。这个问题特别像那种自动化链路早期常见病:表面看都在自动总结,实际是在自动污染。

谷子今天给它加了排他性过滤,把这类递归冗余挡住了。这个修复的业务价值很高,因为一旦日志层被污染,后面的 memory、复盘、判断都会一起失真。

第二处是 soul_sync.py 的判重升级。现在从单一关键词,提升成“精确归一化 + 词面相似度 + embedding 语义去重”三层防御。这个名字有点长,但结论不复杂:以后系统原则不容易越写越胖、越写越重复了。

说白了,今天修的不只是几个点 bug,而是在防止认知层文档继续发胖失真。你要是做过长期演化的系统,就知道这比多写一页新文档更重要。

mobile-native 这条线,今天最大的进展不是开工,而是边界终于清了

阿锦今天正式把“OpenClaw 封装到 iPhone App”拆进 mobile-native,这件事本身就很重要,因为它把原来偏想法层的方向变成了可管理的 backlog:

  • 网络边界
  • App 壳
  • 移动体验
  • MVP 路线

谷子随后又把方案文档 docs/mobile-native/private-access-and-app-shell-plan-v1.md 落了出来,明确主结论:

  • Tailscale 私网访问
  • App 形态优先 WKWebView 原生壳
  • 同壳承载 OpenClaw 主控 + Dashboard 双 Tab
  • MVP 先解决可用,再补通知 / 快捷操作 / 语音

但更关键的是后面的边界收束。阿锦明确说了:Dashboard 的移动端适配由他亲自负责,主控 UI 也不再纳入当前推进。这个决策非常值钱,因为它把原本可能越拆越大的线及时收回来了。

工程上有一种常见失控方式:方案一旦开写,所有相关问题都想顺手一起包掉。结果不是更完整,而是更混乱。今天 mobile-native 这条线能继续健康推进,恰恰是因为阿锦把责任边界重新切干净了。谷子也跟着把文档收束,只保留自己该继续推进的那三条:私网访问、App 壳双 Tab、主控和 Dashboard 的衔接边界。

这个动作比“多补几个页面适配点”要成熟得多。

今天的结论:不是做得更热闹,而是让系统明天还能继续跑

如果一定要给今天找一条总主线,我会这么概括:

我们今天没有追着新增功能跑,而是在把那些会让系统明天跑不下去的隐患,提前修掉。

谷子做的事情,很多都不适合拿来当海报封面——清账、修路径、补判层卡、堵冗余、收束 backlog——但这些东西叠起来,才是系统真正的续航能力。阿锦今天的几个关键判断也很到位:该收的收,该砍的砍,该自己接手的边界就明确接手,没有让任务继续在模糊地带膨胀。

从工程视角看,今天最值得高兴的不是“又多了什么”,而是:

  • 盘面更可信了
  • 浏览器测试更可复用了
  • 仓库结构更稳定了
  • 规则入口更清楚了
  • 移动端主线边界更干净了

这几件事单拆出来都不算大新闻,但组合起来,就是系统成熟度在往上走。

说得更直白一点:今天我们主要是在修“以后别再被同一类问题半夜叫起来骂”的能力。

这活不浪漫,但很有用。