Refactor: Deepen Campaign Intelligence, Read Model, and Runtime #2

Closed
opened 2026-08-10 08:10:36 +00:00 by solahqb · 2 comments
Owner

Refactor: Deepen Campaign Intelligence, Read Model, and Runtime

Problem Statement

AgentEvalTool v0.8.0 已完成 Channel、Intelligent Evaluation 生命周期、Campaign 耐久身份和 Intelligent Evaluation 读模型的第一轮 deepening,但近期评估活动相关演进仍在三个 seam 上泄漏知识。

第一,智能分析与周期对比分别掌握耐久排队、进程内任务启动、执行状态、Session 生命周期、失败落库和重启恢复的完整顺序。现有异步作业 Repository 只复用少量查询,真正高风险的 DB/async 编排仍散落在两个调用方。

第二,评估活动列表、详情、报告、时间线、智能分析、周期对比与 Markdown 导出分别拼装 Campaign、child Run、场景、评测对象和探索发现。前端评估活动页还独立维护多组请求、polling 与局部快照。现有活动 view 已形成雏形,但 interface 覆盖不足。

第三,评估活动耐久运行时已经隐藏 claim、tick、恢复和完成逻辑,但 external interface 仍暴露多个 implementation 阶段。生命周期、启动代码和测试需要学习 Session、时钟、cancel event、tick cadence 与恢复顺序,module 的 depth 仍可提高。

Solution

按依赖顺序完成三次 deepening:先建立评估活动智能作业 module,统一智能分析与周期对比的耐久状态编排;再深化评估活动读模型,集中所有稳定 projection,并深化前端现有读取 module;最后收窄评估活动耐久运行时 interface,把 claim、恢复、tick、完成与进程内句柄保留在 implementation 内。

第四个候选——Campaign 与 Intelligent Evaluation 的条件写入分类——只保留为删除测试验证门。除非能证明一个小 interface 可以隐藏显著 implementation,且至少两个 adapter 不需要暴露领域状态与字段映射,否则不创建新 seam。

整个重构不改变领域口径、现有 HTTP 契约、数据库权威关系、管理后台信息架构或部署拓扑。

Commits

Phase 0 — Lock observable behavior

  1. 记录当前活动智能作业的状态契约。 用 characterization tests 固定手动触发、自动触发、重复触发、缺少模型、生成失败和成功落库的可观察结果;保持生产代码不变。

  2. 记录当前重启与关闭行为。 固定 queued 作业、遗留 generating 作业、进程内任务幂等启动和应用关闭收敛行为,并明确哪些状态可以自动恢复、哪些状态必须显式失败。

  3. 记录活动读取契约。 为列表、详情、报告、时间线、分析、周期对比和 Markdown 导出保存响应形状与关键领域口径,确保后续移动知识时外部行为不变。

