Skip to content

Collie 产品工作流打磨 — 2026-09-06

目标与验收方法

本轮从用户能否完成实际任务出发,检查 agent、连续对话、工具、后台任务及桌面交互。 基线版本为 0c2f4f58。工作时间上限为 2026-09-06 23:04 UTC(开始后 10 小时)。 使用已登录的 Claude Code Max 订阅进行真实测试和实现,不将测试通过等同于真实可用。

每个已解决问题记录触发场景、根因、修改后的行为和可重复验证。 实际模型结果、确定性测试、源码推断分别记录。

工作流 用户应该得到的体验 验证方式 当前状态
第一次提问 已有登录可直接开始,错误给出下一步 隔离配置下的真实模型和 UI 原生 UI 完成;真实反馈后修复标题和多余检查提示
代码修改与验证 完成授权任务,运行必要工具并检查成果 真实 Claude/Collie 对照 两轮编码完成;独立测试通过
连续追问 保持项目、约束和已完成工作 同一会话多轮任务 CLI 含子任务后恢复通过;三种终端入口目录回归通过
长任务 不因隐藏轮数而被迫停工 超过 40/50 轮的场景及真实任务 65 次工具调用回归;真实 Mission 44 轮、Pack 候选 50 轮自然完成
上下文压缩 保留目标、约束、操作结果与下一步 小窗口强制压缩 已完成真实中文压缩和新进程恢复;保留原始 80 条记录
取消与接续 停止及时,不遗失进度或重复副作用 模型、工具中取消与恢复 真实嵌套命令、宿主检查、Live 模型取消通过;未知效果保持隔离
故障恢复 暂时错误可重试,永久错误可理解 超时、断流、限流、工具失败 持久接收、请求重试、附件重启恢复及重复执行回归已整合
后台任务与 agent 协作 结果可追踪,主任务能整合 delegate/Mission/TaskTree 委派隔离;代码 Mission 重构;中途补充需求真实验收通过
桌面交互 进度、输入、权限、结果入口可操作 Playwright 和本地 HTTP 排队、刷新、手机宽度、Mission 专页、Pack 查看应用已实测
原有功能 Live、导出、扩展及 CLI 不退化 完整回归和原生编译 最终结果见文末;Windows 两个原生程序编译成功

第一批执行连续性修复

  • 普通 Harness 默认轮数上限从 50 改为 0,与交互选项一致。显式用户上限仍生效。 脚本模型完成 65 次工具调用后正常回答,共 66 轮,没有第 40/50 轮中止。
  • 对实际内置只读工具记录可安全恢复的执行边界。恢复时补齐缺失的工具结果,说明 哪项读取中断、哪些排队工具没有执行;不自动重放工具,不改写原始磁盘会话。 外部操作、脚本和未经主程序确认的只读声明仍保留副作用核对边界。
  • delegate 改为主任务创建的只读调查:沿用当前模型和连接,继承取消和共享预算, 不再修改全局环境或重新选择账户。子任务不能写文件、执行命令或继续分派; 需要这些操作时由主任务完成。子任务同时看到原始用户要求与主 agent 提议的分工。
  • 子任务记录 parent_run_id,费用计入父任务,汇总只计入父任务以免重复统计。
  • 运行记录区分正常完成、取消、轮数上限、预算上限、输出截断和错误。 success 表示执行正常结束;verified 单独表示实际验证证据,评测器仍可覆盖 success 为任务评分。
  • Auto 验证不再因 auth/fix/test 等主题关键词变成 Required。升级复杂度只读取运行回执; “错误已修复”的普通文字和“没有运行检查”不会伪造失败。
  • 自动 Git 撤销快照使用内部提交身份,不要求先配置 Git 用户姓名和邮箱,不修改 Git 配置。 无身份的新环境下,脏文件、未跟踪文件、HEAD 和暂存区的完整性测试通过。

阶段检查:恢复/轮数 58 项通过;执行循环、权限、持久化及子任务的扩大检查 223 项通过; 统计、控制中心、完成协议与记忆 45 项通过;整合后的路由相关检查 83 通过、1 跳过。 后续原始要求传递和恢复检查 23 项通过。 首批提交前,子任务、检查点、运行选项、Web/CLI worker 和路由整合检查 98 项通过。 路由补丁在隔离工作区完整 pytest 为 2356 通过、10 跳过;最终整合仍需完整回归。

