
这篇记录三次真实返工以及我后来怎样给“已完成”补证据做 Nameo 知识卡片解析时我有段时间经常对 AI 说我去大哥你咋又改出问题来了之前不是改好了吗PDF 不能只按一个扩展名处理。文本型 PDF 可以直接抽文字扫描件要走图片和 OCR图文混合文件还要保留页面、图片和表格顺序。实际改起来经常是这样扫描件识别不好补了页面渲染和 OCR再测文本型 PDF阅读页又退成了纯文本把页级预览补回来表格或混排内容接着出问题。改好这一类再拿旧样本回归熟悉的问题又出现了。这张图把几次返工按发生顺序画到了一起。上一篇《一个多跳问题让我返工RAG 还是 Agent》讨论的是 AI 应用怎样选聊天、RAG、Workflow 和 Agent。这篇换一个问题AI 写完代码以后我凭什么相信旧功能没有被它顺手改坏设计稿改对了MCP 取回来的还是旧图PDF 解析只是其中一处。做 UI 还原时设计师已经在 Figma 里改了资源我通过 Figma MCP 下载拿到的还是旧版本。每次都得先变动一下对应资源或节点再重新下载才能拿到最新内容。代码没错设计稿也没错输入给开发链路的“事实”过期了。这件事和 PDF 回归放在一起看问题就比较清楚了AI 会忘记之前修过什么工具可能提供旧输入一个局部补丁也会影响相邻格式。Prompt 里加一句“请不要破坏已有功能”并不能告诉它“已有功能”具体包括哪些样本、入口、设备和失败态。规则写得越来越长我还是不敢信“已完成”我最初也靠补 Prompt。漏了什么就往规则里加文件别太长View 不要直连 DAO资源名用小写亮暗色 Token 成对公共能力要从 Index 导出。规则越来越多执行和验收却还是同一个模型。它读完规则、改代码、自己检查最后再告诉我已经完成。随着项目变大我遇到的返工也开始重复上下文记不住旧能力被重新写一套刚修好的格式又退化。那时我开始找怎样管理大型 AI 开发看到 Harness Engineering 的文章才顺着这个方向研究并落到 Nameo。我把这套项目内的完成检查叫作 Harness。validate-all执行静态门禁构建、接口、真机和交付报告分别交给专项验证。Prompt 继续负责告诉 AI 要做什么。Harness 负责拿规则、退出码和证据检查它做到了哪一步。改一个 Logo门禁先把我拦住了26年5月我在处理 Pad 深色导航。左上角要恢复正确的分层应用图标左下角继续保留原有 SVGA 动效未选中的聊天图标还要使用 Pad 自己的资源不能影响 Phone。补丁完成后A1.4 文件行数检查失败了。PadNavRail继续堆逻辑超过了项目约定的组件行数上限。我当时在想改个 Logo 怎么又牵出一堆事情后来没有删规则也没调大上限只是把品牌 logo 拆成PadBrandLogo.ets让导航只保留自己的职责再重新构建并补真机证据。关键结果如下[FAIL] A1.4 文件行数检查 PadNavRail.ets超过项目约定的组件行数上限 exit code: 1 拆出 PadBrandLogo.ets 后 [PASS] A1.4 文件行数检查 PadNavRail.ets238 行 baseline compare新增失败检查项 ID 0250 行是 Nameo 按组件复杂度设置的项目门禁。换到其他项目阈值要根据组件职责重新定Logo 好不好看则继续看设计稿和真机效果。一句“完成”至少要对上相应证据后来我不再只问“做完了吗”而是把每种结论对应的检查写清楚。要验收的结论先检查接着检查工程规则通过静态门禁、退出码、违规明细目标产物能否构建目标模块可构建HAP/HAR 或后端构建成功应用能否启动并进入目标页面页面改动已经生效目标设备启动、页面截图必要时补 UI tree点击后的接口、落库和列表刷新删除、恢复、支付或同步成功最终状态、接口/日志、列表刷新或真实样本重试、恢复和异常路径可以交给下一位开发者规格、报告、证据路径后续维护者能否复跑同一套检查这次 Pad Logo 改动实际跑了静态门禁、common/phone/pc 构建并在 Pad 真机进入目标页面检查结果。以后写到 IAP、跨设备同步等专题时我会分别使用沙盒订单和两台设备做验收输入。图里按静态门禁、构建、真机和业务结果分层每一层只回答一个问题这份证据能支持什么结论。Pad Logo 这次走到了真机层。我后来把几种证据分开使用build 检查产物能否生成随后启动目标 HAP 并进入改动页面截图和 UI tree 记录页面与控件状态接口日志和列表刷新继续检查真实数据结果hilog 用来定位黑屏、权限和接口错误所有证据都要和本次 change、目标页面及操作路径对应起来。OpenSpec 先定义“怎样才算完成”自动脚本能稳定执行但它得首先知道要检查什么。如果把“PDF 解析完成”写成接口返回 HTTP 200脚本会通过用户仍可能只看到几行乱码。Nameo 的内容解析 OpenSpec 后来把完成条件改成“可阅读包已经准备好”并拆成五项验收AI 使用的analysisText是否准备好用户阅读所需的页面图、图片、表格或 Markdown 是否准备好关键资产是否可访问通知后第一次打开是否仍在做重活失败发生在上传、结构解析、OCR、资产落盘还是首屏准备。OpenSpec 记录为什么改、改到哪里、哪些内容不在范围内以及验收条件。规格如果写错自动化只会稳定地验错。项目里的责任链可以压成四步OpenSpec 定义承诺 ↓ Harness 检查可机械判定的边界 ↓ 构建、接口和真机提供运行证据 ↓ 报告汇总结果、证据路径和执行记录静态验证用 0/1 表示通过或失败baseline compare 区分历史失败与本次新增失败专项 full-goal verifier 在运行证据齐全时输出COMPLETE缺少证据时输出NOT COMPLETE并列出具体项目。baseline 先拦住本次新增问题老项目第一次接门禁通常会带着历史问题。如果要求一天内全部清零规则很容易被绕过如果全部忽略新门禁也没有意义。Nameo 的做法是修改前生成 baseline snapshot记录已有失败修改后 compare出现本次新增 FAIL 就阻断。历史债不算通过但可以单独治理。修改前A1.4、A1.5、A2.3 已失败 修改后A1.4、A1.5、A2.3、A3.1 失败 结论A3.1 是新增 FAIL本次不能交付接入早期曾保留 6 个历史 FAIL同时要求每次修改的新增 FAIL 为 0。历史 FAIL 继续进入技术债清单本次新增问题则由 compare 直接拦住。后续安排baseline v2 改到 violation 粒度当前 baseline v1 比较失败集合时只保留 A1.4、A1.5 这样的检查项 ID没有比较每条具体 violation。baselineA1.4 FAIL - OldPage.ets 超行 currentA1.4 FAIL - OldPage.ets 超行 - NewPage.ets 也超行从具体违规看NewPage.ets是新问题从 ID 集合看前后都是{ A1.4 }“新增失败检查项”仍可能是 0。这次读代码时我把它记录成 baseline v2 的改进项为每条违规生成稳定 key。ruleId repoRelativePath entity violationKind ruleVersion行号、阈值和完整 message 作为展示字段不直接参与身份指纹。规则本身不能生成稳定 key 时先解决规则输出不能直接拿整行错误文本做 diff。可以从一份很小的完成合同开始不必第一天就搭完整云流水线。下面是我根据 Pad Logo 这次交付整理的字段模板替换字段后就能用于其他改动change:pad-brand-logoscope:Pad 深色导航 Logobaseline:report:tmp/harness-baseline.jsongates:static:status:passreport:tmp/harness-current.jsonbuilds:-target:commondefaulttask:assembleHarstatus:pass-target:phonedefaultdeviceScope:Phone / Pad 共用产品 HAPtask:assembleHapstatus:pass-target:pcdefaulttask:assembleHapstatus:passruntime:deviceClass:Pad 真机path:首页-左侧导航screenshot:tmp/pad-brand-logo-final.pngui_tree_simple:tmp/pad-brand-logo-ui-tree.txtresult:ready_for_review字段叫什么不重要。下一位开发者需要知道改了什么、跑了什么、在哪类设备验证、证据在哪里以及怎样复跑。静态门禁失败时写blocked设备启动被拦住时写runtime_blocked只完成构建时写build_passed下一项任务就是补真机验证。等本地规则稳定再把退出码、JSON 报告和构建命令接入 CI/CD。最小执行顺序也要留在记录里修改前生成 baseline完成修改后重新验证并 compare任一步退出码非 0 就停止交付。报告、截图和日志跟着这次 change 保存不能只在聊天窗口里说“我跑过了”。复盘PDF 解析反复回归、Figma MCP 取得旧资源、Logo 修改触发行数门禁来源不同处理办法却指向同一件事项目变大以后不能再靠人或 AI 的记忆维持一致性。Prompt 说明要做什么OpenSpec 定义完成条件Harness 执行检查构建和真机给出运行结果。静态门禁、构建和真机验证各司其职。后续接入支付和跨设备专项验证时我会分别用沙盒订单和两台设备作为验收输入不拿页面截图代替真实业务结果。下一篇继续看一个更麻烦的事故本机检查和接口创建都成功用户轮询却随机拿到 404。任务没有消失它被保存在另一个 PM2 worker 的内存里。