Phase 1 — Deepen durable Campaign intelligence jobs

  1. 定义统一的耐久作业领域状态。 收敛 queued、generating、completed、failed 的含义、允许迁移、触发来源、失败信息长度和更新时间语义;智能分析与周期对比使用同一状态词汇。

  2. 增加最小恢复元数据。 为作业记录补充区分首次执行与重启恢复所需的最少信息,并增加迁移与全新数据库一致性测试;不引入通用队列产品或分布式锁。

  3. 建立条件认领的 persistence implementation。 queued 作业只能被一次执行认领;重复认领返回类型化结果。用两个独立 Session 验证竞争认领不会派生两次领域工作。

  4. 建立统一失败结算。 把异常归一、错误截断、回滚和 failed 落库收进作业 module;调用方不再分别复制 try/except 与状态写入顺序。

  5. 建立统一成功结算。 领域工作返回结果后,由作业 module 原子写入 completed 状态与结果;验证旧错误和中间状态不会残留。

  6. 接入智能分析工作 adapter。 保留模型解析、失败样本、两阶段分析和自动周期对比判断;移除智能分析调用方对 Session、TaskRegistry 和状态迁移的直接掌握。

  7. 接入周期对比工作 adapter。 保留基线选择、机械 diff 与演进叙述;先持久排队再启动,不再从 HTTP adapter 或智能分析 module 直接启动裸进程任务。

  8. 统一进程内启动与幂等。 让耐久作业 module 独占 TaskRegistry 使用方式;相同作业正在执行时重复触发只观察同一任务,不创建第二个模型调用。

  9. 统一启动恢复。 服务启动时先处理遗留 generating,再恢复 queued。恢复策略必须有上限,避免持续崩溃形成无限模型调用;测试覆盖崩溃发生在排队后、认领后和结果提交前的窗口。

  10. 统一关闭收敛。 Web 生命周期只关闭一个评估活动智能作业 owner,不再分别导入智能分析与周期对比 registry;取消进程任务后,数据库状态仍由恢复规则解释。

  11. 删除旧异步作业编排。 移除重复的 start、enqueue、resume、upsert 和 orphan 清理路径,只保留领域工作 adapter 与新的 deep module;将测试迁移到统一 interface。

  12. 记录耐久作业决策。 新增或修订 ADR,说明数据库状态是作业权威、TaskRegistry 只保存进程句柄、恢复上限、重复模型调用风险及单进程部署假设。

Phase 2 — Deepen the Campaign read model

  1. 定义稳定的活动 projection。 分别固定列表、详情、报告、时间线、智能分析和周期对比的领域形状;保持现有 HTTP 字段和 ADR-0002/0004 统计口径不变。

  2. 批量构建活动列表 projection。 消除按 Campaign 逐条读取 child Run 的查询方式;增加空列表、多活动和查询数量回归测试。

  3. 集中活动详情与 progress。 把窗口位置、spawned/completed Run 计数及终态信息收进读模型;调用方不再选择两个 progress helper,但外部列表与详情值保持兼容。

  4. 集中报告与时间线 projection。 让场景名称、child Run 聚合、探索发现和时间线排序在同一读 module 内形成稳定快照;纯统计函数保留为 internal seam。

  5. 集中智能分析与周期对比 projection。 模型标签、自动基线、生效基线和机械 diff 由读模型统一投影;分析与周期对比领域工作不承担呈现形状。

  6. 让 Markdown 导出消费同一 projection。 删除 router 中对周期对比结果的二次重塑,验证 JSON 页面与 Markdown 导出引用同一活动、基线和模型信息。

  7. 迁移 HTTP adapter。 所有评估活动读取端点只负责请求验证、not-found 翻译和响应序列化;删除跨 repository 拼装知识。

  8. 深化前端现有活动读取 module。 集中列表加载、报告快照、时间线、智能分析、周期对比、初始失败、silent refresh、状态感知 polling 和迟到响应过滤;不创建平行读取体系。

  9. 增加前端读取状态测试。 沿用 Intelligent Evaluation 的 reducer/hook 先例,用 fake adapter、fake timers 和延迟 Promise 验证活动切换、终态停轮询、silent failure 保留完整快照及过期响应不覆盖当前选择。

  10. 迁移评估活动页面 renderer。 页面只保留表单、Drawer、表格列和展示交互;移除请求编排与跨快照 setter,保持 keep-alive、分页、反馈和现有布局。

  11. 删除旧读取 helper 与重复类型。 只在新 interface 覆盖全部调用方和测试后删除旧 helper;保留仍被其他页面使用的 transport 定义。