真实 Claude 任务对照

相同初始 CSV 账本需求,分别由 Claude Code 直接执行,以及 Collie 原生循环调用 Claude Agent SDK。 再在原会话追加日期筛选、总计和兼容性需求。两条路径使用独立仓库,未共享修改。 Claude Code 2.1.221,实际模型 claude-opus-5,订阅登录,无 API key 路由。

路径 初轮耗时 接续耗时 接续后主机独立运行 unittest
Claude Code 直接执行 118.86 秒 190.28 秒 61 通过
Collie + Claude Agent SDK 123.20 秒 171.29 秒 43 通过

两个 --json --total 命令均独立得到 Coffee 2.30、Travel 12.50、总计 14.80。 这是小样本可用性检查,不能据此宣称性能优势或所有需求均正确。 继续检查严格日期格式,并进行“子任务调查→主任务修复”场景。

第三轮首次试验的中文提示因测试脚本经过 PowerShell 标准输入编码而变成问号。 发现后终止了该测试的进程树,保留原始记录;该试验不计入任务正确性或耗时对照。 改用直接 UTF-8 写入,并从第三轮之前分支重跑。不能把测试输入损坏误判为模型理解错误。 这次试验另外暴露出未配置 Git 用户身份时自动检查点失败,已修复并通过独立 Git 场景验证。

源码审查中纠正的推断

  • 无工具调用的 assistant 回答作为结束条件,也是多个开源循环的常见机制。 仅凭这个分支不能证明 Collie 经常过早结束,不增加容易误伤正常回答的关键词循环。
  • Web 的 Allow for this run 只承诺本次运行,结束后规则消失符合界面文字。 跨轮持久授权的入口和体验需要单独验证。
  • force_edit 的工具收缩默认仅用于明确启用该选项的评测路径,不能描述成 每个普通用户都会遇到的第 40 轮停止原因。

真实任务反馈后的第二批改进

第三轮有效输入的任务完成了子任务调查、严格日期修复与测试,耗时 220.98 秒;主机独立运行 49 项 unittest 通过,非标准日期 CLI 输入返回错误。它同时暴露了两个必须修复的问题:

  • 子代理继承父级 checkpoint_scope 后,私有会话被写入父级会话文件。这是本轮委派重构 引入的缺陷,不能用任务输出正确来掩盖。现已取消这项继承,并用磁盘会话精确比对回归。
  • Auto 即使已有通过的修改后检查,仍再提醒检查。内部提醒还容易替代原任务成为最后回答的 主题。现有新鲜证据时不再多跑一轮,内部提醒有明确来源,回答继续遵守用户的格式要求。

修复后从干净会话分支重跑只读委派和父级验证,92.3 秒完成。父级记录 72 条消息, 没有子代理的私有提示,没有缺失的工具结果;随后再恢复,9.82 秒完成读取 README 并返回 用户要求的一个中文段落。前一次混入子任务的会话保留作缺陷证据,不当作恢复成功样本。

另有两项实测限制保留:模型曾把检查命令接到 tail 管道后,宿主因此正确地没有认定该次 工具输出为验证成功;模型还曾在测试项目外创建临时 CSV,违背该场景要求。后者是任务 遵循缺陷,不能宣称当前 Project 模式的工作目录等同操作系统沙箱。

第二批提交 66e8f057 还统一了 edited 结果字段,并修复 Mission 将有效但未验证的 answer 判成“无结果”的错误。明确配置缺失时给出实际配置原因,已保存待继续的代码 步骤在活动列表显示进行中。相关检查 121 通过、1 跳过。

界面与终端连续性

真实浏览器首次任务发现标题仍显示 New task、只读问答下出现无意义的“没有执行检查”。 现已让标题跟随会话,验证卡依据实际编辑和检查证据显示,轮数、预算及输出上限保留部分 成果并显示停止原因。界面也显示子任务调查和上下文处理进度。整合后的 UI、运行注册表 和 Web worker 相关检查 85 项通过;其中 20 项使用真实页面、HTTP、SSE 和 Chromium。

