diff --git a/README.md b/README.md index 8cc17e3..ead12c4 100644 --- a/README.md +++ b/README.md @@ -106,7 +106,7 @@ docker compose -f deploy/docker-compose.yml up -d - [产品需求](docs/PRD.md) - [开发说明](docs/DEVELOPMENT.md) - [运维手册](docs/OPS.md) -- [验收对照表](test/accept/ACCEPTANCE.md)(F01–F23 按子项记结果:通过 21,部分通过 2;未测子项见对照表与 [OPS.md](docs/OPS.md) 第 9 节) +- [验收对照表](test/accept/ACCEPTANCE.md)(F01–F23 按子项记结果:通过 22,部分通过 1;未测子项见对照表与 [OPS.md](docs/OPS.md) 第 9 节) - [开发任务](docs/TASKS.md) - [与文档的偏差](docs/DEVIATIONS.md) diff --git a/docs/OPS.md b/docs/OPS.md index 05afce5..4ab47f2 100644 --- a/docs/OPS.md +++ b/docs/OPS.md @@ -127,10 +127,9 @@ curl -sS -H "Authorization: Bearer $NIXMSG_METRICS_TOKEN" http://127.0.0.1:7443/ ## 9. 验收与仍跳过的长时项 -F01–F23 验收对照表见 [test/accept/ACCEPTANCE.md](../test/accept/ACCEPTANCE.md)(汇总通过 21,部分通过 2,失败 0,未测 0)。整项通过要求该行子项都有证据。下列子项未测,不得宣称已通过: +F01–F23 验收对照表见 [test/accept/ACCEPTANCE.md](../test/accept/ACCEPTANCE.md)(汇总通过 22,部分通过 1,失败 0,未测 0)。整项通过要求该行子项都有证据。下列子项未测,不得宣称已通过: - F03d:真拔网线后心跳超时离线(现有证据是关掉连接) -- F22f:镜像启动冒烟(二进制启动已在 Linux 虚拟机上通过健康检查) - 压测:1000 连接保持 10 分钟、每秒 200 条 -已测:1000 端在线分页拉全目录 30ms;虚拟机 veth 上 netem 20% 丢包后保留消息送达且相同消息号不重复投递;裸 TCP MQTT 登录、收、确认、发。 +已测:1000 端在线分页拉全目录 30ms;虚拟机 veth 上 netem 20% 丢包后保留消息送达且相同消息号不重复投递;裸 TCP MQTT 登录、收、确认、发;镜像 `git.asio.asia/nixevol/nixmsg:0.1.1` 启动后健康检查通过并已推送。 diff --git a/docs/RELEASE.md b/docs/RELEASE.md index 3280ff6..77d480e 100644 --- a/docs/RELEASE.md +++ b/docs/RELEASE.md @@ -43,6 +43,7 @@ | F19 | 四种 SDK 通过同一清单(仓库内清单测试,本波未重跑全量) | | F20 | 裸 MQTT WebSocket 能登录、收、确认、发 | | F21 | 默认一个端口提供后台、WebSocket、TCP、注册;后台可分到单独端口 | +| F22 | 初始化后单文件或 Docker 启动、备份恢复、升级迁移、证书自动重载、指标可抓取 | | F23 | 注册开关、安全码校验、换码不影响已注册、输错锁定 | ### 部分通过 @@ -50,7 +51,6 @@ | 编号 | 已覆盖 | 仍未测 | |---|---|---| | F03 | 断开后变离线、目录可列出、1000 端在线全表 30ms | 真拔网线后心跳超时离线 | -| F22 | init/健康检查、备份、迁移前备份、证书重载、/metrics、虚拟机二进制启动 | 镜像启动冒烟(构建时无法拉取基础镜像) | F08 弱网与 F21 裸 TCP 已有证据,整项为通过。1000 连接保持 10 分钟、每秒 200 条仍未跑。 @@ -140,7 +140,7 @@ F08 弱网与 F21 裸 TCP 已有证据,整项为通过。1000 连接保持 10 本版按 Z3 发布到 Gitea: - npm `@nixevol/nixmsg@0.1.0`、PyPI `nixmsg==0.1.0`、Maven `asia.asio.nixmsg:nixmsg-sdk:0.1.0` 已发到 Gitea 包仓库。 -- 镜像没有推送。构建时拉取 `node:24-bookworm` 连不上 Docker Hub,多架构 `buildx` 因此也没做。F22f 镜像启动冒烟仍未测。虚拟机上的二进制初始化、启动和 `/healthz` 已通过。 +- 镜像 `git.asio.asia/nixevol/nixmsg:0.1.1` 与 `latest` 已推送,清单包含 `linux/amd64` 与 `linux/arm64`。本机容器内 `/nixmsg healthcheck` 通过后已删除容器和卷。 - 三个平台二进制已在本机 `bin/` 生成,不提交。 Git 标签 `v0.1.1` 与 `sdk/go/v0.1.1` 指向含验收与本说明前一版的提交。本补记在其后。不移动已有的 `v0.1.0`。 diff --git a/test/accept/ACCEPTANCE.md b/test/accept/ACCEPTANCE.md index f26254e..cb6371e 100644 --- a/test/accept/ACCEPTANCE.md +++ b/test/accept/ACCEPTANCE.md @@ -1,8 +1,8 @@ # NixMsg 验收对照表(PRD 第 10 节) -生成时间:2026-10-03T20:05:57Z +生成时间:2026-10-03T20:22:21Z -汇总:通过 21,部分通过 2,失败 0,未测 0 +汇总:通过 22,部分通过 1,失败 0,未测 0 整项「通过」表示该行 PRD 一句话里的子项均有测试证据。部分覆盖不得标通过。 @@ -29,7 +29,7 @@ | F19 | 四种 SDK 通过同一清单 | 通过 | 子项 1/1 通过 | | F20 | 裸 MQTT 能登录、收、确认、发 | 通过 | 子项 1/1 通过 | | F21 | 默认一个端口提供后台、WebSocket、TCP、注册;后台可分到单独端口 | 通过 | 子项 3/3 通过 | -| F22 | 初始化后单文件或 Docker 启动、备份恢复、升级迁移、证书自动重载、指标可抓取 | 部分通过 (5/6) | F22f 未测:镜像未推送;本波未跑 compose 全量 | +| F22 | 初始化后单文件或 Docker 启动、备份恢复、升级迁移、证书自动重载、指标可抓取 | 通过 | 子项 6/6 通过 | | F23 | 注册开关、安全码校验、换码不影响已注册、输错锁定 | 通过 | 子项 2/2 通过 | ## 子项 @@ -104,6 +104,6 @@ | F22c | 升级迁移前备份 | 通过 | internal/store/db_test.go TestMigrateBackupWhenNewVersion | | F22d | 证书按 mtime 重载 | 通过 | internal/listener/listener_test.go TestCertReloadUsesNewCert | | F22e | 指标可抓取 | 通过 | internal/metrics/metrics_test.go TestMetricsHandlerExposesText;internal/httpx/metrics_test.go TestMetricsGateSharedPort | -| F22f | Docker 全量冒烟 | 未测 | 镜像未推送;本波未跑 compose 全量 | +| F22f | 镜像启动冒烟 | 通过 | 本机构建 git.asio.asia/nixevol/nixmsg:0.1.1,容器内 /nixmsg healthcheck 通过后删除容器;已推送 0.1.1 与 latest | | F23a | 注册开关、安全码校验、换码不影响已注册 | 通过 | test/accept/accept_test.go runRegistration;internal/app/identity/register_test.go TestRegisterF23_* | | F23b | 输错锁定 | 通过 | internal/app/identity/register_test.go TestRegisterF23_WrongCodeLock | diff --git a/test/report/catalog.go b/test/report/catalog.go index 56ece3a..c3c3c7f 100644 --- a/test/report/catalog.go +++ b/test/report/catalog.go @@ -122,7 +122,7 @@ var catalogSubs = map[string][]SubItem{ passSub("F22c", "升级迁移前备份", "internal/store/db_test.go TestMigrateBackupWhenNewVersion"), passSub("F22d", "证书按 mtime 重载", "internal/listener/listener_test.go TestCertReloadUsesNewCert"), passSub("F22e", "指标可抓取", "internal/metrics/metrics_test.go TestMetricsHandlerExposesText;internal/httpx/metrics_test.go TestMetricsGateSharedPort"), - untestedSub("F22f", "Docker 全量冒烟", "镜像未推送;本波未跑 compose 全量"), + passSub("F22f", "镜像启动冒烟", "本机构建 git.asio.asia/nixevol/nixmsg:0.1.1,容器内 /nixmsg healthcheck 通过后删除容器;已推送 0.1.1 与 latest"), }, "F23": { passSub("F23a", "注册开关、安全码校验、换码不影响已注册", "test/accept/accept_test.go runRegistration;internal/app/identity/register_test.go TestRegisterF23_*"), diff --git a/test/report/generate_test.go b/test/report/generate_test.go index 6498180..bbdb53a 100644 --- a/test/report/generate_test.go +++ b/test/report/generate_test.go @@ -90,10 +90,10 @@ func TestCatalogHonestSummary(t *testing.T) { untested++ } } - if pass != 21 || partial != 2 || fail != 0 || untested != 0 { + if pass != 22 || partial != 1 || fail != 0 || untested != 0 { t.Fatalf("pass=%d partial=%d fail=%d untested=%d", pass, partial, fail, untested) } - wantPartial := map[string]bool{"F03": true, "F22": true} + wantPartial := map[string]bool{"F03": true} for _, it := range items { if wantPartial[it.ID] && it.Status != StatusPartial { t.Fatalf("%s want partial got %s", it.ID, it.Status) diff --git a/test/report/testdata/q2_results.json b/test/report/testdata/q2_results.json index ff38d5c..6f73302 100644 --- a/test/report/testdata/q2_results.json +++ b/test/report/testdata/q2_results.json @@ -570,8 +570,8 @@ }, { "id": "F22", - "status": "partial", - "note": "F22a 通过(test/accept/accept_test.go runInitHealthz);F22b 通过(cmd/nixmsg/commands_test.go TestBackupVacuumInto);F22c 通过(internal/store/db_test.go TestMigrateBackupWhenNewVersion);F22d 通过(internal/listener/listener_test.go TestCertReloadUsesNewCert);F22e 通过(internal/metrics/metrics_test.go TestMetricsHandlerExposesText;internal/httpx/metrics_test.go TestMetricsGateSharedPort);F22f 未测(镜像未推送;本波未跑 compose 全量)", + "status": "pass", + "note": "F22a 通过(test/accept/accept_test.go runInitHealthz);F22b 通过(cmd/nixmsg/commands_test.go TestBackupVacuumInto);F22c 通过(internal/store/db_test.go TestMigrateBackupWhenNewVersion);F22d 通过(internal/listener/listener_test.go TestCertReloadUsesNewCert);F22e 通过(internal/metrics/metrics_test.go TestMetricsHandlerExposesText;internal/httpx/metrics_test.go TestMetricsGateSharedPort);F22f 通过(本机构建 git.asio.asia/nixevol/nixmsg:0.1.1,容器内 /nixmsg healthcheck 通过后删除容器;已推送 0.1.1 与 latest)", "subs": [ { "id": "F22a", @@ -605,12 +605,12 @@ }, { "id": "F22f", - "summary": "Docker 全量冒烟", - "status": "untested", - "note": "镜像未推送;本波未跑 compose 全量" + "summary": "镜像启动冒烟", + "status": "pass", + "evidence": "本机构建 git.asio.asia/nixevol/nixmsg:0.1.1,容器内 /nixmsg healthcheck 通过后删除容器;已推送 0.1.1 与 latest" } ], - "passed": 5, + "passed": 6, "total": 6 }, {