fix(mcp): normalize audit session ids
All checks were successful
Code Review / ai-code-review (push) Successful in 11s
CD Pipeline / tests (push) Successful in 58s
CD Pipeline / build-and-deploy (push) Successful in 4m39s
CD Pipeline / post-deploy-checks (push) Successful in 1m17s

This commit is contained in:
Your Name
2026-05-06 17:40:42 +08:00
parent 9b0f55fd90
commit 0e2e856f12
5 changed files with 174 additions and 2 deletions

View File

@@ -3931,3 +3931,35 @@ ruff check apps/api/src/jobs/km_backfill_reconciler_job.py apps/api/tests/test_k
### 影響
- KM / PlayBook / RAG 飛輪的 backfill 補救鏈恢復可持續執行,避免 DLQ 堆積後造成知識庫關聯缺口。
---
## 2026-05-06台北— MCP audit session_id 長度止血
**觸發**production log 出現多筆 `mcp_audit_write_failed`,錯誤為 `value too long for type character varying(36)`。根因是 legacy MCP caller 新增 `_mcp_audit.session_id` 後,像 `incident:INC-20260505-E8033A:pre_decision` 這類可讀 session id 超過既有 `mcp_audit_log.session_id` 欄位長度,導致 MCP 稽核落地失敗。
### 已修正
| 範圍 | 結果 |
|------|------|
| `mcp_audit_context.py` | 新增 `normalize_mcp_audit_session_id()`,針對 incident / callback / approval / mcp_bridge 等已知格式壓縮到 36 字元以內,同時保留 incident 可讀性與 hash 去重 |
| `mcp_audit_service.py` | 在真正寫入 `mcp_audit_log` 前再做一次 session_id 正規化,補住手動 `_mcp_audit` 呼叫路徑 |
| 測試 | 新增 helper 與 `record_mcp_call()` 回歸測試,驗證 live incident 型 session id 不會再超出 DB 欄位 |
### 驗證
```text
pytest apps/api/tests/test_mcp_audit_context.py apps/api/tests/test_mcp_audit_service.py apps/api/tests/test_pre_decision_investigator.py::TestCollectOne::test_collect_one_injects_mcp_audit_context apps/api/tests/test_post_execution_verifier.py::TestCollectPostStateAuditContext::test_collect_post_state_injects_mcp_audit_context apps/api/tests/test_callback_dispatcher.py::test_dispatch_action_injects_mcp_audit_context apps/api/tests/test_platform_router_order.py
# 8 passed
py_compile apps/api/src/services/mcp_audit_context.py apps/api/src/services/mcp_audit_service.py apps/api/tests/test_mcp_audit_context.py apps/api/tests/test_mcp_audit_service.py
# 通過
ruff check --select F401,F821,I001 apps/api/src/services/mcp_audit_context.py apps/api/src/services/mcp_audit_service.py apps/api/tests/test_mcp_audit_context.py apps/api/tests/test_mcp_audit_service.py
# All checks passed
```
### 注意
- 這次先做 runtime 止血,避免 AwoooP / AI 飛輪的 MCP audit 盲點擴大。
- 後續仍建議用正式 migration 將 `mcp_audit_log.session_id` 放寬為 `varchar(128)``text`,讓 trace / run / session 語義可以完整保留。