Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .trellis/tasks/08-21-ghcr-release-install/design.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 验收由
Expand Down
8 changes: 4 additions & 4 deletions .trellis/tasks/08-21-ghcr-release-install/implement.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
9 changes: 5 additions & 4 deletions .trellis/tasks/08-21-ghcr-release-install/prd.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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.
12 changes: 7 additions & 5 deletions .trellis/tasks/08-21-ghcr-release-install/task.json
Original file line number Diff line number Diff line change
Expand Up @@ -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"
}
}
13 changes: 7 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)。
Expand Down
5 changes: 3 additions & 2 deletions docs/decisions/0021-container-production-deployment.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 生命周期验收。

## 背景

Expand Down
8 changes: 6 additions & 2 deletions docs/handoff.zh-CN.md
Original file line number Diff line number Diff line change
@@ -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) 为准。

Expand All @@ -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、
Expand Down
12 changes: 9 additions & 3 deletions docs/installation.md
Original file line number Diff line number Diff line change
Expand Up @@ -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、短信或电话动作。
Expand Down Expand Up @@ -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。

Expand Down
10 changes: 3 additions & 7 deletions docs/plans/active/mvp.md
Original file line number Diff line number Diff line change
Expand Up @@ -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,并以隔离空
Expand Down Expand Up @@ -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、设备路径、网络命令或配置路径。

## 非目标
Expand Down
Loading