Files
Agent-System-Dev/tests/integration/multi-instance/README.md
T
weichen f705f99b8f Add U7 two-process acceptance, k6 load harness and release checklist
Why: collaboration storage U7 (proposal sections 3/5/7) requires two-process
HTTP-level acceptance over shared PG, a reproducible load-test entry honoring
the load contract, and an auditable pre-release checklist; capacity windows and
dual-host runs need user-scheduled resources, so the deliverable here is the
verifiable entry, not capacity claims.
Evidence: make test green (composite); make test-multi-instance green locally
against an isolated PG (five scenarios incl. crash-takeover and restart
invariants); run_load.sh --profile smoke end-to-end green (SSE probe p95~18ms,
zero seq duplicates, stack auto-recycled); backend pinned to feature branch
with the three cross-instance fixes.
Impact: new tests/integration/multi-instance (CI test-pg job step), new
tests/load/collaboration (k6 + SSE probe + run_load.sh), release checklist at
docs/release-multi-instance.md; no runtime behavior change in Dev repo itself.
Refs: backend PR #164; task card feature/u7-load-fault-release.
2026-10-12 02:31:35 +00:00

46 lines
2.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 双进程 HTTP 级验收(协作存储 U7)
两个**真实 backend serve 进程**共享同一 PostgreSQL 的黑盒验收,覆盖方案 §7
最小验收矩阵的进程级行(库级语义已在 backend `internal/runmgr/multi_instance_test.go`
覆盖;本目录验证 HTTP/SSE/进程生命周期层面的同一套不变量):
| 子场景 | 断言(矩阵行) |
|---|---|
| `cross_read` | A 建的项目/会话在 B 立即可见(共享权威) |
| `cross_event_sse` | A 写入的事件在 B 的 SSE 可见(R5 跨实例传播) |
| `same_session_conflict_then_cross_hitl` | 同会话并发提交明确 409 不误写;B 跨实例 resolve A 的 HITL 经命令总线到达执行者(R3/R4) |
| `cross_cancel` | B 跨实例取消 A 的 run:命令持久、唯一消费、run 收口 cancelled(R4) |
| `owner_crash_takeover` | 执行实例被 SIGKILL:租约期内 B 明确 409 不误抢;死实例不拖累其他会话;原实例重启对账收口遗留 run 后恢复推进(R4/R7/R8) |
| `restart_invariants` | 实例重启后消息俱在、SSE 从 0 重放 seq 连续无洞、写入可推进(R5/R7) |
## 运行
```bash
# 1) 隔离 PostgreSQL(示例:svc.sh 独立实例;已有实例则直接给 DSN)
scripts/svc.sh db create mi7 --port 18890
scripts/svc.sh mi7 start
DSN="$(scripts/svc.sh db dsn mi7 --reveal)"
# 2) 构建 + 运行(Make 目标自动构建二进制并注入)
make test-multi-instance AGENT_PG_TEST_DSN="$DSN?sslmode=disable"
# 3) 回收
scripts/svc.sh mi7 stop && scripts/svc.sh db rm mi7
```
门控:`AGENT_PG_TEST_DSN`(真实 PostgreSQL,CI test-pg job 必跑不跳过)与
`AGENT_BIN`(由 Make 目标构建注入)。测试自建临时数据库、自起进程并在
退出时回收;不打任何生产服务。
## 已实测发现并修复的缺陷(历史)
本验收在 U7 落地时抓出三个跨实例真实缺陷(均已有回归测试):
1. **HITL resolve 落卡短路命令路径**:非执行实例先把卡标记 resolved,
命令 fallback 的 `!card.Resolved` 判定被跳过,执行者永远等不到答案
(backend `TestCrossInstanceResolveDoesNotSettleCard`)。
2. **跨实例 cancel 命令 conversation_id 为空**:消费侧按执行权 JOIN
匹配,空串永远无法送达。
3. **CancelRun 假成功**:非执行实例无句柄时 `CancelRun` 返回 nil,HTTP
层 200 受理但 run 永远停不下(命令路径被短路)。