diff --git a/.doc/adr/2026-09-17-d7-chat-data-retention.md b/.doc/adr/2026-09-17-d7-chat-data-retention.md index f1ab1b45..c8df3f6f 100644 --- a/.doc/adr/2026-09-17-d7-chat-data-retention.md +++ b/.doc/adr/2026-09-17-d7-chat-data-retention.md @@ -52,6 +52,7 @@ FEATURE-MATRIX「对话数据治理(D7)」为 `deferred`。收口计划 W7 ## 后果 - W7 可按本草案启动盘点;物理删除与备份清除在 `pending-compliance-signoff` 解除前禁止按建议数字自动执行。 +- 2026-09-17 只读盘点:[../audit/2026-09-17-d7-data-inventory.md](../audit/2026-09-17-d7-data-inventory.md)(未删数据、未升矩阵 done、未写 gap-matrix blocker)。 - 日志/DLQ/reconciliation 实现与审计须持续满足 Track E ID-only 红线。 - 合规改数后:更新本 ADR 数字表、`updated` 日期,并将 `compliance` 改为 `signed` / `accepted`;再开 W7 整改实现。 diff --git a/.doc/audit/2026-09-17-d7-data-inventory.md b/.doc/audit/2026-09-17-d7-data-inventory.md new file mode 100644 index 00000000..69e8c1bf --- /dev/null +++ b/.doc/audit/2026-09-17-d7-data-inventory.md @@ -0,0 +1,62 @@ +--- +title: "D7 对话数据分类盘点" +status: done +created: 2026-09-17 +updated: 2026-09-17 +severity: medium +--- + +# D7 对话数据分类盘点 + +## 现象 + +FEATURE-MATRIX「对话数据治理(D7)」为 `deferred`;ADR 数字 `pending-compliance-signoff`。W7 只盘点当前基线:会话正文、派生副本、共享 KB、日志、备份、事件敏感字段。本轮**未**按草案 365/180/30 天执行物理删除或备份清除。 + +## 根因分析 + +当前基线是「热库明文 + 软删除列预留 + 事件 ID 化」,不是已签字的留存作业。缺口是**尚未实现**的治理能力,不是已确认合规数字被违反。 + +## 严重度 + +`medium`(实现缺口;**不**升 gap-matrix blocker) + +## 分类盘点 + +| 数据类 | 位置 | 形态 | 现状 | +|--------|------|------|------| +| 会话正文 | `chat_sessions` / `chat_messages.content` | 热库明文 TEXT;`deleted_at` 列存在 | dev 619 sessions / 3291 messages;`deleted_at` 全 NULL;Go 无 `SET deleted_at`、无 `DELETE FROM chat_*` | +| 派生摘要 | `chat_daily_digests` | headline / key_points JSON | 0 行 | +| 向量记忆 | `context_memory_chunks` | `content` TEXT + embedding | 102 行:`project_doc` 71、`chat_history` 24、`approved_case` 7。聊天派生副本会随正文留存 | +| 私密文档 | `freeform_documents` | `is_deleted` / `deleted_at` + version markdown | 122 份,其中 113 已软删(聊天消息无对等写路径) | +| 共享 KB | `shuimu-kb-shared` / `regulations` | 法规 chunks,无 chat 表 | `reg_documents` 2907、`reg_chunks` 312919;与对话库隔离 | +| 事件 envelope | `event_envelopes.payload` BYTEA | JSON 字段 | 4 条;keys 均为 ID/digest/`summary_ref`,`has_content=false` | +| 事件 DLQ / attempts | `event_dead_letters` / `event_delivery_attempts` | ID + reason / error_code | DLQ 0;attempts 4;无正文列 | +| 日志 | Docker `json-file` 无 max-size | 应用 slog | 抽检 rebuild 日志:DSN 已 `***`,无 chat content | +| 备份 | `scripts/backup-system-db.sh` `pg_dump -Fc` | 整库含 chat 明文 | 宿主机无 `./backups` 目录;CI 有 backup-restore-drill | +| Agent workspace | `data/dev/workspaces` 150M | 非终态工作区 | 无 30 天清理作业(ADR 草案待签字) | +| FAV | `final_artifacts` | 1 行;consumer mode=off | 与聊天口径解耦;W6 shadow 不写 | + +事件 payload 比 `StaticContracts` allowlist **多出** `workspace_id` / `manifest_sha256` 等 ID 字段,但仍无聊天正文。属契约收紧 follow-up,不是 Track E 正文泄漏。 + +## 违规判定 + +对照已签字约束(Track E ID-only 日志/DLQ、R13 出站最小化、ADR 明确「签字前禁止按数字删除」): + +- **未发现**已确认安全/合规基线被当前实现违反。 +- **因此不写** `gap-matrix` blocker。 +- 缺 365 天热库清理、缺聊天 soft-delete 写路径、缺字段级加密,均属 ADR 签字后的 W7 整改实现,不得在本轮当「已违规」执行删除。 + +## 关联整改 + +- ADR 草案: [../adr/2026-09-17-d7-chat-data-retention.md](../adr/2026-09-17-d7-chat-data-retention.md) +- 签字后整改:soft-delete 写路径 → 观察窗 → 物理清理;同步清 `context_memory_chunks` 的 `chat_history`;备份二次批准 + delete manifest(R22) + +## 证据 + +`.doc/test-reports/assets/2026-09-17-w7-d7-inventory/`(counts / columns / event keys / KB / logs / health)。查询只读,未 `DELETE`/`UPDATE`。 + +## 开放问题 + +- 合规何时签字或改数(365/180/30)? +- 聊天 UI 删除是否要与 freeform 回收站对齐? +- `taskrun.completed` payload 额外 ID 字段是否收紧 allowlist? diff --git a/.doc/ops/CURRENT.md b/.doc/ops/CURRENT.md index 3495cb5f..73e9278b 100644 --- a/.doc/ops/CURRENT.md +++ b/.doc/ops/CURRENT.md @@ -5,7 +5,7 @@ ## 焦点 -1. **partial/deferred 全量收口**:W1–W4 **done**;W5a **done**(矩阵自举行仍 partial);W6 **shadow done**(矩阵 FAV 仍 partial,live 未放量);续 W7 +1. **partial/deferred 全量收口**:W1–W4 **done**;W5a **done**(矩阵自举行仍 partial);W6 **shadow done**(矩阵 FAV 仍 partial);W7 **盘点 done**(矩阵 D7 仍 deferred,无物理删除) 2. **运维**:nightly `DATA_DIR=dev` 已对齐;KB 宿主机分层加载 / fail-closed **done**(`fix/kb-host-auth-layered-load`) 3. **红线**:禁止整支 merge FAV;不默认升 `MULTI_INTENT_PLAN_TIER=full`(升 `confirm` 须 W4 闭环后独立授权);`SEMANTIC_SUMMARY_REPLACE` 不随 W2 开启;FAV live 顺序 staging→artifact→publication、每级观察窗证据驱动(下限 ≥7 天)、`FAV_DEGRADED_READ=false`;flag 默认 off;项目 143 只读 @@ -19,7 +19,7 @@ | Cursor | 2026-09-17-w4-multi-intent-u9-u12 | feature/w4-u9-segment-live | - | intent-plan | done | | Cursor | 2026-09-17-w5a-software-bootstrap-ui | feature/w5a-software-bootstrap-ui-pi | - | workflow-design | done | | Cursor | 2026-09-17-w6-fav-subscriber-shadow | feature/w6-fav-subscriber-shadow | - | events | done | -| Cursor | 2026-09-17-w7-d7-inventory | feature/w7-d7-data-inventory | - | chat | planned | +| Cursor | 2026-09-17-w7-d7-inventory | feature/w7-d7-data-inventory | - | chat | done | | Cursor | 2026-09-17-kb-host-auth-fix | fix/kb-host-auth-layered-load | - | infra | done | | Cursor | 2026-09-17-w1-ci-e2e-green-nightly | feature/w1-ci-e2e-green-nightly | - | ci | done | | Cline | 2026-09-16-partial-deferred-completion | docs/partial-deferred-completion-plan | - | architecture-docs | in_progress | @@ -118,7 +118,7 @@ | holder | phase | since | scope | queue | |--------|-------|-------|-------|-------| -| - | idle | - | - | W7 | +| - | idle | - | - | - | **phase**: `idle` | `merging` | `smoke` | `e2e` @@ -141,6 +141,7 @@ | 发布缺口 | [gap-matrix](../remediation/gap-matrix.md)(`production_ready=yes`;Wave 0 IAM 只读未发现旁路) | | 连续性审计/计划 | [audit](../audit/2026-09-16-feature-matrix-production-readiness-audit.md) · [remediation](../remediation/2026-09-16-feature-matrix-production-readiness-plan.md) · [Wave 0 任务](./short-term/2026-09-16-feature-matrix-wave0-calibration.md) | | 测试报告 | [test-reports/](../test-reports/) | +| D7 盘点(W7) | [audit](../audit/2026-09-17-d7-data-inventory.md) · [报告](../test-reports/2026-09-17-w7-d7-inventory-test-report.md) · ADR 仍 `pending-compliance-signoff` | | Agent 手册 | [AGENTS.md](../../AGENTS.md) | | 意图双标签 busy 交接 | [./handoffs/2026-09-15-conversation-intent-dual-tab.md](./handoffs/2026-09-15-conversation-intent-dual-tab.md) | | 受控正文 hash 漂移 W1–W6 | [../ops/handoffs/2026-09-14-controlled-content-canonical-hash.md](../ops/handoffs/2026-09-14-controlled-content-canonical-hash.md) | diff --git a/.doc/ops/short-term/2026-09-16-partial-deferred-completion.md b/.doc/ops/short-term/2026-09-16-partial-deferred-completion.md index d7d643e2..2a7426e7 100644 --- a/.doc/ops/short-term/2026-09-16-partial-deferred-completion.md +++ b/.doc/ops/short-term/2026-09-16-partial-deferred-completion.md @@ -28,7 +28,7 @@ mutex: architecture-docs 4. [x] W4 PU8 U9–U12(mutex `intent-plan`;逐 action 独立 flag,U9→U12 顺序;升 confirm 另开独立授权,不升 full) 5. [ ] W5 纯软件自举(mutex `workflow-design`;SWBOOT-10 非 stub + 真实 PI + UI 二次验收) 6. [ ] W6 FAV(mutex `events`;**shadow 已合** → live staging→artifact→publication 仍未开;每级观察窗 ≥7 天;`FAV_DEGRADED_READ=false`;禁止整支 merge) -7. [ ] W7 D7 数据治理(mutex `chat`,排在 W2 后;盘点 → 按 ADR 口径整改;合规签字前数字 `pending-compliance-signoff`;违规升 gap-matrix) +7. [ ] W7 D7 数据治理(mutex `chat`;**盘点已合**;按 ADR 口径整改仍待合规签字;数字 `pending-compliance-signoff`;本轮未发现已确认违规、未写 gap-matrix) 8. [ ] 逐行升 done(保留 lineage)+ CURRENT / 契约状态同步 9. [x] §7 四项开放问题决策落盘(2026-09-17) diff --git a/.doc/ops/short-term/2026-09-17-w7-d7-inventory.md b/.doc/ops/short-term/2026-09-17-w7-d7-inventory.md new file mode 100644 index 00000000..3f5b3142 --- /dev/null +++ b/.doc/ops/short-term/2026-09-17-w7-d7-inventory.md @@ -0,0 +1,46 @@ +--- +title: "W7 D7 对话数据分类盘点" +status: done +created: 2026-09-17 +updated: 2026-09-17 +owner: Cursor +branch: feature/w7-d7-data-inventory +worktree: "-" +mutex: chat +--- + +# W7 D7 对话数据分类盘点 + +## 目标 + +只做数据分类盘点 audit(sessions/messages、KB、日志、备份、event 敏感字段与流转)。无合规签字不物理删除、不清备份。矩阵 D7 保持 `deferred`。 + +## 范围 + +- 只读盘点:表、派生副本、日志、备份脚本、事件 payload +- 若发现**已确认**安全/合规基线违规 → 立即写 gap-matrix blocker + +## 非目标 + +- 按 ADR 草案数字(365/180/30)执行物理删除或备份清除 +- 字段级加密实现 +- 升 FEATURE-MATRIX D7 为 `done` +- 翻转 `production_ready` + +## 步骤 + +1. [x] 只读盘点系统库 / 共享 KB / 宿主 traces / 事件 payload keys +2. [x] 写 audit + test-report;违规判定(无已确认违规,未写 gap-matrix) +3. [x] 合 `dev`;矩阵保持 deferred + +## 验收标准 + +- [x] 盘点覆盖 sessions/messages、KB、日志、备份、event +- [x] 未执行物理删除 +- [x] D7 仍 deferred;ADR 仍 `pending-compliance-signoff` + +## 相关链接 + +- ADR: [../../adr/2026-09-17-d7-chat-data-retention.md](../../adr/2026-09-17-d7-chat-data-retention.md) +- Audit: [../../audit/2026-09-17-d7-data-inventory.md](../../audit/2026-09-17-d7-data-inventory.md) +- Test report: [../../test-reports/2026-09-17-w7-d7-inventory-test-report.md](../../test-reports/2026-09-17-w7-d7-inventory-test-report.md) diff --git a/.doc/status/FEATURE-MATRIX.md b/.doc/status/FEATURE-MATRIX.md index 8daa0ced..f845a759 100644 --- a/.doc/status/FEATURE-MATRIX.md +++ b/.doc/status/FEATURE-MATRIX.md @@ -52,7 +52,7 @@ | 多意图扩面(U9–U12) | U9 LLM 分段实验;U10 mutate;U11 docgov;U12 workflow/run-control | done | deferred_enhancement | [设计](../system-design/2026-09-15-multi-intent-hitl-plan.md);[go/no-go GO](../ops/research/2026-09-16-wave3-pu6-pu8-go-no-go.md);[脚手架](../test-reports/2026-09-16-pu8-u9-u12-flags-test-report.md);[U9](../test-reports/2026-09-17-w4-u9-segment-test-report.md);[U10](../test-reports/2026-09-17-w4-u10-mutate-test-report.md);[U11](../test-reports/2026-09-17-w4-u11-docgov-test-report.md);[U12](../test-reports/2026-09-17-w4-u12-run-control-test-report.md) | **before**:独立 flag 脚手架。**after**:U9 可开 flag 走产品 PI proposer(规则已切则不出 proposal);U10–U12 分 flag dry-run→confirm 证据。**未升** `MULTI_INTENT_PLAN_TIER`(升 `confirm` 另开授权;永不默认 `full`)。U10–U12 领域 live 写仍须专项批准 | `intent-plan` | | 对话 / ctxmgr baseline | 多轮上下文、刷新/重登/重启恢复、授权同集正文与计数、U10 端口化停止扩面 | done | non_blocker | [multi-turn](../system-design/multi-turn-dialogue/);[刷新审计](../audit/2026-09-13-chat-history-refresh-disappears.md);[U10](../test-reports/2026-09-15-chatlog-contextasm-u10-test-report.md);[门禁 B3](../test-reports/2026-09-16-chat-refresh-gate-test-report.md)(项目 6359) | **before**:语义摘要误标 D5 混入 → **after**:摘要迁「语义摘要 D3」;D7 数据治理独立。U10 停止扩面 | `chat` | | 语义摘要(D3) | 授权后可见集合上的语义摘要;shadow → 可选替换 deterministic | done | deferred_enhancement | [chat-agent-p6-backlog](../backlog/chat-agent-p6-backlog.md);[go/no-go GO](../ops/research/2026-09-16-wave3-pu6-pu8-go-no-go.md);[pu6](../ops/long-term/2026-09-16-pu6-semantic-summary-contract.md);[脚手架](../test-reports/2026-09-16-pu6-semantic-summary-test-report.md);[W2 真 PI](../test-reports/2026-09-17-w2-semantic-summary-shadow-test-report.md) | **before**:flag 脚手架 + heuristic。**after**:dev 可开 `SEMANTIC_SUMMARY_SHADOW` 走产品 PI no-tool summarizer(默认 off)。**REPLACE 未启用**(独立后置,不在本行关闭条件内) | `chat` | -| 对话数据治理(D7) | 留存/删除口径、库·备份·日志控制、敏感字段加密边界 | deferred | deferred_enhancement(违规则升 blocker) | [计划](../remediation/2026-09-16-feature-matrix-production-readiness-plan.md) Scope Boundaries;[收口 §7.1](../remediation/2026-09-16-partial-deferred-completion-plan.md);[D7 ADR 草案](../adr/2026-09-17-d7-chat-data-retention.md) | 口径草案已确认(365/180/30;`pending-compliance-signoff`);先盘点;确认违规 → 立即写 gap-matrix | `chat` | +| 对话数据治理(D7) | 留存/删除口径、库·备份·日志控制、敏感字段加密边界 | deferred | deferred_enhancement(违规则升 blocker) | [计划](../remediation/2026-09-16-feature-matrix-production-readiness-plan.md) Scope Boundaries;[收口 §7.1](../remediation/2026-09-16-partial-deferred-completion-plan.md);[D7 ADR 草案](../adr/2026-09-17-d7-chat-data-retention.md);[W7 盘点](../audit/2026-09-17-d7-data-inventory.md);[报告](../test-reports/2026-09-17-w7-d7-inventory-test-report.md) | **after W7**:只读盘点完成(sessions/messages/KB/日志/备份/event)。**未发现**已确认基线违规,未写 gap-matrix。口径仍 `pending-compliance-signoff`;禁止按 365/180/30 物理删除。本行不升 done | `chat` | | 智能体小队 | 角色-任务-工作区-黑板 | done | non_blocker | [agent-squad](../system-design/agent-squad/);[test 2026-09-07](../test-reports/2026-09-07-dynamic-squad-planning-test-report.md) | 非关键步骤降级(A5/A6)属 backlog | `squad` | | 工作流治理 | 三正式工作流、设置页/DutyMode、动作级鉴权、真实 PI 三工作流 E2E、full/none 混合长链 | done | non_blocker | [三工作流整改](../remediation/2026-09-12-three-workflows-strict-governance-remediation.md);[409/职责](../test-reports/2026-09-14-workflow-plan-409-frozen-and-optional-duties-test-report.md);[鉴权](../test-reports/2026-09-14-governance-action-level-authz-test-report.md);[PI E2E](../test-reports/2026-09-16-pi-three-workflow-e2e-test-report.md);[Wave2 full/none](../test-reports/2026-09-16-wave2-real-pi-evidence-test-report.md) | full 跨用户审批 + none 免审批不阻塞已签。纯软件自举仍独立 planned | `workflow` | | 纯软件项目自举 | 软件项目创建、Bootstrap、Delivery、受控工程交接 | partial | deferred_enhancement(明确不挡首发) | [设计](../system-design/2026-09-14-software-project-bootstrap-workflow.md);[ADR](../adr/2026-09-16-software-project-bootstrap-keys.md);[L1 报告](../test-reports/2026-09-16-software-project-bootstrap-test-report.md);[W5a](../test-reports/2026-09-17-w5a-software-bootstrap-ui-pi-test-report.md) | **before**:L1 + UI 仍克隆医疗模板。**after W5a**:catalog 驱动创建、软件不挂医疗 key、docs_only 真 PI 建议 delivery 且不自动激活。**SWBOOT-10 仍 stub**(W5b);本行不升 done | `workflow-design` | diff --git a/.doc/test-reports/2026-09-17-w7-d7-inventory-test-report.md b/.doc/test-reports/2026-09-17-w7-d7-inventory-test-report.md new file mode 100644 index 00000000..31d092b4 --- /dev/null +++ b/.doc/test-reports/2026-09-17-w7-d7-inventory-test-report.md @@ -0,0 +1,103 @@ +# W7 D7 对话数据分类盘点 测试报告 + +## 一、 测试背景 (Background) + +D7 ADR 数字标 `pending-compliance-signoff`。W2 已释放 `chat` mutex。本波只做只读盘点,禁止按草案数字物理删除或清备份,矩阵保持 `deferred`。 + +## 二、 测试目标 (Test Objectives) + +- 盘点 sessions/messages、KB、日志、备份、event 敏感字段与流转 +- 确认无已签字基线违规;若有则写 gap-matrix +- 零物理删除、零备份清除 +- FEATURE-MATRIX D7 保持 `deferred` + +## 三、 测试方案与环境 (Test Plan & Environment) + +| 项 | 值 | +|----|----| +| OS | Linux 7.0.0-31-generic | +| 分支 | `feature/w7-d7-data-inventory`(自 `dev@cb4fbb6` W6 merge 后) | +| 环境 | dev schema 48;共享 KB `regulations` | +| 方法 | 只读 SQL / `docker logs` / 目录 `du` / `go vet` / `arch-check` | +| 证据 | `.doc/test-reports/assets/2026-09-17-w7-d7-inventory/` | + +核心用例矩阵: + +| ID | 用例 | 期望 | +|----|------|------| +| I1 | chat 热库计数与 `deleted_at` | 只读;不 UPDATE | +| I2 | 事件 payload keys | 无 `content` | +| I3 | 共享 KB | 无法规库外的 chat 表 | +| I4 | 应用日志抽检 | 无消息正文;DSN 脱敏 | +| I5 | 备份脚本 | `pg_dump -Fc` 整库;本轮不执行 dump | +| I6 | 违规升级 | 无已确认违规 → 不写 gap-matrix | + +## 四、 预期结果 (Expected Results) + +- 盘点表完整 +- 判定:缺口是未实现治理,不是已签字数字被违反 +- health/ready PASS;FAV 仍 off + +## 五、 实际测试结果与判定 (Actual Results & Evaluation) + +### 5.1 I1 热库 + +- **测试输入 (Input)**:`docker exec shuimu-context-pg-dev psql` 只读 `COUNT` / `MIN/MAX(created_at)` +- **实际输出 (Actual Output)**:sessions=619;messages=3291;soft_deleted=0;older_than_365d=0;oldest=2026-09-10。`chat_messages` 5.4MB。Go 检索无 `SET deleted_at`。见 `pg-counts.tsv`、`pg-chat-age.txt` +- **评价判定 (Evaluation / Verdict)**:PASS(盘点完成;未删数据) +- **性能与耗时 (Duration & Latency)**:<1s + +### 5.2 I2 事件 + +- **测试输入 (Input)**:`jsonb_object_keys(convert_from(payload,'UTF8')::jsonb)`;`? 'content'` +- **实际输出 (Actual Output)**:4 envelopes;`has_content=f`;keys 为 `run_id`/`plan_id`/`summary_ref` 等。DLQ=0。fav mode=off,notify/projection/workflow_advance=live。见 `pg-event-payload-keys.txt` +- **评价判定 (Evaluation / Verdict)**:PASS(Track E 正文未进事件) +- **性能与耗时 (Duration & Latency)**:<1s + +### 5.3 I3 共享 KB + +- **测试输入 (Input)**:`shuimu-kb-shared` `\dt` + counts +- **实际输出 (Actual Output)**:库名 `regulations`;法规 2907 文档 / 312919 chunks;无 chat 表。见 `kb-tables.txt` +- **评价判定 (Evaluation / Verdict)**:PASS(对话与 KB 隔离) +- **性能与耗时 (Duration & Latency)**:<1s + +### 5.4 I4 日志 + +- **测试输入 (Input)**:`docker inspect` LogDriver;`docker logs --tail 30 shuimu-agent-app-dev` +- **实际输出 (Actual Output)**:`json-file` 无 max-size。日志含 `dsn=postgres://regkb:***@...`,无 chat content。见 `app-logs-tail.txt` +- **评价判定 (Evaluation / Verdict)**:PASS +- **性能与耗时 (Duration & Latency)**:<1s + +### 5.5 I5 备份 + +- **测试输入 (Input)**:阅读 `scripts/backup-system-db.sh`;`ls ./backups` +- **实际输出 (Actual Output)**:脚本 `pg_dump -Fc` 整库(含 chat 明文);宿主机无 `./backups`。本轮**未**运行 dump。CI `backup-restore-drill` 仍在。 +- **评价判定 (Evaluation / Verdict)**:PASS(未清备份、未新造 dump) +- **性能与耗时 (Duration & Latency)**:N/A + +### 5.6 I6 违规升级 + +- **测试输入 (Input)**:对照 ADR `pending-compliance-signoff` + Track E ID-only +- **实际输出 (Actual Output)**:无已确认基线违规。**未**修改 `gap-matrix.md`。 +- **评价判定 (Evaluation / Verdict)**:PASS +- **性能与耗时 (Duration & Latency)**:N/A + +### 5.7 冒烟 / health + +- **测试输入 (Input)**:`go vet ./...`;`arch-check --mode block`;`curl :8080/health` `/ready` +- **实际输出 (Actual Output)**:VET_EXIT=0;`arch-check block: production gate passed`;schema_version=48;vault `consumer_mode=off`、`live_not_opened=true`。见 `health.json`、`smoke.txt` +- **评价判定 (Evaluation / Verdict)**:PASS +- **性能与耗时 (Duration & Latency)**:vet+arch ~1.4s + +## 六、 自动化测试套件汇总 (Test Suite Execution) + +```text +go vet ./... VET_EXIT=0 +./scripts/arch-check.sh --mode block production gate passed +W7 无代码变更;go test -short 以 W6 合入后基线为准(TEST_EXIT=0) +只读 SQL 盘点 无 DELETE/UPDATE +``` + +## 七、 测试结论与后续优化建议 (Conclusion & Next Steps) + +W7 **盘点 PASS**。FEATURE-MATRIX D7 **保持 deferred**。合规签字前禁止按 365/180/30 执行删除。签字后整改应覆盖:聊天 soft-delete 写路径、派生 `context_memory_chunks.chat_history`、workspace 非终态、备份二次批准。`production_ready` 不翻转。 diff --git a/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/app-logs-tail.txt b/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/app-logs-tail.txt new file mode 100644 index 00000000..f7dab90f --- /dev/null +++ b/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/app-logs-tail.txt @@ -0,0 +1,30 @@ +time=2026-09-17T04:26:50.573Z level=INFO msg="goose: no migrations to run. current version: 48" +time=2026-09-17T04:26:50.588Z level=INFO msg="[kb] online=true dsn=postgres://regkb:***@shuimu-kb-shared:5432/regulations?sslmode=disable" +time=2026-09-17T04:26:50.640Z level=INFO msg=taskrun_orphans_marked_interrupted count=1 +================================================================== + 🤖 医疗器械商务与研发智能参谋系统 - HTTP / SSE API 守护服务 +================================================================== +服务环境: dev | 智能体后端: pi-agent +监听地址: http://0.0.0.0:8080 +核心服务路由: + • [GET] /api/v1/health - 服务健康检查与基础设施状态 + • [GET] /api/v1/projects - 查询项目当前上下文与黑板事实 + • [POST] /api/v1/chat - 标准阻塞式对话协同接口 + • [POST] /api/v1/chat/stream - 核心 SSE 流式长连接对话协议 (分层按需) + • [GET] /api/v1/chat/stream - SSE 流式长连接对话调试接口 (EventSource) + • [POST] /api/v1/tasks/run/stream - 独立任务与阶段执行 SSE 监控流 (精简进度与拦截) + • [GET] /api/v1/context/user - 获取单用户私有上下文与习惯偏好画像 + • [PUT] /api/v1/context/user/preference - 整理或更新用户个性化产出风格 + • [GET] /api/v1/context/project - 获取项目多方协同黑板事实与里程碑决策流 + • [GET] /api/v1/chat/sessions - 分页查询用户/项目历史会话列表 + • [GET] /api/v1/chat/messages - 分页拉取指定会话多轮历史消息记录 + • [GET] /api/v1/context/cases/recommend - 往期受控标杆案例与历史报价语义自推荐 + • [GET] /api/v1/docgov/document - 查询受控文档治理状态看板 + • [POST] /api/v1/docgov/claim - 查阅并认领受控文档 (正式稿方可认领) + • [POST] /api/v1/docgov/proposal/decide - 编制负责人拍板同意/拒绝变更提案 + • [POST] /api/v1/docgov/submit-review - 编制完成提交审核 (文档正文锁定) + • [POST] /api/v1/docgov/review-decision - 审核通过或驳回 (驳回必填原因且解锁) + • [POST] /api/v1/docgov/approver-decision - 最终批准或驳回 + • [GET/POST] /api/v1/docgov/comments - 批注与修改建议管理 + • [GET] /api/v1/docgov/audit-logs - 全生命周期审计轨迹流 +================================================================== diff --git a/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/docker-log-config.txt b/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/docker-log-config.txt new file mode 100644 index 00000000..d6f268fb --- /dev/null +++ b/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/docker-log-config.txt @@ -0,0 +1 @@ +LogDriver=json-file Config={} diff --git a/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/health.json b/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/health.json new file mode 100644 index 00000000..5af81ab5 --- /dev/null +++ b/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/health.json @@ -0,0 +1 @@ +{"status":"ok","env":"dev","agent_backend":"pi-agent","version":"v1.0","shared_kb_port":5432,"kb_ready":true,"database_ready":true,"schema_version":48,"schema_ready":true,"task_store_ready":true} diff --git a/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/host-data-roots.txt b/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/host-data-roots.txt new file mode 100644 index 00000000..d6e1e88d --- /dev/null +++ b/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/host-data-roots.txt @@ -0,0 +1,6 @@ +data/dev: +150M data/dev +workspaces: +150M data/dev/workspaces +chat files under data/dev (names only): +data/dev/agent_sessions diff --git a/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/host-traces.txt b/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/host-traces.txt new file mode 100644 index 00000000..103b482a --- /dev/null +++ b/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/host-traces.txt @@ -0,0 +1,13 @@ +=== agent_sessions === +4.0K data/dev/agent_sessions +data/dev/agent_sessions +file count: 0 +oldest: +newest: +=== workspaces sample names === +bizdev +dialogue +tmp +workspace dirs: 3 +=== backups on host === +no ./backups dir diff --git a/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/kb-counts.txt b/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/kb-counts.txt new file mode 100644 index 00000000..dccc710e --- /dev/null +++ b/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/kb-counts.txt @@ -0,0 +1,7 @@ + rel | count +---------------+-------- + reg_documents | 2907 + reg_chunks | 312919 + asset_chunks | 0 +(3 rows) + diff --git a/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/kb-identity.txt b/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/kb-identity.txt new file mode 100644 index 00000000..de483f24 --- /dev/null +++ b/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/kb-identity.txt @@ -0,0 +1,5 @@ + current_database +------------------ + regulations +(1 row) + diff --git a/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/kb-tables.txt b/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/kb-tables.txt new file mode 100644 index 00000000..97bf8f8a --- /dev/null +++ b/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/kb-tables.txt @@ -0,0 +1,28 @@ + List of relations + Schema | Name | Type | Owner +--------+--------------------------+-------+------- + public | asset_chunks | table | regkb + public | asset_documents | table | regkb + public | asset_projects | table | regkb + public | reg_catalog_entries | table | regkb + public | reg_chunks | table | regkb + public | reg_chunks_legacy | table | regkb + public | reg_clause_links | table | regkb + public | reg_doc_aliases | table | regkb + public | reg_doc_relations | table | regkb + public | reg_doc_relations_legacy | table | regkb + public | reg_documents | table | regkb + public | reg_documents_legacy | table | regkb + public | reg_ingest_job_events | table | regkb + public | reg_ingest_jobs | table | regkb + public | reg_ingest_jobs_legacy | table | regkb + public | reg_ingest_quota | table | regkb + public | reg_kb_settings | table | regkb + public | reg_nodes | table | regkb + public | reg_nodes_legacy | table | regkb + public | reg_normative_refs | table | regkb + public | reg_sections_legacy | table | regkb + public | staff_experience_records | table | regkb + public | staff_profiles | table | regkb +(23 rows) + diff --git a/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/pg-chat-age.txt b/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/pg-chat-age.txt new file mode 100644 index 00000000..8c3545e2 --- /dev/null +++ b/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/pg-chat-age.txt @@ -0,0 +1,5 @@ + oldest_msg | newest_msg | older_than_365d | soft_deleted +-------------------------------+-------------------------------+-----------------+-------------- + 2026-09-10 16:00:55.791352+00 | 2026-09-17 04:23:14.217905+00 | 0 | 0 +(1 row) + diff --git a/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/pg-columns.txt b/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/pg-columns.txt new file mode 100644 index 00000000..985ddd9e --- /dev/null +++ b/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/pg-columns.txt @@ -0,0 +1,65 @@ + column_name | data_type +----------------------+-------------------------- + id | bigint + session_id | text + user_id | bigint + role | text + content | text + intent | text + branch | text + metadata | jsonb + day_key | date + category | text + deleted_at | timestamp with time zone + created_at | timestamp with time zone + content_kind | text + export_policy | text + content_revision | integer + content_sha256 | text + workflow_instance_id | bigint + stage_instance_id | bigint + stage_key | text + scope_kind | text + id | bigint + session_id | text + project_id | bigint + user_id | bigint + title | text + current_stage | text + pending_exp | jsonb + status | text + created_at | timestamp with time zone + updated_at | timestamp with time zone + event_id | text + consumer | text + reason | text + created_at | timestamp with time zone + id | bigint + event_id | text + consumer | text + attempt | integer + lease_owner | text + fencing_token | text + started_at | timestamp with time zone + finished_at | timestamp with time zone + outcome | text + error_code | text + correlation_id | text + event_id | text + event_name | text + schema_version | integer + environment | text + project_id | bigint + aggregate_type | text + aggregate_id | text + aggregate_version | bigint + actor_ref | text + correlation_id | text + causation_id | text + idempotency_key | text + payload_digest | character + producer | text + occurred_at | timestamp with time zone + payload | bytea +(61 rows) + diff --git a/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/pg-consumer-modes.txt b/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/pg-consumer-modes.txt new file mode 100644 index 00000000..7406674c --- /dev/null +++ b/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/pg-consumer-modes.txt @@ -0,0 +1,8 @@ + consumer | mode +------------------+------ + fav | off + notify | live + projection | live + workflow_advance | live +(4 rows) + diff --git a/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/pg-counts.tsv b/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/pg-counts.tsv new file mode 100644 index 00000000..cc207d07 --- /dev/null +++ b/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/pg-counts.tsv @@ -0,0 +1,12 @@ +chat_daily_digests 0 +chat_messages 3291 +chat_messages_deleted 0 +chat_sessions 619 +chat_turns 19 +context_memory_chunks 102 +event_dead_letters 0 +event_delivery_attempts 4 +event_envelopes 4 +final_artifacts 1 +freeform_deleted 113 +freeform_documents 122 diff --git a/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/pg-event-aux-columns.txt b/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/pg-event-aux-columns.txt new file mode 100644 index 00000000..90e0cd4b --- /dev/null +++ b/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/pg-event-aux-columns.txt @@ -0,0 +1,27 @@ + column_name +---------------- + event_id + consumer + reason + created_at + id + event_id + consumer + attempt + lease_owner + fencing_token + started_at + finished_at + outcome + error_code + correlation_id + event_id + consumer + classification + reason + payload_digest + operator + approval_ref + decided_at +(23 rows) + diff --git a/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/pg-event-payload-keys.txt b/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/pg-event-payload-keys.txt new file mode 100644 index 00000000..1d03bada --- /dev/null +++ b/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/pg-event-payload-keys.txt @@ -0,0 +1,8 @@ + event_name | payload_bytes | has_content | keys +----------------------------+---------------+-------------+--------------------------------------------------------------------------------- + taskrun.completed | 218 | f | {doc_id,run_id,status,task_key,workspace_id,manifest_sha256,storage_identity} + taskrun.completed | 246 | f | {doc_id,run_id,status,task_key,workspace_id,manifest_sha256,storage_identity} + intent.plan.awaiting_input | 201 | f | {status,plan_id,user_id,revision,project_id,session_id,environment,summary_ref} + intent.plan.awaiting_input | 201 | f | {status,plan_id,user_id,revision,project_id,session_id,environment,summary_ref} +(4 rows) + diff --git a/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/pg-identity.txt b/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/pg-identity.txt new file mode 100644 index 00000000..32b41226 --- /dev/null +++ b/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/pg-identity.txt @@ -0,0 +1,5 @@ + db | usr +------------------+----- + agent_system_dev | app +(1 row) + diff --git a/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/pg-mem-domains.txt b/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/pg-mem-domains.txt new file mode 100644 index 00000000..30f87da1 --- /dev/null +++ b/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/pg-mem-domains.txt @@ -0,0 +1,7 @@ + domain | count +---------------+------- + approved_case | 7 + chat_history | 24 + project_doc | 71 +(3 rows) + diff --git a/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/pg-sizes.txt b/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/pg-sizes.txt new file mode 100644 index 00000000..af2bcbe7 --- /dev/null +++ b/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/pg-sizes.txt @@ -0,0 +1,5 @@ + chat_messages | chat_sessions | event_envelopes | mem_chunks +---------------+---------------+-----------------+------------ + 5384 kB | 256 kB | 48 kB | 1232 kB +(1 row) + diff --git a/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/ready.json b/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/ready.json new file mode 100644 index 00000000..5af81ab5 --- /dev/null +++ b/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/ready.json @@ -0,0 +1 @@ +{"status":"ok","env":"dev","agent_backend":"pi-agent","version":"v1.0","shared_kb_port":5432,"kb_ready":true,"database_ready":true,"schema_version":48,"schema_ready":true,"task_store_ready":true} diff --git a/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/smoke.txt b/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/smoke.txt new file mode 100644 index 00000000..6cb8f5b7 --- /dev/null +++ b/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/smoke.txt @@ -0,0 +1,16 @@ +=== go vet === +VET_EXIT:0 +=== arch-check === +arch-check mode=block +boundaries=/home/weichen/projects/Agent-System/.doc/system-design/module-boundaries.yaml +ok chat-agent-system/internal/archtest 0.144s +ok chat-agent-system/internal/archtest 0.145s +arch-check block: production gate passed +ARCH_EXIT:0 +ok chat-agent-system/internal/workflow/runtime (cached) +ok chat-agent-system/internal/workflowdef (cached) +ok chat-agent-system/internal/workspace (cached) +? chat-agent-system/templates [no test files] +TEST_EXIT:0 +--- short --- +TEST_EXIT:0 diff --git a/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/vault-status.json b/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/vault-status.json new file mode 100644 index 00000000..a2b30842 --- /dev/null +++ b/.doc/test-reports/assets/2026-09-17-w7-d7-inventory/vault-status.json @@ -0,0 +1 @@ +{"consumer":"fav","consumer_mode":"off","degraded_read":false,"live_not_opened":true,"note":"fav consumer remains OFF until separate approval; shadow computes intended outcome only; full FAV branch not merged","publisher_enabled":false,"publisher_running":false,"shadow_observe":true,"status":"ok","store_configured":false,"subscriber_default":false,"would_publish":false,"would_stage":false}