进一步检查发现运行中会话的 mirror 监听错误地调用 forEach(...).catch,使完成事件 监听未注册;此外,迟到的历史响应可能覆盖新选中的会话。已修复并补充浏览器重连与切换 场景。内部提醒不再重新显示成用户请求。

CLI、REPL 和 TUI 恢复时现在先解析保存的项目目录,再创建工具和权限范围;TUI 的 /resume 同样切换执行环境。显式 --cwd 迁移会保存新位置和来源。项目目录不存在或 会话 ID 拼错时给出明确错误,不再悄悄启动空会话。第一组相关检查 50 通过、1 跳过; 与循环、检查点等合并检查 118 项通过。

长上下文与再次恢复

新增保留完整原始会话的上下文压缩:模型使用“摘要、用户要求、近期完整工具组”的 投影,磁盘会话保留全部消息。摘要作为低优先级历史交接,不能覆盖系统约束;当前用户 要求保留原文,最近的图片请求跨越切点时保留原始图片。压缩切点不能拆散工具调用和 结果。摘要调用计入实际调用次数及共享预算,支持取消;失败或损坏的检查点回退到原历史。

真实 Claude 长中文任务在受控的较低阈值下触发压缩,估算输入从 22,867 降到 10,823 tokens,40.18 秒完成,磁盘 80 条消息完整保留。最终回答遵守两条中文输出约束,并保留 位于长请求中间的验收编号 LEDGER-LONG-061。随后启动新进程恢复,4.2 秒、一次模型 调用正确返回该编号,没有重新生成摘要。相关整合检查 210 通过、1 跳过。

这不代表摘要可无损代替所有历史:较早图片的视觉细节仍依赖历史描述,旧用户要求同时 依赖摘要和有界原文摘录。超长摘要、无法保全当前要求的切分或没有明显收益的重复压缩 不会被采用。当前默认阈值为估算 48,000 tokens,可在设置中调整。

停止和结束状态

普通消息现在直接进入统一运行流程,不再先额外调用模型分类。真实浏览器复杂审查请求 的停止按钮在约 25 毫秒内可见,取消在约 1.9 秒确认,无页面脚本错误;这是单次本机 实测,不是延迟保证。停止和错误保留已生成的文字及工具进度,不再删除整条回答。 排队后续消息只在正常完成后自动启动,取消、错误或上限不会自动触发下一项。

修复了结束保存清除未知操作边界的缺陷。中断中的内置只读操作可以恢复;可能已产生 副作用的操作保留核对记录,CLI/Web/REPL/TUI 均不能因为保存了部分回答就把它变成 可重放。工具批次中已完成、执行中、未开始的调用分别保留真实结果、未知结果和未执行 说明。Ctrl-C 返回带部分进度的取消结果,同进程后续对话会检查恢复状态。

取消或失败后不再启动新的宿主验证命令;“未运行”证据不会显示成“检查失败”。 中断、压缩、恢复与工作目录相关整合检查 176 项通过,页面与生命周期组合检查 118 项 通过;新文案的繁简体覆盖检查发现缺漏,已补齐。正在继续验证命令执行中的取消,及 跨页面、跨进程的补充消息持久化。

命令执行中的取消

c651c96b 主分支完整回归为 2562 通过、10 跳过,耗时 367 秒。此结果不包含随后 独立工作区中的命令取消改动。

Bash、Grep 在等待命令时检查取消信号,Windows 先给受信任的启动器建立 Job 归属, 再释放实际命令;使用实际 Python 解释器避免虚拟环境启动器抢先派生进程。普通结束时 保留明确后台启动的服务,取消、超时、异常时终止所拥有的进程。未确认终止或后台交接 失败通过宿主字段写入恢复记录,不能只依靠模型读到一条警告。

execute_code 同样支持执行中取消,复用通用进程归属实现。外层脚本结束后给正在退出 的内部工具一个有界收尾时间,保留其部分输出;仍在执行的内部操作继续保留恢复边界。

真实浏览器运行“execute_code → bash → Python → 延迟写文件子进程”,最初出现外层 停止而内层继续运行的失败。排查发现 Windows 的系统 Python 应用别名通过安装管理器 启动进程,普通命令 Job 未覆盖实际解释器。现在仅在默认 python 解析到这种别名时 优先使用 Collie 当前的实际解释器,已选定的虚拟环境及真实 Python 路径保持优先。 同一场景修复后约 0.25 秒确认取消,延迟文件和正常完成标记均未出现,无遗留恢复阻塞; 用户可直接在原会话继续询问,Claude 正确回答前一个命令被中断。

