# xlings 2026.7.28.3 — 发布说明

**日期**: 2026-07-28
**类型**: 发布记录 (release notes)
**关联**: `2026-07-28-multi-subos-repair-design.md`、`2026-07-28-release-2026.7.28.2-notes.md`

---

## 一句话

**`self doctor --fix` 修好了一个 alias 包之后，不再把它报告成 `✗ repair failed`。**

---

## 这一条是怎么找出来的

2026.7.28.2 的验收是拿 fixture 包跑的。发布后改用**真实索引**复跑同一套场景，
`patchelf` 立刻把它撞了出来 —— 这个 recipe 注册两个目标：

```lua
xvm.add("patchelf", { bindir = ... })
xvm.add("elfpatch", { bindir = ..., alias = "patchelf" })
```

删掉 payload 再 `--fix`（2026.7.28.1 和 .2 行为一致）：

```
✗ repair failed  elfpatch@0.18.0
healed          1
$ echo $?   → 1
$ ls data/xpkgs/xim-x-patchelf/0.18.0/bin/patchelf   → 在
```

payload 修好了，doctor 说它失败了，退出码 1。

**原因**：修复后的复检只问了 `resolve_executable(<target>)` —— 那是 check 3 的
**非 alias** 分支。alias 模式的条目按定义就没有自己的可执行文件，于是每一个都会被
判成没修好。

从 2026.7.28.2 起这条假失败还多了一个后果：迁移标记的门槛是 `repairFailed == 0`，
所以家目录里只要有**一个** alias 包，标记就永远落不下，那句
`run xlings self doctor --fix` 的提示永远不会消失。

## 修复

"修好了"现在的定义是**检测不会再报它**，判据逐分支对齐 check 3：

| 分支 | 之前 |
|---|---|
| type-only 存根 | ❌ 没有 |
| alias 模式 → payload 目录回来了就是修好了 | ❌ 没有（本次的 bug）|
| `resolve_executable` 能解析 | ✅ 唯一有的一条 |
| binding root | ✅ |
| payload 里一个可执行文件都没有（release anchor）| ❌ 没有 —— 同一类假失败：纯头文件包的目录恢复了就是修好了，不是坏的 |

五条里原来只有一条。

## 测试

e2e `self_doctor_test.sh` 新增 S11：删掉 alias 条目的 payload 目录 → `--fix` →
断言 payload 回来了、输出里没有 `repair failed`、退出码 0。

**顺带修掉一个恒真的 fixture。** alias fixture 写出的 alias 目标没有可执行位，于是
payload"一个可执行文件都没有"，doctor 走了 release-anchor 豁免 —— **把被测分支删掉，
S11 照样通过**。给 fixture 补上可执行位之后，变异才能被抓住（两个方向都验过：有 chmod
时删分支 S11 失败，没 chmod 时不失败）。S9/S10 之前也是靠同一个错误理由通过的。

## 已知问题（本次不修，另开）

`xlings remove <pkg>` 在别的 subos 还引用该版本时走 detach 路径，但 detach 只处理
被点名的目标，不处理 release 的其它成员：`remove patchelf` 之后，当前 subos 的
`elfpatch` 仍然 active。2026.7.28.1 上行为相同（已验证，不是本次引入）。