Phase 3 — Narrow the durable Campaign runtime interface

  1. 建立生命周期级运行时契���测试。 从创建、取消、恢复和完成这些生产调用面验证 durable claim、取消优先、pending 恢复、running 中断和自动分析触发;减少直接调用内部阶段的测试。

  2. 把时钟变成 internal seam。 生产 adapter 使用真实 UTC 时钟,测试 adapter 使用可控时钟;生命周期调用方不再传递 elapsed seconds 或理解窗口映射。

  3. 把 child Run 执行变成 internal seam。 保留真实 EvalEngine adapter 与测试 fake adapter;claim identity、pending/running 恢复规则仍由运行时 implementation 掌握。

  4. 收进 tick 与 reconcile 顺序。 运行时自行保证先恢复、再决策、再 claim、再完成;外部调用方不再组合这些阶段。

  5. 收进进程任务句柄。 启动、取消、恢复和关闭通过同一个运行时 owner 协调;Campaign lifecycle 只表达领域意图,数据库继续作为唯一状态权威。

  6. 迁移应用启动与关闭。 Web 生命周期只调用 Campaign runtime 和耐久智能作业 module 的高层操作,不再导入具体 registry 或 runner 内部函数。

  7. 收窄并清理旧 external interface。 将 advance、reconcile、loop 等阶段降为 implementation 或 internal seam;生产调用方与主要测试只穿过新的 runtime interface。

  8. 修订 Campaign ADR。 记录 runtime seam、时钟与执行器 adapter、DB 权威、TaskRegistry 角色,以及为何不改变 OpenClaw 与 Campaign 的既有职责划分。

Phase 4 — Conditional-write deletion gate

  1. 执行条件写入删除测试并记录结论。 对比两个领域的条件更新知识,量化新 interface 必须暴露的状态、字段和事务副作用。若删除假想 module 只恢复少量 SQL 模板,则明确拒绝抽象;只有复杂度显著回流且 interface 保持小而稳定时,才另开独立计划。

Final acceptance

  1. 运行完整回归。 执行后端全套测试、前端单元测试、类型检查、生产构建、ruff 检查和迁移升级/降级演练;不在本阶段修复无关失败。

  2. 执行部署前演练。 在生产数据库副本上验证迁移、作业恢复与活动读取兼容性;确认前端生产产物已更新,并通过健康检查与关键活动读取路径。

Decision Document

  • 实施顺序固定为:耐久智能作业 → 活动读模型 → 活动耐久运行时。
  • 智能分析与周期对比是耐久作业 module 的两个真实工作 adapter。
  • judge 抽样复核暂不接入该 module,因为它没有独立 queued 行和重启恢复语义;未来形成相同语义后再评估第三个 adapter。
  • 作业数据库状态是耐久权威;TaskRegistry 只保存当前进程中的任务与取消句柄。
  • queued 作业可恢复;遗留 generating 作业按有上限的恢复策略处理,禁止无限自动重试。
  • 模型解析、提示词、结构化结果归一和领域校验留在各自工作 adapter,不进入通用作业 implementation。
  • Campaign 读模型是活动 projection 的唯一组合 seam,HTTP adapter 不直接跨多个 Repository 拼装响应。
  • 列表、详情、报告、时间线、分析、周期对比和导出保留现有外部契约。
  • 读模型可以内部复用纯统计函数,但这些 internal seam 不暴露给 HTTP adapter 或前端。
  • 前端深化现有活动读取 module,不建立第二套缓存或引入 React Query/SWR。
  • Campaign runtime 吸收 claim、恢复、tick、完成与任务句柄顺序;纯 scheduler 保持无 I/O。
  • 数据库继续是 Campaign 唯一权威;取消后的新 claim 必须失败,已开始的 child Run 允许完成。
  • OpenClaw、Exploration Session、Intelligent Evaluation 与 Campaign 的领域关系保持不变。
  • 条件写入共性不进入当前生产重构;候选 4 必须再次通过删除测试后另立计划。
  • 如需新增数据库字段,必须同时提供 Alembic upgrade、downgrade 与全新数据库 parity 测试。
  • 每一提交必须保持仓库可运行,不保留跨多个提交才能工作的临时双 interface。

