From 71502c7ce090a44d8990c0519a9e4e481a64abeb Mon Sep 17 00:00:00 2001 From: weichen Date: Tue, 15 Sep 2026 10:17:26 +0000 Subject: [PATCH] docs(test): record E2 hook live-guard and Track E retrospective Co-authored-by: Cursor --- .../ops/2026-09-15-event-e1c-projection.md | 2 +- .doc/ops/CURRENT.md | 11 ++- .../2026-09-15-track-e-retrospective.md | 35 ++++++++ .../2026-09-15-durable-event-track-e.md | 17 ++-- .../2026-09-15-event-e2-hook-guard.md | 48 +++++++++++ .doc/remediation/gap-matrix.md | 2 +- .doc/status/FEATURE-MATRIX.md | 2 +- ...6-09-15-event-e2-hook-guard-test-report.md | 79 +++++++++++++++++++ .../arch-check.txt | 5 ++ .../2026-09-15-event-e2-hook-guard/health.txt | 9 +++ .../pg-test.txt | 50 ++++++++++++ .../2026-09-15-event-e2-hook-guard/race.txt | 3 + 12 files changed, 248 insertions(+), 15 deletions(-) create mode 100644 .doc/ops/research/2026-09-15-track-e-retrospective.md create mode 100644 .doc/ops/short-term/2026-09-15-event-e2-hook-guard.md create mode 100644 .doc/test-reports/2026-09-15-event-e2-hook-guard-test-report.md create mode 100644 .doc/test-reports/assets/2026-09-15-event-e2-hook-guard/arch-check.txt create mode 100644 .doc/test-reports/assets/2026-09-15-event-e2-hook-guard/health.txt create mode 100644 .doc/test-reports/assets/2026-09-15-event-e2-hook-guard/pg-test.txt create mode 100644 .doc/test-reports/assets/2026-09-15-event-e2-hook-guard/race.txt diff --git a/.doc/archive/ops/2026-09-15-event-e1c-projection.md b/.doc/archive/ops/2026-09-15-event-e1c-projection.md index 67d8983c..e26b5c54 100644 --- a/.doc/archive/ops/2026-09-15-event-e1c-projection.md +++ b/.doc/archive/ops/2026-09-15-event-e1c-projection.md @@ -1,6 +1,6 @@ --- title: "E1C projection no-replace" -status: in_progress +status: done created: 2026-09-15 updated: 2026-09-15 owner: Cursor diff --git a/.doc/ops/CURRENT.md b/.doc/ops/CURRENT.md index 23da993c..fc970ced 100644 --- a/.doc/ops/CURRENT.md +++ b/.doc/ops/CURRENT.md @@ -5,7 +5,7 @@ ## 焦点 -1. **TRACK-E**: [持久事件交付](./short-term/2026-09-15-durable-event-track-e.md)(E0A–E1C 隔离库 PASS;dispatcher 默认 off。E2 删除 hook 须等 live 窗口) +1. **TRACK-E**: [持久事件交付](./short-term/2026-09-15-durable-event-track-e.md)(E0A–E2 隔离库 PASS;dispatcher 默认 off。删除 hook API 须等 live 窗口。复盘见 [research](./research/2026-09-15-track-e-retrospective.md)) 2. **CHAT-INTENT**: [对话意图运行时状态](../test-reports/2026-09-13-conversation-intent-runtime-state-test-report.md)(双标签 busy 已签:项目 **6275** / `DOC_BUSY` 单 run;不删 `sess-p143-u9` 探针) 3. **CHAT**: [对话历史刷新活验已补](../test-reports/2026-09-13-chat-history-refresh-test-report.md)(项目 6252 闲聊刷新同集 + guest 403;编制任务链仍开放) @@ -62,7 +62,8 @@ | Cursor | event-e0b-dispatcher-pg | feature/events-dispatcher-pg | - | events | done | | Cursor | event-e1a-notify-cutover | fix/event-notify-cutover | - | events | done | | Cursor | event-e1b-workflow-advance | fix/event-workflow-advance | - | events | done | -| Cursor | event-e1c-projection-cutover | fix/event-projection-cutover | - | events | in_progress | +| Cursor | event-e1c-projection-cutover | fix/event-projection-cutover | - | events | done | +| Cursor | event-e2-hook-guard | fix/event-e2-hook-guard | - | events | in_progress | > 新任务开始前登记。`branch` 必须为 `feature/` 或 `fix/`,**禁止** `dev` / `test` / `main`。同一 `mutex` 同时仅一个 `in_progress`。 @@ -74,7 +75,7 @@ | holder | phase | since | scope | queue | |--------|-------|-------|-------|-------| -| Cursor | merging | 2026-09-15 | E1C projection no-replace;mode=off | - | +| Cursor | merging | 2026-09-15 | E2 hook live-guard;mode=off | - | **phase**: `idle` | `merging` | `smoke` | `e2e` @@ -84,7 +85,7 @@ | 环境 | 端口 | schema | 状态 | |------|------|--------|------| -| dev | 8080 | **41** | healthy(`pi-agent`;events worker `:8088`;dispatcher mode=off;health+ready PASS) | +| dev | 8080 | **43** | healthy(`pi-agent`;events worker `:8088`;dispatcher mode=off;health+ready PASS) | | test | 8081 | 25→27* | healthy | | main | 8000 | 25→27* | healthy(app + runner + DB) | @@ -114,6 +115,8 @@ | 文档可靠性 M3 U9 | [../test-reports/2026-09-15-dataset-lifecycle-u9-test-report.md](../test-reports/2026-09-15-dataset-lifecycle-u9-test-report.md) | | 文档可靠性 M4 U10 | [../test-reports/2026-09-15-chatlog-contextasm-u10-test-report.md](../test-reports/2026-09-15-chatlog-contextasm-u10-test-report.md) | | 文档可靠性 M5/M6 U11–U12 | [../test-reports/2026-09-15-app-composition-u11-u12-test-report.md](../test-reports/2026-09-15-app-composition-u11-u12-test-report.md) | +| Track E E2 闭包守卫 | [../test-reports/2026-09-15-event-e2-hook-guard-test-report.md](../test-reports/2026-09-15-event-e2-hook-guard-test-report.md) | +| Track E 复盘 | [./research/2026-09-15-track-e-retrospective.md](./research/2026-09-15-track-e-retrospective.md) | | 旁支清点收口 | [../test-reports/2026-09-15-leftover-branch-cleanup-test-report.md](../test-reports/2026-09-15-leftover-branch-cleanup-test-report.md) | | SSE/幂等审计 | [../audit/2026-09-13-document-revision-sse-idempotency.md](../audit/2026-09-13-document-revision-sse-idempotency.md) | | 质量门禁自污染审计 | [../audit/2026-09-13-document-revision-quality-gate-self-pollution.md](../audit/2026-09-13-document-revision-quality-gate-self-pollution.md) | diff --git a/.doc/ops/research/2026-09-15-track-e-retrospective.md b/.doc/ops/research/2026-09-15-track-e-retrospective.md new file mode 100644 index 00000000..cbe1f744 --- /dev/null +++ b/.doc/ops/research/2026-09-15-track-e-retrospective.md @@ -0,0 +1,35 @@ +--- +title: "Track E 持久事件交付复盘" +created: 2026-09-15 +status: done +confidence: high +--- + +# 调研:Track E 持久事件交付复盘 + +## 结论 + +E0A–E1C 已在隔离库证明:领域变化、envelope、delivery 同 UoW;PG dispatcher 原子 lease/fencing;notify / workflow_advance / projection 各自 exactly-one visible outcome。共享集群消费者保持 **off**,HTTP 闭包仍是唯一真实写者。E2 已部署兼容守卫:消费者 `live` 时闭包停写,`off`/`shadow` 时闭包继续写。删除 `OnOutbox` / `AddOnApprovedHook` 必须等 live 发布窗口;当前删除会让 notify/advance 停写。`DOC-RELIABILITY-PILOT` 保持 OPEN。FAV 保持 disabled。 + +## 证据 + +| 项 | 路径/命令 | 结果 | +|----|-----------|------| +| E0A | [E0A 报告](../../test-reports/2026-09-15-event-e0a-production-scope-contract-test-report.md) | PASS;dispatcher off;FAV 不写入 | +| E0B | [E0B 报告](../../test-reports/2026-09-15-event-e0b-dispatcher-pg-test-report.md) | PASS;1/2/4 worker;旧 token 失败 | +| E1A | [E1A 报告](../../test-reports/2026-09-15-event-e1a-notify-cutover-test-report.md) | 隔离库 unique notify PASS;共享 off | +| E1B | [E1B 报告](../../test-reports/2026-09-15-event-e1b-workflow-advance-test-report.md) | 隔离库 unique stage-ready PASS;共享 off | +| E1C | [E1C 报告](../../test-reports/2026-09-15-event-e1c-projection-test-report.md) | no-replace PASS;共享 off | +| E2 | [E2 报告](../../test-reports/2026-09-15-event-e2-hook-guard-test-report.md) | live 停写;off/shadow 仍写;API 保留 | + +## 开放问题 + +- 共享环境尚未做 notify/advance/projection 的 live 切换与授权页刷新纵切,因此 Track E DoD 中「生产注册无 OnOutbox=」与「授权 UI 三类重启」未关闭。 +- 历史 inventory 的 repair/quarantine 真实批量审批未在共享库演练。 +- FAV 仍只预留 disabled 契约。 + +## 建议动作 + +- 下一窗口:按消费者独立 shadow coverage → drain → live,闭包因 E2 守卫自动停写;确认 backlog 与 receipt 后再删 hook API。 +- Track S 从 D6(`internal/doccontent`)开始,不占用 events mutex。 +- Track P 保持独立 remediation,不阻塞事件交付。 diff --git a/.doc/ops/short-term/2026-09-15-durable-event-track-e.md b/.doc/ops/short-term/2026-09-15-durable-event-track-e.md index a675f9b7..7d8b4509 100644 --- a/.doc/ops/short-term/2026-09-15-durable-event-track-e.md +++ b/.doc/ops/short-term/2026-09-15-durable-event-track-e.md @@ -4,7 +4,7 @@ status: in_progress created: 2026-09-15 updated: 2026-09-15 owner: Cursor -branch: fix/event-projection-cutover +branch: fix/event-e2-hook-guard worktree: "-" mutex: events --- @@ -30,22 +30,23 @@ mutex: events 1. [x] E0A 单独建 short-term/分支,dispatcher 保持 off。 2. [x] E0A 报告通过后再认领 E0B。 -3. [x] 依次交付 E1A notify、E1B workflow advance、E1C projection;每步独立 go/no-go。E2 删除 hook 待 live 窗口。 -4. [ ] 一个兼容发布窗口后 contract 删除闭包 API。 -5. [ ] 同步 test report、CURRENT、FEATURE-MATRIX、gap-matrix。 +3. [x] 依次交付 E1A notify、E1B workflow advance、E1C projection;每步独立 go/no-go。 +4. [x] E2 兼容守卫:live 时闭包停写;hook API 待 live 窗口后删除。 +5. [x] 同步 test report、CURRENT、FEATURE-MATRIX、gap-matrix、[复盘](../research/2026-09-15-track-e-retrospective.md)。 ## 验收标准 -- [ ] 满足 [Phase 2 Track E Definition of Done](../../remediation/2026-09-15-module-decoupling-ipc-phase2-remediation-plan.md#track-e-definition-of-done)。 -- [ ] 每个波次拥有独立 owner、mutex、分支、报告和回滚证据。 -- [ ] 未把计划、MemoryBus、stub 或日志冒充生产 PG/browser/restart 验收。 +- [ ] 满足 [Phase 2 Track E Definition of Done](../../remediation/2026-09-15-module-decoupling-ipc-phase2-remediation-plan.md#track-e-definition-of-done)(共享 live 与删除 hook API 仍开放)。 +- [x] 每个波次拥有独立 owner、mutex、分支、报告和回滚证据。 +- [x] 未把计划、MemoryBus、stub 或日志冒充生产 PG/browser/restart 验收。 ## 相关链接 - Checklist: 按每个波次建立 - Audit: [Phase 2 方案审阅](../../audit/2026-09-15-module-decoupling-phase2-plan-review.md) - Remediation: [Phase 2 修订计划](../../remediation/2026-09-15-module-decoupling-ipc-phase2-remediation-plan.md) -- Test report: 待实施 +- Test report: [E2](../../test-reports/2026-09-15-event-e2-hook-guard-test-report.md) +- 复盘: [./research/2026-09-15-track-e-retrospective.md](../research/2026-09-15-track-e-retrospective.md) ## 证据 / 备注 diff --git a/.doc/ops/short-term/2026-09-15-event-e2-hook-guard.md b/.doc/ops/short-term/2026-09-15-event-e2-hook-guard.md new file mode 100644 index 00000000..b5c8f9a6 --- /dev/null +++ b/.doc/ops/short-term/2026-09-15-event-e2-hook-guard.md @@ -0,0 +1,48 @@ +--- +title: "E2 闭包 live 停写与 Track E 复盘" +status: in_progress +created: 2026-09-15 +updated: 2026-09-15 +owner: Cursor +branch: fix/event-e2-hook-guard +worktree: "-" +mutex: events +--- + +# E2 闭包 live 停写与 Track E 复盘 + +## 目标 + +在 dispatcher 仍默认 off 时保留 `OnOutbox` / `AddOnApprovedHook` 接线,使对应消费者切 `live` 后闭包立即停写,避免双写;并写 Track E 复盘。不关闭 `DOC-RELIABILITY-PILOT`。 + +## 范围 + +- `events.WriterLive` +- `docnotify.Subscriber.SkipWrite` +- Runtime / 遗留 HTTP hook 在 `workflow_advance` live 时 no-op +- 复盘与 E2 测试报告 + +## 非目标 + +- 不删除 hook API(须等 live 发布窗口) +- 不把共享 notify/advance/projection 切 live +- 不激活 FAV +- 不关闭 Track E 发布 blocker + +## 步骤 + +1. [x] 从最新 `dev` 开 `fix/event-e2-hook-guard` 并登记 CURRENT +2. [x] WriterLive + 闭包守卫 + 单测 +3. [x] 隔离库 mode 矩阵 +4. [x] 复盘与报告 + +## 验收标准 + +- [x] live 时闭包不写;off/shadow 仍写 +- [x] 生产仍保留 Bind / AddOnApprovedHook(mode=off 必需) +- [x] [E2 报告](../../test-reports/2026-09-15-event-e2-hook-guard-test-report.md) + +## 相关链接 + +- Track E: [./2026-09-15-durable-event-track-e.md](./2026-09-15-durable-event-track-e.md) +- 复盘: [../research/2026-09-15-track-e-retrospective.md](../research/2026-09-15-track-e-retrospective.md) diff --git a/.doc/remediation/gap-matrix.md b/.doc/remediation/gap-matrix.md index 44d7dc0b..6c591c79 100644 --- a/.doc/remediation/gap-matrix.md +++ b/.doc/remediation/gap-matrix.md @@ -70,7 +70,7 @@ | DOCREV-ACTIVE-DOC-ROUTING | UI-05「当前受控文档」被法规关键词改路由到 `feasibility_reg`,intake 无 pending | **PASS** | [audit](../audit/2026-09-13-document-revision-active-doc-routing.md);Round20 UI-05 pending 停在 intake V2 | **不改弱 E2E**;不删证据 | | DOCREV-QUALITY-STATUS-FP | 行动计划表状态列「待续」被门禁当敷衍,两轮 repair 后 quality_failed 80 | **PASS** | [audit](../audit/2026-09-13-document-revision-quality-status-false-positive.md);Round20 UI-03 | **不删禁词、不放宽正文**;不删证据 | | GOVERNANCE-ACTION-AUTHZ | 文档动作按职责鉴权;未激活 202-blocked;关闭创建直通 | **PASS** | [test-report](../test-reports/2026-09-14-governance-action-level-authz-test-report.md);[audit 异态](../audit/2026-09-14-planning-with-workflow-key-anomaly.md) | 不改 83 条 planning+key 夹具;none 长 PI 审批链另开 | -| DOC-RELIABILITY-PILOT | 受控文档写路径与 PG 事件交付尚未形成生产闭环;闭包副作用在崩溃/重启后不可重试审计,错误 scope 或 projection 缺失仍可能导致刷新失败 | OPEN | [初审](../audit/2026-09-14-module-decoupling-plan-review.md);[Phase 1](./2026-09-14-module-decoupling-refactor-plan.md);[Phase 2 复核](../audit/2026-09-15-module-decoupling-phase2-plan-review.md);[Phase 2 修订](./2026-09-15-module-decoupling-ipc-phase2-remediation-plan.md);[U11–U12 报告](../test-reports/2026-09-15-app-composition-u11-u12-test-report.md);[E1A](../test-reports/2026-09-15-event-e1a-notify-cutover-test-report.md);[E1B](../test-reports/2026-09-15-event-e1b-workflow-advance-test-report.md);[E1C](../test-reports/2026-09-15-event-e1c-projection-test-report.md) | E0A–E1C 隔离库已过。E2 删除闭包须等 live 窗口。dispatcher 保持 off。FAV、结构整理、HTTP/PI 协议不纳入本 blocker 关闭条件。项目 143 只读 | +| DOC-RELIABILITY-PILOT | 受控文档写路径与 PG 事件交付尚未形成生产闭环;闭包副作用在崩溃/重启后不可重试审计,错误 scope 或 projection 缺失仍可能导致刷新失败 | OPEN | [初审](../audit/2026-09-14-module-decoupling-plan-review.md);[Phase 1](./2026-09-14-module-decoupling-refactor-plan.md);[Phase 2 复核](../audit/2026-09-15-module-decoupling-phase2-plan-review.md);[Phase 2 修订](./2026-09-15-module-decoupling-ipc-phase2-remediation-plan.md);[U11–U12 报告](../test-reports/2026-09-15-app-composition-u11-u12-test-report.md);[E1A](../test-reports/2026-09-15-event-e1a-notify-cutover-test-report.md);[E1B](../test-reports/2026-09-15-event-e1b-workflow-advance-test-report.md);[E1C](../test-reports/2026-09-15-event-e1c-projection-test-report.md);[E2](../test-reports/2026-09-15-event-e2-hook-guard-test-report.md);[复盘](../ops/research/2026-09-15-track-e-retrospective.md) | E0A–E2 隔离库已过。共享消费者未 live,故不删 hook API。dispatcher 保持 off。FAV、结构整理、HTTP/PI 协议不纳入本 blocker 关闭条件。项目 143 只读 | --- diff --git a/.doc/status/FEATURE-MATRIX.md b/.doc/status/FEATURE-MATRIX.md index 60c795a9..c9f4f44a 100644 --- a/.doc/status/FEATURE-MATRIX.md +++ b/.doc/status/FEATURE-MATRIX.md @@ -27,7 +27,7 @@ | PI Runner / 配置链 | pi-agent + MiniMax 真实链路 | done | [test piagent](../test-reports/2026-09-13-codex-audit-p0-remediation-test-report.md);[container-env](../test-reports/2026-09-13-container-env-configuration-test-report.md) | — | `pi-agent` | | 三环境运维 | dev/test/main + 共享 KB | done | [PROJECT.md](../../PROJECT.md) §4;四环境 healthy | — | `infra` | | CI / E2E | PG 集成 + 真实 PI E2E | partial | [gap-matrix BUG-08](../remediation/gap-matrix.md);[test pg-ci](../test-reports/2026-09-12-pg-ci-soak-e2e-test-report.md);[运行时 UI Round20](../test-reports/2026-09-14-document-revision-runtime-ui-test-report.md) | CI `TEST_DATABASE_URL` 隔离库仍缺;文档运行时真实 UI 已按 UI_PHASE 分文件且 post-restart 断言最终 A1 正文。`-race` 全包并行 TempDir flake 为基建残留 | `ci` | -| 模块解耦与可靠事件 | 文档可靠性纵向试点、PG 持久事件交付与选择性模块化 | partial | [架构](../system-design/2026-09-14-module-decoupling-architecture.md);[ADR](../adr/2026-09-14-modular-monolith-decoupling.md);[Phase 1](../remediation/2026-09-14-module-decoupling-refactor-plan.md);[Phase 2 审阅](../audit/2026-09-15-module-decoupling-phase2-plan-review.md);[Phase 2 修订计划](../remediation/2026-09-15-module-decoupling-ipc-phase2-remediation-plan.md);[E0A](../test-reports/2026-09-15-event-e0a-production-scope-contract-test-report.md);[E0B](../test-reports/2026-09-15-event-e0b-dispatcher-pg-test-report.md);[E1A](../test-reports/2026-09-15-event-e1a-notify-cutover-test-report.md);[E1B](../test-reports/2026-09-15-event-e1b-workflow-advance-test-report.md);[E1C](../test-reports/2026-09-15-event-e1c-projection-test-report.md) | E0A–E1C 隔离库已过;dispatcher 默认 off。E2 删除闭包须等 live。Track S/P 与 FAV 另列 | `architecture-docs` | +| 模块解耦与可靠事件 | 文档可靠性纵向试点、PG 持久事件交付与选择性模块化 | partial | [架构](../system-design/2026-09-14-module-decoupling-architecture.md);[ADR](../adr/2026-09-14-modular-monolith-decoupling.md);[Phase 1](../remediation/2026-09-14-module-decoupling-refactor-plan.md);[Phase 2 审阅](../audit/2026-09-15-module-decoupling-phase2-plan-review.md);[Phase 2 修订计划](../remediation/2026-09-15-module-decoupling-ipc-phase2-remediation-plan.md);[E0A](../test-reports/2026-09-15-event-e0a-production-scope-contract-test-report.md);[E0B](../test-reports/2026-09-15-event-e0b-dispatcher-pg-test-report.md);[E1A](../test-reports/2026-09-15-event-e1a-notify-cutover-test-report.md);[E1B](../test-reports/2026-09-15-event-e1b-workflow-advance-test-report.md);[E1C](../test-reports/2026-09-15-event-e1c-projection-test-report.md);[E2](../test-reports/2026-09-15-event-e2-hook-guard-test-report.md);[复盘](../ops/research/2026-09-15-track-e-retrospective.md) | E0A–E2 隔离库已过;dispatcher 默认 off。删除闭包 API 须等 live。Track S/P 与 FAV 另列 | `architecture-docs` | --- diff --git a/.doc/test-reports/2026-09-15-event-e2-hook-guard-test-report.md b/.doc/test-reports/2026-09-15-event-e2-hook-guard-test-report.md new file mode 100644 index 00000000..2f5834c7 --- /dev/null +++ b/.doc/test-reports/2026-09-15-event-e2-hook-guard-test-report.md @@ -0,0 +1,79 @@ +# E2 闭包 live 停写测试报告 + +## 一、 测试背景 (Background) + +E1A–E1C 已把 notify、workflow_advance、projection 接到独立 worker,但共享集群 mode 仍为 **off**。此时删除 `OnOutbox` / `AddOnApprovedHook` 会让可见通知与阶段推进停写。E2 需要在切 live 之前部署兼容守卫:durable consumer 为 live 时闭包 no-op,off/shadow 时闭包仍是唯一写者。 + +## 二、 测试目标 (Test Objectives) + +- `events.WriterLive`:缺行 / off / shadow → false;live → true。 +- `docnotify.Subscriber.SkipWrite`:live 不 emit;off 仍 emit。 +- Runtime 与遗留 HTTP 批准 hook 在 `workflow_advance` live 时不推进。 +- 不删除 hook API;不把共享消费者切 live;不关闭 `DOC-RELIABILITY-PILOT`。 + +## 三、 测试方案与环境 (Test Plan & Environment) + +| 项 | 值 | +|----|-----| +| OS | Linux 7.0.0-31-generic | +| Go | go1.27.1 linux/amd64 | +| 分支 | `fix/event-e2-hook-guard` | +| Schema | **43**(隔离库 `agent_rel_e2`,测完 DROP) | +| PostgreSQL | `shuimu-system-pg-test` `:5434`;非 `agent_system_test` | +| 项目 143 | 只读 | +| 共享 dispatcher | off | +| 证据 | `.doc/test-reports/assets/2026-09-15-event-e2-hook-guard/` | + +## 四、 预期结果 (Expected Results) + +| 用例 | 期望 | +|------|------| +| nil pool / 缺 mode 行 | WriterLive=false,闭包继续写 | +| mode=off / shadow | WriterLive=false | +| mode=live | WriterLive=true,Handle 不 emit | +| Bind / AddOnApprovedHook | 生产仍注册(mode=off 需要) | +| 共享 :8080 / :8088 | health/ready ok;schema 43 | + +## 五、 实际测试结果与判定 (Actual Results & Evaluation) + +### 5.1 单测 + +- **测试输入 (Input)**:`go test -count=1 ./internal/events ./internal/app ./internal/app/docnotify -run 'TestWriterLiveNilPool|TestHandleSkipsWhenConsumerLive|TestHandleWritesWhenNotLive|TestWriterLiveNilRuntime'` +- **实际输出 (Actual Output)**:全部 PASS(见 `race.txt` 同范围) +- **评价判定 (Evaluation / Verdict)**:**PASS** +- **性能与耗时 (Duration & Latency)**:<20ms + +### 5.2 隔离库 mode 矩阵 + +- **测试输入 (Input)**:`TEST_DATABASE_URL` → `127.0.0.1:5434/agent_rel_e2`;`go test -v ./internal/events -run 'TestWriterLiveNilPool|TestE2_WriterLiveModes_PG'` +- **实际输出 (Actual Output)**:goose 迁至 **43**;`TestE2_WriterLiveModes_PG` PASS 0.28s(`pg-test.txt`) +- **评价判定 (Evaluation / Verdict)**:**PASS** +- **性能与耗时 (Duration & Latency)**:0.285s 含全量迁移 + +### 5.3 race + +- **测试输入 (Input)**:`go test -race ./internal/events ./internal/app ./internal/app/docnotify -run 'TestWriterLive|TestHandleSkipsWhen|TestHandleWritesWhen|TestE2_|TestStartStop'` +- **实际输出 (Actual Output)**:`race.txt` 三包 ok(约 1.0s) +- **评价判定 (Evaluation / Verdict)**:**PASS** +- **性能与耗时 (Duration & Latency)**:~1.0s + +### 5.4 arch-check 与共享健康 + +- **测试输入 (Input)**:`./scripts/arch-check.sh --mode block`;`curl -sf :8080/health` `:8088/health` `:8088/ready` +- **实际输出 (Actual Output)**:arch-check block 通过;`schema_version`: **43**;events worker ok(`arch-check.txt`、`health.txt`) +- **评价判定 (Evaluation / Verdict)**:**PASS** +- **性能与耗时 (Duration & Latency)**:arch-check ~0.12s + +## 六、 自动化测试套件汇总 (Test Suite Execution) + +| 命令 | 结果 | +|------|------| +| 隔离库 TestE2_WriterLiveModes_PG | PASS schema 43 | +| race 目标包 | PASS | +| arch-check block | PASS | +| 共享 notify/advance/projection mode | **off** | +| hook API 删除 | **未做**(须等 live 窗口) | + +## 七、 测试结论与后续优化建议 (Conclusion & Next Steps) + +E2 **兼容守卫 PASS**。共享环境未 live,因此 Track E DoD 中「生产注册无 `OnOutbox =`」仍开放。下一步是按消费者独立切换 live(闭包将自动停写),发布窗口后再删 API。Track S 可并行占用非 events mutex。FAV 仍 off。复盘见 [Track E 复盘](../ops/research/2026-09-15-track-e-retrospective.md)。 diff --git a/.doc/test-reports/assets/2026-09-15-event-e2-hook-guard/arch-check.txt b/.doc/test-reports/assets/2026-09-15-event-e2-hook-guard/arch-check.txt new file mode 100644 index 00000000..0e3c3d0f --- /dev/null +++ b/.doc/test-reports/assets/2026-09-15-event-e2-hook-guard/arch-check.txt @@ -0,0 +1,5 @@ +arch-check mode=block +boundaries=/home/weichen/projects/Agent-System/.doc/system-design/module-boundaries.yaml +ok chat-agent-system/internal/archtest 0.121s +ok chat-agent-system/internal/archtest 0.125s +arch-check block: production gate passed diff --git a/.doc/test-reports/assets/2026-09-15-event-e2-hook-guard/health.txt b/.doc/test-reports/assets/2026-09-15-event-e2-hook-guard/health.txt new file mode 100644 index 00000000..ced0e17b --- /dev/null +++ b/.doc/test-reports/assets/2026-09-15-event-e2-hook-guard/health.txt @@ -0,0 +1,9 @@ +=== HTTP :8080/health === +{"status":"ok","env":"dev","agent_backend":"pi-agent","version":"v1.0","shared_kb_port":5432,"database_ready":true,"schema_version":43,"schema_ready":true,"task_store_ready":true} + +=== events :8088/health === +{"env":"dev","owner":"events-1","status":"ok"} + +=== events :8088/ready === +{"status":"ok"} + diff --git a/.doc/test-reports/assets/2026-09-15-event-e2-hook-guard/pg-test.txt b/.doc/test-reports/assets/2026-09-15-event-e2-hook-guard/pg-test.txt new file mode 100644 index 00000000..f504c3a2 --- /dev/null +++ b/.doc/test-reports/assets/2026-09-15-event-e2-hook-guard/pg-test.txt @@ -0,0 +1,50 @@ +=== RUN TestWriterLiveNilPool +--- PASS: TestWriterLiveNilPool (0.00s) +=== RUN TestE2_WriterLiveModes_PG +2026/09/15 10:11:47 OK 00001_baseline.sql (55.93ms) +2026/09/15 10:11:47 OK 00002_2026-09-09-doc-edit-lease.sql (1.58ms) +2026/09/15 10:11:47 OK 00003_2026-09-09-uq-context-memory-chunk-hash.sql (1.03ms) +2026/09/15 10:11:47 OK 00004_2026-09-10-chat-daily-digests-and-search.sql (513.4µs) +2026/09/15 10:11:47 OK 00005_2026-09-10-chat-messages-day-window.sql (942.92µs) +2026/09/15 10:11:47 OK 00006_2026-09-11-chat-read-positions.sql (402.18µs) +2026/09/15 10:11:47 OK 00007_2026-09-11-chat-turns.sql (385.53µs) +2026/09/15 10:11:47 OK 00008_2026-09-11-freeform-documents.sql (7.38ms) +2026/09/15 10:11:47 OK 00009_2026-09-11-message-export-policy.sql (3.08ms) +2026/09/15 10:11:47 OK 00010_2026-09-11-project-workflows-and-lineage.sql (12.63ms) +2026/09/15 10:11:47 OK 00011_2026-09-11-seed-ten-projects.sql (5.17ms) +2026/09/15 10:11:47 OK 00012_2026-09-11-seed-ten-projects-chat.sql (30.11ms) +2026/09/15 10:11:47 OK 00013_2026-09-11-task-run-lineage.sql (1.52ms) +2026/09/15 10:11:47 OK 00014_project_members.sql (3.58ms) +2026/09/15 10:11:47 OK 00015_2026-09-12-iam-core.sql (15.55ms) +2026/09/15 10:11:47 OK 00016_2026-09-12-workflow-definitions-and-templates.sql (10.59ms) +2026/09/15 10:11:47 OK 00017_2026-09-12-project-workflow-instances.sql (14.31ms) +2026/09/15 10:11:47 OK 00018_2026-09-12-outbox-notifications-stage-advance.sql (9.53ms) +2026/09/15 10:11:47 OK 00019_2026-09-12-task-runs-events.sql (5.18ms) +2026/09/15 10:11:47 OK 00020_2026-09-12-task-run-worker-lease.sql (1.1ms) +2026/09/15 10:11:47 OK 00021_2026-09-12-iam-hardening.sql (3.56ms) +2026/09/15 10:11:47 OK 00022_2026-09-12-workflow-schema-v2.sql (1.81ms) +2026/09/15 10:11:47 OK 00023_2026-09-12-instance-integrity.sql (1.04ms) +2026/09/15 10:11:47 OK 00024_2026-09-12-workflow-catalog-governance.sql (6.21ms) +2026/09/15 10:11:47 OK 00025_2026-09-13-sync-seed-sequences.sql (876.41µs) +2026/09/15 10:11:47 OK 00026_2026-09-13-chat-message-scope.sql (2.45ms) +2026/09/15 10:11:47 OK 00027_2026-09-13-chat-message-scope-backfill.sql (2.04ms) +2026/09/15 10:11:47 OK 00028_2026-09-13-document-revisions.sql (16.83ms) +2026/09/15 10:11:47 OK 00029_2026-09-13-freeform-client-key.sql (1.12ms) +2026/09/15 10:11:47 OK 00030_2026-09-13-task-run-pending-author-confirmation.sql (999.4µs) +2026/09/15 10:11:47 OK 00031_2026-09-13-project-member-document-duty.sql (1.7ms) +2026/09/15 10:11:47 OK 00032_2026-09-14-document-revision-migration-repair.sql (591.15µs) +2026/09/15 10:11:47 OK 00033_2026-09-14-task-run-blocked-pending-governance.sql (420.9µs) +2026/09/15 10:11:47 OK 00034_2026-09-14-workspace-lease-fencing.sql (451.12µs) +2026/09/15 10:11:47 OK 00035_2026-09-14-durable-event-delivery.sql (5.02ms) +2026/09/15 10:11:47 OK 00036_2026-09-14-final-artifact-vault.sql (8.18ms) +2026/09/15 10:11:47 OK 00037_2026-09-15-task-run-manifests.sql (2.27ms) +2026/09/15 10:11:47 OK 00038_2026-09-15-dataset-lifecycle.sql (7.74ms) +2026/09/15 10:11:47 OK 00039_2026-09-15-event-inventory-and-principals.sql (5.65ms) +2026/09/15 10:11:47 OK 00040_2026-09-15-event-dispatcher.sql (6.56ms) +2026/09/15 10:11:47 OK 00041_2026-09-15-notification-visible-outcome.sql (999.47µs) +2026/09/15 10:11:47 OK 00042_2026-09-15-workflow-advance-outcome.sql (889.57µs) +2026/09/15 10:11:47 OK 00043_2026-09-15-projection-outcome.sql (2.02ms) +2026/09/15 10:11:47 goose: successfully migrated database to version: 43 +--- PASS: TestE2_WriterLiveModes_PG (0.28s) +PASS +ok chat-agent-system/internal/events 0.285s diff --git a/.doc/test-reports/assets/2026-09-15-event-e2-hook-guard/race.txt b/.doc/test-reports/assets/2026-09-15-event-e2-hook-guard/race.txt new file mode 100644 index 00000000..b4cf072a --- /dev/null +++ b/.doc/test-reports/assets/2026-09-15-event-e2-hook-guard/race.txt @@ -0,0 +1,3 @@ +ok chat-agent-system/internal/events 1.035s +ok chat-agent-system/internal/app 1.024s +ok chat-agent-system/internal/app/docnotify 1.011s