Files
sanguo_moziplus_v2/docs/review/simayi-independent-audit.md
T
2026-05-19 22:43:25 +08:00

273 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 司马懿独立审计报告:PRD→设计→代码 三层一致性审查
**审查人**: 司马懿(simayi-challenger
**日期**: 2026-05-19
**范围**: moziplus v2.0 全链路(PRD + 7 设计文档 + 24 后端文件 + 22 前端文件)
---
## 一、总体评价
moziplus v2.0 的 F1-F18 编码完成度很高,核心链路(黑板 CRUD → Ticker 调度 → Dispatcher 分发 → Spawner 执行 → Checkpoint 人工确认)已经贯通。v2.7 SubTask 模型、v2.8 状态增强、M3 Checkpoint 均已落地。
**做得好的**
- 黑板(Blackboard)模块设计扎实,operations.py 20+ 方法覆盖完整 CRUD + 聚合 + 归档
- Ticker 580 行实现持续指挥循环,_tick_project/_dispatch_pending/_dispatch_reviews/_check_timeouts 职责清晰
- Counter + Dispatcher + Spawner 三层限流机制设计正确(BUG-30/31 已修)
- Checkpoint 端到端实现(DDL → operations → routes → CheckpointPanel → TaskModal 集成)质量高
- 前端 12 Tab 覆盖全面,EdictBoard 任务卡片 + CARD_ACTIONS 操作按钮设计实用
**需要改进的**
- 安全红线(PRD §10.1 六条)落地不足,6 条中只有 2.5 条有代码实现
- development-plan 文档严重滞后(v2.8/M3 仍标"待开发",实际已完成+已评审)
- 5 个前端组件已编写但未被任何主流程引用(死代码)
- 设计文档版本混乱,存在重复/过时文件未归档
---
## 二、PRD 能力 → 设计覆盖 → 代码实现(§5 十大能力)
| # | PRD 能力 | 设计覆盖 | 代码实现 | 状态 |
|---|---------|---------|---------|------|
| C1 | 需求探索对话 | ✅ topic4 + architecture §5 苏格拉底 Skill | ⚠️ skill_system.py 有 Skill 框架,但苏格拉底 Skill 未注册 | **缺口** |
| C2 | 动态规划 | ✅ architecture §6 指挥循环 | ⚠️ Ticker 有 _dispatch_pending 但无 AI 规划环节 | **部分** |
| C3 | 持续指挥 | ✅ architecture §6 Ticker + 庞统关键节点介入 | ✅ ticker.py 580行,_tick_project 完整循环 | ✅ |
| C4 | 共享意识 | ✅ architecture §7 Blackboard + Daemon API | ✅ blackboard/ 全套 + 7 routes 模块 | ✅ |
| C5 | 自主协作 | ✅ PRD §6.2 标注 v2.1+ | ❌ 未实现(PRD 明确 v2.1+ 范围) | **预期缺口** |
| C6 | 质量门禁 | ✅ topic3 + review.py | ✅ review.py ReviewPipeline + router.py AI 路由 | ✅ |
| C7 | 主动汇报 | ✅ architecture §8 SSE 推送 | ✅ sse_routes.py + 前端 NotificationCenter | ✅ |
| C8 | 经验沉淀 | ✅ topic6 | ✅ experience.py 291行 ExperienceStore | ✅ |
| C9 | 安全护栏 | ✅ PRD §10.1 六条红线 | ⚠️ 详见下方安全红线分析 | **重大缺口** |
| C10 | 工具链集成 | ✅ PRD §10.2 标注 v2.1+ | ❌ toolchain-proposal.md 有设计但未实现 | **预期缺口** |
### 安全红线(PRD §10.1 六条)落地分析
| 红线 | 设计覆盖 | 代码实现 | 状态 |
|------|---------|---------|------|
| 实盘交易拦截 | ❌ 无专门设计 | ❌ 无代码 | **P0 缺口** |
| 数据删除拦截 | ⚠️ archive 改 metadata 不删文件 | ✅ archive_task 只改 archived=1,不删除记录 | **部分满足** |
| 系统配置变更拦截 | ❌ 无专门设计 | ❌ 无代码 | **P0 缺口** |
| 大额 token 消耗 | ⚠️ architecture 提及 L3 tripwire | ⚠️ bootstrap.py L113 有 token limit 警告,但非拦截 | **部分** |
| Agent 不受控行为 | ✅ counter.py + health.py | ✅ counter.py 并发限制 + health.py zombie 检测 | ✅ |
| 连续失败 | ✅ max_retries + review pipeline | ✅ Task.max_retries=2 + ReviewPipeline | ✅ |
**结论**:6 条安全红线中只有 2 条完整落地(Agent 不受控 + 连续失败),1.5 条部分满足(数据删除 + token),2 条完全缺失(实盘交易 + 配置变更)。这是 **P0 级缺口**——PRD 明确标注"必须 AI 拦截并拉人确认,不允许自主执行",但代码无实现。
---
## 三、设计文档 → 代码一致性
### 3.1 API 路由对比
| 设计文档 API | 代码实现 | 一致性 |
|-------------|---------|--------|
| GET /api/projects/{pid}/tasks | ✅ blackboard_routes L31 | ✅ |
| GET /api/projects/{pid}/tasks/{id} | ✅ blackboard_routes L41 | ✅ |
| POST /api/projects/{pid}/tasks | ✅ blackboard_routes L66 | ✅ |
| POST /api/projects/{pid}/tasks/{id}/claim | ✅ blackboard_routes L101 | ✅ |
| PATCH /api/projects/{pid}/tasks/{id}/status | ⚠️ 代码用 POSTblackboard_routes L109 | **偏差** |
| POST /api/projects/{pid}/tasks/{id}/comments | ✅ blackboard_routes L172 | ✅ |
| POST /api/projects/{pid}/tasks/{id}/outputs | ✅ blackboard_routes L189 | ✅ |
| POST /api/projects/{pid}/tasks/{id}/decisions | ✅ blackboard_routes L264 | ✅ |
| POST /api/projects/{pid}/tasks/{id}/observations | ✅ blackboard_routes L275 | ✅ |
| POST /api/projects/{pid}/tasks/{id}/reviews | ✅ blackboard_routes L291 | ✅ |
| POST /api/projects/{pid}/tasks/{id}/archive | ✅ blackboard_routes L337 | ✅ |
| POST /api/projects/{pid}/tasks/archive-done | ✅ blackboard_routes L353 | ✅ |
| GET /api/projects/{pid}/tasks/{id}/checkpoints | ✅ checkpoint_routes | ✅ |
| POST /api/projects/{pid}/tasks/{id}/checkpoints | ✅ checkpoint_routes | ✅ |
| POST /.../checkpoints/{cid}/approve | ✅ checkpoint_routes | ✅ |
| POST /.../checkpoints/{cid}/reject | ✅ checkpoint_routes | ✅ |
| POST /api/daemon/tick | ✅ daemon_routes L26 | ✅ |
| GET /api/daemon/status | ✅ daemon_routes L10 | ✅ |
| GET /api/daemon/sessions | ❌ **未实现** | **缺口** |
| GET /api/events?project={pid} | ✅ sse_routes | ✅ |
| GET /api/projects | ✅ project_routes L20 | ✅ |
| POST /api/projects | ✅ project_routes L28 | ✅ |
| GET /api/projects/{pid} | ✅ project_routes L42 | ✅ |
| DELETE /api/projects/{pid} | ⚠️ 代码用 POST /{id}/archive | **偏差** |
### 3.2 关键偏差
**偏差1PATCH status → POST status**P2
- 设计文档 technical-design-v2.6.md L749`PATCH /api/projects/{pid}/tasks/{id}/status`
- 代码 blackboard_routes.py L109`@router.post("/tasks/{task_id}/status")`
- 影响:语义偏差(PATCH 表示部分更新,POST 表示动作),功能无差异
- 建议:统一为 PATCH 或设计文档改 POST
**偏差2DELETE project → POST archive**P1
- 设计文档 technical-design-v2.6.md L786`DELETE /api/projects/{pid}` 归档项目
- 代码 project_routes.py`POST /{project_id}/archive`
- 影响:违反 RESTful 约定(删除操作用 DELETE),且设计文档与代码不同步
- 建议:PRD §10.1 要求"数据删除需人工确认"POST + 确认流程比 DELETE 更安全,代码做法更合理,应更新设计文档
**偏差3GET /api/daemon/sessions 未实现**P1
- 设计文档 technical-design-v2.6.md L768 定义 `GET /api/daemon/sessions`
- 代码中无此端点
- spawner.py L142-148 有 `_sessions` 字典和 `active_sessions` 属性,但未暴露为 API
- 建议:补实现或设计文档标记为 v2.1+
### 3.3 数据模型一致性
| 设计定义 | 代码实现 | 一致性 |
|---------|---------|--------|
| tasks 表 11 状态 CHECK | ✅ db.py L87 11 状态完整 | ✅ |
| checkpoints 表 DDL | ✅ db.py L121 11 字段完整 | ✅ |
| outputs 表扩展 4 字段 | ✅ db.py _migrate_v28 | ✅ |
| events 表 FK tasks(id) | ✅ db.py L106 | ✅ |
| Task Pydantic model | ✅ models.py 28 字段 | ✅ |
---
## 四、超前实现(代码有但设计文档无记录)
| 组件 | 文件 | 评价 |
|------|------|------|
| MailPanel | components/MailPanel.tsx | ✅ 好事 — Mail Tab 是 v2.7 新增功能,前端-redesign 未提及但合理 |
| MorningPanel | components/MorningPanel.tsx | ⚠️ 孤立 — 未被 App.tsx 引用,无设计文档 |
| ArtifactList | components/ArtifactList.tsx | ⚠️ 孤立 — 未被引用,设计文档提到 ArtifactPanel 但未提到 ArtifactList |
| ConfirmDialog | components/ConfirmDialog.tsx | ⚠️ 孤立 — 未被引用,通用组件可保留 |
| GlobalSearch | components/GlobalSearch.tsx | ⚠️ 孤立 — 未被引用,topic7 提到全局搜索但未落地到主流程 |
| ArtifactPanel | components/ArtifactPanel.tsx | ⚠️ 孤立 — 设计文档 §5.1 提到成果物面板,但 TaskModal 未引用 |
| court Tab | CourtDiscussion.tsx | ✅ 好事 — topic3 挑战/评审体系的前端展示 |
| agent-api-contract.md | docs/design/ | ⚠️ 设计文档但未在 architecture 中引用 |
| agent-routing-redesign.md | docs/design/ | ⚠️ 设计文档但未在 architecture 中引用 |
| frontend-principles.md | docs/design/ | ⚠️ 孤立设计文档 |
---
## 五、缺口分析
### 5.1 PRD 有但代码未实现(按优先级)
| # | 优先级 | 缺口 | PRD 来源 | 影响 |
|---|--------|------|---------|------|
| 1 | **P0** | 实盘交易安全拦截 | §10.1 红线1 | 量化平台核心安全需求 |
| 2 | **P0** | 系统配置变更拦截 | §10.1 红线3 | 防止 Agent 擅自改配置 |
| 3 | **P1** | 苏格拉底需求探索 Skill | §5 C1 | PRD 定义为"核心入口能力" |
| 4 | **P1** | AI 动态规划环节 | §5 C2 | 当前 Ticker 只做调度,无 AI 规划 |
| 5 | **P2** | GET /api/daemon/sessions | technical-design L768 | 已有数据但未暴露 API |
| 6 | **P2** | ArtifactPanel 集成到 TaskModal | v2.8-state-enhancement §5 | 组件已写但未接入 |
### 5.2 PRD 标注 v2.1+ 的预期缺口(可接受)
| 能力 | PRD 声明 | 状态 |
|------|---------|------|
| C5 自主协作 | §10.2 v2.1+ | ✅ 预期缺口 |
| C10 工具链集成 | §10.2 v2.1+ | ✅ 预期缺口 |
| peer-to-peer 协作 | §6.2 | ✅ 预期缺口 |
| Agent 主动感知 | §10.2 | ✅ 预期缺口 |
| Fidelity 信息路由 | §10.2 | ✅ 预期缺口 |
---
## 六、文档版本混乱
| 文件 | 问题 | 建议 |
|------|------|------|
| architecture-v2.md (2757行) | 旧版,被 v2.6 替代但仍保留 | **归档到 archive/** |
| topic7-9-interaction-dashboard-proposal.md (247行) | 与 topic7-interaction-dashboard-proposal.md (456行) 重复 | 保留 456 行版本,删除旧版 |
| topic4-skill-checklist-draft.md (96行) | topic4-decomposition-skill-proposal.md (638行) 的草稿 | 归档到 archive/ |
| product-direction-notes.md | 产品方向笔记,非正式设计文档 | 归档到 archive/ |
| agent-integration-v2.6.md | 可能与 architecture §9 重叠 | 检查后归档或合并 |
| agent-routing-redesign.md | 可能与 architecture §8 重叠 | 检查后归档或合并 |
| **development-plan-v2.6.md** | **v2.8/M3 仍标"待开发",实际已完成+已评审** | **立即更新** |
**权威文档定义**
- architecture-v2.6.md:主架构(权威)
- technical-design-v2.6.md:技术设计(权威)
- development-plan-v2.6.md:开发计划(需更新)
- frontend-redesign-v2.6.md:前端设计(权威)
- v2.7-subtask-model.mdSubTask 补充(权威)
- v2.8-state-enhancement.md:状态增强补充(权威)
---
## 七、代码质量问题
### 7.1 死代码(已编写但未被主流程引用)
| # | 优先级 | 组件 | 证据 | 建议 |
|---|--------|------|------|------|
| 1 | P1 | MorningPanel.tsx | App.tsx 未 import | 接入 morning tab 或删除 |
| 2 | P1 | ArtifactList.tsx | 无 import | TaskModal 产出区域集成或删除 |
| 3 | P1 | ArtifactPanel.tsx | 无 import(设计文档 §5.1 要求接入) | TaskModal 产出区域集成 |
| 4 | P2 | ConfirmDialog.tsx | 无 import | 通用组件保留,后续使用 |
| 5 | P2 | GlobalSearch.tsx | 无 import | topic7 提到但未落地,v2.1+ 接入 |
### 7.2 集成缺失
| # | 优先级 | 问题 | 证据 |
|---|--------|------|------|
| 1 | P1 | F19-F22 开发计划标注"设计评审中/待开始" | development-plan L280-282 |
| 2 | P1 | experience.py ExperienceStore 未被 Ticker 自动调用 | 无 auto-distill 逻辑 |
| 3 | P2 | router.py AgentRouter.route() 未被 Dispatcher 调用 | dispatcher.py 用 _legacy_dispatch |
### 7.3 已知 Bug(本轮及之前评审发现,已修或待修)
| Bug | 状态 | 说明 |
|-----|------|------|
| BUG-30/31 Counter leak | ✅ 已修 | on_complete 回调链 |
| BUG-32 resolve 状态校验 | ✅ 已修 | waiting_human 守卫 |
| BUG-33 payload version 校验 | ✅ 已修 | version 字段校验 |
| BUG-34 CheckpointPanel 索引 | ✅ 已修 | pendingIdx 管理 |
| FK 恢复缺 finally | ⚠️ 待修 | db.py _migrate_v28 |
---
## 八、问题汇总(按优先级排序)
### P0(必须修)
| # | 问题 | 证据 |
|---|------|------|
| 1 | **安全红线未落地**:实盘交易拦截 + 系统配置变更拦截无代码实现 | PRD §10.1 红线1/3,代码中无任何拦截逻辑 |
| 2 | **development-plan 严重滞后**v2.8/M3 标"待开发",实际已完成+评审通过 | development-plan-v2.6.md L277-278 |
### P1(应该修)
| # | 问题 | 证据 |
|---|------|------|
| 3 | GET /api/daemon/sessions 未实现 | technical-design L768spawner.py L146 有数据 |
| 4 | 5 个前端组件死代码 | MorningPanel/ArtifactList/ArtifactPanel/ConfirmDialog/GlobalSearch 无 import |
| 5 | ArtifactPanel 未集成到 TaskModal | v2.8-state-enhancement §5.1 要求,组件已写未接入 |
| 6 | design 文档版本混乱 | architecture-v2.md + 3 份重复 topic 文件未归档 |
| 7 | FK 恢复缺 finally 保护 | db.py _migrate_v28,异常时 FK 永久 OFF |
| 8 | ExperienceStore 未被 Ticker 自动调用 | experience.py 291 行写好但无 auto-distill |
### P2(可以后修)
| # | 问题 | 证据 |
|---|------|------|
| 9 | PATCH status → POST status 偏差 | technical-design L749 vs blackboard_routes L109 |
| 10 | DELETE project → POST archive 偏差 | technical-design L786 vs project_routes |
| 11 | 苏格拉底 Skill 未注册 | PRD C1 核心能力,skill_system.py 有框架无 Skill |
| 12 | AI 动态规划环节缺失 | PRD C2,Ticker 只有调度无规划 |
| 13 | agent-api-contract.md / agent-routing-redesign.md 未在主架构引用 | 孤立设计文档 |
---
## 九、结论
### 做得好的 ✅
1. **黑板模块完整**operations.py 20+ 方法 + 7 API routes 模块,覆盖设计文档全部要求
2. **v2.8 + M3 端到端贯通**DDL → operations → routes → CheckpointPanel → TaskModal,质量高
3. **Ticker 持续指挥**:580 行实现,调度/超时/依赖推进/审查分发 职责清晰
4. **Counter 限流**:BUG-30/31 修复后三层限流机制完整
5. **前端 12 Tab 全覆盖**EdictBoard + TaskModal + MailPanel + 9 个辅助面板
### 必须立即修的 🔴
1. **安全红线 P0**:实盘交易 + 配置变更拦截必须实现,这是 PRD 硬性要求
2. **development-plan P0**:立即更新 v2.8/M3 状态为"已完成"
### 应该近期修的 🟡
1. daemon/sessions API 补实现
2. ArtifactPanel 集成到 TaskModal
3. 死代码清理或接入
4. 设计文档归档(architecture-v2.md + 重复 topic 文件)
5. FK 恢复 finally 保护
6. ExperienceStore auto-distill 接入 Ticker
---
*审查完毕。司马懿 🗡️ 2026-05-19*