From 04dc1710ffcdd10a8070a06c79ce10962a41f7b3 Mon Sep 17 00:00:00 2001 From: Leon <41661196+leonfox28@users.noreply.github.com> Date: Fri, 21 Aug 2026 20:19:00 +0800 Subject: [PATCH] docs: record v0.1.1 release evidence --- .trellis/tasks/08-21-ghcr-release-install/design.md | 6 +++--- .../tasks/08-21-ghcr-release-install/implement.md | 8 ++++---- .trellis/tasks/08-21-ghcr-release-install/prd.md | 9 +++++---- .../research/v0.1.0-release-failure.md | 4 ++-- .trellis/tasks/08-21-ghcr-release-install/task.json | 12 +++++++----- README.md | 13 +++++++------ .../0021-container-production-deployment.md | 5 +++-- docs/handoff.zh-CN.md | 8 ++++++-- docs/installation.md | 12 +++++++++--- docs/plans/active/mvp.md | 10 +++------- 10 files changed, 49 insertions(+), 38 deletions(-) diff --git a/.trellis/tasks/08-21-ghcr-release-install/design.md b/.trellis/tasks/08-21-ghcr-release-install/design.md index 8802751..617c3ef 100644 --- a/.trellis/tasks/08-21-ghcr-release-install/design.md +++ b/.trellis/tasks/08-21-ghcr-release-install/design.md @@ -47,9 +47,9 @@ Pre-release,但两个 registry manifest HEAD 调用错误使用 `curl --reques 矩阵项均在任何镜像构建或推送前以 exit 18 失败,digest manifest 未生成。该 tag 和 Pre-release 保持不完整,不重跑或补写;修复合并后用新 tag `v0.1.1` 完成首发。 -GitHub 首次创建的个人 GHCR package 默认 private,workflow 无法替代所有者的不可逆 -visibility 决策;`v0.1.1` 三个镜像完成后由所有者逐个改为 public,再从未登录 registry -的环境执行 inspect/pull 验证。 +`v0.1.1` 实际发布后,三个 package 已可从未登录 registry 的空凭据环境 inspect/pull, +因此没有执行额外的 visibility 修改。未来新 package 仍须逐一验证;若保持 private, +workflow 无法替代所有者将其改为 public 的不可逆 visibility 决策。 基础设施瞬时错误可对同一 tag/commit 重跑。此次失败需要改代码,所以不移动或复用 `v0.1.0`,而是在 main 修复后使用 `v0.1.1`。首发保持 Pre-release,clean-VM 验收由 diff --git a/.trellis/tasks/08-21-ghcr-release-install/implement.md b/.trellis/tasks/08-21-ghcr-release-install/implement.md index 9227b23..3b58346 100644 --- a/.trellis/tasks/08-21-ghcr-release-install/implement.md +++ b/.trellis/tasks/08-21-ghcr-release-install/implement.md @@ -33,10 +33,10 @@ - [x] 对合并提交 `d7aaa34` 创建/推送不可移动的 `v0.1.0`;部署/来源资产发布成功,三个镜像 job 在构建/推送前失败,Release 保持不完整 Pre-release。 - [x] 从 Actions 日志确认 `curl --request HEAD` 导致 exit 18;不重跑、移动或补写 `v0.1.0`,添加 `--head` 回归合同。 -- [ ] 修复分支经 PR/CI 合并后,对新合并提交创建并推送 `v0.1.1`,等待 containers workflow 完成。 -- [ ] 验证 `v0.1.1` Pre-release 部署包/checksum、strongSwan/Mihomo 来源资产、三个 GHCR tag 和 digest manifest。 -- [ ] 由仓库所有者把三个首次 package 改为 public;在无 GHCR 登录环境 inspect/pull 并核对 OCI metadata/digest。 -- [ ] 解包到临时目录,运行 checksum、`docker compose config --quiet` 和 `docker compose pull`;不得执行 up、宿主准备或 HIL。 +- [x] 修复 PR #6 的 6 个执行检查成功后,以 merge commit `81d3f3a` 合并并创建/推送 `v0.1.1`;containers run `32480362514` 全部成功。 +- [x] 验证 `v0.1.1` Pre-release 的八个部署/来源资产、checksum、三个 GHCR tag 和 digest manifest。 +- [x] 三个 package 已可匿名访问;在空 Docker 凭据环境 inspect 并核对单一 `linux/amd64`、OCI metadata 和三个 digest。 +- [x] 从临时目录匿名下载/校验/解包后运行 `docker compose config --quiet` 和 `docker compose pull`;未执行 up、宿主准备或 HIL。 ## Rollback points diff --git a/.trellis/tasks/08-21-ghcr-release-install/prd.md b/.trellis/tasks/08-21-ghcr-release-install/prd.md index 6df37f5..5e1812e 100644 --- a/.trellis/tasks/08-21-ghcr-release-install/prd.md +++ b/.trellis/tasks/08-21-ghcr-release-install/prd.md @@ -43,7 +43,8 @@ PR #5 在全部检查成功后以 `d7aaa34` 合并,并创建了不可移动的 平台、完整 tag reference 和实际 `sha256` digest;本任务的完整清单应为 `simplus-images-v0.1.1.json`。 - 任一来源、资产或镜像步骤失败时不得把 GitHub Release 标记为稳定可用。 -- GitHub 首次生成的三个 private package 由仓库所有者显式改为 public;完成前不得宣告匿名安装可用。 +- 首次 package 必须逐一验证匿名访问;若保持 private,由仓库所有者显式改为 public, + 完成前不得宣告匿名安装可用。 ### R4 — Documentation and lifecycle @@ -69,9 +70,9 @@ PR #5 在全部检查成功后以 `d7aaa34` 合并,并创建了不可移动的 - [x] PR Actions 成功构建三个 target 但不推送;只有严格版本 tag 进入来源资产 → Pre-release → GHCR → image manifest 流程。 - [x] `make check-container-files`、`go test ./internal/containercontract`、`make check-docs`、`make lint`、`make test`、`make security` 和 `git diff --check` 通过。 - [x] 功能分支通过 PR #5 合并;`v0.1.0` workflow 成功生成 Pre-release/部署/源码资产,并在任何镜像推送前失败关闭,旧 tag 保持不可移动且不完整。 -- [ ] 修复分支通过 PR/CI 合并后,新合并提交的 `v0.1.1` workflow 成功生成完整 Pre-release、部署资产、源码资产、三个 GHCR 镜像和 digest manifest。 -- [ ] 三个 package 经所有者改为 public 后,无 GHCR 登录也能 inspect/pull `v0.1.1`,且 digest/OCI 元数据与 `simplus-images-v0.1.1.json` 一致。 -- [ ] 发布后仅执行解包、Compose config 和 pull 验证;不启动服务或接触真实硬件。 +- [x] 修复分支通过 PR #6/CI 合并后,新合并提交的 `v0.1.1` workflow 成功生成完整 Pre-release、部署资产、源码资产、三个 GHCR 镜像和 digest manifest。 +- [x] 三个 package 已可匿名访问;无 GHCR 登录也能 inspect/pull `v0.1.1`,且 digest/OCI 元数据与 `simplus-images-v0.1.1.json` 一致。 +- [x] 发布后仅执行解包、Compose config 和 pull 验证;未启动服务或接触真实硬件。 ## Out of Scope diff --git a/.trellis/tasks/08-21-ghcr-release-install/research/v0.1.0-release-failure.md b/.trellis/tasks/08-21-ghcr-release-install/research/v0.1.0-release-failure.md index 60cf0db..ec02cdc 100644 --- a/.trellis/tasks/08-21-ghcr-release-install/research/v0.1.0-release-failure.md +++ b/.trellis/tasks/08-21-ghcr-release-install/research/v0.1.0-release-failure.md @@ -29,7 +29,7 @@ read`; no build, digest staging, tag promotion, or manifest publication ran. | P0 | Runtime correctness | Replace both probes with `curl --head` while retaining explicit 200/404 classification | Done | | P0 | Test coverage | Require exactly two `--head` probes and reject `--request HEAD` in the container workflow contract | Done | | P1 | Documentation | Record the curl HEAD/body-transfer rule in the versioned release spec and error matrix | Done | -| P1 | Rollout discipline | Keep incomplete `v0.1.0` immutable and publish the code fix only from a new `v0.1.1` tag | In progress | +| P1 | Rollout discipline | Keep incomplete `v0.1.0` immutable and publish the code fix only from a new `v0.1.1` tag | Done | ## 4. Systematic Expansion @@ -45,4 +45,4 @@ read`; no build, digest staging, tag promotion, or manifest publication ran. - [x] Updated `.trellis/spec/core/infra/build-and-generated-files.md`. - [x] Added a focused regression assertion to `internal/containercontract`. - [x] Recorded the immutable failed-release evidence in the active task. -- [ ] Complete the replacement `v0.1.1` Pre-release and anonymous pull checks. +- [x] Completed the replacement `v0.1.1` Pre-release and anonymous pull checks. diff --git a/.trellis/tasks/08-21-ghcr-release-install/task.json b/.trellis/tasks/08-21-ghcr-release-install/task.json index c42f07e..cdfd5e9 100644 --- a/.trellis/tasks/08-21-ghcr-release-install/task.json +++ b/.trellis/tasks/08-21-ghcr-release-install/task.json @@ -12,20 +12,22 @@ "assignee": "Leon", "createdAt": "2026-08-21", "completedAt": null, - "branch": "fix/ghcr-head-probe", + "branch": "docs/v0-1-1-release-evidence", "base_branch": "main", "worktree_path": null, - "commit": null, - "pr_url": null, + "commit": "81d3f3ac3a7868ea39e90bb3533b599fd2939ccd", + "pr_url": "https://github.com/leonfox28/simplus/pull/6", "subtasks": [], "children": [], "parent": null, "relatedFiles": [], - "notes": "", + "notes": "v0.1.0 remains an incomplete immutable Pre-release. v0.1.1 completed release run 32480362514 and anonymous bundle/image verification.", "meta": { "release_tag": "v0.1.1", "incomplete_release_tag": "v0.1.0", "initial_merge_commit": "d7aaa34aeb6936f3683f37bacbef71ca9a013f57", - "initial_pr_url": "https://github.com/leonfox28/simplus/pull/5" + "initial_pr_url": "https://github.com/leonfox28/simplus/pull/5", + "release_run": 32480362514, + "release_url": "https://github.com/leonfox28/simplus/releases/tag/v0.1.1" } } diff --git a/README.md b/README.md index 401a25b..a235589 100644 --- a/README.md +++ b/README.md @@ -47,9 +47,9 @@ remap 及其他发行版尚未验证。Web 与 controller 只应开放给受信 到公网。 生产安装不需要克隆源码或在宿主构建镜像。不可移动的 `v0.1.0` 已保留为不完整 -Pre-release:部署/来源资产发布成功,但镜像发布在推送前失败,因此不得安装。首个完整 -部署候选改为 `v0.1.1`;只有发布资产和三个公开 GHCR package 全部完整后,才从该 -Release 下载版本化部署包及校验文件: +Pre-release:部署/来源资产发布成功,但镜像发布在推送前失败,因此不得安装。替代版本 +`v0.1.1` 已完整发布为部署候选,并从未登录 GHCR 的环境通过三镜像 inspect/pull;它仍 +没有 clean-VM 生命周期证据,不能提升为稳定版。版本化部署包及校验文件位于: ```bash version=v0.1.1 @@ -83,9 +83,10 @@ docker compose logs bootstrap 会删除容器和临时运行对象,但保留这些目录;容器部署不会自动读取或迁移旧原生安装的 `/var/lib/simplus` 数据。 -三个 GHCR package 首次发布后需由仓库所有者显式改为 public,之后匿名 `pull` 才是有效 -安装证据。发布包、对应源码和 `simplus-images-v0.1.1.json` digest 清单均保留在同一 -Pre-release;任一资产缺失时不要回退到生产机本地构建。 +`v0.1.1` 三个 GHCR package 已在空 Docker 凭据环境通过匿名 `pull`。未来首次发布的新 +package 仍须逐一确认匿名访问;若保持 private,仓库所有者需显式改为 public,且该变更 +不可恢复为 private。发布包、对应源码和 `simplus-images-v0.1.1.json` digest 清单均保留 +在同一 Pre-release;任一资产缺失时不要回退到生产机本地构建。 完整的宿主要求、权限模型、生命周期、更新方式和故障处理见 [Docker Compose 生产部署](docs/installation.md)。 diff --git a/docs/decisions/0021-container-production-deployment.md b/docs/decisions/0021-container-production-deployment.md index c2948c0..a85163b 100644 --- a/docs/decisions/0021-container-production-deployment.md +++ b/docs/decisions/0021-container-production-deployment.md @@ -15,8 +15,9 @@ 生产安装接口进一步收敛为 GitHub Pre-release 中的版本化 `linux/amd64` 部署包和 GHCR 三镜像:管理员不再为生产部署克隆源码或本地构建。不可移动的 `v0.1.0` 在来源资产发布 后、任何镜像推送前失败并保持不完整 Pre-release;修复使用新 tag `v0.1.1`,不补写旧 -版本。三个首次 GHCR package 必须由仓库所有者显式改为 public,并取得匿名 pull 证据 -后,才能宣称新候选可匿名安装。该发布变化不替代仍待完成的 clean-VM 生命周期验收。 +版本。`v0.1.1` 三个 GHCR package、digest manifest 和八个 Release 资产已完整发布, +并取得空凭据环境的匿名 inspect/pull 证据;未来 package 若保持 private,仍须由所有者 +显式改为 public。该发布变化不替代仍待完成的 clean-VM 生命周期验收。 ## 背景 diff --git a/docs/handoff.zh-CN.md b/docs/handoff.zh-CN.md index b4bc1c5..acd9f7e 100644 --- a/docs/handoff.zh-CN.md +++ b/docs/handoff.zh-CN.md @@ -1,8 +1,8 @@ # Simplus 当前开发交接 -> 更新:2026-08-14 +> 更新:2026-08-21 > -> 状态:V1 管理面、Vite/React Query 前端、持久模组/线路层、Host VoWiFi/SMS over IMS 与 QDC507 原生蜂窝短信纵切已完成;生产 Docker Compose 已在 Debian 13 开发 VM 完成三镜像构建和隔离 smoke,clean-VM 生命周期验收尚待完成。 +> 状态:V1 管理面、Vite/React Query 前端、持久模组/线路层、Host VoWiFi/SMS over IMS 与 QDC507 原生蜂窝短信纵切已完成;`v0.1.1` Pre-release 已提供匿名可拉取的三镜像与版本化部署包,clean-VM 生命周期验收尚待完成。 本文只记录可以公开的代码状态、验证等级和下一步;现场与个人环境材料遵循 [`privacy-and-publication.md`](privacy-and-publication.md) 留在仓库外。产品范围以 [`product.md`](product.md) 为准,进程与安全不变量以 [`architecture.md`](architecture.md) 为准,任务状态以 [`plans/active/mvp.md`](plans/active/mvp.md) 为准。 @@ -22,6 +22,10 @@ ### 容器部署候选 +- `v0.1.1` Pre-release 包含写死同版本 tag 的确定性 Compose 部署包、checksum、对应 + strongSwan/Mihomo 来源资产和三镜像 digest manifest;在空 registry 凭据环境已完成 + checksum、解包、Compose config、三镜像 OCI metadata/digest 核对和 pull,未执行 + 宿主准备、`compose up` 或 HIL; - 首版只面向 Debian 13/amd64、Compose 2.24+ 和 rootful、无 userns-remap 的 Docker; 日常 Go/Node/pnpm 开发与 CI 不进入开发容器; - 宿主只持有 Docker、内核及开机加载的 `option`。Agent 容器精确映射 USB sysfs、 diff --git a/docs/installation.md b/docs/installation.md index 1c13a15..4dc2378 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -13,6 +13,11 @@ GHCR 镜像,不要求源码 checkout、Git、Go、Node、pnpm、Make 或本地 manifest 探测随后在任何镜像构建/推送前失败,且没有生成 digest manifest。不要安装或 补齐该版本;修复后的首个完整候选使用新 tag `v0.1.1`。 +`v0.1.1` 的八个 Release 资产、三张 `linux/amd64` 镜像和 digest manifest 已完整发布; +未登录 GHCR 的空凭据环境已完成镜像 inspect、OCI metadata/digest 核对及解包后的 +Compose config/pull。该证据只验证发布与匿名分发,没有执行 `compose up`、宿主准备或 +HIL,也不替代 clean-VM 生命周期验收。 + 三个 production target 和隔离无硬件 Compose 已在 Debian 13/amd64 开发 VM 完成 smoke;该证据验证镜像、权限、netd preflight、bootstrap、Web 登录和数据保留重建, 不等于 clean-VM 或真实模组验收,也没有执行 RF、VoWiFi、短信或电话动作。 @@ -59,9 +64,10 @@ cp .env.example .env `SIMPLUS_DEVICE_GID`,生产安装不接受镜像版本变量。 tag workflow 会先把部署包、strongSwan 包/对应源码和 Mihomo 对应源码发布到同一 -GitHub Pre-release,随后才推送三张镜像。三个 package 首次生成时默认 private,必须由 -仓库所有者逐个改为 public 并完成匿名 pull 验证;该 visibility 变更不能再恢复为 -private,在这一步完成前,部署候选不能宣称可匿名安装。Release 中的 +GitHub Pre-release,随后才推送三张镜像。`v0.1.1` 三个 package 已可匿名访问;未来首次 +生成的新 package 仍须逐一验证,若保持 private,必须由仓库所有者改为 public,且该 +visibility 变更不能再恢复为 private。在匿名 pull 完成前,候选不能宣称可匿名安装。 +Release 中的 `simplus-images-v0.1.1.json` 记录实际 digest,供发布后审计,Compose 仍引用不可移动 的版本 tag。 diff --git a/docs/plans/active/mvp.md b/docs/plans/active/mvp.md index c72d769..b23b436 100644 --- a/docs/plans/active/mvp.md +++ b/docs/plans/active/mvp.md @@ -199,10 +199,9 @@ 按部署包/对应源码 → 三张 GHCR 镜像 → digest manifest 的顺序保持 Pre-release; - [x] 保留不可移动但不完整的 `v0.1.0` Pre-release:部署/来源资产已发布,GHCR manifest 探测在任何镜像构建或推送前失败,没有生成 digest manifest;不重跑、不补写该 tag; -- [ ] 用修复后的新 tag `v0.1.1` 发布首个完整 Pre-release,由仓库所有者把三张首次 - GHCR package 显式改为 public,并在未登录 registry 的环境核对匿名 pull、OCI - metadata、digest manifest 和解包后的 Compose config/pull;该项不得执行 `up`、 - 宿主准备或 HIL; +- [x] 用修复后的新 tag `v0.1.1` 发布首个完整 Pre-release;三张 GHCR package 已可 + 匿名访问,并在未登录 registry 的环境核对 pull、OCI metadata、digest manifest 和 + 解包后的 Compose config/pull;该项未执行 `up`、宿主准备或 HIL; - [x] 保持日常开发、Simulator、Go/Web 测试和 CI 使用本机/runner 工具,不提供 dev image;保留受限 `simplus-agent-dev` 供本机 HIL; - [x] 在当前 Debian 13/amd64 开发 VM 构建三个 production target,并以隔离空 @@ -262,9 +261,6 @@ 8. 将 ePDG FQDN、IKE responder identity 和远端选择从当前已验证运营商接入 profile 中解耦,并分别完成其他运营商 HIL;动态 IMS Home Domain 本身不能作为多运营商兼容证据。 9. 完成 Milestone 26 的 clean-VM Compose 生命周期验收;ARM64、rootless/userns、 Podman、Docker Desktop 与 SELinux 发行版仍需独立设计和证据。 -10. 保留失败关闭的 `v0.1.0`,在修复合并提交上以 `v0.1.1` 完成 Pre-release/GHCR - 首发和所有者 public visibility 门禁;后续仍不得移动或补写旧 tag。 - 每项真实副作用都需要独立设计、最小实现、明确授权和与风险相称的 HIL;Web/API 不得暴露任意 AT/QMI、设备路径、网络命令或配置路径。 ## 非目标