Skip to content

Commit 9cfa9ee

Browse files
speak-agentclaude
andcommitted
the wave's self-review: five defects, and the one place this landing differs most from its design
Three of the five were found by reading the branch's own diff and were green on every host: the interface list read from the first package that stated one rather than the resolved provider, a package name matched as a substring of `name@version`, and a symbol matched as a substring of a longer one. The other two were found by CI. The largest gap between the design and what landed is P7's L3, the link-time set difference. Without it a consumer's `requires-interfaces` is still only trusted: a package may declare fewer interfaces than it calls, pass resolution, and link on an implementation that provides them --- failing only on one that does not, on a user's target rather than in its author's build. Co-authored-by: Claude Code <noreply@anthropic.com>
1 parent f0573e0 commit 9cfa9ee

2 files changed

Lines changed: 95 additions & 1 deletion

File tree

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
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。** 独立工作量。

‎.agents/docs/README.md‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ superseded_by: 2026-09-07-....md # when status is superseded
1818
---
1919
```
2020

21-
300 records.
21+
301 records.
2222

2323
## By subject
2424

@@ -60,6 +60,7 @@ Records that declare one. Everything else is listed by date below.
6060

6161
### review
6262

63+
- [本轮生态级自审](2026-09-20-wave-self-review.md) — active
6364
- [#674 设计方案评审:`-include unistd.h` 在 Windows + `presents = "posix"` 上的可行性](2026-09-20-issue-674-design-review.md) — active
6465

6566
### targets
@@ -91,6 +92,7 @@ Records that declare one. Everything else is listed by date below.
9192

9293
### 2026-09
9394

95+
- [本轮生态级自审](2026-09-20-wave-self-review.md) — active
9496
- [openkal 生态:能力的时刻模型,以及 C 环境方案空间的划分](2026-09-20-openkal-c-environment-ecosystem-design.md) — active
9597
- [#674 设计方案评审:`-include unistd.h` 在 Windows + `presents = "posix"` 上的可行性](2026-09-20-issue-674-design-review.md) — active
9698
- [C 环境生态方案:执行计划](2026-09-20-ecosystem-execution-plan.md) — active

0 commit comments

Comments
 (0)