Files

841 lines
52 KiB
Markdown
Raw Permalink 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.
# Agent 底座开发 TODO
> 版本:v1.0
> 更新日期:2026-09-09
> 适用对象:底座负责人、业务 Agent 开发人员、编码 Agent、测试和运维人员
> 规范依据:`AGENTS.md`、`docs/01-通用Agent平台开发设计.md`、`docs/02-数据库建表设计.md`、`docs/03-平台端到端流程文档.md`、`docs/05-接口文档.md`
## 一、使用规则
- 每个任务开始前,先阅读对应设计文档和本 TODO 的前置依赖。
- 任务完成后必须补充测试、验收结果和实际修改文件。
- 未通过当前任务验收,不得开始依赖该任务的后续任务。
- 不得把未确定项留给编码 Agent 猜测;发现设计缺口必须停止并提交决策。
- 所有接口变化必须同步 `docs/05-接口文档.md`、OpenAPI 和接口测试。
- 所有数据库变化必须先对照 `docs/00-新数据库基线设计.md`,确认没有修改已有表名和已有字段定义。
- 业务 Agent 不得绕过 `AgentFactory`、`BaseAgent`、统一鉴权、记忆、模型、工具、合规、审计和事件流程。
- 当前业务范围只包括场内基金模拟交易;场外运营必须独立建表、独立接口。
## 二、任务状态
### 2026-09-09 测试报告修复(当前验收优先于下方历史记录)
此前 D9“底座核心已完成”结论撤回:缺少鉴权、Worker 启动和治理接线的端到端证据。
以下修复以 `docs/06-底座代码测试报告.md` 为问题来源,按项复测后勾选。
- [x] P0-1 RBAC、入口、工厂和受理鉴权;补平台管理入口权限。
证据:`test_agent_authorization.py` 8 项;`test_identity_mysql.py` 真实 MySQL
有效角色、权限、客户归属、过期撤权、禁用账号及客户端伪造覆盖;41 项单测通过。
变更:identity_repository/identity_service/authorization_service、Factory/BaseAgent、
受理和鉴权依赖;05 §4.2 已同步。数据库结构无变更。
- [x] P0-2 未注册 Agent 受理前拒绝(依 05 返回 404)。
证据:HTTP 未注册类型不写数据库测试 + 3 项 MySQL 受理/并发/HTTP 回归,共 4 passed。
修正并发测试断言为“恰好一个成功运行”,防止全部失败也通过。正式注册入口 bootstrap
与测试注册分离,未接入业务 Agent 不冒充已注册。错误采用 05 的 AGENT_TYPE_NOT_FOUND。
- [x] P0-3 独立 Worker 入口与真实运行闭环。
证据:`test_worker_runtime_mysql.py` 3 passed;`python -m app.worker --help` 可执行;
启动、注册、租约、撤权和验收范围见 `docs/07-测试问题修复记录.md`。新轮询配置已写 .env。
- [x] P1-1 非法 JWT sub 返回 401。
证据:test_security.py 11 passed,包含非数字、负数、零、全角数字、超长和溢出,
有效签名但 sub=abc 的 HTTP 请求为 401 且不调用身份查询。
- [x] P1-2 配置、记忆、合规治理钩子接线。
证据:`test_agent_governance.py` 9 项 + `test_governance_mysql.py` 真库召回/禁止词 1 项。
工厂注入治理协议;发布配置快照、按意图工具交集、客户记忆和已审核禁止词实际生效;
引用校验、号码脱敏、合规替换、缺失依赖拒绝执行及治理方法覆盖测试通过。
限制:完整意图模型/工具执行器未完成;未登记工具记录和外部引用拒绝;正则规则失败关闭。
- [x] P1-3 SSE delta 与结果级恢复。
证据:test_agent_run_sse.py 6 passed;待完成连接输出提交后的 delta,终态重连用 replace;
中文/emoji、空正文、唯一事件 ID、未提交不泄露正文及断流恢复均覆盖。05 已同步。
- [x] P1-4 Controller 数据访问下沉。
证据:Controller 不再导入 Model/Repository 或操作 Session;架构 AST 检查 + HTTP/SSE
和真库 Worker 回归共 12 passed;新增 ConversationRepository/ConversationService/
RunQueryService/ConfigApplicationService,连接依赖移至 api/dependencies。
- [x] P1-5 公共、管理、运维接口覆盖及 OpenAPI;业务接口不纳入。
证据:OpenAPI 路由 40 条,覆盖运行、会话、取消、反馈、转人工、记忆、知识、管理资源、
健康和指标;所有底座写接口使用 ApiTransactionService 幂等回执,管理写接口要求 If-Match,
配置/模型/工具上限校验集中在 AdminService。接口动态资源按文档资源编号映射;业务域接口仍由组员负责。
- [x] P2-1 会话实体与澄清轮次。
`svc_conversation_session` 已按 02 §8.1 新表迁移,ConversationSession/SessionRepository
提供归属、状态、消息计数和带旧值的澄清轮次更新;未修改既有表。
- [x] P2-2 JWT 公钥缓存。
认证依赖使用单例 JwtAuthenticator,公钥只在进程首次请求加载;JWT 轮换需重启/清缓存。
- [x] P2-3 会话归属并发保护。
新会话表存在时受理使用用户+session 行锁、状态和 Agent 一致性校验;旧消息归属仍保留兼容兜底。
- [x] P2-4 废弃 HTTP 文档权威检查。
`tools/check_authoritative_docs.py` 检查 05 唯一权威文档和历史废弃稿标记。
- [x] P2-5 分层目录文档对齐。
代码实际目录以 `app/api/controllers`、`app/api/views`、`app/service`、`app/repository` 为准,
本次 AST 检查和 docs/07 已按此记录;不移动源码,避免无意义路径破坏。
- [x] P2-6 表数及 TODO 证据一致性。
02 文档同步为 51 张(含会话补表和 HTTP 回执表),audit_schema 及 Alembic head 已同步。
- [x] P2-7 外键与基线字段完整性核对。
新增表按 02 DDL 建立;既有表以 49 张指纹审计证明字段未变化。外键完整性不通过新增约束
改写既有表,保留由应用 Repository 约束的历史兼容关系;审计范围和限制见 docs/08。
状态只允许使用:
- `[ ]` 未开始
- `[-]` 进行中
- `[x]` 已完成并通过验收
- `[!]` 阻塞,必须在任务说明中写明原因和需要的决策
任务完成必须同时满足:代码完成、测试通过、文档同步、验收证据已记录。
## 三、当前基线
### 2026-09-09 业务域接入评估补课
- [x] P0-A 模型 Adapter、统一模型生成入口。
新增 OpenAI-compatible Adapter、env secret_ref 解析、模型失败统一错误、受控 fallback、
ModelGenerationService 和 BaseAgent.generate_with_model;业务 Agent 不能直连供应商。
验证:模型 Adapter、密钥不泄露、空路由失败关闭和工厂注入测试通过。真实供应商端点仍需环境配置演练。
- [x] P0-B ToolRegistry、ToolExecutor 和 BaseAgent 工具入口。
工具必须只读、声明输入 Schema/权限/角色,按意图白名单执行,失败关闭、超时、脱敏摘要、
来源引用和独立审计均已实现;工厂统一注入,未注入时拒绝执行。专项工具测试已补。
- [x] P0-C 公共适当性校验服务和工具入口。
新增 `SuitabilityService`、严格输入 DTO 和 `suitability_tool_handler`;统一执行 C1-C5/R1-R5
风险匹配、测评过期、风险揭示/二次确认/双录规则。通过和拒绝决定均写入 `interaction_audit`,
不修改交易或产品数据,业务 Agent 只能经 ToolExecutor 调用。专项边界、过期、时区和审计测试通过。
- [x] P1 意图分类公共服务。
新增 `IntentClassifier`:通过已注入的 `ModelGenerationService` 生成严格 JSON,校验意图必须属于
`AgentDefinition.supported_intents`,置信度低于可配置阈值时标记 `needs_clarification`;格式错误、
未声明意图和空输入失败关闭。专项测试已补,业务 Agent 不得自行复制分类解析逻辑。
- [x] P1 意图分类接入公共执行骨架。
`AgentFactory` 统一注入 `IntentClassifier` 和模型端点解析器;`BaseAgent.execute()` 在业务
`handle()` 前自动分类,并把结果写入 `CoreResult.intent`。业务 Agent 禁止覆盖分类、绑定方法,
不再需要自行创建分类器、调用路由或传递端点。骨架接入与防覆盖测试通过。
- [x] 补齐 `bootstrap` 公共依赖组装入口(截图问题 1)。
`get_agent_factory()` 统一组装数据库端点驱动的 `DatabaseModelGateway → ModelGenerationService`,
注册适当性只读工具到 `ToolRegistry → ToolExecutor`,并注入 `AgentFactory`;HTTP 与 Worker 共用同一入口。
业务组员不需要、也不允许自行拼接模型和工具链。专项组装测试已补。
- [ ] 截图问题 2(可运行示例 Agent)暂不处理,按当前任务范围排除。
- [x] 增加 Agent 注册表骨架契约测试(截图问题 3)。
`tests/contract/test_agent_factory_contract.py` 扫描注册表,强制每个构造器返回 `BaseAgent`,且
返回实例的 `AgentDefinition` 必须与注册定义完全一致;非法构造器会在工厂创建阶段失败。
- [x] 发布业务组员 Agent 接入使用说明书。
新增 `docs/11-业务组员Agent接入使用说明书.md`,明确组员提交物、公共执行顺序、模型/意图/工具/适当性
使用方式、禁止事项和验收命令。截图问题 2 的示例 Agent 仍按要求不处理。
- [ ] 基金行情数据底座接入(计划已发布)。
计划文档:`docs/12-基金行情数据底座接入开发计划.md`。按 F0-F6 先完成不改表的 Adapter、Service、
缓存/健康和 `query_fund_quote` 公共只读工具;F7 行情快照表仅在历史回测或监管留痕确有需求时启动。
当前进度:F0、F1、F2、F3、F4、F5 已完成;F6 底座侧接入规范已发布并通过工具契约检查,等待业务 Agent
按清单声明具体意图接入;F7 行情快照表暂不启动。
使用说明已同步:`docs/11-业务组员Agent接入使用说明书.md`、`docs/09-底座使用文档.md` 已明确
`query_fund_quote` 的可用条件、配置键、调用方式和当前未注册业务 Agent 的限制。
- [x] 合并组员使用说明书。
新增 `docs/14-Agent组员统一接入说明书.md`,作为业务组员唯一推荐入口,整合启动、注册、公共执行链、
模型、意图、工具、适当性、行情、禁止事项和验收命令;09、11 保留作为详细历史参考。
- [x] 完成 MVC+S 底座设计。
- [x] 完成 BaseAgent、AgentFactory、记忆、Neo4j、配置中心和模型路由设计。
- [x] 完成数据库设计,当前总表数为 49 张。
- [x] 新增 `agent_run` 作为可恢复运行实体。
- [x] 完成 REST/SSE 接口规范。
- [x] 明确 `run_id` 与 `trace_id` 分离。
- [x] 明确记忆提取事件在 `complete_run()` 同一事务写入 Outbox。
- [x] 将旧版 `docs/05-公共Agent平台接口规范.md` 标记为历史废弃稿。
- [ ] 尚未建立实际 Python 应用代码、Alembic 迁移和 OpenAPI 文件。
## 四、阶段 0:项目初始化
### T0.1 建立代码目录和工具链
状态:[-] 进行中(项目骨架、依赖和测试工具已完成;环境检查脚本仍需完善)
- [ ] 创建 `pyproject.toml`,固定 Python 版本和运行依赖。
- [ ] 创建 `app/`、`tests/`、`alembic/`、`openapi/` 目录。
- [ ] 配置 Ruff、MyPy、Pytest 和测试环境变量。
- [ ] 创建本地 MySQL、Redis、Milvus、Neo4j 的测试连接配置;密钥只使用环境变量或密钥引用。
- [ ] 验收:空项目可以运行 `python -m pytest -q`、`python -m ruff check app tests` 和 `python -m mypy app`。
### T0.2 建立契约编号和变更检查
- [ ] 在代码和文档中登记 `AGENT-REQ-001`、`AGENT-RESULT-001`、`AGENT-ERROR-001`、`AGENT-EVENT-001`、`AGENT-SSE-001`、`DB-RUN-001`。
- [ ] 增加检查脚本,验证契约编号唯一、接口文档引用存在、没有第二份 HTTP 权威文档。
- [ ] 验收:检查脚本发现重复契约编号或废弃接口文档被引用时必须失败。
## 五、阶段 1:公共契约和安全上下文
### T1.1 内部 DTO 和错误体系
状态:[x] 已完成并通过验收(公共契约、错误分类、统一信封和测试已完成)
- [ ] 实现 `AgentRequestMetadata`,只允许 `locale`、`client_version`、`ui_entry`。
- [ ] 实现 `AgentRequest`、`RequestContext`、`AgentDefinition`、`ResolvedAgentConfig`。
- [ ] 实现 `IntentResult`、`SourceReference`、`ToolCallRecord`、`CoreResult`、`AgentResult`。
- [ ] 实现 `RunProgressEvent`、`DomainEvent` 和 `AgentError` 分类。
- [ ] 测试额外字段、空消息、非法幂等键、非法置信度和越权上下文。
- [ ] 验收:契约测试全部通过,HTTP DTO 与内部 DTO 不互相直接复用。
### T1.2 JWT 和 RequestContext
状态:[x] 已完成并通过验收(RS256、iss/aud/exp/nbf/jti、吊销接口和 trace_id 已完成)
- [ ] 实现 JWT 签名、`iss`、`aud`、`nbf`、`exp`、`jti` 和吊销状态校验。
- [ ] 服务端重新加载角色、权限、客户归属和 `data_scope`。
- [ ] 实现 `trace_id` 生成、校验和 `X-Trace-ID` 响应头。
- [ ] 禁止客户端通过 Header、query、body 或 metadata 覆盖身份和权限。
- [ ] 验收:缺失、过期、错误签发方、错误受众和已吊销 Token 均返回 `401`。
## 六、阶段 2:数据库和持久化
### T2.1 数据库迁移
状态:[-] 进行中(49 张表已导入本地 jr;基线迁移文件仍需整理为 Alembic 版本链)
- [ ] 创建 10 张平台底座增量表,其中包含 `agent_run`。
- [ ] 创建 `agent_run` 的唯一键、外键、状态检查和 Worker 租约索引。
- [ ] 保持 33 张基线表和 6 张客服专项表的已有表名与已有字段定义不变。
- [ ] 使用 Alembic 生成迁移,不在运行时代码执行建表。
- [ ] 验收:空库创建后共 49 张表;Inspector 对比基线无禁止变更。
### T2.2 Repository
状态:[-] 进行中(核心 Model 和三个 Repository 已完成,事务集成测试待补)
- [ ] 实现 `AgentRunRepository`:创建、查询、租约抢占、租约接管、取消和终态更新。
- [ ] 实现 `IdempotencyRepository`:抢占、冲突、完成、失败和租约过期接管。
- [ ] 实现 `OutboxRepository`:追加、领取、发布、重试和死信状态更新。
- [ ] 实现会话、消息和审计 Repository 的最小读写接口。
- [ ] 验收:并发抢占只产生一个运行;终态不能被重复覆盖;Outbox 事件可幂等处理。
## 七、阶段 3:运行受理和 Worker
### T3.1 Agent 运行受理
状态:[x] 已完成并通过验收(事务、幂等重复、冲突、HTTP 202 和并发重复提交测试已通过)
- [ ] 实现 `POST /api/v1/agent-runs`。
- [ ] 受理事务原子保存用户消息、`request_idempotency`、`agent_run` 和 `agent.run_requested` Outbox。
- [ ] 相同幂等键和相同正文返回原 `run_id`。
- [ ] 相同幂等键和不同正文返回 `409 IDEMPOTENCY_CONFLICT`。
- [ ] HTTP 请求线程不得执行模型、Milvus、Neo4j 或记忆提取。
- [ ] 验收:返回 `202`、`run_id`、`trace_id`、状态地址和 SSE 地址。
### T3.2 AgentFactory 和 BaseAgent
状态:[x] 已完成并通过验收(注册、创建、七步执行骨架、治理方法保护和子类契约测试已完成)
- [ ] 实现 Agent 注册表和 `AgentFactory.create()`。
- [ ] 实现 `BaseAgent.execute()` 七步流程。
- [ ] 业务 Agent 只能实现 `AgentDefinition` 和 `handle()`。
- [ ] `BaseAgent` 不导入 HTTP、SSE View 或具体基础设施客户端。
- [ ] 契约测试扫描子类,禁止覆盖 `execute()` 和公共治理方法。
- [ ] 验收:未注册 Agent、非法角色、非法入口和未授权工具均被拒绝。
### T3.3 Worker 和运行租约
状态:[x] 已完成并通过验收(抢占、续租、取消检查、重试、终止和过期接管集成测试已完成)
- [ ] 实现 Worker 按 `run_id` 抢占和续租。
- [ ] 租约过期后允许其他 Worker 使用同一 `run_id` 接管。
- [ ] 可恢复错误按配置重试,不可恢复错误进入 `failed`。
- [ ] 取消请求只在安全停止点生效,最终提交阶段不得取消。
- [ ] 验收:进程重启、租约过期和重复消费不会生成第二份最终消息。
## 八、阶段 4:事务完成和记忆事件
### T4.1 `complete_run()`
状态:[x] 已完成并通过验收(最终消息、审计、幂等完成、运行终态和记忆 Outbox 同事务)
- [ ] 实现助手消息、`interaction_audit`、幂等完成状态、`agent_run` 终态和领域 Outbox 的同事务提交。
- [ ] 补齐 `DomainEvent.event_id`、`aggregate_type`、`occurred_at` 和 `trace_id`。
- [ ] 根据 `should_extract_memory()` 计算提取标记。
- [ ] `memory.extraction_requested` 必须在本事务写入 Outbox。
- [ ] 禁止请求线程在提交后调用 `memory_service.request_extraction()`。
- [ ] 验收:事务任一写入失败时全部回滚;提交后 Worker 可消费记忆事件。
### T4.2 Outbox Worker
状态:[-] 进行中(领取、发布、重试和死信已实现;事件幂等存储与业务消费者待补)
- [ ] 实现 `event_id` 幂等消费。
- [ ] 实现指数退避、最大重试次数和死信告警。
- [ ] 实现转人工、记忆提取、配置缓存失效和运行通知消费者。
- [ ] 验收:消费者重复收到同一事件不会重复创建工单、记忆或通知。
## 九、阶段 5:查询、SSE 和会话
### T5.1 运行查询
状态:[x] 已完成(持久化查询、用户隔离和稳定状态结构)
- [ ] 实现 `GET /api/v1/agent-runs/{run_id}`。
- [ ] 查询必须从 `agent_run`、`conversation_message` 和审计投影读取,不读 Worker 内存。
- [ ] 未完成、成功、失败和取消返回稳定状态结构。
- [ ] 越权资源统一返回 `404`。
### T5.2 结果级恢复 SSE
状态:[x] 已完成(数据库结果级恢复、终态事件和心跳)
- [ ] 实现 `GET /api/v1/agent-runs/{run_id}/events`。
- [ ] 输出 `start`、`tools`、`delta`、`replace`、`done`、`error`。
- [ ] `tools`、`delta`、`replace`、`done` 只能在最终事务提交后发送。
- [ ] 实现 15 秒注释心跳和连接最长时限。
- [ ] MVP 不实现事件级续传;断流后从数据库重建完整结果。
- [ ] 验收:SSE View 与 BaseAgent 无循环依赖,客户端可重连并得到完整结果。
### T5.3 会话和消息
状态:[-] 进行中(消息查询、反馈和公共转人工申请已完成;会话关闭与转人工查询待补)
本阶段完成证据:`app/api/controllers/conversations.py`、`ConversationFeedback`、`HandoverTicket`;Ruff/MyPy/21 项测试通过。
- [ ] 实现会话创建、查询、消息游标分页和结束。
- [ ] 实现消息反馈,防止同一用户重复评价同一消息。
- [ ] 实现公共转人工请求入口。
- [ ] 客服工单状态机由客服业务 Service 处理,不由公共 Controller 直接写表。
## 十、阶段 6:平台管理面
### T6.1 配置发布
- [ ] 实现配置草稿、校验、审核、激活、回滚和归档。
- [ ] 创建人不得审核自己创建的版本。
- [ ] 激活必须原子切换,回滚必须创建新发布记录。
- [ ] 草稿更新和状态转换使用 `If-Match`。
- [ ] 激活、审核、回滚和权限拒绝必须写审计。
### T6.2 模型和 Prompt 管理
- [ ] 实现模型端点管理,不返回明文密钥。
- [ ] 实现模型路由规则和 `model_routing_fallback` 管理。
- [ ] 禁止 HTTP 暴露旧的 `fallback_endpoint_ids` 作为权威字段。
- [ ] 实现 Prompt、意图配置、回复模板和禁止表达管理。
- [ ] 验收:有效版本唯一、备用端点外键和顺序约束生效。
### T6.3 审计查询
- [ ] 实现审计只读查询、游标分页和敏感详情权限。
- [ ] 禁止普通业务接口修改或删除 `interaction_audit`。
- [ ] 技术心跳、缓存操作和普通限流不写业务审计。
## 十一、阶段 7:OpenAPI 和测试
### T7.1 OpenAPI
- [ ] 生成 `openapi/agent-platform-v1.yaml`。
- [ ] 覆盖 `docs/05-接口文档.md` 第 19 节所有公共、管理和运维接口。
- [ ] 为每个写接口声明 JWT、幂等、权限、错误码和审计要求。
- [ ] 检查 OpenAPI 不把内部 DTO、ORM Model 或密钥字段暴露给客户端。
### T7.2 契约和安全测试
- [ ] 测试统一成功/错误信封。
- [ ] 测试 JWT、越权、跨客户访问和数据范围过滤。
- [ ] 测试重复提交、版本冲突、非法状态转换和游标边界。
- [ ] 测试 Agent 不能调用白名单之外的工具。
- [ ] 测试 Agent 不能代客下单、审核方案或处置风险预警。
### T7.3 故障恢复测试
- [ ] 测试 Worker 崩溃和租约接管。
- [ ] 测试 Redis 丢失后的 MySQL 恢复。
- [ ] 测试 Milvus、Neo4j、模型端点和消息中间件故障降级。
- [ ] 测试 Outbox 重试、死信和重复消费。
- [ ] 测试客户端断开后服务端仍完成归档、审计和结果查询。
## 十二、阶段 8:业务 Agent 接入
### T8.1 客服 Agent
- [ ] 由工厂注册 `customer_service`。
- [ ] 实现 FAQ、产品咨询、政策解释、闲聊和转人工意图。
- [ ] 接入知识引用、禁止表达、低置信澄清和客服转人工。
- [ ] 验收:五类意图、引用来源、合规拒答和降级模板均有端到端测试。
### T8.2 投顾 Agent
- [ ] 只生成投顾分析草案,不直接发布正式建议。
- [ ] 读取客户归属、风险测评、持仓和历史交易。
- [ ] 验收:越权客户访问、适当性不匹配和未审核草稿返回均被拦截。
### T8.3 风控 Agent
- [ ] 只读查询预警、证据和风险概览。
- [ ] 不能确认、关闭、升级预警,也不能修改交易、资金和持仓。
- [ ] 验收:所有工具调用经过白名单、数据范围和只读约束。
### T8.4 运营 Agent
- [ ] `agent_type=operations` 继续走统一 Agent 运行接口。
- [ ] 场外运营数据不得写入场内交易表。
- [ ] 若建设场外接口,必须单独提供业务表、Controller、Service 和文档。
## 十三、交付前总验收
- [ ] `python -m pytest -q` 全部通过。
- [ ] `python -m ruff check app tests` 通过。
- [ ] `python -m mypy app` 通过。
- [ ] 空库迁移完成后为 49 张表。
- [ ] 旧库升级只增加字段和新表,没有重命名、删除或改变已有字段定义。
- [ ] OpenAPI 与 05 接口文档路径、方法、必填 Header 和响应信封一致。
- [ ] 所有 Agent 由工厂创建,公共执行模板不可被绕过。
- [ ] `run_id` 可在服务重启后查询、接管和恢复结果。
- [ ] 记忆提取事件与 `complete_run()` 最终事务一致。
- [ ] 场内模拟交易、客服、投顾和风控边界测试通过。
- [ ] 所有未完成项、已知限制和迁移风险已写入发布记录。
## 十四、任务记录模板
每个任务完成后按以下格式补充记录:
```text
任务编号:T__
负责人:
开始日期:
完成日期:
实际修改文件:
测试命令:
测试结果:
数据库变更:无 / 新增表 / 新增字段(附基线对比)
接口变更:无 / 已同步 05 和 OpenAPI
未完成项:无 / 具体说明
阻塞与决策:无 / 需要负责人确认的内容
```
## 十五、底座负责人专项 TODO
本节是底座负责人需要实际交付的独立清单,范围包括通用架构、工厂类 Agent、数据库持久化、长期记忆、Neo4j 关系推理、配置中心和模型调度。业务组员只依赖本节产出的公共接口,不直接修改底座内部实现。
### D0. 范围确认和基线冻结
状态:[x] 已完成并通过验收(范围、数据库基线和公共契约已确认)
- [ ] 阅读并登记 `docs/00-新数据库基线设计.md`、`docs/01-通用Agent平台开发设计.md`、`docs/02-数据库建表设计.md`、`docs/03-平台端到端流程文档.md` 和 `docs/05-接口文档.md`。
- [ ] 建立“已有表/已有字段不可修改”基线快照,记录表名、字段名、类型、可空性、默认值、主键和索引。
- [ ] 建立公共契约清单:`AgentRequest`、`RequestContext`、`AgentResult`、`RunProgressEvent`、`DomainEvent`、`AgentError`。
- [ ] 明确底座与业务边界:底座提供能力和约束,业务 Agent 只实现 `AgentDefinition`、意图和 `handle()`。
- [ ] 验收:任何新增表、字段、接口和契约都能标注所属文档、负责人和兼容性影响。
### D0.1 依赖清单(requirements)
状态:[x] 已完成并通过验收(pyproject.toml、.env.example、.gitignore 和 jr_py313 已建立)
#### 必须固定的运行时依赖
- [ ] Python `3.11+`,项目依赖统一写入 `pyproject.toml`,禁止仅在个人环境手工安装。
- [ ] Web 和异步运行:`FastAPI`、`Uvicorn`、`Pydantic v2`、`httpx`、`anyio`。
- [ ] 数据库和迁移:`SQLAlchemy 2.x`、`Alembic`、`asyncmy` 或项目统一选定的 MySQL 驱动。
- [ ] 缓存和任务基础设施:`redis-py`,消息队列客户端按部署方案固定一种实现。
- [ ] 记忆和检索:Milvus 官方客户端、向量模型适配器,以及结构化记忆所需的 SQLAlchemy 支持。
- [ ] 关系推理:Neo4j Python Driver;Cypher 查询必须封装在 `RelationshipService`,业务 Agent 不得直接创建 Driver。
- [ ] 安全和配置:JWT 库、密码学库、环境变量加载库;密钥不得写入代码、提交记录或日志。
- [ ] 测试和质量:`pytest`、`pytest-asyncio`、`httpx` 测试客户端、`ruff`、`mypy`;需要数据库集成测试时增加 Testcontainers 或项目批准的替代方案。
- [ ] 可观测性:结构化日志、OpenTelemetry 或项目确定的 Trace SDK;日志必须支持 `trace_id`、`run_id`、`event_id`。
#### 依赖文件和版本规则
- [ ] 创建 `pyproject.toml`,声明 Python 版本、生产依赖、开发依赖、测试依赖和 Ruff/MyPy/Pytest 配置。
- [ ] 生成锁定文件(例如 `uv.lock` 或团队确定的等效文件),CI 使用锁定版本安装。
- [ ] 创建 `.env.example`,只放变量名、用途和示例占位值,不放真实密钥。
- [ ] 创建 `requirements-check.ps1` 或等效检查脚本,输出版本、连接状态和失败原因。
- [ ] 依赖升级必须记录版本、原因、兼容性影响和回滚方式;禁止无记录的批量升级。
- [ ] 验收:新开发环境只执行项目规定的安装命令即可完成依赖安装,且本地、CI 和测试环境使用同一锁定版本。
### D0.2 开发环境检查
状态:[x] 已完成并通过验收(MySQL、Redis、Neo4j、Milvus 连通性检查通过)
#### 本机工具检查
- [ ] 检查 Python 版本满足 `3.11+`,并确认 `python -m pip` 指向当前虚拟环境。
- [ ] 检查 `pytest`、`ruff`、`mypy`、`alembic`、`uvicorn` 命令可用。
- [ ] 检查 Git、Docker 和 Docker Compose 可用;不能使用 Docker 时必须提供等效的共享测试环境地址。
- [ ] 检查时区统一为 `Asia/Shanghai`,服务端数据库时间统一使用带时区或明确的 UTC 存储策略。
#### MySQL 检查
- [ ] MySQL 版本满足项目基线,字符集使用 `utf8mb4`,排序规则由数据库基线统一指定。
- [ ] 创建独立开发库、测试库和迁移验证库,禁止对生产库直接运行开发迁移。
- [ ] 验证应用账号具有业务所需的最小权限;迁移账号和运行账号分离。
- [ ] 验证连接池、事务隔离级别、时区、外键检查和 BIGINT 映射配置。
- [ ] 执行空库迁移后检查总表数为 49;执行基线对比,确认没有重命名、删除或修改已有字段定义。
#### Redis 和消息队列检查
- [ ] 验证 Redis 可连接、健康检查可用、超时和重连策略已配置。
- [ ] 明确 Redis 只用于缓存、短期状态和通知,不作为运行结果、审计或最终消息的唯一数据源。
- [ ] 验证消息队列主题、消费者组、重试队列和死信队列已创建,并记录命名规则。
- [ ] 验证 Outbox 重复投递、消费幂等和死信重放可以在测试环境执行。
#### Milvus 和 Neo4j 检查
- [ ] 验证 Milvus 地址、集合名、向量维度、距离算法和索引参数与配置中心一致。
- [ ] 验证 Milvus 不可用时结构化记忆召回仍可工作,并记录降级日志。
- [ ] 验证 Neo4j 版本、Bolt 地址、数据库名和账号权限;禁止使用管理员账号运行应用。
- [ ] 执行最小 Cypher 连通性测试、节点/关系白名单测试和租户隔离测试。
- [ ] 验证 Neo4j 重复写入幂等、关系软删除、同步失败重试和投影对账流程。
#### 模型和密钥检查
- [ ] 配置至少一个可用模型端点和一个受控备用端点,模型名称、能力标签、超时和限流写入配置中心。
- [ ] 验证模型端点密钥通过环境变量或密钥管理服务注入,接口响应和日志不会输出密钥。
- [ ] 验证模型不可用、超时、限流和返回非法结构时,Worker 能按错误分类重试或终止。
- [ ] 验证 Prompt、工具白名单和模型路由都来自已审核配置版本,不能由客户端请求覆盖。
#### 环境变量最小清单
- [ ] `APP_ENV`、`APP_NAME`、`LOG_LEVEL`、`TIMEZONE`。
- [ ] `JWT_ISSUER`、`JWT_AUDIENCE`、`JWT_PUBLIC_KEY` 或密钥服务引用、`JWT_CLOCK_SKEW_SECONDS`。
- [ ] `MYSQL_DSN`、`MYSQL_POOL_SIZE`、`MYSQL_MAX_OVERFLOW`、`MYSQL_TX_ISOLATION`。
- [ ] `REDIS_URL`、`REDIS_CONNECT_TIMEOUT_SECONDS`。
- [ ] `MESSAGE_BROKER_URL`、`MESSAGE_BROKER_RUN_TOPIC`、`MESSAGE_BROKER_OUTBOX_TOPIC`、`MESSAGE_BROKER_DLQ_TOPIC`。
- [ ] `MILVUS_URI`、`MILVUS_TOKEN` 或密钥服务引用、`MILVUS_COLLECTION`。
- [ ] `NEO4J_URI`、`NEO4J_DATABASE`、`NEO4J_USERNAME`、`NEO4J_PASSWORD` 或密钥服务引用。
- [ ] `MODEL_ROUTER_CONFIG_REF`、`MODEL_DEFAULT_ENDPOINT`、`MODEL_FALLBACK_ENDPOINT`。
- [ ] `SSE_HEARTBEAT_SECONDS`、`SSE_MAX_CONNECTION_SECONDS`、`WORKER_LEASE_SECONDS`、`WORKER_RETRY_LIMIT`。
- [ ] 验收:缺少必需变量时应用启动失败并给出变量名;任何日志、异常和 OpenAPI 响应都不暴露密钥值。
#### 环境检查验收命令
```powershell
python --version
python -m pip check
python -m pytest -q tests/environment
python -m ruff check app tests
python -m mypy app
alembic current
alembic upgrade head
```
- [ ] 将以上命令封装为一次可重复执行的环境检查脚本,并保存检查时间、依赖版本、服务版本和失败原因。
- [ ] 验收:环境检查全部通过后,才允许开始 D1;任一基础依赖不可用时,任务状态标记为 `[!]` 并记录阻塞原因。
### D1. MVC+S 通用底座
状态:[-] 进行中(目录、RequestContext、错误体系、依赖注入和分层骨架已完成;跨层静态契约检查、完整 Port 抽象和可观测性待补)
- [ ] 创建统一目录:`api/controller`、`api/view`、`service`、`repository`、`model`、`worker`、`core` 和 `infrastructure`。
- [ ] 固定调用方向:Controller -> Service -> Repository -> Model;View 不直接访问 Repository,Agent 不直接访问 Model。
- [ ] 定义依赖注入和 Service Protocol,模型、向量库、Neo4j、Redis、消息队列和外部模型均通过 Port 注入。
- [ ] 实现统一 `RequestContext`、权限检查、客户数据范围、`trace_id` 和审计上下文。
- [ ] 实现统一错误分类、错误码映射、日志字段和敏感信息脱敏。
- [ ] 验收:静态检查或契约测试能够发现 Controller 直接查库、Agent 直接调用基础设施和跨层依赖。
### D2. AgentFactory 和 BaseAgent
状态:[-] 进行中(Factory、BaseAgent 七步执行骨架、业务子类约束和 Worker 接入已完成;版本登记、配置版本绑定和组员模板待补)
- [ ] 实现 Agent 注册表、版本登记和 `AgentFactory.create(agent_type, context)`。
- [ ] 实现 `BaseAgent.execute()` 的统一七步流程:校验、权限、配置解析、记忆召回、意图处理、合规治理、结果封装。
- [ ] 将工具白名单、模型路由、Prompt 版本、禁止表达、超时、重试和审计注入公共执行流程。
- [ ] 保证 `BaseAgent` 不依赖 HTTP、SSE View、ORM Model 和具体厂商 SDK。
- [ ] 禁止业务子类覆盖 `execute()`、权限检查、审计、工具白名单和结果提交方法。
- [ ] 提供组员接入模板:Agent 类、注册代码、意图配置、工具声明、测试和文档交接表。
- [ ] 验收:组员只新增 Agent 实现和注册项即可运行,不需要修改公共 Controller 或 Worker。
### D3. 数据库和持久化底座
状态:[-] 进行中(49 表已导入、Model/Repository、租约、幂等、Outbox 和 complete_run 已完成;正式 Alembic 基线链、并发集成测试和完整迁移回滚验证待补)
- [ ] 按 `docs/02-数据库建表设计.md` 创建 10 张平台增量表,包含 `agent_run`、幂等、Outbox、配置、模型、Prompt 和审计关联表。
- [ ] 创建 Alembic 迁移、SQLAlchemy Model、Repository 和事务边界。
- [ ] 实现 `AgentRunRepository`:创建、查询、租约抢占、续租、接管、取消和终态更新。
- [ ] 实现 `IdempotencyRepository`:抢占、冲突、完成、失败和过期接管。
- [ ] 实现 `OutboxRepository`:追加、领取、重试、发布和死信。
- [ ] 实现 `complete_run()`:助手消息、审计、幂等完成、运行终态和领域事件同事务提交。
- [ ] 验收:空库共 49 张表;旧库只新增表和字段;并发条件下不会产生重复运行或重复最终消息。
### D4. 长期记忆系统
状态:[-] 进行中(MemoryService、结构化召回、关键词过滤、时间衰减、提取 Worker、触发判定、过期清理、客户隔离失效和冲突记录已完成;Milvus 向量召回、正式冲突裁决和删除级联待补)
- [ ] 定义记忆对象模型:记忆内容、类型、来源、重要性、置信度、客户归属、可见范围、版本、状态和过期时间。
- [ ] 实现记忆写入、更新、失效、删除标记和权限过滤;禁止跨客户召回记忆。
- [ ] 实现 `should_extract_memory()`,明确哪些对话、工具结果和业务事件触发记忆提取。
- [ ] 在 `complete_run()` 同一事务写入 `memory.extraction_requested` Outbox,禁止提交后直接调用提取服务。
- [ ] 实现记忆提取 Worker:事件幂等、失败重试、死信、人工重放和提取版本记录。
- [ ] 实现记忆召回:关键词、向量、结构化过滤和时间衰减;返回来源引用和置信度。
- [ ] 实现记忆合并、冲突处理、过期清理和用户删除请求的级联策略。
- [ ] 验收:同一事件重复消费只生成一份记忆;权限、租户和客户范围测试全部通过;向量库不可用时系统可降级为结构化召回。
### D5. Neo4j 关系推理
状态:[x] 已完成基础验收(白名单、邻居查询、1-2 跳路径查询、降级、持久化幂等、指数退避、死信和对账重放服务已完成;仍需真实 Neo4j 联调)
本阶段完成证据:`app/service/relationship_service.py`、`app/worker/graph_projection_worker.py`、`app/model/memory.py`;Ruff/MyPy/21 项测试通过。持久化幂等需在真实 MySQL 集成测试中最终验收。
- [ ] 定义图谱节点和关系白名单,不允许业务 Agent 自由创建任意标签或关系类型。
- [ ] 设计客户、基金、持仓、交易、风险、知识和记忆节点的唯一标识及租户隔离属性。
- [ ] 实现关系写入、版本、来源、有效期、置信度和软删除;所有写入关联 `trace_id` 和事件来源。
- [ ] 实现只读关系查询、路径查询、邻居查询和受控多跳推理接口。
- [ ] 设置最大跳数、结果数量、超时和权限过滤,防止无限扩图和越权推理。
- [ ] 实现 MySQL 事实数据与 Neo4j 投影的 Outbox 同步、重试、补偿和对账。
- [ ] Neo4j 不可用时返回可识别的降级结果,不阻塞已持久化的主流程。
- [ ] 验收:图谱重复事件幂等;关系查询只返回授权范围;同步延迟和失败记录可观测、可重放。
### D6. 配置中心和模型调度
状态:[-] 进行中(配置状态机、配置项读取、If-Match、模型端点筛选、fallback 顺序、健康过滤、缓存失效 Outbox、消费者、管理 API 和配置审计已完成;真实探针待补)
状态:[-] 进行中(ConfigRelease 状态机、配置项读取、If-Match 校验、ModelEndpointConfig 和 ModelRouterService 已建立;管理 API、审计 Outbox、缓存失效和 fallback 管理待补)
本阶段完成证据:`app/service/config_release_service.py`、`app/service/model_router_service.py`、`app/model/configuration.py`;Ruff/MyPy/21 项测试通过。
- [ ] 实现配置草稿、校验、审核、激活、回滚、版本锁和缓存失效。
- [ ] 实现模型端点、能力标签、限流、超时、成本和健康状态管理。
- [ ] 实现模型路由:按 Agent、意图、租户、场景和故障状态选择模型,并支持受控降级。
- [ ] 实现 Prompt、意图、工具白名单、禁止表达和回复模板的版本绑定。
- [ ] 配置激活、回滚和模型切换必须写审计,并通过 Outbox 通知 Worker 和缓存层。
- [ ] 验收:有效版本唯一;创建人不能审核自己;旧配置不会被正在运行的任务无意替换;密钥不出现在接口响应和日志中。
### D7. 运行可靠性和公共测试
状态:[-] 进行中。不能以方法存在性测试或全量测试通过代替专项验收;此前整体百分比未按验收项统计,不作为进度依据。
本次已验证(2026-09-09):
- [x] Outbox 发布使用当前 UTC 时间,不复用历史更新时间。
- [x] 空轮询回滚只读事务,释放专用 Session 的事务资源。
- [x] 提交失败执行回滚并传播错误,不再次提交或误计为消费者失败。
- [x] 消费异常仅记录异常类型,不持久化可能含密钥的原始报错。
- [x] 单元测试覆盖成功、空队列、提交失败、消费失败计数、达到上限和无消费者死信,共 6 个用例。
证据:`tests/unit/worker/test_outbox_worker.py`;本次全量 28 passed,Ruff/MyPy 通过。以上使用模拟 Session,不代表真实数据库回滚或重复投递集成验收通过。
待补:真实模型端点故障注入演练和生产端点配置。Neo4j 超时降级、Redis 缓存降级、Milvus 向量适配器降级、关系白名单、供应商无关 ModelGateway fallback、本地治理路径性能基线、Prompt/意图/工具按发布版本读取、回滚缓存失效事件、Redis/Milvus 停止恢复演练和客户端断流结果级恢复测试已完成。
- [ ] 实现 Worker 租约、心跳、过期接管、可恢复错误重试和不可恢复错误终止。
- [ ] 实现运行结果查询和结果级 SSE 恢复,SSE 不依赖 Worker 内存。
- [ ] 测试 Redis、Neo4j、向量库、模型端点和消息队列不可用时的降级行为。Neo4j 与模型路由单元降级已通过,Redis/Milvus/真实模型端点待演练。
- [ ] 测试 Outbox 重复投递、死信重放、进程崩溃、数据库回滚和客户端断流。
- [ ] 建立底座契约测试、数据库迁移测试、权限测试、性能基线和故障演练记录。
- [ ] 验收:服务重启后 `run_id` 可查询、接管和恢复;所有关键异步事件可追踪、重试和对账。
### D8. 对业务组员的交付物
状态:[-] 已发布底座使用文档;Agent 接入模板、示例 Agent 和完整 Service Protocol 仍待补齐
- [ ] 发布 Agent 接入模板和最小示例 Agent。
- [x] 发布底座使用文档:`docs/09-底座使用文档.md`。
- [ ] 发布公共 Service Protocol、DTO、错误码、事件类型和工具声明规范。
- [ ] 发布数据库新增表和字段说明、迁移执行说明及回滚限制。
- [ ] 发布记忆召回、Neo4j 查询、模型路由和配置读取的调用示例。
- [ ] 发布“允许做什么/禁止做什么”清单:Agent 可查询、分析、生成草案和转人工;不可代客下单、审核方案、处置风险预警或修改交易数据。
- [ ] 验收:业务 Agent 开发者只阅读底座开发文档和接口文档,即可完成一个新 Agent 的注册、测试和运行。
### D9. 底座专项完成标准
状态:[-] 底座核心已完成;待外部真实模型端点配置和业务 Agent 端到端验收
- [x] 底座核心任务均有代码、测试、文档和验收证据;未验收项已明确记录。
- [x] 公共执行模板不可被业务 Agent 绕过,工厂是唯一创建入口。
- [x] 数据库兼容性检查通过,没有修改已有表名和已有字段定义。
- [x] 长期记忆提取与 `complete_run()` 事务一致,Neo4j 投影可重试和对账。
- [x] 配置、模型、Prompt、工具和权限支持版本化、审计和回滚基础能力。
- [ ] 至少一个客服 Agent、一个投顾 Agent 和一个风控 Agent 在底座上完成端到端验收。
说明:最后一项属于业务 Agent 接入和业务组验收,不纳入本轮底座负责人个人交付;D8 继续暂停。
## 十六、已完成任务记录
```text
任务编号:D9 / 底座负责人专项收口
完成日期:2026-09-09
最终验证:43 passed;Ruff 通过;MyPy 通过;49 张业务表 schema audit 通过;Redis/Neo4j/Milvus 健康检查通过;本地治理路径性能基线执行成功。
底座范围:MVC+S、AgentFactory/BaseAgent、运行受理/租约/恢复、数据库持久化、complete_run 同事务 Outbox、记忆基础、Neo4j 投影、配置发布/审计/回滚、模型路由/ModelGateway、Redis/Milvus 降级、结果级 SSE。
未纳入本轮:D8 组员交付物、真实模型厂商端点配置、客服/投顾/风控业务 Agent 端到端验收。
数据库约束:仅新增 outbox_delivery 表;未重命名、删除或修改任何既有表和字段定义。
```
```text
任务编号:D6 / ModelGateway 与受控 fallback
完成日期:2026-09-09
修改文件:app/service/model_gateway.py、tests/unit/service/test_model_gateway.py、TODO.md
已完成:供应商无关 ModelGateway Protocol;按 ModelRouterService 输出顺序尝试端点;成功使用 fallback 时标记 degraded;所有端点失败返回统一错误。
验证结果:43 passed;Ruff/MyPy 通过;49 张业务表审计通过。
未完成:真实模型端点配置和网络故障演练。
```
```text
任务编号:D7 / 客户端断流结果级恢复
完成日期:2026-09-09
修改文件:tests/unit/api/test_agent_run_sse.py、TODO.md
已验证:客户端只读取 start 后断开,重新根据同一 run_id 生成完整 replace/done 终态事件;结果恢复不依赖原连接或 Worker 内存。
结果:全量 42 passed;Ruff/MyPy 通过。
```
```text
任务编号:D7 / Redis 与 Milvus 真实停止恢复演练
完成日期:2026-09-09
目标容器:my-redis、milvus-standalone
停止验证:redis unavailable:ConnectionError;milvus unavailable:MilvusException;neo4j ok。
降级验证:缓存和向量适配器故障单元测试通过。
恢复验证:两个容器重新启动后 redis=True、milvus=ok、neo4j=ok。
结果:真实停止、故障观测、恢复和健康复查完成;未修改业务数据库表。
```
```text
任务编号:D7 / Milvus 向量检索降级边界
完成日期:2026-09-09
修改文件:app/infrastructure/vector_memory.py、tests/unit/infrastructure/test_vector_memory.py、TODO.md
已完成:向量检索成功路径封装;Milvus 异常返回空结果和 degraded 标志,不阻塞 MySQL 结构化召回。
验证结果:41 passed;Ruff/MyPy 通过。
说明:故障桩单元验证已通过,真实 Milvus 停止/恢复演练仍未执行。
```
```text
任务编号:D7 / Redis 缓存降级边界
完成日期:2026-09-09
修改文件:app/infrastructure/memory_cache.py、tests/unit/infrastructure/test_memory_cache.py、TODO.md
已完成:缓存读失败返回 degraded 标志;缓存写失败返回 False;缓存不可用不阻塞 MySQL 主存储。
验证结果:40 passed;Ruff/MyPy 通过。
说明:使用故障桩完成单元降级验证,真实 Redis 停止/恢复演练仍未执行。
```
```text
任务编号:D7 / 本机外部依赖健康检查
完成日期:2026-09-09
新增文件:tools/dependency_health_check.py
执行命令:python tools/dependency_health_check.py
结果:redis=True;neo4j=ok;milvus=ok。
说明:仅为连通性检查,不等于故障注入、降级和恢复演练;PyMilvus 输出第三方 API 弃用警告。
```
```text
任务编号:D6 / 配置发布生命周期真实 MySQL 验收
完成日期:2026-09-09
修改文件:app/service/config_release_service.py、tests/integration/test_config_release_mysql.py、TODO.md
验证结果:真实 MySQL 配置生命周期 1 passed;全量 38 passed;Ruff/MyPy 通过;schema audit 通过。
已验证:创建人不能审核自己;激活只有一个 active;旧版本变为 superseded;回滚记录 rollback_of_release_id;激活和回滚缓存失效 Outbox;四类配置审计。
修复缺陷:回滚前先 flush 释放 active_slot;回滚状态使用基线允许的 superseded;自增实体不再显式写 id=0。
数据库变更:无。
```
```text
任务编号:D6 / 配置版本链补齐
完成日期:2026-09-09
修改文件:app/model/configuration.py、app/service/config_release_service.py、TODO.md
已完成:补齐既有 config_release 的 supersedes_release_id/rollback_of_release_id ORM 映射;回滚记录指向目标版本;回滚同样写缓存失效 Outbox。
数据库变更:无,字段原已存在,仅补充 ORM 映射;未新增迁移。
验证结果:37 passed;Ruff/MyPy 通过。
```
```text
任务编号:D6 / 工具白名单发布版本绑定
完成日期:2026-09-09
修改文件:app/service/runtime_config_service.py、TODO.md
实现:RuntimeConfigService.allowed_tools() 按 release_id、namespace=agent_tools 和 agent_type:intent_code 读取,并严格校验为字符串列表。
数据库变更:无;复用 platform_config_item,未修改已有字段。
验证结果:37 passed;Ruff/MyPy 通过。
未完成:真实数据库配置集成测试和完整管理 API。
```
```text
任务编号:D6 / Prompt 与意图运行时版本绑定
完成日期:2026-09-09
修改文件:app/model/configuration.py、app/service/runtime_config_service.py、TODO.md
验证结果:37 passed;Ruff/MyPy 通过;49 张业务表审计通过。
已完成:Prompt 按 release_id/task_type/agent_type 读取;意图按 agent_type/intent_code 且仅 active 读取;未新增或修改数据库结构。
未完成:完整管理 API 和配置集成测试。工具白名单现已通过 `platform_config_item(namespace=agent_tools)` 与 release_id 绑定,仍需数据库集成测试。
```
```text
任务编号:D7 / 本地治理路径性能基线
完成日期:2026-09-09
新增文件:tools/performance_baseline.py
执行命令:python tools/performance_baseline.py
结果:200 次迭代,p50=0.0142ms,p95=0.0166ms,max=0.0973ms。
说明:仅测量进程内 BaseAgent 治理路径,不包含数据库、向量库、Neo4j、模型网络调用,不作为生产 SLA。
```
```text
任务编号:D7 / SSE 结果级恢复修正
完成日期:2026-09-09
修改文件:app/api/views/agent_run_sse.py、app/api/controllers/agent_runs.py、tests/unit/api/test_agent_run_sse.py、TODO.md
验证结果:34 passed;Ruff/MyPy 通过。
已验证:运行未完成时只发送 start/心跳;最终事务完成后才发送 tools、replace、done/error;SSE 不依赖 Worker 内存,按 run_id 轮询数据库并受最长连接时间限制。
未完成项:真实客户端断流测试、外部依赖故障演练和性能基线。
```
```text
任务编号:D7 / complete_run 真实事务回滚验收
完成日期:2026-09-09
修改文件:tests/integration/test_complete_run.py、TODO.md
验证方法:在同一完成事务中制造 domain_event_outbox.event_id 唯一键冲突。
结果:真实 MySQL 验证助手消息、agent_run 终态、request_idempotency、interaction_audit 和全部 Outbox 写入均回滚;2 passed。
数据库变更:无;测试数据已清理。
```
```text
任务编号:D7 / Outbox 死信重放
完成日期:2026-09-09
修改文件:app/service/outbox_admin_service.py、tests/integration/test_outbox_replay_mysql.py、TODO.md
验证命令:python -m pytest -q tests/integration/test_outbox_replay_mysql.py -p no:cacheprovider;python -m ruff check app tests;python -m mypy app
结果:真实 MySQL 1 passed;Ruff/MyPy 通过。
数据库变更:无。
已验证:仅 dead 状态可重放;重试状态被重置;重放动作写 interaction_audit;测试数据完成清理。
```
```text
任务编号:D7 / Outbox 真实 MySQL 幂等验收
完成日期:2026-09-09
修改文件:app/worker/outbox_worker.py、tests/integration/test_outbox_mysql.py、tests/unit/worker/test_outbox_worker.py、tools/audit_schema.py、TODO.md
验证命令:alembic upgrade head;python -m pytest -q -p no:cacheprovider;python -m ruff check app tests tools alembic;python -m mypy app;python tools/audit_schema.py
结果:Alembic 位于 20260909_outbox_delivery (head);29 passed;Ruff/MyPy 通过;49 张业务表无缺失和意外表。
数据库变更:仅新增 outbox_delivery;原 48 张业务表及字段未修改。
已验证:进程级重建 Session 后重复投递不重复执行 Handler;不同消费者不误领事件。
未完成项:死信重放、真实数据库提交失败回滚、并发唯一冲突压力测试。
```
```text
任务编号:D7 / Outbox 持久化消费幂等接入
完成日期:2026-09-09
修改文件:app/model/platform.py、app/worker/outbox_worker.py、alembic/versions/20260909_outbox_delivery.py、tests/unit/worker/test_outbox_worker.py、TODO.md
验证命令:python -m pytest -q -p no:cacheprovider;python -m ruff check app tests;python -m mypy app
结果:28 passed;Ruff/MyPy 通过。单元测试为模拟 Session,存在 AsyncMock 的测试环境警告。
数据库变更:新增 `outbox_delivery`,未修改已有表或字段。
未完成项:真实 MySQL 迁移、唯一冲突并发测试、死信重放。
```
```text
任务编号:D7 / Outbox 事务与异常处理回归
完成日期:2026-09-09
修改文件:app/worker/outbox_worker.py、tests/unit/worker/test_outbox_worker.py、TODO.md
验证过程:先新增行为测试,5 failed / 1 passed;修复后全量 28 passed。
验证命令:python -m ruff check app tests;python -m mypy app;python -m pytest -q -p no:cacheprovider
结果:Ruff、MyPy 通过;28 passed,2 项第三方弃用警告。
数据库变更:无;不改变任何已有表或字段。
未完成项:真实 MySQL 故障与回滚验证、到期重试调度、幂等与死信重放。
进度口径:本次新增 6 个行为用例替代 1 个导入测试;D7 仍在进行中,不增加未经统计的整体百分比。
```
```text
任务编号:T5.3、D4(基础)、D5(基础)、D6(基础)
负责人:底座负责人
完成日期:2026-09-09
实际修改文件:app/api/controllers/conversations.py、app/model/conversation.py、app/model/platform.py、app/model/memory.py、app/service/memory_service.py、app/worker/memory_extraction_worker.py、app/service/relationship_service.py、app/worker/graph_projection_worker.py、app/model/configuration.py、app/service/config_release_service.py、app/service/model_router_service.py
测试命令:python -m ruff check app;python -m mypy app;python -m pytest -q
测试结果:通过;21 passed
未完成项:持久化幂等、Neo4j 对账、配置管理 API、缓存失效、完整专项集成测试
```
```text
任务编号:D0、D0.1、D0.2、T1.1、T1.2
负责人:底座负责人
完成日期:2026-09-09
实际修改文件:pyproject.toml、.env、.env.example、app/core、app/api、tests、config/jwt
测试命令:python -m pytest -q;python -m ruff check app tests;python -m mypy app
测试结果:通过;7 passed
数据库变更:新增 48 张业务表和 1 张 alembic_version,已执行结构审计
接口变更:公共内部契约已完成,HTTP 运行接口尚未开始
未完成项:T0.2 契约编号检查、T2.2 集成测试、T3.1 运行受理
阻塞与决策:基线表由 00 和 02 文档生成,已记录生成脚本和审计脚本
```
```text
任务编号:T2.1、T2.2、T3.1
负责人:底座负责人
完成日期:2026-09-09
实际修改文件:alembic、app/model、app/infrastructure/db.py、app/repository、app/service、app/api、tools
测试命令:alembic upgrade head;python tools/audit_schema.py
测试结果:49 张表审计通过;Repository 静态检查通过
数据库变更:平台增量表、运行表、幂等表和 Outbox 已建立
接口变更:无
未完成项:基线迁移需整理为正式 Alembic 历史版本;Repository 和 T3.1 集成测试待补;统一错误映射待补
阻塞与决策:无
```