# NixMsg 0.1.0 交付说明 | 项 | 内容 | |---|---| | 版本 | 0.1.0 | | 日期 | 2026-09-30 | | 功能合入 tip | `2ebcb6e1b85a8997c48de2711b013c83fa0440fc`(W4 + Q4 已进 main) | | 发布标签 | `v0.1.0`、`sdk/go/v0.1.0`(指向含本说明的提交;以 `git rev-parse v0.1.0` 为准) | | 对应 | [PRD.md](./PRD.md)、[DEVELOPMENT.md](./DEVELOPMENT.md)、[TASKS.md](./TASKS.md) | ## 1. 已完成能力 - 服务端:端登录与会话令牌、在线目录、单聊/群发、离线保留、延迟/定时/撤回/回执、自助注册、管理 API、Prometheus `/metrics`、SQLite 存储、单端口多协议(HTTP / WebSocket MQTT / TCP MQTT) - 管理后台网页:接真实 `/api/admin`,Playwright 主路径 e2e - SDK:Go、JS/TS、Python、Java/Android(源码与接入清单测试在仓库内;包未发布,见第 5 节) - 部署文档:README 构建与启动、[OPS.md](./OPS.md) 运维、Docker Compose / Dockerfile 定稿(镜像未推送) ## 2. F01–F23 验收结果 来源:[test/accept/ACCEPTANCE.md](../test/accept/ACCEPTANCE.md)(生成时间 2026-09-30T02:16:46Z)。对照表汇总:通过 23,失败 0,未测 0。 长时/环境限制项在对照表备注中保留「未测子项」说明,不单独占「未测」行: - F03:未跑 1000 端全表 1s、真拔网线心跳超时(关连接模拟断线) - F08:Linux netem 20% 丢包未测(本机 Windows) - 压测:未跑 1000 连接保持 10 分钟 ### 通过 | 编号 | 一句话 | |---|---| | F01 | 批量开通整批校验、停用、删除群主转让、删除后同编号重开不串数据 | | F02 | 新设备登录后旧设备自动退出、换 IP 用令牌重连、两种密码锁定、重置密码后被踢、服务器故障不误报密码错误 | | F03 | 断开后状态及时变离线,全表可列出 | | F04 | 只通知订阅了的端 | | F05 | 崩溃不丢已提交消息,消息号去重和冲突,密码门生效,配额生效 | | F06 | 群成员收到同一份,入群前不补,发送者不收到自己的 | | F07 | 256 KiB 通过,超出拒绝,接收上限生效 | | F08 | 弱网最终送达且应用层不重复,重启后续传 | | F09 | 保留时间从发送时刻起算,超时过期 | | F10 | 短断线送到,长断线丢弃,服务器重启后宽限内重连送到 | | F11 | 发送方离线后到点仍发送 | | F12 | 延迟窗口内撤回对方收不到 | | F13 | 未推送必撤成功;群部分确认得到部分撤回 | | F14 | 回执能补送给当时离线的发送方 | | F15 | 输一次记住、改密失效、回复免密、进群仍要密码、防多账号轮流猜 | | F16 | 群主权限、退出后不再收到、解散后同编号新群不收旧消息 | | F17 | 后台管端、管注册、管群、查记录,响应里没有正文;API 令牌可用且不能越权 | | F18 | 送达后正文消失;记录天数 0 时连记录消失;防重仍在 | | F19 | 四种 SDK 通过同一清单 | | F20 | 裸 MQTT 能登录、收、确认、发 | | F21 | 默认一个端口提供后台、WebSocket、TCP、注册;后台可分到单独端口 | | F22 | 初始化后单文件或 Docker 启动、备份恢复、升级迁移、证书自动重载、指标可抓取 | | F23 | 注册开关、安全码校验、换码不影响已注册、输错锁定 | ### 未测 无整行未测项。子项因长时间或环境限制未测的见上「长时/环境限制」与对照表备注。 ### 失败 无。 ## 3. 偏差(供负责人回来审阅) 完整正文见 [DEVIATIONS.md](./DEVIATIONS.md)。以下只列小节标题,不抄全文: - T0.1 2026-09-30 - L-WIRE 2026-09-30 - L-UPLINK 2026-09-30 - T0.2 2026-09-30 - T0.3 2026-09-30 - T0.5 2026-09-30 - T0.4 2026-09-30 - P1 2026-09-30 - P2 2026-09-30 - P3 2026-09-30 - P4 2026-09-30 - N1 / N2 2026-09-30 - N3 2026-09-30 - M1 2026-09-30 - M2 / M3 / M4 2026-09-30 - I1 2026-09-30 - I2 / I3 / I4 2026-09-30 - I5 2026-09-30 - A1 2026-09-30 - A2 2026-09-30 - A3 2026-09-30 - 后台网页 W(W1–W3 假数据与分页等条目) - W4 2026-09-30 - S1.1 传输层可注入假实现(Go / JS) - S1.2 Go autopaho `OnConnectionUp` 内握手改异步 - S1.3 重连退避与「稳定在线 60s」状态机自管 - S1.4 Go 模块许可证标注 - S1.5 JS 回调命名与文档概念名 - S1.6 任务 1–3 当时未做范围(已被 S1.7 取代) - S1.7 2026-09-30 任务 4–5 接入清单与打包文档 - S2-PY/JAVA 1–3 2026-09-30 - S2-PY/JAVA 4–5 2026-09-30 - Q1 / Q4 骨架 2026-09-30 - Q2 第一部分(已合并功能验收)2026-09-30 - Q2 补齐 + Q3(本机 Windows)2026-09-30 - Q4 定稿 + Q5 文档 2026-09-30 - Q accept-rest 补测 2026-09-30 ## 4. 本轮验证 合并 `feat/w4-e2e`、`feat/q-release-docs` 后,在 `main`(功能 tip `2ebcb6e`,含本说明的发布提交)执行: | 项 | 结果 | |---|---| | `task check` | 通过 | | `go test ./test/...` | 通过(accept / chaos / harness / load / report) | | `task w:e2e`(W4 合并后) | 通过(1 passed) | | `sdk/go`:`go test ./...` | 通过 | | `sdk/js`:`npm test` | 通过(23 passed) | | `sdk/python`:venv + `pytest` | 通过(22 passed);测完已删本地 `.venv` | | `sdk/java`:`mvn test` | 通过(scoop maven 3.9.16;测完已删 `target`) | 其后在 `feat/accept-rest` 补齐短时间验收并更新对照表: | 项 | 结果 | |---|---| | `go test ./test/accept/ -count=1`(含 F03/F04/F07/F10/F11/F14/F15/F18,F19 引用既有 SDK 清单) | 通过(约 24–27s) | | 写入 `ACCEPTANCE.md` / `q2_results.json` | 通过 23,失败 0,未测 0 | 跳过:1000 连接 10 分钟浸泡、Linux netem 20% 丢包、F03 的 1000 端全表 1s 与真拔网线心跳超时。 ## 5. 构建与启动 请直接按仓库文档操作,此处不重复步骤: - 构建、交叉编译、Docker 本地构建与启动示例:[README.md](../README.md) - 配置项、备份、升级、证书、时钟、指标:[docs/OPS.md](./OPS.md) - 配置样例:`deploy/config.example.yaml`、`deploy/config.docker.yaml` 常用入口:`task check` / `task build`,然后 `admin init` + `serve`(见 README)。 ## 6. 未发布 SDK 包与镜像的原因 按本次总控收尾要求:**不创建 Gitea package 令牌**,因此: - **未** `npm` / `pip` / Maven 发布到 Gitea 包仓库(`@nixevol/nixmsg`、`nixmsg`、`asia.asio.nixmsg:nixmsg-sdk`) - **未** `docker push`(含 `git.asio.asia/nixevol/nixmsg` 的版本标签与 `latest`) - **未** 执行多架构 `buildx` 正式推送 有 package 读写令牌且负责人授权后,再按 [TASKS.md](./TASKS.md) 第 3 节与 Z3、以及 README / OPS 中的发布命令补做。 ## 7. 标签 在本交付说明提交(含 `docs/RELEASE.md`)上打附注标签 `v0.1.0` 与 `sdk/go/v0.1.0` 并推送到 `origin`(若远端已存在同名标签则不覆盖,见当时操作记录)。