merge: candidate test-single-binary-2026-09-27 closeout into dev

This commit is contained in:
weichen
2026-09-27 21:12:12 +00:00
5 changed files with 160 additions and 21 deletions
+1
View File
@@ -18,6 +18,7 @@
| owner | task | branch | worktree | mutex | status |
|---|---|---|---|---|---|
| pi | test-single-binary-2026-09-27 | feature/test-single-binary-2026-09-27 | .worktrees/test-single-binary-2026-09-27 | env:dev+env:test+git:dev+git:test | done |
| pi | upload-doc-access-2026-09-27 | fix/upload-doc-access-2026-09-27 | .worktrees/upload-doc-access-2026-09-27 | freedoc+web-upload | done |
| pi | frontend-demo-fallback-2026-09-27-r3c | fix/frontend-demo-fallback-2026-09-27-r3 | (已清理) | web-chat-fallback | done |
| pi | frontend-demo-fallback-2026-09-27-r2 | fix/frontend-demo-fallback-2026-09-27 | (已清理) | web-chat-fallback | done |
@@ -1,7 +1,7 @@
---
title: "dev→test 晋升(rc-v1.1.0-beta.4)与 test 单二进制化"
task_id: test-single-binary-2026-09-27
status: in_progress
status: done
created: 2026-09-27
updated: 2026-09-27
owner: pi
@@ -21,9 +21,9 @@ write_scope:
allowed_environments: ["dev", "test"]
capabilities: [docs:publish, env:dev, env:test, git:dev, git:test]
mutex: env:dev+env:test+git:dev+git:test
review_state: pending
integration_state: pending
deployment: pending
review_state: accepted
integration_state: merged_local_dev
deployment: test_ok_single_binary_rc_v1.1.0_beta.4
cleanup: pending
remote_sync: not_requested
---
@@ -62,19 +62,20 @@ remote_sync: not_requested
## 步骤与验收
1. [x] 建 worktree / 注册 / CURRENT 认领
2. [x] 脚本落地(migrate-test-db.sh / launch-single.sh)
3. [ ] worktree 验证(bash -n、scripts unittest、门禁套件)
4. [ ] 集成入 dev(候选 + validate + integrate)
5. [ ] dev tip 全面门禁 + nightly 真实 PI + receipt + candidate images
6. [ ] test 晋升(候选 M + rc-v1.1.0-beta.4)
7. [ ] test 单二进制转换 + 验收
8. [ ] 报告 / CURRENT / 收口
2. [x] 脚本落地(migrate-test-db.sh / launch-single.sh;含两处修复:DEV_PG_CONTAINER 变量名、SYSTEM_DB_* 强制覆盖根 .env CONTEXT_DB_*)
3. [x] worktree 验证(bash -n、scripts unittest 234、门禁套件)
4. [x] 集成入 dev(候选 94c215d3)
5. [x] dev tip 全面门禁 + nightly 真实 PI + receipt + candidate images(含 .dockerignore 缺陷修复后 D2=5e409c1e 重跑)
6. [x] test 晋升(候选 2fe1e055 + rc-v1.1.0-beta.4,promote-rc-beta4 任务执行)
7. [x] test 单二进制转换 + 验收(见测试报告 §5.4–5.6)
8. [x] 报告 / CURRENT / 收口
## 验证与证据
见 [测试报告](../../test-reports/2026-09-27-test-single-binary-test-report.md)(执行后填写)。
见 [测试报告](../../test-reports/2026-09-27-test-single-binary-test-report.md)。过程事件(gate-pg 口令、runner key 清空机制、两次误连 dev 库审计、docker 上下文缺陷)如实记录于报告 §5.8。
## 收口与交接
- 分别记录 review_state / integration_state / deployment / cleanup / remote_sync。
- 回滚(任一步失败且不可前滚时):容器路径 `docker compose -f docker-compose.test.yml -p agent-test up -d`(volumes 未删);DB 回滚用 S0 快照 restore 到容器 PG。
- 分别记录:review_state=accepted;integration_state=merged_local_dev;deployment=test_ok(单二进制,schema 76);cleanup=pending(待独立维护者复查后移除 worktree);remote_sync=not_requested(未 push)。
- 回滚(任一步失败且不可前滚时):容器路径 `docker compose -f docker-compose.test.yml -p agent-test up -d`(镜像已按 beta.4 digests pin;volumes 未删);DB 回滚用 S0 快照 restore 到容器 PG。
- 待跟进(新任务):① sysadmin 初始 apply 空 key 清空 runner 配置(internal/app/app.go + internal/sysadmin/apply.go;建议 payload 空 key 省略)+ run-nightly 固化 MINIMAX_*/TAVILY 导出注释;② launch.sh sidecar 子 shell 相对 DATA_DIR(本次已在 launch-single.sh 规避,dev 侧 launch.sh 未改);③ systemd/install-test/preflight 打包(设计 §5.1,未在本轮范围)。
@@ -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`。
+8 -6
View File
@@ -74,12 +74,14 @@ export HTTP_PORT
export SEED_DEMO_USERS="${SEED_DEMO_USERS:-false}"
export LOCALPG_MODE="${LOCALPG_MODE:-managed}"
# SYSTEM_DB_*(compose 约定)→ CONTEXT_DB_*(config.Load 宿主读取约定)
export CONTEXT_DB_HOST="${CONTEXT_DB_HOST:-127.0.0.1}"
export CONTEXT_DB_PORT="${CONTEXT_DB_PORT:-${SYSTEM_DB_PUBLISH_PORT:-5434}}"
export CONTEXT_DB_USER="${CONTEXT_DB_USER:-${SYSTEM_DB_USER:-app}}"
export CONTEXT_DB_PASSWORD="${CONTEXT_DB_PASSWORD:-${SYSTEM_DB_PASSWORD:?SYSTEM_DB_PASSWORD required}}"
export CONTEXT_DB_NAME="${CONTEXT_DB_NAME:-${SYSTEM_DB_NAME:-agent_system_$ENV_NAME}}"
# SYSTEM_DB_*(compose 约定)→ CONTEXT_DB_*(config.Load 宿主读取约定)。
# 注意:SYSTEM_DB_* 必须压过根 .env 的 dev 值 CONTEXT_DB_*(分层加载先读根 .env),
# 因此这里不用 :- 回退而直接覆盖;attach 模式可用 APP_DB_DSN 显式指定。
export CONTEXT_DB_HOST="127.0.0.1"
export CONTEXT_DB_PORT="${SYSTEM_DB_PUBLISH_PORT:-5434}"
export CONTEXT_DB_USER="${SYSTEM_DB_USER:-app}"
export CONTEXT_DB_PASSWORD="${SYSTEM_DB_PASSWORD:?SYSTEM_DB_PASSWORD required}"
export CONTEXT_DB_NAME="${SYSTEM_DB_NAME:-agent_system_$ENV_NAME}"
PI_PORT="${PI_AGENT_RUNNER_PORT:-18866}"
export PI_AGENT_RUNNER_URL="${PI_AGENT_RUNNER_URL:-http://127.0.0.1:$PI_PORT}"
+1 -1
View File
@@ -20,7 +20,7 @@ if [[ -f "$ROOT/configs/.env.test" ]]; then
set +a
fi
export CONTAINER="${DEV_PG_CONTAINER:-shuimu-system-pg-test}"
export DEV_PG_CONTAINER="${DEV_PG_CONTAINER:-shuimu-system-pg-test}"
export DATA_DIR="${MIGRATE_DATA_DIR:-$ROOT/data/test}" # 绝对路径,避免 PGDATA 相对解析漂移
export PORT="${CONTEXT_DB_PORT:-${SYSTEM_DB_PUBLISH_PORT:-5434}}"
export CONTEXT_DB_PORT="$PORT"