diff --git a/.doc/ops/CURRENT.md b/.doc/ops/CURRENT.md index 230b01c9..08236834 100644 --- a/.doc/ops/CURRENT.md +++ b/.doc/ops/CURRENT.md @@ -18,7 +18,7 @@ | owner | task | branch | worktree | mutex | status | |---|---|---|---|---|---| -| pi | chat-semantic-replace-2026-09-26 | feature/chat-semantic-replace-2026-09-26 | .worktrees/chat-semantic-replace-2026-09-26 | chat | in_progress | +| pi | chat-semantic-replace-2026-09-26 | feature/chat-semantic-replace-2026-09-26 | .worktrees/chat-semantic-replace-2026-09-26 | chat | done | | pi | jevdecide-soak-2026-09-26 | feature/jevdecide-soak-2026-09-26 | .worktrees/jevdecide-soak-2026-09-26 | jevdecide | done | | pi | dialogue-ctx-closeout-2026-09-26-r4 | feature/dialogue-ctx-closeout-2026-09-26 | .worktrees/dialogue-ctx-closeout-2026-09-26 | dialogue-ctx | done | | pi | dialogue-ctx-closeout-2026-09-26-r2 | feature/dialogue-ctx-closeout-2026-09-26 | .worktrees/dialogue-ctx-closeout-2026-09-26 | dialogue-ctx | in_progress | diff --git a/.doc/ops/short-term/2026-09-26-chat-semantic-replace.md b/.doc/ops/short-term/2026-09-26-chat-semantic-replace.md index 42bbebd7..41f76a9f 100644 --- a/.doc/ops/short-term/2026-09-26-chat-semantic-replace.md +++ b/.doc/ops/short-term/2026-09-26-chat-semantic-replace.md @@ -53,11 +53,17 @@ ## 三、计划 1. [x] 分析(§一) -2. [ ] 实现 §2(flags/allowlist/替换点/单测/sysadmin 目录) -3. [ ] 工程门禁 + 候选集成 dev -4. [ ] dev 运行时验收(真实链路 swap + 回滚 + allowlist 隔离) +2. [x] 实现 §2(flags/allowlist/替换点/单测/sysadmin 目录;dev `cd1f846f`) +3. [x] 工程门禁 + 候选集成 dev(含回滚残留修复 `6004494e`) +4. [x] dev 运行时验收(替换/隔离/回滚无残留全 PASS;另修复 goose62 schema 漂移) 5. [ ] 测试报告 + 矩阵行更新 + 收口清理 ## 四、结果登记 -(完成后回填) +- **review_state**: done(单测 8/8 + 工程门禁 + 既有密封负例保持) +- **integration_state**: done(dev `cd1f846f` + `6004494e` --no-ff 候选集成) +- **deployment**: dev_runtime_verified(阶梯验收后已恢复默认关闭;compose/env 默认不变) +- **验证结论**: 见 [测试报告](../../test-reports/2026-09-26-chat-semantic-replace-test-report.md) +- **过程修复**: ①回滚残留(displaced_narrative);②dev localpg goose62 对象缺失按幂等 DDL 修复 +- **cleanup**: 本任务 worktree 按门禁清理 +- **remote_sync**: not_requested(本地 dev 前进,未 push) diff --git a/.doc/status/FEATURE-MATRIX.md b/.doc/status/FEATURE-MATRIX.md index e019b574..d94b9e2e 100644 --- a/.doc/status/FEATURE-MATRIX.md +++ b/.doc/status/FEATURE-MATRIX.md @@ -51,7 +51,7 @@ |------|----------|------|----------|------|---------------------|-------|-------| | dialogue-ctx-injection | 对话上下文注入 | 项目成员对话清洗分层注入小队 workspace 与助手 Prompt;冲突裁决+HITL 分级路由;默认 on 紧急可关 | done | deferred_enhancement | [设计](../system-design/2026-09-25-dialogue-context-injection-design.md);[报告](../test-reports/2026-09-25-dialogue-context-injection-test-report.md);[短文](../ops/short-term/2026-09-25-dialogue-context-injection.md);[收口报告](../test-reports/2026-09-26-dialogue-ctx-closeout-test-report.md) | **after 2026-09-26 收口**:关闭条件全满足——dev 迁移 00072 应用(schema 73);真实 PI intake 任务 `context/dialogue/` 五文件落盘 + TASK.md 导航核验 PASS;冲突确认卡冒烟(投递+确认+黑板同步)PASS;trigger_user 卡片接线补齐(dev `ebb82820`)。会话实时推卡为后续增强另立 | `dialogue-ctx` | | jevdecide-shadow | jev 产品决策 shadow/assist | jevdecide + coordinator realtime/ProfileTask;compose 默认 off;**local_dev 已开 assist**(no-docker 根 `.env` 与 `configs/.env.dev`) | done | deferred_enhancement | [产品报告](../test-reports/2026-09-24-jev-product-shadow-test-report.md);[shadow 启用](../test-reports/2026-09-24-jev-dev-shadow-enable-test-report.md);[assist 启用+对话](../test-reports/2026-09-24-jev-dev-assist-enable-test-report.md);[assist 短文](../ops/short-term/2026-09-24-jev-dev-assist-enable.md);[浸泡收口](../test-reports/2026-09-26-jevdecide-soak-test-report.md) | **after 2026-09-26 浸泡收口**:200 真实轮(10×20)——决策层 B 组加成 100/100、规则压制 0、C 组误伤 0/60、jev 失败 0;体验层 B 组 handled 94%(92 实时事实 + 2 fail-closed 声明,6 真缺口源于意图误路由至模板通道,归 intent/risk 另立行);无编造数值。compose 默认仍 off;test/main 放量另授权 | `jevdecide` | -| chat-semantic-replace | 语义摘要 REPLACE | 以 shadow 叙事可选替换 served deterministic Narrative(fail-closed 灰度) | deferred | deferred_enhancement | [Wave5 X-2](../ops/short-term/2026-09-18-wave5-deadcode-decisions.md);[pu6](../ops/long-term/2026-09-16-pu6-semantic-summary-contract.md);[summary_flags](../../internal/ctxmgr/summary_flags.go) | 关闭条件:用户独立授权 + fail-closed 灰度设计;`SEMANTIC_SUMMARY_REPLACE` 当前密封不接线。本行不自动升 done | `chat` | +| chat-semantic-replace | 语义摘要 REPLACE | 以 shadow 叙事可选替换 served deterministic Narrative(fail-closed 灰度:master + 会话 allowlist 双开关,默认全关) | done | deferred_enhancement | [Wave5 X-2](../ops/short-term/2026-09-18-wave5-deadcode-decisions.md);[pu6](../ops/long-term/2026-09-16-pu6-semantic-summary-contract.md);[summary_flags](../../internal/ctxmgr/summary_flags.go);[接线报告](../test-reports/2026-09-26-chat-semantic-replace-test-report.md);[短文](../ops/short-term/2026-09-26-chat-semantic-replace.md) | **after 2026-09-26 接线**(用户独立授权解封):`SEMANTIC_SUMMARY_REPLACE` + `SEMANTIC_SUMMARY_REPLACE_SESSIONS` 白名单灰度——报告 OK/可见集 digest/served watermark/长度四重校验后仅换白名单会话 Narrative;Facts 与 digest 保持 deterministic;回滚经 displaced_narrative 无残留(dev `cd1f846f`+`6004494e`,单元 8/8 + dev 真实链路阶梯 PASS)。默认关闭;放量逐环境另授权 | `chat` | | gov-agent-worktree | Agent worktree 治理自动化 | 主目录保护、任务 worktree、机器认领、候选集成、dev 部署与安全清理 | partial | non_blocker | [方案](../remediation/2026-09-21-agent-workflow-governance-plan.md);[L1 验收](../test-reports/2026-09-21-agent-governance-test-report.md);[W1-B macOS](../ops/short-term/2026-09-22-agentctl-macos.md);[W4](../ops/short-term/2026-09-22-governance-automation.md);residual `modular-decouple-residual-2026-09-23` | L1 与 macOS `with/docs apply/validate/integrate` 已合入。W4 landed:durable queue + 完整 docs projection apply(行/整文 CAS)+ deploy/recover 真实收据闭环 + Darwin cwd 可见性测试。仍 deferred:PI 源码镜像 compose、跨机隔离、automation/w4 实现收敛。本行不升 done | `agent-workflow-governance` | | intent-l1 | 意图识别 L1 | 18 类 Intent、三分支消解、写/只读分流、双标签 `DOC_BUSY`、intent 纯依赖边界 | done | non_blocker | [intent-recognition](../system-design/intent-recognition/);[工作流作用域](../test-reports/2026-09-21-intent-workflow-scoping-test-report.md);[审计](../audit/2026-09-13-conversation-intent-runtime-state.md);[报告](../test-reports/2026-09-13-conversation-intent-runtime-state-test-report.md);[双标签](../test-reports/assets/2026-09-15-conversation-intent-dual-tab/live.json);[U1](../test-reports/2026-09-15-multi-intent-u1-contracts-test-report.md)–[U3](../test-reports/2026-09-15-multi-intent-u3-intentflow-pg-test-report.md) | **边界 before**:含 U9–U12 叙事混入 → **after**:U9–U12 迁至「多意图扩面」行。关闭:纯依赖边界回归即重开 | `intent` | | intent-plan-u1u8 | 多意图持久计划(U1–U8 基线) | app/intentflow 生命周期、HITL、默认 `legacy`、U1–U8 代码与安全基线 | done | non_blocker(默认 legacy) | [设计](../system-design/2026-09-15-multi-intent-hitl-plan.md);[U1](../test-reports/2026-09-15-multi-intent-u1-contracts-test-report.md)–[U8](../test-reports/2026-09-16-multi-intent-u8-task-generate-test-report.md);[Wave2 真 PI](../test-reports/2026-09-16-wave2-real-pi-evidence-test-report.md);[Track I1](../test-reports/2026-09-22-track-i1-query-owner-test-report.md);[I2 放量](../test-reports/2026-09-24-intent-plan-i2-rollout-test-report.md) | **after Track I2**:shadow 持久 validated_only + 项目 allowlist + 指标已合入;dev 已按 allowlist 验收 shadow→auto_read→confirm(项目 6579;确认前零写)。compose 默认仍 `legacy`。U9–U12 见独立行 | `intent-plan` | diff --git a/.doc/test-reports/2026-09-26-chat-semantic-replace-test-report.md b/.doc/test-reports/2026-09-26-chat-semantic-replace-test-report.md new file mode 100644 index 00000000..b9c18875 --- /dev/null +++ b/.doc/test-reports/2026-09-26-chat-semantic-replace-test-report.md @@ -0,0 +1,60 @@ +# 语义摘要 REPLACE fail-closed 灰度接线 测试报告 + +## 一、测试背景 (Background) + +FEATURE-MATRIX `chat-semantic-replace` 行关闭条件:用户独立授权(本任务授权来源:用户会话指令明确要求完成本行,满足 Wave5 X-2 密封解封条件)+ fail-closed 灰度设计。此前 `SEMANTIC_SUMMARY_REPLACE` 密封不接线。 + +## 二、测试目标 (Test Objectives) + +1. fail-closed:master 开而 allowlist 空 → 不替换任何会话;任一校验失败(模型错误/超长/stale watermark)→ deterministic 保留 +2. 灰度:仅 allowlist 会话在 shadow 报告 OK 且 served watermark 一致时替换 served Narrative;Facts/计数保持 deterministic +3. 回滚安全:替换后关闭开关,下一轮确定性再生成不含语义残留 +4. digest(每日纪要)保持 advisory-only + +## 三、测试方案与环境 (Test Plan & Environment) + +- 单元:`internal/ctxmgr/semantic_replace_test.go`(7 用例:空 allowlist/命中/未命中/模型错误/超长/stale/flag 解析 + 回滚残留) +- 工程:`arch-check --mode block`、`go vet ./...`、`go test -short ./...`(候选 `cd1f846f`、`6004494e`) +- 运行时:本机 no-docker dev(`bin/agent-server` @ dev `6004494e`;PI Runner MiniMax-M2.7-highspeed;产品 PI no-tool summarizer 由组合根注入) +- 过程修复:dev localpg 的 `chat_summaries.freshness_note/shadow_json` 与 `chat_summary_shadow_jobs` 缺失(goose 62 版本已记但对象缺失的 schema 漂移)——按 62 号幂等 Up DDL 修复并留档 + +## 四、预期结果 (Expected Results) + +| 用例 | 预期 | +|---|---| +| 单测矩阵(7+1) | 全 PASS | +| allowlist 会话溢出窗口 | source=semantic_replace、真实语义叙事、model=MiniMax | +| 非 allowlist 会话 | source=deterministic | +| 回滚(replace off + 新轮) | source=deterministic 且叙事无语义文本残留 | + +## 五、实际测试结果与判定 (Actual Results & Evaluation) + +### 5.1 单元/工程 + +- `go test ./internal/ctxmgr/ -run SemanticReplace`:**8/8 PASS**(含回滚残留用例) +- 既有密封负例 `TestSemanticSummary_ShadowOKKeepsDeterministic`(Replace:true 无 allowlist)保持 PASS——master 位单独打开不替换任何会话 +- sysadmin 目录断言更新为新契约(shadow/degraded + allowlist 键默认空)PASS;`arch-check`/`vet`/`-short` 全 PASS + +### 5.2 dev 运行时阶梯([runtime-ladder.txt](./assets/2026-09-26-chat-semantic-replace/runtime-ladder.txt)) + +1. **替换**:`sess-csr-hit2`(allowlist)窗口溢出后 `source=semantic_replace`,served Narrative 为真实 MiniMax 语义叙事(“用户启动手持超声新项目…客户为华西医院,预算约500万…”),freshness_note 记录 `semantic_replace: narrative replaced from MiniMax-M2.7-highspeed` **PASS** +2. **隔离**:同配置 `sess-csr-miss2` `source=deterministic`(shadow job 完成但未替换)**PASS** +3. **回滚**:重启 `SEMANTIC_SUMMARY_REPLACE=false` + 新增 15 轮 → rev5 `source=deterministic`,叙事为规则叙事(“双方开展了研发立项与合规细节沟通…”)**无语义残留 PASS** + +### 5.3 过程缺陷与修复(运行时验证发现) + +- **回滚残留缺陷**:确定性生成器合并 prior served 叙事(`summarizer.go` narrativeParts 以 `oldSum.Narrative` 起始),替换后回滚会把语义文本带入后续确定性叙事。修复(dev `6004494e`):替换时将被换下的确定性叙事存入 shadow 报告 `displaced_narrative`(随 `shadow_json` 持久化);确定性合并遇 `source=semantic_replace` 优先取回 displaced 叙事。单测 `TestSemanticReplace_RollbackLeavesNoResidue` + 运行时阶梯 3 覆盖。 + +## 六、自动化测试套件汇总 (Test Suite Execution) + +| 套件 | 结果 | +|---|---| +| `go test ./internal/ctxmgr/ ./internal/sysadmin/` | PASS | +| `arch-check --mode block` / `go vet` / `go test -short ./...`(候选) | PASS | +| dev 运行时阶梯(替换/隔离/回滚) | PASS | + +## 七、测试结论与后续优化建议 (Conclusion & Next Steps) + +**结论**:fail-closed 灰度设计已实现并经单元 + dev 真实链路验收——双开关(master + 会话 allowlist,默认全关)、四重前置校验(OK 报告/digest/watermark/长度)、Facts 与 digest 不变式、回滚无残留。默认关闭下零行为变化(负例保持)。FEATURE-MATRIX 行可升 `done`。 + +**后续**:放量阶梯 `off → 白名单会话 → 更广`,各环境开启需单独授权;`chat_summaries` 无外部读端点,验证经 DB/内部状态,后续可在管理台补只读视图。 diff --git a/.doc/test-reports/assets/2026-09-26-chat-semantic-replace/runtime-ladder.txt b/.doc/test-reports/assets/2026-09-26-chat-semantic-replace/runtime-ladder.txt new file mode 100644 index 00000000..ded009f1 --- /dev/null +++ b/.doc/test-reports/assets/2026-09-26-chat-semantic-replace/runtime-ladder.txt @@ -0,0 +1,6 @@ + session_id | source | revision | model_version | narrative | freshness +----------------+---------------+----------+------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+----------- + sess-csr-hit2 | deterministic | 5 | MiniMax-M2.7-highspeed | 双方开展了研发立项与合规细节沟通;双方开展了研发立项与合规细节沟通;双方开展了研发立项与合规细节沟通;双方开展了研发立项与合规细节沟通;讨论了包装按出口标准 | + sess-csr-miss2 | deterministic | 4 | MiniMax-M2.7-highspeed | 双方开展了研发立项与合规细节沟通;双方开展了研发立项与合规细节沟通;双方开展了研发立项与合规细节沟通;双方开展了研发立项与合规细节沟通 | +(2 rows) +