Refactor: Deepen Campaign Intelligence, Read Model, and Runtime #2
Labels
No Label
priority:P0
priority:P1
priority:P2
wayfinder:grilling
wayfinder:map
wayfinder:prototype
wayfinder:research
wayfinder:task
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: solahqb/AgentEvalTool#2
Loading…
Reference in New Issue
Block a user
No description provided.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
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
记录当前活动智能作业的状态契约。 用 characterization tests 固定手动触发、自动触发、重复触发、缺少模型、生成失败和成功落库的可观察结果;保持生产代码不变。
记录当前重启与关闭行为。 固定 queued 作业、遗留 generating 作业、进程内任务幂等启动和应用关闭收敛行为,并明确哪些状态可以自动恢复、哪些状态必须显式失败。
记录活动读取契约。 为列表、详情、报告、时间线、分析、周期对比和 Markdown 导出保存响应形状与关键领域口径,确保后续移动知识时外部行为不变。
Phase 1 — Deepen durable Campaign intelligence jobs
定义统一的耐久作业领域状态。 收敛 queued、generating、completed、failed 的含义、允许迁移、触发来源、失败信息长度和更新时间语义;智能分析与周期对比使用同一状态词汇。
增加最小恢复元数据。 为作业记录补充区分首次执行与重启恢复所需的最少信息,并增加迁移与全新数据库一致性测试;不引入通用队列产品或分布式锁。
建立条件认领的 persistence implementation。 queued 作业只能被一次执行认领;重复认领返回类型化结果。用两个独立 Session 验证竞争认领不会派生两次领域工作。
建立统一失败结算。 把异常归一、错误截断、回滚和 failed 落库收进作业 module;调用方不再分别复制 try/except 与状态写入顺序。
建立统一成功结算。 领域工作返回结果后,由作业 module 原子写入 completed 状态与结果;验证旧错误和中间状态不会残留。
接入智能分析工作 adapter。 保留模型解析、失败样本、两阶段分析和自动周期对比判断;移除智能分析调用方对 Session、TaskRegistry 和状态迁移的直接掌握。
接入周期对比工作 adapter。 保留基线选择、机械 diff 与演进叙述;先持久排队再启动,不再从 HTTP adapter 或智能分析 module 直接启动裸进程任务。
统一进程内启动与幂等。 让耐久作业 module 独占 TaskRegistry 使用方式;相同作业正在执行时重复触发只观察同一任务,不创建第二个模型调用。
统一启动恢复。 服务启动时先处理遗留 generating,再恢复 queued。恢复策略必须有上限,避免持续崩溃形成无限模型调用;测试覆盖崩溃发生在排队后、认领后和结果提交前的窗口。
统一关闭收敛。 Web 生命周期只关闭一个评估活动智能作业 owner,不再分别导入智能分析与周期对比 registry;取消进程任务后,数据库状态仍由恢复规则解释。
删除旧异步作业编排。 移除重复的 start、enqueue、resume、upsert 和 orphan 清理路径,只保留领域工作 adapter 与新的 deep module;将测试迁移到统一 interface。
记录耐久作业决策。 新增或修订 ADR,说明数据库状态是作业权威、TaskRegistry 只保存进程句柄、恢复上限、重复模型调用风险及单进程部署假设。
Phase 2 — Deepen the Campaign read model
定义稳定的活动 projection。 分别固定列表、详情、报告、时间线、智能分析和周期对比的领域形状;保持现有 HTTP 字段和 ADR-0002/0004 统计口径不变。
批量构建活动列表 projection。 消除按 Campaign 逐条读取 child Run 的查询方式;增加空列表、多活动和查询数量回归测试。
集中活动详情与 progress。 把窗口位置、spawned/completed Run 计数及终态信息收进读模型;调用方不再选择两个 progress helper,但外部列表与详情值保持兼容。
集中报告与时间线 projection。 让场景名称、child Run 聚合、探索发现和时间线排序在同一读 module 内形成稳定快照;纯统计函数保留为 internal seam。
集中智能分析与周期对比 projection。 模型标签、自动基线、生效基线和机械 diff 由读模型统一投影;分析与周期对比领域工作不承担呈现形状。
让 Markdown 导出消费同一 projection。 删除 router 中对周期对比结果的二次重塑,验证 JSON 页面与 Markdown 导出引用同一活动、基线和模型信息。
迁移 HTTP adapter。 所有评估活动读取端点只负责请求验证、not-found 翻译和响应序列化;删除跨 repository 拼装知识。
深化前端现有活动读取 module。 集中列表加载、报告快照、时间线、智能分析、周期对比、初始失败、silent refresh、状态感知 polling 和迟到响应过滤;不创建平行读取体系。
增加前端读取状态测试。 沿用 Intelligent Evaluation 的 reducer/hook 先例,用 fake adapter、fake timers 和延迟 Promise 验证活动切换、终态停轮询、silent failure 保留完整快照及过期响应不覆盖当前选择。
迁移评估活动页面 renderer。 页面只保留表单、Drawer、表格列和展示交互;移除请求编排与跨快照 setter,保持 keep-alive、分页、反馈和现有布局。
删除旧读取 helper 与重复类型。 只在新 interface 覆盖全部调用方和测试后删除旧 helper;保留仍被其他页面使用的 transport 定义。
Phase 3 — Narrow the durable Campaign runtime interface
建立生命周期级运行时契���测试。 从创建、取消、恢复和完成这些生产调用面验证 durable claim、取消优先、pending 恢复、running 中断和自动分析触发;减少直接调用内部阶段的测试。
把时钟变成 internal seam。 生产 adapter 使用真实 UTC 时钟,测试 adapter 使用可控时钟;生命周期调用方不再传递 elapsed seconds 或理解窗口映射。
把 child Run 执行变成 internal seam。 保留真实 EvalEngine adapter 与测试 fake adapter;claim identity、pending/running 恢复规则仍由运行时 implementation 掌握。
收进 tick 与 reconcile 顺序。 运行时自行保证先恢复、再决策、再 claim、再完成;外部调用方不再组合这些阶段。
收进进程任务句柄。 启动、取消、恢复和关闭通过同一个运行时 owner 协调;Campaign lifecycle 只表达领域意图,数据库继续作为唯一状态权威。
迁移应用启动与关闭。 Web 生命周期只调用 Campaign runtime 和耐久智能作业 module 的高层操作,不再导入具体 registry 或 runner 内部函数。
收窄并清理旧 external interface。 将 advance、reconcile、loop 等阶段降为 implementation 或 internal seam;生产调用方与主要测试只穿过新的 runtime interface。
修订 Campaign ADR。 记录 runtime seam、时钟与执行器 adapter、DB 权威、TaskRegistry 角色,以及为何不改变 OpenClaw 与 Campaign 的既有职责划分。
Phase 4 — Conditional-write deletion gate
Final acceptance
运行完整回归。 执行后端全套测试、前端单元测试、类型检查、生产构建、ruff 检查和迁移升级/降级演练;不在本阶段修复无关失败。
执行部署前演练。 在生产数据库副本上验证迁移、作业恢复与活动读取兼容性;确认前端生产产物已更新,并通过健康检查与关键活动读取路径。
Decision Document
Testing Decisions
Out of Scope
Further Notes
10a089e的架构扫描。Phase 0 基线完成:后端 Campaign/分析/周期对比/报告/runtime 针对性测试 251 passed;前端新增 useCampaignReport 行为基线 3 项后全套 12 passed;生产实现暂未修改,下一步进入 Phase 1 深化耐久 LLM 后台作业 module。测试仅有 Vite esbuild/oxc 弃用警告。
已完成并验收。Campaign 智能作业、读模型、运行时收窄及条件写入删除测试由提交
1782b24完成,阶段总结见 docs/archive/campaign-architecture-deepening-20260811-v1.0.md;最终随 v1.0.0(0326ec5)通过完整质量门禁并部署开发线与正式线。