|
| 1 | +--- |
| 2 | +subject: review |
| 3 | +status: active |
| 4 | +--- |
| 5 | + |
| 6 | +# 本轮生态级自审 |
| 7 | + |
| 8 | +- 日期:2026-09-20 |
| 9 | +- 对象:`2026-09-20-openkal-c-environment-ecosystem-design.md` 所规划、本轮落地的六个仓库改动 |
| 10 | +- 依据:`2026-09-20-ecosystem-execution-plan.md` 的执行记录 |
| 11 | + |
| 12 | +--- |
| 13 | + |
| 14 | +## 1. 落地与设计的对照 |
| 15 | + |
| 16 | +| 设计项 | 落地 | 与设计的差异 | |
| 17 | +| --- | --- | --- | |
| 18 | +| P0.1 探针带目标 | mcpp#678 | 多了一个装配函数:不变量放在调用点靠记性,放在装配处靠结构 | |
| 19 | +| P0.2 `builtins` 注释 | mcpp#678 | 无 | |
| 20 | +| P1 冻结 `presents` | mcpp#678 | 无 | |
| 21 | +| P2 `refused` | mcpp-index#444(已合入) | 判据从"显式标注"改为引擎的拒绝码,D4 的建议被数据推翻:显式标注没有第一个使用者 | |
| 22 | +| P3 撤 `__CYGWIN__` | 未做 | 判据已具备,代价需一次重测 | |
| 23 | +| P4 合成节点 | 未做 | 独立工作量 | |
| 24 | +| P5 接口列举 | mcpp#678 + openkal#42 + openkal-linux#29 + openkal-windows#26 | 设计说"引擎新增两处",实际只新增解析期一处:链接期那一处(L3)未做 | |
| 25 | +| P6 `openkal-win-ucrt` | 未做 | 需 c++-abi 配套 | |
| 26 | +| P7 校验阶梯 | L1 + L2 + `[c-abi.absent]` 落地;L3 未做 | 见下 | |
| 27 | + |
| 28 | +**与设计最大的偏差是 P7 的 L3(链接期集合差)。** 设计把它列为"`requires-interfaces` 唯一 |
| 29 | +的校验者",本轮没有做。后果要写清楚:**消费者一侧的声明目前仍然只被信任。** 一个包可以 |
| 30 | +声明少于它实际调用的接口,解析期通过,在提供该接口的实现上链接也通过——只有在不提供的 |
| 31 | +实现上才会炸,而那时错误出现在用户的目标上。这一条应当是下一轮的第一项。 |
| 32 | + |
| 33 | +--- |
| 34 | + |
| 35 | +## 2. 多维核查 |
| 36 | + |
| 37 | +| 维度 | 核查 | 结论 | |
| 38 | +| --- | --- | --- | |
| 39 | +| **架构** | 新增机制是否落在 §6.2 的三时刻表内 | 是。`requires/provides-interfaces` 在解析期,`[c-abi.absent]` 的 `link` 形状在链接期,`enosys` 在运行期。没有一项落在预处理期 | |
| 40 | +| **兼容性** | 未声明任何新键的包命令行是否逐字节不变 | 是。e2e 743 的 C 腿与 verify 的 D 段各验一次 | |
| 41 | +| | 两个新键对旧引擎的行为 | 不同,且已写入 docs/22 与其 zh 镜像:`[kernel-abi]` 被忽略,`[c-abi.absent]` 被拒。前者不需要抬 floor,后者需要 | |
| 42 | +| **跨平台** | Windows / macOS / freestanding | 探针修复的直接受益者是 freestanding(此前在任何宿主上都空转)。Windows 上 clang 20.1.7 的三次前端崩溃是本轮实测发现,最终形态写下了理由 | |
| 43 | +| **一致性** | 同一个事实是否只有一处 | 提升了一处:openkal-musl 的 CI 手写 withheld 清单被 `[c-abi.absent]` 取代。降低了零处 | |
| 44 | +| **无感升级** | 旧图是否照常构建 | 是。"一个什么都没陈述的提供者,不是一个什么都不提供的提供者"由 e2e 743 的 C 腿钉住 | |
| 45 | +| **测试覆盖** | 新增判据是否可证伪 | 逐条检查见 §3 | |
| 46 | +| **优雅简洁** | 新增概念数 | 一个(接口列举)。`[c-abi.absent]` 是既有 `[c-abi]` 的延伸,`assemble_argv` 是既有装配的提取 | |
| 47 | +| **用户体验** | 失败时读者能否知道改哪一边 | 接口拒绝同时点名缺的接口、要它的包、没提供它的实现;`[c-abi.absent]` 的诊断带上那一行的 `note` | |
| 48 | + |
| 49 | +--- |
| 50 | + |
| 51 | +## 3. 每条判据是否可证伪 |
| 52 | + |
| 53 | +| 判据 | 能失败吗 | 如何确认的 | |
| 54 | +| --- | --- | --- | |
| 55 | +| `assemble_argv` 拒绝无目标的 freestanding argv | 是 | 单测直接构造该形状 | |
| 56 | +| 探针量的是目标不是宿主 | 是 | 本机实测真实命令:`__riscv`、wchar 4、无 `__linux__` | |
| 57 | +| 接口不满足即拒绝 | 是 | e2e 743 的 B 腿,并断言**未编译任何东西** | |
| 58 | +| 提供者什么都没说时不拒绝 | 是 | e2e 743 的 C 腿 | |
| 59 | +| `[c-abi.absent]` 与产物一致 | 是 | openkal-musl CI 翻转一行并要求脚本拒绝 | |
| 60 | +| `provides-interfaces` 与产物一致 | 是 | openkal-linux / -windows CI 重新生成并 diff | |
| 61 | +| 接口清单不是"打印 SURFACE.txt 的每一组" | 是 | openkal CI 的半组腿:`openkal.fs` 只导出两个名字,必须不被列出 | |
| 62 | +| 沙箱 CHANGE 段确实区分两个版本 | 是 | 对 2026.9.17.1 跑出 fails=3,对 2026.9.20.1 跑出 fails=0 | |
| 63 | + |
| 64 | +**一条判据曾经不可证伪并已更正**:`CenvProbe` 的两个端到端探针测试在 gcc 宿主上 skip。 |
| 65 | +跳过的判据等于没有判据,所以不变量被提升为 `assemble_argv` 这个纯函数,五个新测试不需要 |
| 66 | +交叉工具链。 |
| 67 | + |
| 68 | +--- |
| 69 | + |
| 70 | +## 4. 本轮自审中发现并修掉的缺陷 |
| 71 | + |
| 72 | +| # | 缺陷 | 形状 | |
| 73 | +| --- | --- | --- | |
| 74 | +| 1 | 接口清单取"图里第一个声明的包"而不是**被解析出的提供者** | 一个图可能有多个候选,读错的是另一个实现的清单——错误答案而不是缺失答案 | |
| 75 | +| 2 | 提供者用包名**子串**匹配 `impl` | `openkal` 命中 `openkal-linux@0.15.0` | |
| 76 | +| 3 | `[c-abi.absent]` 的诊断用符号**子串**匹配 | `undefined symbol: open` 是 `opendir` 的前缀;一个自信的错误解释比链接器自己的消息更坏 | |
| 77 | +| 4 | openkal CI 的接口步量的是 `impl-fd`,而它**一个接口都不整组提供** | 判据的对象选错了 | |
| 78 | +| 5 | openkal CI 的接口步读到上一步遗留的目标文件 | 上一步删了源文件没删产物 | |
| 79 | + |
| 80 | +第 1、2、3 条是读自己的 diff 时发现的;第 4、5 条由 CI 发现。**前三条在本机全绿,只有 |
| 81 | +读代码能发现**——它们都属于"谓词对、对象错"。 |
| 82 | + |
| 83 | +--- |
| 84 | + |
| 85 | +## 5. 未关闭,按优先级 |
| 86 | + |
| 87 | +1. **P7 的 L3(链接期集合差)。** `requires-interfaces` 今天仍只被信任。这是本轮与设计 |
| 88 | + 最大的偏差。 |
| 89 | +2. **P3 撤 `__CYGWIN__`。** 判据已由 mimalloc 与 sqlite3 给出,代价需一次重测。 |
| 90 | +3. **`__cxa_thread_atexit`。** 本轮测量新发现的 C++ 运行时缺口。 |
| 91 | +4. **openkal-macos 的 `provides-interfaces`。** 无法在 Linux 宿主派生,需 macOS runner。 |
| 92 | +5. **P4 / P6。** 独立工作量。 |
0 commit comments