@@ -0,0 +1,135 @@
# dev→test 晋升(rc-v1.1.0-beta.4)与 test 单二进制化 — 测试报告
## 一、测试背景 (Background)
用户指令:把 `dev` 合入 `test` ,并将 test 环境转换为单二进制服务(与 dev 同形态)。dev 领先 test 273 提交(含单二进制运行时、9 月 24 日以来的功能与修复);test 原为 4 容器形态(app/events/pi-agent/system-pg, schema 66)。
过程中发现并处置三个阻断问题(详见 §5.8):
1. gate-pg 隔离库口令与首次假设不符(全 SKIP,nightly 门禁正确拒绝出收据);
2. nightly 测试内嵌 app 启动时的 sysadmin 初始 apply 会用测试库的空 `secrets.minimax_api_key` 清空真实 runner 的 models.json key(已证实机制,nightly 环境补导出正确值规避;产品缺陷待修复任务);
3. `.dockerignore` 排除整个 `web/dist` ,与 `web/embed.go` ( `all:dist` )组合导致候选镜像构建自 P1 起即坏(fix: `!web/dist/.gitkeep` ,随本轮入 dev)。
## 二、测试目标 (Test Objectives)
- dev 全面门禁绿(arch-check/vet/short/npm/scripts unittest)后晋升 test: `--no-ff` P1=旧 test `0e4b111d` , tag `rc-v1.1.0-beta.4` ,镜像 digests 入收据
- test 转单二进制:容器 system-db 数据迁入本机 localpg `:5434` ( PGDATA=`data/test/pg` ,volume 保留可回滚);停 app/events/pi-agent/system-pg 容器;从 **rc tag 源码 ** 构建 `bin/agent-server-test` ; test PI sidecar `:18866` + agent-server( ENV=test, HTTP 8081, MiniMax-M2.7-highspeed, SEED_DEMO_USERS=false)
- 验收:health/ready、embed SPA、DB 数据保留与迁移、真实 Runner 执行、dev 环境不受扰
## 三、测试方案与环境 (Test Plan & Environment)
| 项 | 值 |
|----|-----|
| OS | Linux (brew postgresql@18 .6 + pgvector) |
| 晋升前 dev tip | `5e409c1e` ( = D2;含 docker 上下文修复 `e40a9989` + 脚本 `d91dafc1` ) |
| 晋升前 test tip | `0e4b111d` ( rc-v1.1.0-beta.3, schema 66) |
| promote M | `2fe1e055` ( P1=`0e4b111d` , P2=`5e409c1e` ),tag `rc-v1.1.0-beta.4` |
| 制品 | `bin/agent-server-test` , sha256 `5796ecb913fd8421d968ffbba29e411301e28dbdf8eeea65452976b4b72e474a` ( 32MB, `-X main.version=rc-v1.1.0-beta.4` , git archive @ tag 构建) |
| 门禁/nightly | gate-pg `127.0.0.1:5436/agent_gate` ; dev runner `:18865` ; test runner `:18866` |
| S0 快照 | `/tmp/agent-test-snap-s0-pre-beta4-20260927T172223Z` ( goose 66 / projects 9 / task_runs 9 / users 9, pg_dump -Fc) |
| 层级 | 静态门禁 + nightly 真实 PI 五链 + test 部署验收(迁移/配置层 + 业务链路) |
## 四、预期结果 (Expected Results)
- nightly 五例(U8 + FullNoneMixed + FullChain× 3)全部 PASS 且逐项核对执行;receipt `verdict=pass` + 三镜像 digests
- test 候选 first parent = 旧 test tip; tag/rc 校验一致
- 迁移后 localpg `:5434/agent_system_test` 数据 = S0; agent-server 启动自动 goose 66→76
- test health/ready: `env=test, schema_version=76, database_ready/kb_ready/events_ready=true, shared_kb_port=5432`
- SPA 200( embed);PI sidecar `:18866` 真实执行一次 pi run; dev 环境(8080/5433/18865)不受扰
## 五、实际测试结果与判定 (Actual Results & Evaluation)
### 5.1 静态门禁(dev tip 94c215d3 = 候选 1)
| 检查 | 结果 |
|---|---|
| `arch-check.sh --mode block` | PASS |
| `go vet ./...` | PASS |
| `go test -short ./...` | PASS |
| `web/ npm test` ( 34 例) | PASS |
| `web/ npm run build` ( demo seeds off + precompress) | PASS |
| scripts unittest( 234 例) | PASS |
证据:`/tmp/tsb-gate/01..06` ( validate 收据 run `a835747e` @ `94c215d3` )。
### 5.2 nightly 真实 PI( dev tip `5e409c1e`, nightly7)
- **输入**: `run-nightly-real-pi.sh` @ `5e409c1e` ; `TEST_DATABASE_URL=…:5436/agent_gate` ;绝对 `DATA_DIR=data/dev` ; `MINIMAX_API_KEY/MINIMAX_MODEL_ID/TAVILY_API_KEYS` 显式导出(见 §5.8-2);KB 预检 OK `127.0.0.1:5432/regulations`
- **实际**(首轮 FullNoneMixedChain 命中已知 MISSING_TARGET flake 43s,脚本内整组重试一次):
| 用例 | 首轮 | 重试 |
|------|------|------|
| TestMultiIntentU8_RealPI_ConfirmGenerate_PG | PASS 312.5s | PASS 309.2s |
| TestWorkflowGovernance_PiAgent_PG_FullNoneMixedChain | FAIL 43.1s (MISSING_TARGET) | **PASS 1153.2s ** |
| TestWorkflowGovernance_PiAgent_PG_FullChain | PASS 309.8s | PASS 364.6s |
| TestWorkflowGovernance_PiAgent_PG_ProductManager_FullChain | PASS 1199.9s | PASS 1058.9s |
| TestWorkflowGovernance_PiAgent_PG_TestManager_FullChain | PASS 1274.6s | (重试组末例由 expected-tests 逐项核对,见 expected-tests.json) |
- receipt: `.doc/test-reports/assets/promotion-receipts/5e409c1eb237814723f65102cb221a3e2de42e6e.json` `verdict=pass` , model `MiniMax-M2.7-highspeed` , digests app/events=`sha256:c1601783…` 、pi-agent=`sha256:c26508b6…` ; `promotion-receipt-check --require-digests` OK
- **判定**: PASS( expected-tests 逐项核对五例执行且最终轮全 PASS;flake 首轮-重试关系保留如上)
### 5.3 test 晋升
- 候选 `2fe1e055` ( commit-tree 构造,P1=`0e4b111d` );validate 收据 run `2b9bac34` ( receipt gate + 拓扑自检)
- `git:test` 租约内:`update-ref refs/heads/test 2fe1e055 0e4b111d` ; tag `rc-v1.1.0-beta.4` ; `candidate-images-apply.sh test` ( app/events/pi-agent 镜像按收据 digest 重打 tag, compose 回滚路径就绪)
- **判定**: PASS
### 5.4 test DB 迁移(容器 → localpg :5434)
- **输入**: `migrate-dev-db.sh` 以 test 参数运行(CONTAINER=shuimu-system-pg-test、DATA_DIR=data/test、5434/agent_system_test; wrapper 脚本 `migrate-test-db.sh` 的变量名缺陷当场以显式环境变量等价执行,修复随任务入 dev)
- **实际**: dump→restore 完成(3 条扩展 COMMENT 噪声,与 dev 迁移一致);restore 后 goose=66、projects/task_runs/users=9/9/9(与 S0 一致);system-db 容器停止(volume 保留)
- **判定**: PASS
### 5.5 单二进制构建与启动
- **输入**: `git archive rc-v1.1.0-beta.4` → 临时目录;web `npm ci` + `env -u VITE_ENABLE_DEMO_SEEDS npm run build` ( precompress 66 br/gz);`CGO_ENABLED=0 go build -ldflags "-s -w -X main.version=rc-v1.1.0-beta.4"` → `bin/agent-server-test`
- **实际**:启动后 health/ready `env=test, schema_version=76` (服务端 goose 66→76 自动迁移),`database_ready/kb_ready/events_ready/task_store_ready=true` , `shared_kb_port=5432` (共享 KB 容器,非 dev 库)
- **判定**: PASS
### 5.6 test 验收明细
| 项 | 实际 | 判定 |
|---|---|---|
| health/ready `:8081` | `ok / test / schema 76` ; ready 同 | PASS |
| SPA embed | `GET / → 200` ,标题「水木东方 · 医疗器械现代 AI 协同工作台」 | PASS |
| DB 数据保留 | localpg :5434 goose=76(数值 cast 核对),projects/users/task_runs=9/9/9 | PASS |
| app→DB 连接 | `ss` 确认 agent-server-test ↔ 127.0.0.1:5434 | PASS |
| PI sidecar `:18866` | health ok, model MiniMax-M2.7-highspeed, data_dir=data/test/workspaces | PASS |
| 真实 PI 执行 | `POST /v1/run` ( test sidecar)→ `ok:true` + sidecar 日志 `[runner] Starting pi run … tsb-verify-beta4` | PASS |
| 业务管道 | admin 登录 48B token; `POST /api/v1/chat` 两条 → intent+KB 应答 1322 字(模板路径,非寒暄句式不足以触发 dialogue runner;真实 runner 链由 nightly 五链 @ 同代码覆盖 + 上行直调覆盖) | PASS |
| 容器状态 | app/events/pi-agent/system-pg-test 全部 Exited( volume 保留);shuimu-kb-shared Up | PASS |
| dev 不受扰 | dev health `dev/76` ; dev 库 goose=76、projects=22、task_runs=9、窗口期 chat_messages=0(见 §5.8-3) | PASS |
### 5.7 回滚路径
- 容器:`docker compose -f docker-compose.test.yml -p agent-test up -d` (镜像已按 beta.4 digests pin; system-db volume 未动)
- 数据:S0 快照 restore; localpg 数据可 `pg_dump` 回容器
- 单二进制:`bin/agent-server-test` 为制品身份(sha256 见 §三)
### 5.8 过程事件与现场处置(如实记录)
1. **gate-pg 口令 ** :首轮 nightly 全 SKIP( SASL 401)→ 脚本正确写 infra_fail 拒绝晋升;改用容器实际口令(app/app)后正常。
2. **runner key 被清空(机制已证实) ** : `internal/app/app.go` 每个 app 启动即向 runner `POST /admin/reload` 推送 sysadmin 库解析值;nightly 测试 app 连 gate-pg( `secrets.minimax_api_key` 为空)→ runner `models.json` apiKey 被写空 → pi 以空 key 解析失败后回落内置 MiniMax 目录(anthropic-messages @ api.minimax.io)→ 401。验证:models.json 空 key 必现 401/路由漂移,恢复字面 key 后同请求即 PASS 且 key 不被运行剥离。规避:nightly 环境导出 `MINIMAX_API_KEY/MODEL_ID/ENDPOINT/API_TYPE/TAVILY_API_KEYS` 使推送值正确。**产品缺陷待修复**(建议:payload 空 key 时省略字段或 apply 不以空覆盖),另记 launch.sh sidecar 子 shell 相对 DATA_DIR 扩展路径问题。
3. **两次 test server 误连 dev 库(已审计无污染) ** : launch-single.sh 首版映射用 `:-` 回退,被分层加载的根 .env `CONTEXT_DB_*` ( dev 值)压过;脚本内 `set -a` 重载再次覆盖外部导出。两次均在启动后 ≤2 分钟发现并 kill。dev 库审计:goose=76 未变、projects=22/task_runs=9 稳定、窗口期新增 chat_messages=0(首次窗口 15min、二次 10min 各核一次)。修复(SYSTEM_DB_* 强制覆盖 + 注释说明)已随任务提交。
4. **docker 候选镜像构建缺陷 ** :见背景;修复 `e40a9989` 经真实 `docker build` ( git archive 上下文)验证后入 dev( D2),nightly7 在 D2 重跑并产出全 digests PASS 收据。nightly6 @94c215d3 的五链 PASS(收据 infra_fail 于镜像步)保留为过程证据。
5. **测试 workspaces/杂散目录 ** : sidecar 相对路径时期产生的 `deploy/pi-agent/data/` (396K,错误路由产物)已删除(未跟踪垃圾,非证据)。
## 六、自动化测试套件汇总 (Test Suite Execution)
| 套件 | 范围/SHA | 结果 |
|---|---|---|
| arch-check block / go vet / go test -short / npm test+build / scripts unittest(234) | 候选 94c215d3 | 全 PASS(§5.1) |
| nightly 真实 PI 五链(非 stub,真实 Runner+gate-pg+共享 KB) | dev 5e409c1e | PASS(§5.2) |
| docker build( app 镜像,git archive 上下文) | e40a9989 | PASS( sha256:0d5f6663…) |
| test 部署验收(health/ready/SPA/迁移/连接/runner/chat) | rc-v1.1.0-beta.4 制品 | PASS(§5.6) |
## 七、测试结论与后续 (Conclusion & Next Steps)
**结论 ** : `rc-v1.1.0-beta.4` ( `2fe1e055` )已晋升 test 并以单二进制形态落地:localpg `:5434` ( schema 76、S0 数据完整)、agent-server-test( tag 源码构建、sha256 入档)、PI sidecar `:18866` 、共享 KB 保持容器形态;容器 compose 路径与 S0 快照构成回滚面。dev 环境全程无扰动(两次误连均已审计)。
**后续 ** :
1. 产品缺陷修复任务:sysadmin 初始 apply 空 key 清空 runner 配置(§5.8-2);launch.sh sidecar 相对路径;建议随修复把 nightly 的 MINIMAX_* 显式导出固化进 run-nightly 脚本注释/模板
2. systemd 单元与 `install-test.sh` /preflight 打包(设计 §5.1)未在本轮范围,test 先以 nohup 形态长期运行(与 dev 一致)
3. embedding 401 运维债不变(非 blocker)
4. main 未晋升;远端未 push(未请求)
**证据路径 ** : receipt/evidence 见 `.doc/test-reports/assets/promotion-receipts/5e409c1e…{json,-images.json}` 与 `evidence-5e409c1e…/` 、`evidence-94c215d3…-171311Z/` (过程);门禁日志 `/tmp/tsb-gate/` ; nightly 日志 `/tmp/tsb-nightly/nightly{1..7}.log` ;转换日志 `/tmp/tsb-convert/` (本机,未入库);服务日志 `.tmp/launch/{server,pi-sidecar}-test.log` 。