Collie 产品审计 · 2026-09-06¶
产品判断¶
Collie 的优势是把代码执行、持续任务、桌面入口和 Live 协作放在同一个产品里。原来的主要问题是各入口对“收到要求”“正在执行”“已经停止”“真正完成”的定义不一致,用户必须理解内部模块才能判断下一步。更多 agent 或更多入口不能解决这个问题。
改进前,普通短任务可用,长任务和中途变更还不足以让人放心交给它。 实验发现:原代码 Mission 没有修改文件,却用旧项目的绿色测试支持“已修改”的结果;取消嵌套命令后,子进程仍会写文件;Pack 未立即应用的结果随临时工作区清理,用户无法事后查看。这些任务完整性问题,比单次模型速度更优先。
本轮重建了输入、执行、停止、恢复和交付边界,用真实 Claude 会话、浏览器、宿主独立验收和故障回归验证。核心工作流现在明显更可靠;这还不足以宣称所有场景都完善。 长期存储、其他平台实机、不同 worker 的能力和更广泛用户试用仍待完善。
范围与证据¶
- 工作分支
feat/agent-workflow-polish,基线0c2f4f58。用户授权检查、重设计、使用现有 Claude Code 订阅实测及本地提交;未推送或发布。 - 已保留并提交工作区原有的 Live 等改动。此前记录移至 第一阶段 Live 审计,其中分支和测试统计描述当时状态。
- 直接检出并阅读 8 个开源 harness,固定 commit 和源码链接见 架构参考。它不是所有产品的穷尽清单。
- 真实模型使用已登录的 Claude Code / Claude Agent SDK。记录中的 API 等价美元数不代表实际订阅账单。
- 实测脚本、结果、截图和失败复现保存在
C:\workspace\collie-product-2026-09-06。Live 使用手工笔记,图像使用合成素材;未据此声称验证真实音视频质量。
根因与改进¶
| 问题 | 根因 | 改进后的行为 |
|---|---|---|
| 长任务被固定次数截断 | Harness 默认 50 轮,与交互入口不一致;“40”主要是提示策略,不能称为统一硬停止 | 普通循环默认 0 表示不设轮数上限;预算、取消和显式上限仍生效 |
| 刷新、追加要求和后台任务脱节 | 输入依赖客户端或临时队列,执行所有权不统一 | 先持久保存再清空输入;操作系统会话锁;排队和插话有独立身份 |
| 长对话丢约束或破坏工具配对 | 摘要与原始历史混用,压缩会截断用户要求 | 完整历史与模型投影分离;完整工具组切割,保留当前要求并校验摘要来源 |
| 子任务污染父历史、另起预算 | 继承父级保存作用域,计数和取消路径分散 | 私有历史隔离;共享父级模型、取消和总预算 |
| Stop 后命令继续运行 | 只停止外层;Windows Python 启动别名越过进程归属 | 启动前建立受控进程树;宿主检查也可取消;结果未知时保持恢复隔离 |
| Mission 用旧测试证明新需求完成 | 专用代码目标绕回只读规划器;修改、测试和目标缺少关联 | 直接传递完整目标;验证绑定实际修改、已执行的检查和当前目标范围 |
| 新增要求截短、被覆盖或未读先完成 | 有限长度摘要被当作需求来源;完成与追加存在竞争 | 精确需求账本;可重试的保存接口;应用新要求使旧证据失效;完成事务重查晚到输入 |
| Pack 无法稍后交付、覆盖后来编辑 | 候选清理与成果保存混在一起,直接复制工作区 | 保存完整差异后再清理;Web/CLI 查看并应用;基线冲突明确拒绝 |
| 设置改变排队任务执行条件 | 运行中反复读取共享环境 | 接收时保存预算、生成参数、路由及四项敏感能力;原生循环、摘要、子任务和 Pack 沿用本次限制 |
| 外部 Claude 普通追问卡住 | 路由到聊天后拒绝只读任务 | Claude Code 用同一原生会话和只读工具承接追问;不支持的 worker 仍说明限制 |
| 外部 worker 首条请求刷新后消失 | 执行结束才保存初始交换 | 首条请求也在执行前写入会话和恢复记录 |
| 直接模块启动时进度与执行脱节 | __main__ 与导入的 Web 模块拥有两套运行表 |
统一模块实例;独立服务下的真实队列、刷新和 Stop 复验通过 |
| Live 停止慢、结果串会话 | 取消未传入实际模型,异步回写缺少会话归属 | 取消传播至调用;音频和分析有领取身份;停止后可回顾导出 |
用户现在能完成的主要流程¶
连续做任务。 工作时可以输入下一项要求,看到已保存队列,刷新后继续。正常完成后可接续下一项;Stop 停住自动接续,之后由 Send next 开始下一项。插话只有进入模型边界后才显示“已送达”,不会把保存成功冒充模型已经读过。
持续 Mission。 Tasks 打开有独立地址、进度和补充输入的任务页面。草稿跨刷新恢复;暂停期间保存要求不会启动任务;运行中仍可追加;历史显示待处理、已读取或拒绝及原因。原始要求与后续变更各自保留,代码报告可以完整阅读和复制。
查看并采用候选实现。 Pack 未立即应用也会保存结果。当前文件与基线不一致时说明冲突,保留当前文件和保存结果;不相关编辑不被覆盖。
判断成果。 只读回答不再显示无意义的代码检查失败。修改、运行了测试、测试通过和任务完成分别有证据。用户可选择 Required 检查;检查通过仍只证明该检查覆盖的范围。
关键真实验收¶
| 场景 | 实际结果 |
|---|---|
| 两轮代码任务与接续 | 直接 Claude / Collie 的独立测试分别 61 / 43 通过,样本 CLI 金额一致;不据此排名性能 |
| 委派后恢复 | 49 项项目测试通过,随后 9.82 秒恢复并按中文段落回答;父子记录隔离 |
| 压缩与重启 | 保留完整 80 条记录;模型估算上下文 22,867 → 10,823;新进程找回中段精确标记 |
| 嵌套命令 / 宿主检查取消 | UI 场景约 0.361 / 0.119 秒停止,延迟写入标记未出现 |
| 图片与 IDE 上下文跨服务重启 | 合成图形计数、精确上下文标记正确;重试旧请求 ID 未重复入队 |
| 代码 Mission | 168.42 秒、44 轮;57 项项目测试及 36 个独立 CLI 组合通过 |
| Mission 中途变更 | 120.183 秒;暂停保存、刷新、运行中追加成功;6 项独立 Unicode/顺序/文档验收通过 |
| Pack 查看、冲突、应用 | 40.376 秒、2 候选;制造冲突返回 409,恢复基线后应用成功 |
| Claude Code 修改和两条追问 | 43.025 秒;刷新正常;3 次运行沿用同一原生会话,3 项独立测试通过 |
| 独立服务启动后的完整队列流程 | 27.808 秒;刷新、两条追问、Stop 和手动接续通过,停止响应约 0.127 秒 |
| Live 笔记和停止 | 两次实际摘要完成;停止由 11.062 秒降至约 0.111 秒,导出保留 3 条笔记 |
最终统一检查 tests/run_all.sh 退出 0:3240 项 Python 测试通过、17 项跳过;GUI 59/59、CLI 入口 41/41 通过,两个 Windows 原生程序编译成功。完整验证与阶段失败说明见 工作流记录。失败样本保留,没有覆盖成成功记录。
后续优先级¶
- 存储。 会话 JSON 仍整文件重写;附件有限额但没有完整生命周期和可见清理工具。下一阶段应迁移到追加日志、索引和经过引用检查的回收。
- 配置隔离。 本轮重点是预算、生成参数和四项敏感能力。Live 和若干旧模块仍读取全局设置,尚未消除全局状态。
- worker 能力一致性。 当前 Claude Code 外部适配器使用文件工具白名单,不能任意执行 shell;可使用原生 Collie,或配置由宿主执行的 Required 检查。目录和工具白名单不是操作系统沙箱。
- 跨平台实机。 真实测试在 Windows。代码审查与跳过项不等于完成 macOS、Linux 实机验收。
- 用户试用。 主要入口仍需围绕“现在做什么、等什么、结果在哪里”收敛,继续简化设置、活动和恢复术语。
- 持续评测。 把需求变更、取消、崩溃、长上下文和候选冲突整理成固定任务集,保留真实模型的失败和耗时分布,不只收集成功截图。
下一阶段优先收敛数据与配置边界,开展用户实测,建立持续任务验收;更多并发可写 agent、隐藏重试和入口数量不应成为进步指标。