From 912342ae0aac92373b6fc15ea54cff6a8db9f5e3 Mon Sep 17 00:00:00 2001 From: weichen Date: Sun, 27 Sep 2026 21:10:16 +0000 Subject: [PATCH] docs(test): rc-v1.1.0-beta.4 promotion + test single-binary report; fix launcher env mapping MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - migrate-test-db.sh: export DEV_PG_CONTAINER (inner script reads it, not CONTAINER) - launch-single.sh: SYSTEM_DB_* must override root-.env CONTEXT_DB_* (set -a re-source clobbers both external exports and :- fallbacks; two misdirected launches audited, dev DB unchanged - report §5.8-3) - task record done; full test report (nightly five chains PASS @5e409c1e, migration S0-verified, deployment acceptance, rollback paths, follow-ups) --- .../2026-09-27-test-single-binary.md | 29 ++-- ...26-09-27-test-single-binary-test-report.md | 135 ++++++++++++++++++ scripts/launch-single.sh | 14 +- scripts/migrate-test-db.sh | 2 +- 4 files changed, 159 insertions(+), 21 deletions(-) create mode 100644 .doc/test-reports/2026-09-27-test-single-binary-test-report.md diff --git a/.doc/ops/short-term/2026-09-27-test-single-binary.md b/.doc/ops/short-term/2026-09-27-test-single-binary.md index 83568ed3..2317fbc3 100644 --- a/.doc/ops/short-term/2026-09-27-test-single-binary.md +++ b/.doc/ops/short-term/2026-09-27-test-single-binary.md @@ -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,未在本轮范围)。 diff --git a/.doc/test-reports/2026-09-27-test-single-binary-test-report.md b/.doc/test-reports/2026-09-27-test-single-binary-test-report.md new file mode 100644 index 00000000..f0963ce3 --- /dev/null +++ b/.doc/test-reports/2026-09-27-test-single-binary-test-report.md @@ -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`。 diff --git a/scripts/launch-single.sh b/scripts/launch-single.sh index a49aa318..3d320e56 100755 --- a/scripts/launch-single.sh +++ b/scripts/launch-single.sh @@ -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}" diff --git a/scripts/migrate-test-db.sh b/scripts/migrate-test-db.sh index 50b10626..7d56926d 100755 --- a/scripts/migrate-test-db.sh +++ b/scripts/migrate-test-db.sh @@ -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"