Testing Decisions

  • 好测试穿过生产调用方使用的同一 interface,断言可观察结果、持久状态和领域事件;不检查 TaskRegistry 私有字典、Repository 内部调用次数或 runner 阶段函数的调用顺序。
  • 耐久作业测试使用内存 SQLite、fake 工作 adapter 和可控 TaskRegistry,覆盖排队、竞争认领、成功、失败、重复触发、重启恢复、恢复上限与关闭窗口。
  • 智能分析和周期对比保留各自领域测试,继续验证提示输入、白名单归一、基线规则和机械 diff;删除被统一作业契约完全替代的编排测试。
  • Campaign 读模型测试覆盖 projection 内容、not-found、批量查询、快照一致性、模型标签、自动/手动基线和 Markdown 同源性。
  • HTTP 集成测试只验证状态码、响应契约和错误翻译,不 spy 读模型内部 Repository。
  • 前端测试沿用 Intelligent Evaluation 读取 module 的 Vitest/React Testing Library 先例,使用 fake timers 与 fake adapter 测 observable state 和用户可见行为。
  • Campaign runtime 测试以 lifecycle 结果和数据库状态为主;纯 scheduler 的确定性测试继续作为 internal seam 测试保留。
  • 迁移测试覆盖升级、降级、全新 schema parity、旧行默认值与恢复元数据。
  • 最终验收至少保持当前发布基线:后端全套测试、前端测试、类型检查和生产构建全部通过。

Out of Scope

  • 不合并 Campaign、Intelligent Evaluation、Exploration Session 或普通 EvalRun 的领域状态机。
  • 不把 judge 抽样复核强行纳入耐久智能作业 module。
  • 不引入 Celery、Redis、Kafka、外部队列或多进程 worker。
  • 不改变分析岗位、judge 岗位或周期对比的提示词与业务输出 schema。
  • 不改变 ADR-0002/0004 的通过率、可用性、失败、取消或周期对比口径。
  • 不改变 HTTP 路径、响应字段、前端信息架构、keep-alive 标签页或 Drawer 交互。
  • 不把 Campaign 前端状态迁移到全局 Zustand,也不引入新的请求缓存框架。
  • 不重写纯 scheduler 算法,不改变 time_scale 语义。
  • 不改变 TaskRegistry 为数据库权威,也不让 OpenClaw 全程驱动 Campaign。
  • 不因单文件长度拆分 Repository;文件移动本身不算 deepening。
  • 不在本计划中实现通用条件写入 module。
  • 不处理与本次三个 seam 无关的代码风格或历史兼容问题。

Further Notes

  • 计划基于 v0.8.0 / commit 10a089e 的架构扫描。
  • 最近发布验证基线为后端 729 个测试通过、前端 9 个测试通过、生产构建通过;实施前应重新跑一次并记录实际基线。
  • 现有 Intelligent Evaluation 读模型及其前端 reducer/hook 是 Phase 2 的主要先例。
  • 现有 Channel complete-exchange interface、Campaign child-Run durable identity 和生命周期 CAS 是 Phase 1/3 的主要先例。
  • 生产仍为单进程 FastAPI + SQLite;若未来改为多 worker,耐久作业认领语义需要单独复审。
  • Gitea Issue 创建需要新的临时 token;当前工作区未保存可用 token,本文件先作为待确认草案。
