From 7e8b8740c4ce0860dea5c93159d1e4ee77fb5573 Mon Sep 17 00:00:00 2001 From: AskaEth Date: Sun, 8 Nov 2026 14:23:49 +0800 Subject: [PATCH] =?UTF-8?q?fix(m184):=20r1=20=E2=80=94=E2=80=94=20?= =?UTF-8?q?=E8=AF=81=E6=8D=AE=E8=B4=A6=E4=B8=8D=E5=86=8D=E6=8A=8A=E3=80=8C?= =?UTF-8?q?=E6=9C=BA=E5=88=B6=E4=BC=9A=E8=B7=91=E3=80=8D=E5=86=99=E6=88=90?= =?UTF-8?q?=E3=80=8C=E5=B7=B2=E6=9C=89=E8=BF=90=E8=A1=8C=E6=97=B6=E8=AF=81?= =?UTF-8?q?=E6=8D=AE=E3=80=8D=EF=BC=8C=E5=B9=B6=E6=94=B6=205=20=E6=9D=A1?= =?UTF-8?q?=E6=96=87=E6=A1=A3=E6=BC=82=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit P2-1(唯一阻塞):`packaging/docs/linux-evidence.md` 里 `ull --version` 冒烟那条被写成 「两个槽位都有一份 CLI 运行时证据」——`make_artifacts.py::smoke_version` 只保证**机制** (`slot == host_slot()` 时真跑),而仓库里找不到任何一次 linux-arm64 成功出包的记录 (`git grep -rn all_slots DevDocs/` 零命中),所以 arm64 侧运行时证据为零。§1 表格与 §5 改成「机制上会真跑 / 截至本分支没有那一次记录」,§6 解锁条件同步补一句。 P3 漂移: 1. `release-publish.yml` 注释 8 条 → 11 条自测回归(与脚本/其它三处一致)。 2. `packaging/docs/profiles-and-measurements.md` 同上 8 → 11。 3. `check_publish_slots.py` 注释示例 `PUBLISH_SLOTS: "windows-x64"` → 两档现值。 4. `release-build.yml` 注释「x64(当前唯一在发的槽位)」→ 两档已发布,并点名 linux-x64 的证据在自己的 xvfb 冒烟步。 5. `linux-evidence.md` 「20 倍以上余量」→ **8~37 倍**,并点明最紧的是亮度 σ (24.06/3.0≈8×,与 check_screenshot.py 自述的 1/5~1/8 一致)。 自查(复审点名的五处之外):`只发 windows-x64` / `Windows only` / `暂未发布` / `once published` / `8 条` 全仓再扫一遍,release-notes / README ×2 / artifacts-and-version 剩下的都是准确表述(如「the only Windows asset」指 windows_x64.exe)。 验证:check_publish_slots --self-test EXIT=0、check_test_source_off EXIT=0,另 check_publish_slots(source) / check_release_semantics(+--self-mutation) / make_manifest --self-test 均 EXIT=0。本轮无 cargo 构建,未创建 CARGO_TARGET_DIR。 --- .github/workflows/release-build.yml | 3 ++- .github/workflows/release-publish.yml | 2 +- packaging/check_publish_slots.py | 2 +- packaging/docs/linux-evidence.md | 13 ++++++++----- packaging/docs/profiles-and-measurements.md | 2 +- 5 files changed, 13 insertions(+), 9 deletions(-) diff --git a/.github/workflows/release-build.yml b/.github/workflows/release-build.yml index afbe7ae..1520852 100644 --- a/.github/workflows/release-build.yml +++ b/.github/workflows/release-build.yml @@ -206,7 +206,8 @@ jobs: fi fi cargo build --release --locked --bin unlucky-launcher-iced --bin ull - # 产物清单只给 arm64 打:x64(当前唯一在发的槽位)这一步零变化,不额外给它加失败面。 + # 产物清单只给 windows-arm64 打:两档已发布的 x64(windows-x64 / linux-x64)这一步零变化,不额外给它们 + # 加失败面(linux-x64 的证据在它自己那条 xvfb 运行时冒烟步里)。 if [ "$SLOT" = "windows-arm64" ]; then ls -l "$BUILD_DIR"/unlucky-launcher-iced* "$BUILD_DIR"/ull* || true fi diff --git a/.github/workflows/release-publish.yml b/.github/workflows/release-publish.yml index f882add..8888114 100644 --- a/.github/workflows/release-publish.yml +++ b/.github/workflows/release-publish.yml @@ -66,7 +66,7 @@ jobs: # (M164)发布名单守卫:**声明了就必须有产物**(名单内某个槽位缺 GUI 或 CLI 就红,少一档不发版), # 反方向的「产物在、名单没声明」则打 `::warning::` 明说未发布 —— M142 之后那个方向是**静默**的(裁剪步只 # echo 一行 `drop:`,没有注解、也没有非零退出),一个真编出来的 arm64 会被就地 `rm` 掉而没人知道。 - # 判据全在 `packaging/check_publish_slots.py`:同一份代码本地可跑,`--self-test` 注入 8 条回归断言每条都红。 + # 判据全在 `packaging/check_publish_slots.py`:同一份代码本地可跑,`--self-test` 注入 11 条回归断言该红的红。 # 它跑在**裁剪前**的全量集上(裁剪只删名单外的文件),所以是原来「裁剪后再查」那次检查的严格超集。 - name: 发布名单守卫(声明 ⇒ 必须有产物;有产物没声明 ⇒ 显式未发布) shell: bash diff --git a/packaging/check_publish_slots.py b/packaging/check_publish_slots.py index 62019bc..de52100 100644 --- a/packaging/check_publish_slots.py +++ b/packaging/check_publish_slots.py @@ -54,7 +54,7 @@ PUBLISH_YML = Path(".github/workflows/release-publish.yml") #: 槽位表条目(`plan` job 里那份):`dict(slot="windows-x64", ..., mode="ci")`,一条可能跨两行。 SLOT_RE = re.compile(r'dict\(\s*slot="(?P[^"]+)"(?P.*?)\)', re.S) MODE_RE = re.compile(r'mode="(?P[^"]+)"') -#: 发布白名单那一行(yaml 里是 `PUBLISH_SLOTS: "windows-x64"`)。 +#: 发布白名单那一行(yaml 里是 `PUBLISH_SLOTS: "windows-x64 linux-x64"`)。 PUBLISH_RE = re.compile(r'^\s*PUBLISH_SLOTS:\s*"(?P[^"]*)"', re.M) #: 每个槽位必须**两样都有**:GUI 与 CLI 各自一个资产(只按「槽位名出现过」判会被其中一个掩盖)。 diff --git a/packaging/docs/linux-evidence.md b/packaging/docs/linux-evidence.md index b61f7c9..78a2f23 100644 --- a/packaging/docs/linux-evidence.md +++ b/packaging/docs/linux-evidence.md @@ -12,7 +12,7 @@ | 本地复跑脚本(开发机) | `packaging/linux-smoke-docker.sh` | 在 `rust:1-bookworm`(**Debian 12 / glibc 2.36**)里逐步复刻上面那个 job;M131 真跑过一次(2026-11-05):`exit=0`、截图 1180×760、`[ok] 截图非空白` | 基础镜像是 Debian 而不是 runner 的 Ubuntu;仍是 debug 档;同样没有 arm64 | | 编译期门禁复跑 | `packaging/linux-check-docker.sh` | 在 Linux 上跑 `clippy --workspace --all-targets -- -D warnings` 与 `test --workspace --all-targets`(M144 那两条只能在 Linux 复现的红) | 与运行时无关,只证明「编得过、测得过」 | | 阈值依据 | `packaging/ci-runtime-smoke.md` | 真实帧与纯色帧的实测数值(唯一色 342~2352、σ 19.45~27.46、强边缘 0.0076~0.0433)都在这里,阈值取在两者之间 | 标定样本来自 x64 软渲染 | -| `ull --version` 冒烟 | `packaging/make_artifacts.py::smoke_version` | 槽位与宿主一致时**真跑** CLI 并断言版本串(`linux-x64` 与 `linux-arm64` 在各自的 CI runner 上都满足这条,所以两个 arm64/x64 槽位都有一份 CLI 运行时证据) | 只覆盖 CLI(零图形栈),GUI 一帧都没有;`linux-arm64` 的 GUI 从未启动过 | +| `ull --version` 冒烟 | `packaging/make_artifacts.py::smoke_version` | 槽位与宿主一致时**机制上会真跑** CLI 并断言版本串(`slot != host_slot()` 才跳过)。`linux-x64` 侧本轮**真跑过**(见 §2 `smoke: ull --version -> 0.2.3 (ok)`) | **机制存在 ≠ 有过一次运行**:截至本分支,仓库里找不到任何一次 `linux-arm64` 成功出包的记录(`git grep -rn "all_slots" DevDocs/` 零命中),所以 **arm64 侧运行时证据为零** —— 连这条 CLI 冒烟都没在 arm64 上真跑过。GUI 一帧更没有 | **glibc 地板怎么定的**:槽位表把 Linux 两档钉在 `ubuntu-22.04` / `ubuntu-22.04-arm`,**不跟 `latest` 走** (`release.yml` 的槽位表注释:跟 latest 走地板就会随镜像漂移)。Ubuntu 22.04 ⇒ glibc **2.35**,这就是 @@ -135,8 +135,9 @@ launcher exit=0 ``` 软渲染是确定性的:WSLg 与 Xvfb 两张图的统计量**逐个相同**(1858 / 24.06 / 0.0372),也正是这一点让 -`check_screenshot.py` 的阈值(唯一色 ≥64、亮度 σ ≥3.0、强边缘 ≥0.001)有 20 倍以上余量 —— CI 里这条门禁不会因为 -"某次抗锯齿抖了"而假红。 +`check_screenshot.py` 的阈值(唯一色 ≥64、亮度 σ ≥3.0、强边缘 ≥0.001)有 **8~37 倍**余量 +(唯一色 1858/64≈29×、强边缘 0.0372/0.001≈37×、**亮度 σ 只有 24.06/3.0≈8×** —— 与 `check_screenshot.py` 自己 +写的「阈值取在实测下限的 1/5~1/8」一致,三者里最紧的是亮度 σ):CI 里这条门禁不会因为"某次抗锯齿抖了"而假红。 本机 Docker 复跑(`packaging/linux-smoke-docker.sh`,Debian 12 容器 + **debug** 档,缓存卷是热的): @@ -188,7 +189,9 @@ exit=0 上一次都没跑过。 - **Wayland 原生**:WSLg 同时提供 X11 与 Wayland,本轮只按 `DISPLAY` 走(见 §2 的实测环境),没单独验 `WAYLAND_DISPLAY` 那条路。 -- **linux-arm64 运行时完全未验**:GUI 进程在 ARM64 上一次都没启动过;它只有「编得过 + `ull --version` 跑得过」。 +- **linux-arm64 运行时完全未验**:GUI 进程在 ARM64 上一次都没启动过。连 `make_artifacts.py` 那条 `ull --version` + 冒烟也**只是机制上会真跑**(`mode: ci` + 宿主==产物),**截至本分支没有一次 arm64 成功出包的记录**,所以 arm64 + 侧一份运行时证据都没有 —— 别把「这条冒烟以后会跑」读成「它跑过了」。 - **`ubuntu-22.04-arm` runner 的可用性未在本机核实**:本机没有 `gh` CLI,也没有到 Actions API 的可用凭据, 所以「这档 runner 在这个仓库上真能起来」只能由下一次 CI 证明。风险是有界的:它**不在** `PUBLISH_SLOTS` 里, 起不来/红了不会挡住 `windows-x64` + `linux-x64` 的发布(只会让那一条 job 红,外加一条 `::warning::`)。 @@ -202,4 +205,4 @@ exit=0 4. 然后把 `linux-arm64` 加进 `release-publish.yml` 的 `PUBLISH_SLOTS`(一行),并同步 §9 与 `release-notes.md`。 构建绿了**不算**解锁,`ull --version` 跑得过也**不算** —— 那两条只证明 CLI 与编译器,用户拿到的那个 `.tar.gz` 里 -装的是 GUI。 +装的是 GUI。(何况截至本分支 arm64 上连那条 CLI 冒烟都还没真跑过一次。) diff --git a/packaging/docs/profiles-and-measurements.md b/packaging/docs/profiles-and-measurements.md index ce4dc7b..a4b13e6 100644 --- a/packaging/docs/profiles-and-measurements.md +++ b/packaging/docs/profiles-and-measurements.md @@ -124,5 +124,5 @@ libxcb 条目数 = 0,只把 fontconfig 那 7 个 `.so` 放进 `LD_LIBRARY_PATH `um/arm64/kernel32.lib`,猜缺就 `exit 1`,而 `cargo build` 永远 skipped);M164 把它降级为只取证(打印 vswhere 组件、 目录 `.lib` 计数、`link.exe` 候选),红绿交回编译器。闭环标准不是「两槽位都进 SHA256SUMS」(M142 起只有 x64 进), 而是 arm64 的 `cargo build` 真跑绿 + 把键加回 `PUBLISH_SLOTS`(守卫会自动跟着扩,并在产物有了却没声明时报 `::warning::`)。 -本机能补的只有脚本层证据:`python packaging/check_publish_slots.py --self-test`(8 条注入回归)与 +本机能补的只有脚本层证据:`python packaging/check_publish_slots.py --self-test`(11 条注入回归)与 `cargo check --target aarch64-pc-windows-msvc`(依赖图对该 target 的类型检查,**不链接、不产出 PE**)。