进程归属仍不是操作系统沙箱:显式调用系统服务代为启动程序、POSIX 主动脱离进程组等 路径不能笼统算作已被 Job 或进程组覆盖。实际工具结果和恢复边界必须据此解释,不能 把“已终止所拥有的进程”推广为“外部世界没有任何变化”。

后续整合与实际交付

下列记录补齐前面按时间写下的阶段状态,描述最终整合后的行为。

持久输入、图片与设置

会话执行使用操作系统锁;输入账本先保存后确认,保留请求身份、内容、设置和附件引用。Web 默认排队、显式插话分开处理;CLI、REPL 和 TUI 可以查看待处理请求并手动开始下一条。停止或失败不会自动放行下一项。外部 worker 的首次请求也在传输前写入会话,避免刷新后只有空白进度或中断后缺失原始要求。

图片和 IDE 上下文不再只依赖临时上传缓存。真实实验先接受带图请求、重启本地服务器,再用同一个请求 ID 重试,确认只保存一次;模型正确回答图片计数、颜色和精确上下文标记,随后也能区分历史图片与新图片。一次直接 SDK 实验使用 opus 别名触发冻结模型身份不匹配,未计为成功;使用该实验实际返回的规范模型 ID 后通过。

预算、生成参数、路由及四项敏感能力在接收时冻结。运行开始后不因另一个页面修改设置而改变已接受的条件;摘要、重试、子任务和 Pack 候选仍纳入共享预算。冻结过程本身也经过并发检查:最初两项回归复现读取多版设置、读到部分应用的环境;改为同一版设置快照和互斥应用后,相关 99 项检查通过。没有声称消除了 Live 等旧模块的全部全局设置读取。

Mission 完整目标与中途变更

原始真实代码 Mission 样本耗时 97.8 秒,未修改文件,却出现声称完成代码修改的输出。该失败记录保留在 mission-real.json。专用代码 Mission 现直接调度原生代码执行器,检查绑定实际修改和当前工作树,而不是把旧测试通过当作目标完成。

修复后 mission-v2-real.json 记录 168.42 秒、44 个模型迭代;项目 57 项测试通过。宿主另用原始行为作参照运行 36 个 CLI 参数组合,验证类别筛选与原有 since/total/json 组合兼容。这里的 44 轮是自然完成;默认 0 表示不设固定轮数上限,显式资源和时间限制仍有效。

需求保存在精确账本中,状态里的有限长度摘要只用于展示。Web 新增独立 Mission 页面、可跨刷新保留的草稿、运行中补充和完整需求历史。唯一请求 ID 支持安全重试;新要求应用后,旧的完成证据被标记为过时,完成事务还会检查晚到输入。

mission-notes-real.json 完整走过“暂停时保存说明 → 刷新 → 恢复 → 运行中追加 Unicode casefold 需求 → 完成”。耗时 120.183 秒,两条原文完整保留并应用,6 项独立验收通过。复核另外修正了重试后未释放 SQLite 事务的分支,以及运行中错误禁用补充按钮的问题。桌面与 390px 手机页面均检查,无 JS 错误或水平溢出。

Pack 保存与应用

Pack 选中结果先保存为可验证的差异,再清理候选目录;默认不立即应用时仍可日后查看。新增 Web 查看、刷新、应用和 CLI --saved 入口,查看及应用不调用模型。应用检查基线、路径和内容,遇到冲突保留当前修改,不以覆盖文件来掩盖差异。

pack-review-real.json 的真实两候选任务在 40.376 秒完成;浏览器查看后手动制造目标文件冲突,应用返回 409;恢复该文件基线后应用成功,不相关笔记保留,刷新显示结果已经存在,独立测试通过。较早的大任务样本两个候选分别完成 50 和 46 轮;选中结果另通过 15 项独立 CLI 检查。

外部 Claude Code 连续对话

