Close the U2 checklist with golden/hard-negative evidence while keeping production routing unchanged. Co-authored-by: Cursor <cursoragent@cursor.com>
7.1 KiB
7.1 KiB
多意图 HITL U2 规则分段与 shadow 提案 测试报告
一、 测试背景 (Background)
U1 已冻结 app/intentflow 契约与默认 legacy tier。生产路径仍由 plan_builder 最多拆两段查询,写意图直接丢弃。U2 要在不改 TopIntent / 现有 IntentPlan 路由的前提下,用纯规则分段器生成 2–4 步 PlanProposal,并把写段、指代、红线、超限记录进 shadow,供后续 intentflow 消费。
二、 测试目标 (Test Objectives)
- 连接词 / 句号 / 分号 / 换行 / 序号 / 「先…再…最后」能拆出 2–4 段
- 「查询并总结」内部链不拆;5 段不截断而是
rejected_batch_size - 写段进入提案且
ComboHint=needs_confirm;生产 IntentPlan 仍为 nil - 指代 →
needs_clarify;红线 → 整句rejected - 同输入 digest 稳定;反事实
auto_read错误自动执行 = 0 intent -> maturity保持;coordinator / chat 无回归- 无运行时路由变更,因此不做真实 PI / 浏览器验收
三、 测试方案与环境 (Test Plan & Environment)
| 项 | 值 |
|---|---|
| OS | Linux 7.0.0-31-generic |
| Go | go1.27.1 linux/amd64 |
| 分支 | feature/multi-intent-u2-segmenter(从本地 dev@8ac3d3f 检出) |
| Schema | 43(本单元不迁移) |
| 容器 | 不 rebuild |
| 项目 143 | 只读 |
| 证据 | .doc/test-reports/assets/2026-09-15-multi-intent-u2-segmenter/ |
测试层级:characterization(legacy IntentPlan)/ 分段器单测 / PlanProposal + golden eval / go test -short ./...。无 PG 集成、无真实 PI。
四、 预期结果 (Expected Results)
| 用例 | 判定 |
|---|---|
| 「查风险,然后查法规」 | 生产 IntentPlan 仍为 2 步 query;提案 read_only,反事实 would_execute |
| 「查法规然后生成报价单」 | 生产 IntentPlan=nil,TopIntent 仍为查询;提案含写段、needs_confirm、would_confirm;shadow LegacyDroppedWrite=true |
| 「查询并总结」 | 不分段;生产无 multi-intent plan;提案 single / would_passthrough |
| 「然后再看一下它的适用范围」 | needs_clarify / would_clarify |
| 「然后修改我的工号」 | 整句 rejected / would_reject |
| 5 段编号 | 分段器保留 5 段;提案 rejected_batch_size,不静默截成 4 |
| 同输入 digest | SHA-256 稳定 |
| golden v1 denom=8 | false_auto_execute=0 |
| arch-check block | production gate passed |
| 全仓 short | PASS |
五、 实际测试结果与判定 (Actual Results & Evaluation)
5.1 characterization:生产路由不变
- 测试输入 (Input):
go test -count=1 ./internal/intent -run 'TestLegacyIntentPlan|TestLimitedIntentPlan_QueryThenQuery' - 实际输出 (Actual Output):
--- PASS: TestLegacyIntentPlan_WriteComboStillDropped (0.00s)
--- PASS: TestLegacyIntentPlan_NoConnectorStaysSingle (0.00s)
--- PASS: TestLimitedIntentPlan_QueryThenQuery (0.00s)
ok chat-agent-system/internal/intent 0.012s
- 评价判定 (Evaluation / Verdict):PASS。写组合生产 IntentPlan 仍为 nil;「查询并总结」不产生 legacy 计划;双查询仍是 2 步 IntentPlan。
- 性能与耗时 (Duration & Latency):约 12ms
5.2 分段器 golden
- 测试输入:
go test -v -count=1 ./internal/intent -run TestSplitPlanSegments - 实际输出:
--- PASS: TestSplitPlanSegments_ConnectorAndNumbered (0.00s)
--- PASS: TestSplitPlanSegments_PeriodAndSemicolon (0.00s)
--- PASS: TestSplitPlanSegments_InternalChainNotSplit (0.00s)
--- PASS: TestSplitPlanSegments_FirstThenFinally (0.00s)
--- PASS: TestSplitPlanSegments_FiveNumberedKeptIntact (0.00s)
- 评价判定:PASS。连接词、编号、「先再最后」、句号/分号均可拆;内部链保持 1 段;5 段不被截断。
- 性能与耗时:<10ms
5.3 写段进入提案且路由不变
- 测试输入:
查一下相关法规,然后帮我生成报价单 - 实际输出:见 proposal-verbose.txt
--- PASS: TestPlanProposal_WriteNotDroppedAndLegacyUnchanged (0.00s)
断言:IntentPlan==nil,TopIntent=QUERY_REGULATIONS,提案 ≥2 段,ComboHint=needs_confirm,LegacyDroppedWrite=true,CounterfactualAutoRead=would_confirm。
- 评价判定:PASS。提案层不再静默丢写段;生产路由未改。
- 性能与耗时:<10ms
5.4 指代 / 红线 / 批量上限 / digest
- 测试输入:对应
TestPlanProposal_AnaphoraClarify、SecurityRejectsWhole、BatchSizeRejected、DigestStable - 实际输出:
--- PASS: TestPlanProposal_AnaphoraClarify (0.00s)
--- PASS: TestPlanProposal_SecurityRejectsWhole (0.00s)
--- PASS: TestPlanProposal_BatchSizeRejected (0.00s)
--- PASS: TestPlanProposal_DigestStable (0.00s)
- 评价判定:PASS。指代澄清、红线整句拒绝、5 段
rejected_batch_size、digest 稳定。 - 性能与耗时:<10ms
5.5 golden eval 与反事实安全
- 测试输入:
internal/intent/testdata/plan-proposal-eval-v1.json(denom=8) - 实际输出:
proposal_test.go:221: plan-proposal eval denom=8 false_auto_execute=0
--- PASS: TestPlanProposalEvalGolden (0.00s)
--- PASS: TestPlanProposal_HardNegativeNoFalseAutoExecute (0.00s)
- 评价判定:PASS。写/红线/指代/超限均不会被反事实判成
would_execute。ComboHint只是结构提示,不是授权。 - 性能与耗时:<10ms
5.6 边界与全仓 short
- 测试输入:
go vet ./...;./scripts/arch-check.sh --mode block;unset TEST_DATABASE_URL; go test -short -count=1 ./internal/intent ./internal/coordinator ./internal/chat ./internal/archtest ./internal/app/intentflow;go test -short -count=1 ./... - 实际输出:
go vet无输出。arch-check block: production gate passed。包级见 unit.txt;全仓见 short.txt。internal/server9.687s;全包 ok。 - 评价判定:PASS。
intent -> maturity保持;L1 未 import intentflow。coordinator / chat 无回归。 - 性能与耗时:全仓 short 约 12s
六、 自动化测试套件汇总 (Test Suite Execution)
| 命令 | 结果 |
|---|---|
go vet ./... |
PASS |
go test -count=1 ./internal/intent -run 'TestSplitPlanSegments|TestPlanProposal|TestLegacyIntentPlan' |
PASS |
go test -short -count=1 ./internal/intent ./internal/coordinator ./internal/chat ./internal/archtest ./internal/app/intentflow |
PASS |
go test -short -count=1 ./... |
PASS |
./scripts/arch-check.sh --mode block |
PASS |
通过率 100%。未跑 PG / 真实 PI(本单元无副作用路径)。
七、 测试结论与后续优化建议 (Conclusion & Next Steps)
U2 达到合入标准:规则分段与 shadow PlanProposal 落地,生产 TopIntent / IntentPlan 不变,反事实错误自动执行为 0。
后续:U3 在独立分支 feature/multi-intent-u3-intentflow-pg 建 intentflow owner、PG schema、CAS/lease/fencing;不得把 HITL/tier 回灌 ActionRegistry,也不得把 shadow 提案当作生产 IntentPlan。