# Refactor: Deepen Campaign Intelligence, Read Model, and Runtime ## Problem Statement AgentEvalTool v0.8.0 已完成 Channel、Intelligent Evaluation 生命周期、Campaign 耐久身份和 Intelligent Evaluation 读模型的第一轮 deepening,但近期评估活动相关演进仍在三个 seam 上泄漏知识。 第一,智能分析与周期对比分别掌握耐久排队、进程内任务启动、执行状态、Session 生命周期、失败落库和重启恢复的完整顺序。现有异步作业 Repository 只复用少量查询,真正高风险的 DB/async 编排仍散落在两个调用方。 第二,评估活动列表、详情、报告、时间线、智能分析、周期对比与 Markdown 导出分别拼装 Campaign、child Run、场景、评测对象和探索发现。前端评估活动页还独立维护多组请求、polling 与局部快照。现有活动 view 已形成雏形,但 interface 覆盖不足。 第三,评估活动耐久运行时已经隐藏 claim、tick、恢复和完成逻辑,但 external interface 仍暴露多个 implementation 阶段。生命周期、启动代码和测试需要学习 Session、时钟、cancel event、tick cadence 与恢复顺序,module 的 depth 仍可提高。 ## Solution 按依赖顺序完成三次 deepening:先建立评估活动智能作业 module,统一智能分析与周期对比的耐久状态编排;再深化评估活动读模型,集中所有稳定 projection,并深化前端现有读取 module;最后收窄评估活动耐久运行时 interface,把 claim、恢复、tick、完成与进程内句柄保留在 implementation 内。 第四个候选——Campaign 与 Intelligent Evaluation 的条件写入分类——只保留为删除测试验证门。除非能证明一个小 interface 可以隐藏显著 implementation,且至少两个 adapter 不需要暴露领域状态与字段映射,否则不创建新 seam。 整个重构不改变领域口径、现有 HTTP 契约、数据库权威关系、管理后台信息架构或部署拓扑。 ## Commits ### Phase 0 — Lock observable behavior 1. **记录当前活动智能作业的状态契约。** 用 characterization tests 固定手动触发、自动触发、重复触发、缺少模型、生成失败和成功落库的可观察结果;保持生产代码不变。 2. **记录当前重启与关闭行为。** 固定 queued 作业、遗留 generating 作业、进程内任务幂等启动和应用关闭收敛行为,并明确哪些状态可以自动恢复、哪些状态必须显式失败。 3. **记录活动读取契约。** 为列表、详情、报告、时间线、分析、周期对比和 Markdown 导出保存响应形状与关键领域口径,确保后续移动知识时外部行为不变。 ### Phase 1 — Deepen durable Campaign intelligence jobs 4. **定义统一的耐久作业领域状态。** 收敛 queued、generating、completed、failed 的含义、允许迁移、触发来源、失败信息长度和更新时间语义;智能分析与周期对比使用同一状态词汇。 5. **增加最小恢复元数据。** 为作业记录补充区分首次执行与重启恢复所需的最少信息,并增加迁移与全新数据库一致性测试;不引入通用队列产品或分布式锁。 6. **建立条件认领的 persistence implementation。** queued 作业只能被一次执行认领;重复认领返回类型化结果。用两个独立 Session 验证竞争认领不会派生两次领域工作。 7. **建立统一失败结算。** 把异常归一、错误截断、回滚和 failed 落库收进作业 module;调用方不再分别复制 try/except 与状态写入顺序。 8. **建立统一成功结算。** 领域工作返回结果后,由作业 module 原子写入 completed 状态与结果;验证旧错误和中间状态不会残留。 9. **接入智能分析工作 adapter。** 保留模型解析、失败样本、两阶段分析和自动周期对比判断;移除智能分析调用方对 Session、TaskRegistry 和状态迁移的直接掌握。 10. **接入周期对比工作 adapter。** 保留基线选择、机械 diff 与演进叙述;先持久排队再启动,不再从 HTTP adapter 或智能分析 module 直接启动裸进程任务。 11. **统一进程内启动与幂等。** 让耐久作业 module 独占 TaskRegistry 使用方式;相同作业正在执行时重复触发只观察同一任务,不创建第二个模型调用。 12. **统一启动恢复。** 服务启动时先处理遗留 generating,再恢复 queued。恢复策略必须有上限,避免持续崩溃形成无限模型调用;测试覆盖崩溃发生在排队后、认领后和结果提交前的窗口。 13. **统一关闭收敛。** Web 生命周期只关闭一个评估活动智能作业 owner,不再分别导入智能分析与周期对比 registry;取消进程任务后,数据库状态仍由恢复规则解释。 14. **删除旧异步作业编排。** 移除重复的 start、enqueue、resume、upsert 和 orphan 清理路径,只保留领域工作 adapter 与新的 deep module;将测试迁移到统一 interface。 15. **记录耐久作业决策。** 新增或修订 ADR,说明数据库状态是作业权威、TaskRegistry 只保存进程句柄、恢复上限、重复模型调用风险及单进程部署假设。 ### Phase 2 — Deepen the Campaign read model 16. **定义稳定的活动 projection。** 分别固定列表、详情、报告、时间线、智能分析和周期对比的领域形状;保持现有 HTTP 字段和 ADR-0002/0004 统计口径不变。 17. **批量构建活动列表 projection。** 消除按 Campaign 逐条读取 child Run 的查询方式;增加空列表、多活动和查询数量回归测试。 18. **集中活动详情与 progress。** 把窗口位置、spawned/completed Run 计数及终态信息收进读模型;调用方不再选择两个 progress helper,但外部列表与详情值保持兼容。 19. **集中报告与时间线 projection。** 让场景名称、child Run 聚合、探索发现和时间线排序在同一读 module 内形成稳定快照;纯统计函数保留为 internal seam。 20. **集中智能分析与周期对比 projection。** 模型标签、自动基线、生效基线和机械 diff 由读模型统一投影;分析与周期对比领域工作不承担呈现形状。 21. **让 Markdown 导出消费同一 projection。** 删除 router 中对周期对比结果的二次重塑,验证 JSON 页面与 Markdown 导出引用同一活动、基线和模型信息。 22. **迁移 HTTP adapter。** 所有评估活动读取端点只负责请求验证、not-found 翻译和响应序列化;删除跨 repository 拼装知识。 23. **深化前端现有活动读取 module。** 集中列表加载、报告快照、时间线、智能分析、周期对比、初始失败、silent refresh、状态感知 polling 和迟到响应过滤;不创建平行读取体系。 24. **增加前端读取状态测试。** 沿用 Intelligent Evaluation 的 reducer/hook 先例,用 fake adapter、fake timers 和延迟 Promise 验证活动切换、终态停轮询、silent failure 保留完整快照及过期响应不覆盖当前选择。 25. **迁移评估活动页面 renderer。** 页面只保留表单、Drawer、表格列和展示交互;移除请求编排与跨快照 setter,保持 keep-alive、分页、反馈和现有布局。 26. **删除旧读取 helper 与重复类型。** 只在新 interface 覆盖全部调用方和测试后删除旧 helper;保留仍被其他页面使用的 transport 定义。 ### Phase 3 — Narrow the durable Campaign runtime interface 27. **建立生命周期级运行时契���测试。** 从创建、取消、恢复和完成这些生产调用面验证 durable claim、取消优先、pending 恢复、running 中断和自动分析触发;减少直接调用内部阶段的测试。 28. **把时钟变成 internal seam。** 生产 adapter 使用真实 UTC 时钟,测试 adapter 使用可控时钟;生命周期调用方不再传递 elapsed seconds 或理解窗口映射。 29. **把 child Run 执行变成 internal seam。** 保留真实 EvalEngine adapter 与测试 fake adapter;claim identity、pending/running 恢复规则仍由运行时 implementation 掌握。 30. **收进 tick 与 reconcile 顺序。** 运行时自行保证先恢复、再决策、再 claim、再完成;外部调用方不再组合这些阶段。 31. **收进进程任务句柄。** 启动、取消、恢复和关闭通过同一个运行时 owner 协调;Campaign lifecycle 只表达领域意图,数据库继续作为唯一状态权威。 32. **迁移应用启动与关闭。** Web 生命周期只调用 Campaign runtime 和耐久智能作业 module 的高层操作,不再导入具体 registry 或 runner 内部函数。 33. **收窄并清理旧 external interface。** 将 advance、reconcile、loop 等阶段降为 implementation 或 internal seam;生产调用方与主要测试只穿过新的 runtime interface。 34. **修订 Campaign ADR。** 记录 runtime seam、时钟与执行器 adapter、DB 权威、TaskRegistry 角色,以及为何不改变 OpenClaw 与 Campaign 的既有职责划分。 ### Phase 4 — Conditional-write deletion gate 35. **执行条件写入删除测试并记录结论。** 对比两个领域的条件更新知识,量化新 interface 必须暴露的状态、字段和事务副作用。若删除假想 module 只恢复少量 SQL 模板,则明确拒绝抽象;只有复杂度显著回流且 interface 保持小而稳定时,才另开独立计划。 ### Final acceptance 36. **运行完整回归。** 执行后端全套测试、前端单元测试、类型检查、生产构建、ruff 检查和迁移升级/降级演练;不在本阶段修复无关失败。 37. **执行部署前演练。** 在生产数据库副本上验证迁移、作业恢复与活动读取兼容性;确认前端生产产物已更新,并通过健康检查与关键活动读取路径。 ## Decision Document - 实施顺序固定为:耐久智能作业 → 活动读模型 → 活动耐久运行时。 - 智能分析与周期对比是耐久作业 module 的两个真实工作 adapter。 - judge 抽样复核暂不接入该 module,因为它没有独立 queued 行和重启恢复语义;未来形成相同语义后再评估第三个 adapter。 - 作业数据库状态是耐久权威;TaskRegistry 只保存当前进程中的任务与取消句柄。 - queued 作业可恢复;遗留 generating 作业按有上限的恢复策略处理,禁止无限自动重试。 - 模型解析、提示词、结构化结果归一和领域校验留在各自工作 adapter,不进入通用作业 implementation。 - Campaign 读模型是活动 projection 的唯一组合 seam,HTTP adapter 不直接跨多个 Repository 拼装响应。 - 列表、详情、报告、时间线、分析、周期对比和导出保留现有外部契约。 - 读模型可以内部复用纯统计函数,但这些 internal seam 不暴露给 HTTP adapter 或前端。 - 前端深化现有活动读取 module,不建立第二套缓存或引入 React Query/SWR。 - Campaign runtime 吸收 claim、恢复、tick、完成与任务句柄顺序;纯 scheduler 保持无 I/O。 - 数据库继续是 Campaign 唯一权威;取消后的新 claim 必须失败,已开始的 child Run 允许完成。 - OpenClaw、Exploration Session、Intelligent Evaluation 与 Campaign 的领域关系保持不变。 - 条件写入共性不进入当前生产重构;候选 4 必须再次通过删除测试后另立计划。 - 如需新增数据库字段,必须同时提供 Alembic upgrade、downgrade 与全新数据库 parity 测试。 - 每一提交必须保持仓库可运行,不保留跨多个提交才能工作的临时双 interface。 ## Testing Decisions - 好测试穿过生产调用方使用的同一 interface,断言可观察结果、持久状态和领域事件;不检查 TaskRegistry 私有字典、Repository 内部调用次数或 runner 阶段函数的调用顺序。 - 耐久作业测试使用内存 SQLite、fake 工作 adapter 和可控 TaskRegistry,覆盖排队、竞争认领、成功、失败、重复触发、重启恢复、恢复上限与关闭窗口。 - 智能分析和周期对比保留各自领域测试,继续验证提示输入、白名单归一、基线规则和机械 diff;删除被统一作业契约完全替代的编排测试。 - Campaign 读模型测试覆盖 projection 内容、not-found、批量查询、快照一致性、模型标签、自动/手动基线和 Markdown 同源性。 - HTTP 集成测试只验证状态码、响应契约和错误翻译,不 spy 读模型内部 Repository。 - 前端测试沿用 Intelligent Evaluation 读取 module 的 Vitest/React Testing Library 先例,使用 fake timers 与 fake adapter 测 observable state 和用户可见行为。 - Campaign runtime 测试以 lifecycle 结果和数据库状态为主;纯 scheduler 的确定性测试继续作为 internal seam 测试保留。 - 迁移测试覆盖升级、降级、全新 schema parity、旧行默认值与恢复元数据。 - 最终验收至少保持当前发布基线:后端全套测试、前端测试、类型检查和生产构建全部通过。 ## Out of Scope - 不合并 Campaign、Intelligent Evaluation、Exploration Session 或普通 EvalRun 的领域状态机。 - 不把 judge 抽样复核强行纳入耐久智能作业 module。 - 不引入 Celery、Redis、Kafka、外部队列或多进程 worker。 - 不改变分析岗位、judge 岗位或周期对比的提示词与业务输出 schema。 - 不改变 ADR-0002/0004 的通过率、可用性、失败、取消或周期对比口径。 - 不改变 HTTP 路径、响应字段、前端信息架构、keep-alive 标签页或 Drawer 交互。 - 不把 Campaign 前端状态迁移到全局 Zustand,也不引入新的请求缓存框架。 - 不重写纯 scheduler 算法,不改变 time_scale 语义。 - 不改变 TaskRegistry 为数据库权威,也不让 OpenClaw 全程驱动 Campaign。 - 不因单文件长度拆分 Repository;文件移动本身不算 deepening。 - 不在本计划中实现通用条件写入 module。 - 不处理与本次三个 seam 无关的代码风格或历史兼容问题。 ## Further Notes - 计划基于 v0.8.0 / commit `10a089e` 的架构扫描。 - 最近发布验证基线为后端 729 个测试通过、前端 9 个测试通过、生产构建通过;实施前应重新跑一次并记录实际基线。 - 现有 Intelligent Evaluation 读模型及其前端 reducer/hook 是 Phase 2 的主要先例。 - 现有 Channel complete-exchange interface、Campaign child-Run durable identity 和生命周期 CAS 是 Phase 1/3 的主要先例。 - 生产仍为单进程 FastAPI + SQLite;若未来改为多 worker,耐久作业认领语义需要单独复审。 - Gitea Issue 创建需要新的临时 token;当前工作区未保存可用 token,本文件先作为待确认草案。
Author
Owner