首次外部 worker 排队实验错误要求文件工具适配器执行 Bash。Claude 如实说明能力限制;后续普通追问又暴露 worker 选择拒绝只读聊天的产品问题。不能把最初未执行 Bash 描述为完成了测试任务。修复后,原先卡住的两条追问在约 6.47 秒完成,沿用同一 Claude 原生会话。

之后使用适配器实际支持的文件工具重新测试:修改 slugify、排队两条追问、刷新并等待完成,共 43.025 秒;3 次运行使用相同原生会话,两个待处理请求各消费一次,独立 3 项测试通过,浏览器无 JS 错误。记录为 worker-edit-v2-real.json。它同时验证了修复前真实发现的“首条请求在刷新时不见”的问题。

另一次 Required 场景记录了宿主确实执行 python -m unittest -q、3 项测试通过、随后两次同会话追问完成。该测试脚本原本假设两条追问都排队,但第一条发送时前一任务已经结束,因此等待两个队列项超时;这是夹具假设失败。保存的执行记录和新开浏览器读取独立核验通过,见 required-readback.json,没有把脚本退出 1 改称端到端测试通过。

统一验证

第一轮最终整合脚本:Python 3236 通过、17 跳过、1 失败,耗时 590.26 秒。失败断言仍要求外部执行开始时会话为空;现在初始请求已经持久保存。断言按新的崩溃恢复契约更新,相关 28 项复测通过。

同一轮脚本还发现两处独立检查问题:平台扫描没有识别 6 行以外的 Windows 返回守卫;旧插话 UI 夹具仍模拟临时 /api/steer 接收。进程启动改为共用平台参数;插话夹具改为真实产品的持久队列 ACK 与执行边界事件,平台扫描及 16 项插话 UI 检查通过。不是把“保存成功”弱化成“已送达”。

第二轮 Python 3239 通过、17 跳过、0 失败,耗时 589.81 秒,但整个统一脚本仍退出 1:独立 runs_registry 集成脚本发现 python -m harness.webapp 将 Web 模块载入为两个实例,执行者和 HTTP 查询读取不同的运行表。这是本轮引入执行管理器后,在直接模块启动方式下暴露的真实缺陷,不能因为 pytest 全绿而略过。

修复为共享同一个模块实例后,真实子进程中的任务在客户端断开后仍被服务端列出并正常完成;独立脚本 12 项检查通过,相关 pytest 60 项通过。这个实际启动方式的集成场景现也进入 pytest,避免以后只在独立脚本中验证。

随后从 python -m harness.webapp 真正启动独立服务,使用真实 Claude 模型重跑浏览器刷新、两条排队追问、工具中取消及手动开始下一项:整套 27.808 秒,停止响应约 0.127 秒,等待中的请求没有被自动启动,未出现延迟完成文件,无 JS 错误。记录见 queue-module-real.json。这次也实际覆盖了修复前彼此分离的运行与取消控制路径。

最终第三轮 tests/run_all.sh 退出 0,所有门禁通过。Python 3240 通过、17 跳过、0 失败,耗时 598.76 秒;通用 GUI 59/59、CLI surfaces 41/41 通过。覆盖代码编译、核心组件、浏览器与编辑器扩展、控制面、渲染器、配对/relay、独立服务入口和完整 pytest 回归。原始日志为 final-run-all-v3.log,便于阅读的 UTF-8 副本为 run-all-final.txt。

两个 Windows 原生程序编译成功,壁纸程序仍有两条既有的未使用字段警告。17 个 pytest 跳过项仍然是未执行项,不计为通过;本轮没有完成其他操作系统的实机验证。各阶段检查数不能相加当成独立测试总数。

最后额外启动的 Claude Code 只读文档核对在 360 秒内未返回结果,未计为验证通过,也未据此推断文档无误。最终指南按本地实现和实际 CLI --help 核对;8 个参考 commit 与克隆清单一致,本地文档链接及 UTF-8 完整性检查通过。

工件目录

临时项目、模型事件、源码固定版本和测试日志位于 C:\workspace\collie-product-2026-09-06,不进入发布包。 开源参考包括 Codex、OpenCode、Pi、OpenHands SDK、Hermes、Goose、Aider 和 Cline; 对应提交记录在该目录的 references/manifest.json,源码结论与目标结构见 Agent Harness 源码对照。