docs: M2 收尾复核闭环(M4)+Wave 0 状态同步——M4 复核记录(任务映射/T-30~T-32 边界收口/成功体不包裹演进口径维持/agent_message.trace_id 请求级口径/会话枚举取舍登记), TODO(T-01/T-02/T-06/T-07 勾选+T-30~T-32 收口), MEMORY(§0 进度/仓库地图/下一步/273 绿), FLOW(§0 JWT 已做/§1 链路/§2 对话主链路状态), FRAMEWORK(能力模块+分层), REQUIREMENTS(F-01/F-02 完成/F-03 部分), 开发计划头注, 演示 SOP 补 JWT 通道签发演示

This commit is contained in:
2026-09-07 03:08:27 +08:00
parent 61711cb70a
commit b97e77747a
7 changed files with 79 additions and 58 deletions
+16 -16
View File
@@ -38,7 +38,7 @@
RBAC 联调账号:scripts/dev/rbac-seed-reference.md
```
**尚未自动化:** Milvus 建 Collection、JWT 中间件(现 `api/deps.py` debug 头过渡,T-01 就绪换工厂内部)— 见 `TODO.md`;agent 专用表已有 `02-mysql-agent专用.sql`(手工执行,含 risk_aml_list)。
**尚未自动化:** Milvus 建 Collection(T-21);agent 专用表已有 `02-mysql-agent专用.sql`(手工执行,含 risk_aml_list)。JWT 中间件已完成(T-01:`app/service/auth_service.py` + `deps.py` 工厂;dev 联调签发 `scripts/dev/issue_dev_token.py`,debug 头兜底仅限 development 且未配 RS256 公钥)。
------
@@ -48,9 +48,9 @@ RBAC 联调账号:scripts/dev/rbac-seed-reference.md
Client → Gateway(JWT/RBAC) → api/chat → agent_service(LangGraph) → Tools → 存储 → 响应 + audit_log
```
当前:**风控事件线已集成 + 测试基建完成**(交易网关 → 规则引擎 → 预警/AML/L3 → 4 API,`main.py` 路由挂载 + trace 中间件 + lifespan 完成,B1~B8;B8 = conftest 演示数据校验 + 集成测试 A-1~A-5/A-7/A-9 + `tests/_ddl.py` DDL 单一事实源;B7/B8 均经独立 AI 评审闭环;B9a = subscribe_alerts/rebuild_alerts 演示与补偿脚本;B9b = 演示走查 + B6/B7/B8 核查单①~⑥收口(disclaimer/aml scan 幂等/集成测试前置断言),演示 SOP 见 docs/项目框架设计/演示SOP-风控模块.md;B9b 复审有条件通过→闭环:P2-1 SOP 交互重灌补 DROP agent / P2-2 补做 T-31 名下 P2-8 手工 SQL 对照收口 / P2-3 走查口径统一,209 测试绿,M2 tag risk-m2);阶段 B 完结;对话链路待 T-01/T-07。
当前:**风控事件线 + Wave 0 共用底座完成**(交易网关 → 规则引擎 → 预警/AML/L3 → 4 API,`main.py` 路由挂载 + trace 中间件(X-Trace-Id/X-Request-Id + 500 兜底)+ audit 中间件(http_access)+ lifespan 完成,B1~B8;T-01 JWT 鉴权(Bearer 全环境 + dev debug 头兜底 + X-Agent-Type 准入矩阵)/ T-02 审计与 input_guard_log 双写 / T-06 chat 最小闭环(`POST /api/chat` 会话+窗口+落盘)/ T-07 LangGraph 骨架+DeepSeek(无 key 降级)均于 2026-09-07 完成并经独立 AI 评审闭环;M2 tag risk-m2 + M4 复核闭环;273 测试绿);阶段 B 完结;**对话链路骨架已通**(chat → LangGraph → 免责声明 → 落库),Tool 节点与 RAG 待 T-04/T-21、输入防护待 T-03。
**本机已就位状态(2026-09-07 更新 · 已完成上述 ①~⑤,无需重做):** `.env` 已配置(学习项目,`MYSQL_PASSWORD=123456`;NEO4J/DEEPSEEK 留空暂不影响风控);`jinrong_core` + `jinrong_agent` 已灌库(28 客户 / AML 名单 8 条 / 演示测评已刷新 / 归属同步 28 行);`python -m pytest` 209 用例(重灌后全绿;集成测试真连本机 MySQL,未灌库的机器自动 skip 集成模块。**演示库当前含 B9b 走查残留,跑集成前先按演示 SOP §2 重灌**——核查单⑥前置断言会对残留数据显式 fail);本机 Redis 服务在跑(`redis://127.0.0.1:6379/0`,B9a 订阅脚本已验证)。
**本机已就位状态(2026-09-07 更新 · 已完成上述 ①~⑤,无需重做):** `.env` 已配置(学习项目,`MYSQL_PASSWORD=123456`;NEO4J/DEEPSEEK 留空——DEEPSEEK_API_KEY 空时 chat 走降级回复,不阻塞演示;JWT 配置走默认 dev secret,启动有 warning 属预期);`jinrong_core` + `jinrong_agent` 已灌库(28 客户 / AML 名单 8 条 / 演示测评已刷新 / 归属同步 28 行);`python -m pytest` 273 用例(重灌后全绿;集成测试真连本机 MySQL,未灌库的机器自动 skip 集成模块。**演示库当前含 B9b 走查残留,跑集成前先按演示 SOP §2 重灌**——核查单⑥前置断言会对残留数据显式 fail);本机 Redis 服务在跑(`redis://127.0.0.1:6379/0`,B9a 订阅脚本已验证)。
**本机已知坑:** `mysql.exe` 不在 PATH(位于 `C:\Program Files\MySQL\MySQL Server 8.0\bin`);`reset.ps1` 的交互式 `-p` 在自动化执行时会卡死——脚本化重灌用 `MYSQL_PWD` 环境变量传密码(交互执行不受影响,不把密码写进仓库脚本);`redis` 包 requirements 有但初始 `pip install -r` 漏装(B9a 于 2026-09-07 补装,重装环境时留意)。
@@ -61,23 +61,23 @@ Client → Gateway(JWT/RBAC) → api/chat → agent_service(LangGraph) → Tools
```text
输入:Authorization + X-Agent-Type + X-Trace-Id + 用户消息
↓
Gateway:验签、角色准入、注入 AuthContext 【待做 T-01】
Gateway:验签、角色准入、注入 AuthContext 【T-01 已做】(JWT 验签/吊销 + AGENT_ACCESS_MATRIX)
↓
api/chat:SessionGuard;创建/续 agent_session 【待做】
api/chat:SessionGuard;创建/续 agent_session 【T-06 已做】(actor/agent_type 一致校验)
↓
memory_service:Redis 读最近 N 轮;异步写 agent_message 【待做】
memory_service:Redis 读最近 N 轮;MySQL 落盘 agent_message 【T-06 已做】(窗口 TTL2h N≤20,miss 回源;同步落盘)
↓
agent_service:LangGraph StateGraph + DeepSeek;按 Agent 类型选 Tool 节点 【待做】
agent_service:LangGraph StateGraph + DeepSeek;按 Agent 类型选 Tool 节点 【T-07 骨架已做(llm→guard+免责声明);Tool 节点待阶段 C/T-04】
↓
Tool 示例:
- CoreReadOnlyRepository:持仓/流水/L0(自动注入 customer_id) 【Repository 已有,Tool 未接】
- milvus_tool:产品规则 RAG + source_refs 【待做】
- memory_service:读/写 L1/L2/L3(ProfileGuard) 【待做】
- 风控 service 账号:R-02 适当性(无会话) 【待做】
- CoreReadOnlyRepository:持仓/流水/L0(自动注入 customer_id) 【Repository 已有,Tool 未接 T-04】
- milvus_tool:产品规则 RAG + source_refs 【待做 T-21】
- memory_service:读/写 L1/L2/L3(ProfileGuard) 【窗口读写已做;画像读写待做】
- 风控 service 账号:R-02 适当性(无会话) 【待做 阶段 C】
↓
输出:assistant 消息 + has_disclaimer(客户/对外)
输出:assistant 消息 + has_disclaimer(customer/risk 固定免责,T-07 guard 节点)
↓
落库:agent_message、agent_tool_call、audit_log(同 trace_id)
落库:agent_message、agent_tool_call(待 C1 Tool 节点)、audit_log(http_access 已接,同 trace_id)
```
------
@@ -107,12 +107,12 @@ admin/knowledge 上传 → document_parser → embedding_tool(Ollama bge-m3)
| 步骤 | 输入 | 输出 | 约定 |
| --- | --- | --- | --- |
| 鉴权 | JWT | AuthContext | 失败 401/403 + audit |
| 会话 | session_id | Redis ctx + MySQL session | actor_id 一致 |
| 鉴权 | JWT | AuthContext | 失败 401/403 + audit + input_guard_log 双写(401 归 platform) |
| 会话 | session_id | Redis ctx + MySQL session | actor_id 一致(AUTH_403_SESSION_AGENT) |
| RAG | question + product_id? | chunks + source_doc_id | 必须溯源 |
| 画像读 | customer_id | L1/L2/L3 JSON | RBAC 矩阵 §8 |
| Core RO | customer_id | L0/持仓/流水 | 只读 jinrong_core |
| 审计 | 任意判定 | audit_log INSERT | 不可删改 |
| 审计 | 任意判定 | audit_log INSERT | 不可删改;http_access 经 audit 中间件 |
------
+15 -12
View File
@@ -34,13 +34,14 @@
| 模块 | 职责 | 依赖 | 代码状态 |
| --- | --- | --- | --- |
| Agent Gateway / Auth SDK | JWT、RBAC、归属校验 | Redis、MySQL customer_advisor_rel | **过渡版已实现**(`api/deps.py` debug 头 AuthContext + 归属断言 + 越权审计,B6;JWT 解析归 T-01,仅换工厂内部) |
| 客户财富 Agent | L1 画像、事实查询、阈值提醒 | Core RO、Milvus 产品库 | 空壳 service |
| 代理人助手 Agent | L2 画像、RAG、草稿 | L1 只读、Milvus | 空壳 service |
| 数据分析 Agent | NL→SQL→解读 | Core RO、画像只读 | 空壳 service |
| Agent Gateway / Auth SDK | JWT、RBAC、归属校验 | Redis、MySQL customer_advisor_rel | **已实现(T-01,2026-09-07)**:`service/auth_service.py`(验签/吊销)+ `api/deps.py`(Bearer 全环境优先 + dev debug 头兜底 + AGENT_ACCESS_MATRIX 准入) |
| 客户财富 Agent | L1 画像、事实查询、阈值提醒 | Core RO、Milvus 产品库 | 空壳 service(chat 骨架已通) |
| 代理人助手 Agent | L2 画像、RAG、草稿 | L1 只读、Milvus | 空壳 service(chat 骨架已通) |
| 数据分析 Agent | NL→SQL→解读 | Core RO、画像只读 | 空壳 service(chat 骨架已通) |
| 风控监测 Agent | 预警、L3、R-02 适当性 | 交易事件、AML 名单 | **已实现**(B1~B7:rules/alert_service/profile_l3/aml_service/engine/scoring 占位 + 4 API + suitability + main 集成与挂账①~⑦) |
| Core 只读层 | L0 事实查询 | `jinrong_core` | **core_ro.py 已实现**(含风控扩展查询) |
| 共用底座 | 会话、审计、输入防护 | MySQL 11 表 + Redis | **部分接入**(风控审计落库 / Redis 推送已接;会话、全量审计中间件、输入防护待 T-02/T-03) |
| 共用底座 | 会话、审计、输入防护 | MySQL 11 表 + Redis | **大部分接入(2026-09-07)**:会话(T-06 session_repository + memory_service 窗口)、审计中间件(T-02 http_access + input_guard_log 双写)已接;输入防护规则待 T-03 |
| 对话编排 | LangGraph StateGraph + DeepSeek | langgraph/langchain-openai | **骨架已实现(T-07,2026-09-07)**:llm→guard(免责声明);Tool 节点待 T-04/阶段 C |
| 同步脚本 | 归属、Neo4j | Core → agent / 图库 | **sync_*.py 已实现** |
------
@@ -48,16 +49,18 @@
## 3. 后端分层(app/)
```text
api/ → 风控 risk / simulate / deps 已实现(main 已挂载);chat、knowledge、admin 空壳【部分】
service/ → risk/*(rules/alert/aml/engine/l3/scoring/locks/redis_gateway)+ suitability 已实现;
agent_service、rag_service、memory_service 空壳 【部分】
api/ → risk / simulate / chat / deps / audit_middleware 已实现;knowledge、admin 空壳 【大部分】
service/ → risk/*(rules/alert/aml/engine/l3/scoring/locks/redis_gateway)+ suitability +
auth_service(T-01 JWT)+ agent_service(T-07 StateGraph)+ memory_service(T-06)已实现;
rag_service 空壳 【大部分】
tool/ → document_parser、embedding_tool、milvus_tool 【空壳】
repository/ → core_ro(Core 只读)+ risk_repository(风控四表) 【已实现】
repository/ → core_ro(Core 只读)+ risk_repository(风控四表+审计双写)+
session_repository(agent_session/agent_message,T-06) 【已实现】
gateway/ → 模拟交易网关(trade_gateway + gateway_repository 仅 INSERT core_trade) 【已实现 B5】
model/ → schemas(Pydantic)、entities(ORM) 【占位】(风控暂用 dict,收敛待后续)
config/ → settings(双库 + risk_* 阈值)、database 【settings 已实现】
utils/ → trace / desensitize / db(引擎工厂)/ response(统一错误体)/ exceptions 【基本就绪;logger 占位】
main.py → 路由挂载 + trace 中间件 + lifespan(B7) 【已集成】
config/ → settings(双库 + risk_* 阈值 + JWT 配置)、database 【settings 已实现】
utils/ → trace(trace_id+request_id)/ desensitize / db(引擎工厂)/ response(统一错误体)/ exceptions 【基本就绪;logger 占位】
main.py → 路由挂载 + trace 中间件(双 ID 贯通 + 500 兜底)+ audit 中间件 + lifespan(B7/T-02) 【已集成】
允许:api → service → tool / repository / model / config
禁止:api 直连 Milvus/MySQL 写复杂逻辑;tool 写业务流程;repository 写 Core
+18 -14
View File
@@ -9,26 +9,29 @@
**项目是什么:** 金融四 Agent(客户财富 / 代理人 / 数据分析 / 风控)共用数据层与合规底座;**不**互调 LLM,跨 Agent 走 L1/L2/L3 画像与预警表。
**当前进度:** 需求与表设计已定 · **风控模块 B1~B9b 全部完成(M2 已达成,tag risk-m2)**(规则/预警聚合/L3/AML/引擎/交易网关/鉴权+4 API/适当性校验/main 集成/B8 测试基建/B9a 订阅+重放脚本/B9b 演示走查+核查单①~⑥收口,B7/B8/B9a/B9b 均经独立 AI 评审闭环,**209 测试绿**)· 阶段 B 完结剩 M2 文字复核 → **JWT(T-01) / 审计中间件(T-02) / LangGraph 对话线(T-07) 未做**(chat/knowledge/admin 仍空壳)。**开发在分支 `feature/risk`(未合入 main)。**
**当前进度:** 需求与表设计已定 · **风控模块 B1~B9b 全部完成(M2 tag risk-m2),M4 复核已闭环(2026-09-07),风控阶段 B 正式完结** · **Wave 0 已完成(2026-09-07,经独立 AI 评审闭环)**:T-01 JWT 鉴权(auth_service Auth SDK + deps 工厂替换 + X-Agent-Type 准入矩阵)/ T-02 审计中间件(http_access + 独立 request_id + 4xx/500 统一错误体 + input_guard_log 双写)/ T-06 chat 最小闭环(POST /api/chat + 会话落库 + Redis 窗口)/ T-07 LangGraph StateGraph 骨架 + DeepSeek(无 key 降级),**273 测试绿**。**下一步:T-03 输入防护 / T-04 Core RO 封装 Tool / T-21 Milvus / 风控阶段 C(C0~C3,A-6 对话验收)**。**开发在分支 `feature/risk`(未合入 main)。**
**仓库地图:**
| 路径 | 状态 | 说明 |
| --- | --- | --- |
| `app/main.py` | **已集成** | 路由挂载 + trace 中间件(X-Trace-Id 贯通)+ lifespan(启动期 debug 校验 · Redis 网关注册 · 引擎 dispose,B7) |
| `app/api/risk.py` `simulate.py` `deps.py` | **已实现** | 风控 4 API + 模拟网关路由 + debug 头 AuthContext(T-01 过渡版,JWT 就绪只换工厂内部) |
| `app/api/chat.py` `knowledge.py` `admin.py` | 空壳 | 待 T-06 / T-07 |
| `app/main.py` | **已集成** | 路由挂载 + trace 中间件(X-Trace-Id/X-Request-Id 贯通 + 500 兜底错误体)+ audit 中间件(T-02 http_access)+ lifespan(jwt_ready 校验 · Redis 网关注册 · 引擎 dispose) |
| `app/api/risk.py` `simulate.py` `deps.py` | **已实现** | 风控 4 API + 模拟网关路由 + **JWT 鉴权工厂(T-01:Bearer 全环境优先;debug 头仅 dev+无 RS256 公钥时兜底;AGENT_ACCESS_MATRIX 准入)** |
| `app/api/chat.py` `audit_middleware.py` | **已实现(T-06/T-02)** | POST /api/chat(SessionGuard+归属+窗口+落盘)· http_access 访问审计 |
| `app/api/knowledge.py` `admin.py` | 空壳 | 待 T-21(Milvus/RAG)与审计查询台 |
| `app/service/auth_service.py` | **已实现(T-01)** | Auth SDK:JWT 验签(HS256 dev/RS256 生产)、必填 claims、jti 吊销(Redis fail-open);签发 CLI `scripts/dev/issue_dev_token.py` |
| `app/service/risk/*` + `service/suitability.py` | **已实现** | RISK-001~005 规则 / 预警聚合 / L3 写入 / AML / 引擎编排 / SUIT-001~008 / locks+redis_gateway 公共原语(B7) |
| `app/service/agent_service.py` 等 | 空壳 | LangGraph 对话线待 T-07 |
| `app/service/agent_service.py` `memory_service.py` | **已实现(T-07/T-06)** | LangGraph StateGraph(llm→guard)+ DeepSeek(无 key 降级);Redis 会话窗口 + MySQL 回源 |
| `app/repository/session_repository.py` | **已实现(T-06)** | agent_session / agent_message 读写 |
| `app/gateway/` | **已实现** | 模拟交易网关(仅 gateway_repository 可 INSERT core_trade,B5) |
| `app/repository/core_ro.py` | **已实现** | Core 只读 SELECT(含风控扩展 sum_trades_on_date / list_trades_range / list_active_customers) |
| `app/repository/risk_repository.py` | **已实现** | risk_alert / risk_suitability_log / L3 / risk_aml_list 读写 |
| `app/utils/` | **基本就绪** | trace / desensitize / db(引擎工厂)/ response(统一错误体)/ exceptions(含 ApiError)已实现;logger 占位 |
| `app/config/settings.py` | **已实现** | 双库 `jinrong_agent` + `jinrong_core` + risk_* 阈值 |
| `app/repository/risk_repository.py` | **已实现** | risk_alert / risk_suitability_log / L3 / risk_aml_list / audit_log / input_guard_log 读写 |
| `app/utils/` | **基本就绪** | trace(trace_id+request_id 双 contextvar)/ desensitize / db(引擎工厂)/ response(统一错误体+4xx/500 handler)/ exceptions(含 ApiError)已实现;logger 占位 |
| `app/config/settings.py` | **已实现** | 双库 + risk_* 阈值 + JWT 配置(jwt_public_key_path/jwt_dev_secret/jwt_issuer/jwt_audience) |
| `scripts/core/*.sql` + `reset.ps1` | **已实现** | Core 模拟库 DDL + 种子 |
| `scripts/agent/` `scripts/demo/` | **已实现** | AML 名单种子 + 风控演示数据 + subscribe_alerts/rebuild_alerts(B9a 订阅与幂等重放补偿) |
| `scripts/agent/` `scripts/demo/` `scripts/dev/` | **已实现** | AML 名单种子 + 风控演示数据 + subscribe_alerts/rebuild_alerts + issue_dev_token(JWT 签发) |
| `scripts/sync/*.py` | **已实现** | 归属同步 + Neo4j 全图 |
| `tests/` | **已实现** | 17 个测试文件 209 用例(sqlite 隔离;DDL 单一事实源 `_ddl.py`;`test_integration_risk.py` 走真 MySQL + TRD-TEST- 前缀隔离) |
| `tests/` | **已实现** | 21 个测试文件 273 用例(sqlite 隔离;DDL 单一事实源 `_ddl.py`;`test_integration_risk.py` 走真 MySQL + TRD-TEST- 前缀隔离) |
| `docs/需求拆解/` | 已定 | 场景 P0、矩阵、合规原文 |
| `docs/PRD/PRD-风控监测Agent.md` | **已冻结** | 风控 PRD v1.0 + 规则表附录 |
| `docs/项目框架设计/表设计/` | 已定 | Agent 共用 11 表 + agent 专用 SQL |
@@ -52,7 +55,7 @@
> **本机 ①~⑤已执行、`.env` 已配置,勿重做**;本机状态与已知坑(mysql.exe 路径 / reset.ps1 交互式 -p / redis 包漏装已补)见 `FLOW.md` §0 尾注。
> **⚠️ 演示库当前含 B9b 走查残留(2026-09-07)**:直接跑 `pytest` 集成模块会因核查单⑥前置断言显式 fail 约 6 例(防护行为,非环境损坏)——先按 `docs/项目框架设计/演示SOP-风控模块.md` §2 重灌再跑,即恢复全绿。
**下一步开发(见 TODO):** 风控 M2 文字收尾复核 → Wave 0 T-01 JWT / T-02 审计中间件 / T-06 / T-07 LangGraph。演示走查按 `docs/项目框架设计/演示SOP-风控模块.md`。
**下一步开发(见 TODO):** T-03 输入防护 / T-04 Core RO 封装 Tool(agent_tool_call 随 C1)/ T-21 Milvus / 风控阶段 C(C0~C3,A-6 对话验收)。演示走查按 `docs/项目框架设计/演示SOP-风控模块.md`(debug 头通道仍有效;JWT 通道签发用 `scripts/dev/issue_dev_token.py`)。
**禁止(改代码前必记):** Core 正式 C1~C5 不可被画像覆盖 · 审计表只 INSERT · 代理人草稿不外发 · 仅 R-02 可阻断交易 · 四 Agent 不互调 LLM。
@@ -61,7 +64,7 @@
## 1. 项目简介
- **名称:** JinRong 金融四 Agent 智能管家
- **当前阶段:** 风控模块(Wave 2 提前开发)**B1~B9b 全部完成,M2 已达成(tag risk-m2)**;剩 M2 文字复核 + 阶段 C 对话线(依赖 Wave 0)
- **当前阶段:** **Wave 0 共用底座完成(2026-09-07:JWT / 审计中间件 / chat 闭环 / LangGraph 骨架,273 绿)**;风控模块 B1~B9b 完成(M2 tag risk-m2)+ M4 复核闭环,阶段 B 完结;下一批 = T-03/T-04/T-21 + 风控阶段 C(A-6 对话线验收)
- **当前优先级:** Wave 0(T-01 JWT / T-02 审计中间件 / T-06 / T-07 LangGraph)→ 风控阶段 C(A-6)→ Wave 1
------
@@ -125,8 +128,9 @@ Core 模拟:scripts/core/reset.ps1 · 文档 docs/项目框架设计/Core模
种子:scripts/agent/seed-aml-list.sql(AML 名单)· scripts/demo/prepare_risk_demo.sql(reset 后重跑)
依赖:requirements.txt(LangGraph + langchain-core/openai + FastAPI + SQLAlchemy)
启动:uvicorn app.main:app --reload → GET /health
测试:python -m pytest(204 用例;集成测试需本机演示数据,未灌库时自动 skip)
测试:python -m pytest(273 用例;集成测试需本机演示数据,未灌库时自动 skip)
运维/演示脚本:scripts/demo/subscribe_alerts.py(订阅推送演示)· rebuild_alerts.py TRD-xxx(引擎异常补偿重放)
JWT 联调:python scripts/dev/issue_dev_token.py --sub STAFF-30001 --roles risk_officer(+ Authorization: Bearer + X-Agent-Type)
配置:.env(见 .env.example)
RBAC 联调账号:scripts/dev/rbac-seed-reference.md
```
@@ -168,6 +172,6 @@ RBAC 联调账号:scripts/dev/rbac-seed-reference.md
2. 改动属于 api / service / tool / repository 哪一层?
3. 是否需 customer_id 归属与 JWT RBAC?
4. Core 是模拟库只读还是 agent 库读写?
5. 如何验证?(`python -m pytest` 全量(当前 209 绿)· uvicorn 启动 + /health · SQL / sync 脚本 · 对照 REQUIREMENTS 验收列)
5. 如何验证?(`python -m pytest` 全量(当前 273 绿)· uvicorn 启动 + /health · SQL / sync 脚本 · 对照 REQUIREMENTS 验收列)
大任务:FRAMEWORK/FLOW 与实现状态不符时先更新 memory 再编码(用户确认跳过除外)。
+4 -4
View File
@@ -17,11 +17,11 @@
| ID | 需求 | 验收对照 | 状态 | TODO |
| --- | --- | --- | --- | --- |
| F-01 | JWT + RBAC + 数据归属 | 越权 403 + audit;JWT 手册 §13 | **部分**(deps.py debug 头 AuthContext + 归属断言 + 越权审计已落地,B6;JWT 解析待 T-01) | T-01 |
| F-02 | 全量审计留痕 | trace_id 可还原 | **部分**(utils/trace 贯通 + 风控审计 INSERT 已接;全量审计中间件待 T-02) | T-02 |
| F-03 | 输入防护 | input_guard_log | 未做(双写缺口挂账 B7 接 T-02 时统一补) | T-03 |
| F-01 | JWT + RBAC + 数据归属 | 越权 403 + audit;JWT 手册 §13 | **已完成(T-01,2026-09-07)**:auth_service 验签/吊销 + deps 工厂(Bearer 全环境 + dev debug 头兜底)+ X-Agent-Type 准入矩阵 + 归属断言(B6 已有);越权 403 + audit + input_guard_log 双写 | ~~T-01~~ |
| F-02 | 全量审计留痕 | trace_id 可还原 | **已完成(T-02,2026-09-07)**:http_access 审计中间件 + X-Trace-Id/X-Request-Id 双贯通 + 4xx/500 统一错误体;业务判定审计 B6 已接 | ~~T-02~~ |
| F-03 | 输入防护 | input_guard_log | **部分(2026-09-07)**:input_guard_log 双写通道已由 T-02 接通(鉴权拒绝类);防护规则(prompt_injection/oversize/限流)待做 | T-03 |
| F-04 | Core 只读层 | 不改 Core 账;Repository 只 SELECT | **部分**(core_ro 已扩展风控查询;接入 api/service Tool 与归属校验待 T-04) | T-04 |
| R0-DB | MySQL 共用 11 表 + Redis | 01-mysql-共用底座.sql | SQL 已定;灌库待验 | T-05 |
| R0-DB | MySQL 共用 11 表 + Redis | 01-mysql-共用底座.sql | SQL 已定;本机已灌库(B9b 走查验证) | T-05(本机已完成) |
| R0-CORE | Core 模拟 + 同步 | reset.ps1 + sync 脚本 | **脚本已落地** | T-05 |
**F-01 部分完成说明:** B6 已落地 `app/api/deps.py`(AuthContext Pydantic + `get_auth_context()` 工厂,dev 从 `X-Debug-Role`/`X-Debug-Actor` 头构造;T-01 就绪后仅替换工厂内部为 JWT 解析)。
+13 -10
View File
@@ -5,27 +5,30 @@
## 进行中
- [ ] 风控 M2 收尾:MEMORY/TODO 状态复核(开发计划 M4 前置)——B1~B9b 已全部完成(M2 tag 已打),复核边界文字对齐后转 Wave 0
(无——风控 M2 收尾已闭环,Wave 0 已完成,均见「已完成」)
## 待办(推荐顺序)
- [ ] T-01 Auth SDK / JWT 中间件(对照 `02-JWT-RBAC鉴权手册.md`)
- [ ] T-02 audit_log 中间件 + trace_id 贯通
- [ ] T-05 本机执行 `reset.ps1` + `01-mysql-共用底座.sql` + sync 脚本验收
- [ ] T-06 挂载 `app.api` 路由到 `main.py`;chat 最小闭环
- [ ] T-07 LangGraph `agent_service` StateGraph 骨架 + DeepSeek
- [ ] T-04 Core RO 封装为 Tool 节点;A-01 归属校验
- [ ] T-04 Core RO 封装为 Tool 节点;A-01 归属校验(chat Tool 接入 + agent_tool_call 落库)
- [ ] T-21 Milvus Lite + kb_product_rules 首批入库
- [ ] T-03 输入防护规则(F-03:prompt_injection/oversize/限流;input_guard_log 双写通道已由 T-02 接通)
- [ ] 风控阶段 C(C0 pytest-asyncio / C1 chat_tools / C2 risk 分支 StateGraph / C3 A-6 验收——依赖 T-07 已就绪)
- [ ] 前端 React 多 Agent 入口(HashRouter,`web/` init)
### 风控模块(PRD v1.0 已冻结 · `docs/PRD/PRD-风控监测Agent.md`,事件驱动线不依赖 T-07 可先行)
- [ ] T-30 风控事件线:`app/gateway/` 交易网关 + `service/risk/` 规则引擎(RISK-001~005)+ 预警单聚合 + L3 最小写入 + `risk:pub:alert` 推送 + AML(含 `risk_aml_list` 种子)+ 演示数据脚本验收 A-1~A-5/A-9 —— **进度(2026-09-06):B1 规则纯函数 / B2 预警服务 / B3 L3 写入(risk_score 一期不写)/ B4 AML+引擎编排 / B5 交易网关 / B6 鉴权+4 API+处置编排 / B7 main 集成(路由挂载 + trace 中间件 + lifespan 启动期 debug 校验;挂账①锁公共化 ②L3 缓存 DEL ③死代码 ④统一错误体 ⑤启动校验 ⑥引擎工厂 ⑦处置原子事务均落地;⑧ input_guard_log 双写仍随 T-02)均完成并经独立 AI 评审闭环(B7 复审有条件通过→P1-1 dispose 已修闭环;183 测试绿;P2/P3 已登记开发计划 B7/B8/B9b/T-02);**B8 已完成(2026-09-06):conftest(演示数据校验/幂等代跑 prepare_risk_demo/TRD-TEST- teardown + L3 快照还原)+ 集成测试 11 例(A-1~A-5/A-7/A-9 + trace 一致性 + 审计 JSON)+ sqlite DDL 单一事实源 `_ddl.py`(10 文件收敛,localtime 时区收敛 B5 P3-4)+ L3 DEL 行为断言(P2-1)+ locks 文案(P3-2);B8 复审有条件通过→P1-1 conftest skip 路径炸收集已修闭环(故障注入验证),P2-1 演示库耦合前置断言挂 B9b 核查单⑥**;**B9a 已完成(2026-09-07):`scripts/demo/subscribe_alerts.py`(risk:pub:alert 订阅演示:连接自检/--duration/心跳)+ `rebuild_alerts.py`(按 trade_id 幂等重放:`find_alerts_by_trade` 以 payload LIKE 查已入单(含 aml/已处置单)防重复出单与重复 append;engine_error 中断笔 skip 时 warning 提示人工核对;core_ro 新增只读 `get_trade_by_id`)+ tests/test_demo_scripts.py 8 例;真库手工验证通过(rebuilt→skipped→missing exit1;订阅端到端收到假消息+真交易推送且 trace 贯通;中间态警示路径复验),验证现场已清理;独立 AI 评审有条件通过→P2-1 中间态警示/P2-2 非首笔幂等用例已闭环**;**B9b 已完成(2026-09-07):前置代码三件(①预警类 API 固定 disclaimer ②scan_all 幂等防护 `find_recent_aml_alert`+`skipped_existing` ③核查单⑥集成测试前置断言 A-1/A-3/A-4 清洁检查+A-5 按 trade_id 定位),208 绿;演示 SOP `docs/项目框架设计/演示SOP-风控模块.md`;真服务走查(uvicorn+真库)A-1~A-5/A-7/A-9+核查单①②④⑤ 全 PASS(11/11,A-6 归 M3),核查单⑥防护现场复现验证;走查演示数据按 SOP 保留、pytest 集成前需重灌;M2 达成打 tag risk-m2(M1 未打 tag 留痕)——核查单①~⑥ 全部收口,风控阶段 B 完结**;**B9b 复审有条件通过→闭环(2026-09-07):P2-1 SOP 交互重灌补 DROP agent / P2-2 补做 T-31 名下 P2-8 手工 SQL 对照收口 / P2-3 走查范围与 11/11 口径统一;P3 落地:A-4/A-9 COUNT 当日窗、已处置单幂等用例、suitability/check 阻断响应补 G-08 两要素、记忆文档数字同步;留痕:scan_all 幂等读后写无锁(演示场景可接受,批量时接 run_locked),209 绿**
- [ ] T-31 `service/suitability.py` 公共校验(SUIT-001~008)+ `POST /api/risk/suitability/check` + 单测验收 A-8 —— **代码已完成(A1~A4 · 77 测试绿;B6 起该 API 带鉴权+直调审计;B9b 复审补 G-08 两要素 advice/notice);MySQL 手工 SQL 对照(阶段 A 评审 P2-8)已于 2026-09-07 收口:4 组演示组合真库 SQL 推导与函数判定逐项一致(登记演示 SOP 核查单附行)**
- [ ] T-32 预警台账与人工处置 API(`GET /alerts`、`POST /handle`,risk_officer/compliance 权限)+ 对话线(依赖 T-01/T-03/T-07)验收 A-6/A-7 —— **API 部分已由 B6 覆盖并复审通过(A-7/A-9 用例绿);对话线仍依赖 T-01/T-03/T-07**
- [x] T-30 风控事件线 —— **全部完成(B1~B9b,M2 tag risk-m2)**:规则引擎/预警聚合/L3/AML/交易网关/4 API/演示走查 11/11 PASS + 核查单①~⑥收口,均经独立 AI 评审闭环;scan_all 幂等读后写无锁留痕(接批量时 run_locked)
- [x] T-31 `service/suitability.py` 公共校验(SUIT-001~008)+ `POST /api/risk/suitability/check` —— **交付=suitability 服务函数+单测(77 例;check API 随 B6 带鉴权+直调审计);MySQL 手工 SQL 对照(阶段 A 评审 P2-8)2026-09-07 收口:4 组演示组合真库 SQL 推导与函数判定逐项一致(演示 SOP 核查单附行)**
- [x] T-32 预警台账与人工处置 API + 对话线 —— **台账/处置 API 已由 B6 覆盖并复审通过(A-7/A-9 用例绿);交付=对话线,归阶段 C(C1~C3,T-07 已就绪)**
## 已完成
- [x] 2026-09-07 风控 M2 收尾(M4 复核):MEMORY/TODO 状态与边界文字对齐(任务映射 T-30/T-31/T-32 口径确认;B7 复审留痕「成功响应不包裹外壳」演进口径维持并登记开发计划 M4 节)——风控阶段 B 正式完结
- [x] 2026-09-07 T-01 JWT 鉴权(commit 36f476f + 评审闭环 61711cb):`app/service/auth_service.py` Auth SDK(HS256 dev/RS256 生产、必填 claims 显式校验、jti 吊销 fail-open、RS256/HS256 算法白名单互斥)+ `deps.get_auth_context` 工厂替换(Bearer 全环境优先;debug 头降级 dev 兜底,双闸门=APP_ENV+无 RS256 公钥)+ X-Agent-Type 交叉校验(手册 §4.6/§5.4 AGENT_ACCESS_MATRIX)+ `scripts/dev/issue_dev_token.py` 签发 CLI + lifespan 改验 jwt_ready
- [x] 2026-09-07 T-02 审计中间件(commit 3cec034):`app/api/audit_middleware.py` http_access 全量访问审计(actor 经 request.state.auth,排障路径/OPTIONS 跳过,写库失败降级)+ 独立 request_id(X-Request-Id 贯通,B7 复审 P3-4)+ 422/404/405/500 统一错误体(500 由 trace 中间件兜底回写 trace 头,B7 复审 P2-2)+ input_guard_log 双写(挂账⑧收口;401 归 platform、四 Agent 入口写 guard)
- [x] 2026-09-07 T-07 LangGraph 骨架(commit fb18c04):`agent_service` StateGraph(llm→guard)+ DeepSeek/langchain-openai(无 key 降级明确标注)+ 四 Agent 边界 system prompt + customer/risk 免责声明(has_disclaimer)+ 单测 mock LLM 不依赖外网
- [x] 2026-09-07 T-06 chat 最小闭环(commit ee5c78a):`api/chat.py` POST /api/chat(X-Agent-Type 分流+准入+归属校验+SessionGuard AUTH_403_SESSION_AGENT+closed 409)+ `session_repository`(agent_session/agent_message)+ `memory_service`(Redis 窗口 sess:{agent}:{id}:msgs TTL2h N≤20,miss/异常回源 MySQL)+ main 挂载
- [x] 2026-09-07 Wave 0 独立 AI 评审有条件通过→闭环(commit 61711cb):P2×5(python-jose>=3.5.0 防 CVE / audit 降级测试 / JWT 通道 chat 用例 / debug 兜底纵深防御 / 留痕失败降级显式化)+ P3×11 顺手,273 测试绿
- [x] 2026-09-05 init 项目记忆目录 + `app/` 脚手架(api/service/tool/model/config/utils)
- [x] 2026-09-05 需求拆解文档(业务场景/矩阵/合规)
- [x] 2026-09-05 表设计 + 技术选型 + JWT 手册
@@ -3,7 +3,7 @@
> 版本:v1.1(AI 评审通过:修复 P1×2——假 AuthContext 规范落 deps.py、conftest 测试前置;P2×7 顺手收敛)· 2026-09-06 · 分支 `feature/risk` · 负责人 E
> 依据:PRD v1.0 + 架构设计 v1.1
> 铁律:**每步完成即测,测试通过才进下一步**;每个任务至少一个 commit,里程碑打 tag;涉及表结构/接口协议的步骤已获 PRD 批准
> 任务映射:T-31 = 阶段 A(**交付=suitability 服务函数+单测**;check API 随 B6)· T-30 = 阶段 B · T-32 = 阶段 C(**交付=对话线**;台账/处置 API 随 B6)——此边界说明用于对齐 `docs/memory/TODO.md` 文字,M4 时同步修订 TODO
> 任务映射:T-31 = 阶段 A(**交付=suitability 服务函数+单测**;check API 随 B6)· T-30 = 阶段 B · T-32 = 阶段 C(**交付=对话线**;台账/处置 API 随 B6)——此边界已按 M4 复核(2026-09-07)同步修订 TODO 完成
---
@@ -63,6 +63,13 @@
| M3 | 阶段 C 完成(对话线验收 A-6) | 逐任务 commit + 打 tag `risk-m3` |
| M4 | 收尾:MEMORY/TODO 状态复核与边界文字对齐 | `docs: 风控模块验收记录` |
**M4 完成(2026-09-07 · 复核记录):**
1. **任务映射边界确认**:T-31 = 阶段 A(交付=suitability 服务函数+单测,check API 随 B6)、T-30 = 阶段 B、T-32 = 台账/处置 API 随 B6 + 对话线归阶段 C——TODO.md 已按此口径勾选收口。
2. **B7 复审留痕对齐**:「成功响应不包裹外壳」(B5 P2-2「返回体不变」演进口径)复核后**维持**——错误响应走统一错误体(utils/response),成功体平铺;此取舍为演示口径的长期约定,登记于本节(B7 复审段的「M4 复核时对齐」到此收口)。
3. **agent_message.trace_id 口径**:实现为「当次请求 trace_id」(手册 §9「同会话同一 trace_id」按请求贯通更合理,会话维度由 session_id 关联)——登记为实现决策,手册表述修订归 Wave 1 文档清理。
4. **会话存在性枚举**:404(不存在)/ 403(他人会话)可区分属已知取舍——session_id 为 uuid4 高熵随机、仅 dev 演示开放,风险可接受(评审 P3-4 登记)。
5. **风控阶段 B 正式完结**;阶段 C(C0~C3)依赖的 Wave 0(T-01/T-02/T-06/T-07)已于同日完成并经独立 AI 评审闭环(273 测试绿),C0 的 pytest-asyncio 增补与 C1 chat_tools 开工即可。
**Commit 规范**(自《03-团队分工》内联,该文档当前在仓库外):
```text
@@ -49,10 +49,14 @@ uvicorn app.main:app --reload # Swagger: http://127.0.0.1:8000/docs
python scripts/demo/subscribe_alerts.py # 另开终端:订阅预警推送(Ctrl+C 退出)
```
debug 鉴权头(dev 过渡,T-01 后换 JWT):`X-Debug-Role` + `X-Debug-Actor`。
debug 鉴权头(dev 兜底通道,T-01 已接 JWT):`X-Debug-Role` + `X-Debug-Actor`。
走查角色:`risk_officer`(STAFF-90001) / `compliance`(STAFF-40001) / `customer`(CUST-1001/CUST-1002)
/ `advisor`(STAFF-10087,名下无 CUST-3001) / `risk_demo`(STAFF-DEMO,simulate 白名单)。
JWT 通道(T-01,可选演示):`python scripts/dev/issue_dev_token.py --sub STAFF-30001 --roles risk_officer`
签发后请求带 `Authorization: Bearer <token>` + `X-Agent-Type: risk`(JWT 通道强制 X-Agent-Type
交叉校验;debug 头与 JWT 不可同时生效时 JWT 优先)。
## 4. 验收走查(PRD §8 · A-6 归 M3 对话线)
Swagger 逐条执行;预期响应与库内核验点如下(`trade_id` 以实际响应为准)。