Phase 0 基线完成:后端 Campaign/分析/周期对比/报告/runtime 针对性测试 251 passed;前端新增 useCampaignReport 行为基线 3 项后全套 12 passed;生产实现暂未修改,下一步进入 Phase 1 深化耐久 LLM 后台作业 module。测试仅有 Vite esbuild/oxc 弃用警告。

Phase 0 基线完成:后端 Campaign/分析/周期对比/报告/runtime 针对性测试 251 passed;前端新增 useCampaignReport 行为基线 3 项后全套 12 passed;生产实现暂未修改,下一步进入 Phase 1 深化耐久 LLM 后台作业 module。测试仅有 Vite esbuild/oxc 弃用警告。
Author
Owner

已完成并验收。Campaign 智能作业、读模型、运行时收窄及条件写入删除测试由提交 1782b24 完成,阶段总结见 docs/archive/campaign-architecture-deepening-20260811-v1.0.md;最终随 v1.0.0(0326ec5)通过完整质量门禁并部署开发线与正式线。

已完成并验收。Campaign 智能作业、读模型、运行时收窄及条件写入删除测试由提交 1782b24 完成,阶段总结见 docs/archive/campaign-architecture-deepening-20260811-v1.0.md;最终随 v1.0.0(0326ec5)通过完整质量门禁并部署开发线与正式线。
Sign in to join this conversation.
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: solahqb/AgentEvalTool#2
No description provided.