Skip to content

Commit 5a27f14

Browse files
committed
docs(plan): 实现期的实测回填 —— 七条,其中三条推翻了正文
1 parent dff7787 commit 5a27f14

1 file changed

Lines changed: 87 additions & 1 deletion

File tree

.agents/docs/2026-09-07-package-identity-and-doc-alignment.md

Lines changed: 87 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# 一个包一个版本:xlings 地址的身份,以及 2026.9.6.5 之后的文档对齐
22

3-
> 状态:设计,未实现。本文的每一条「现状」都标注了它是****出来的还是****出来的。
3+
> 状态:**已实现**(mcpp 2026.9.6.6 / mcpp-plugins 0.2.4)。§10 是实现期的实测回填,
4+
> 其中三条推翻了本文正文。原文保留,不回改——被推翻的判断本身是这份记录的一部分。本文的每一条「现状」都标注了它是****出来的还是****出来的。
45
> 伴随文档:`2026-09-07-general-build-infrastructure-gaps-design.md`(§15 记录了本轮
56
> 五处缺口),本文处理它遗留的第六处,以及随之而来的文档与生态对齐。
67
@@ -256,3 +257,88 @@ pin 让这条依赖变成一个没人核过的假设。
256257
第四处形状不同:**我把「这里有真实的复杂度」读成了「这里应该保持现状」。** 12.9 与
257258
13.x 的驱动下界差异是真的,但它论证的是「工程要能覆盖」,而我拿它论证了「规则不该有
258259
默认」——同一个事实支持的是相反的结论。
260+
261+
## 10. 实现期的实测回填
262+
263+
写下来的四条里,有三条改了正文的结论。
264+
265+
### 10.1 `xpkg_dir` 根本回答不了范围 —— 方案漏了这条
266+
267+
§1.1 只测了「范围被**供给**」,没测「范围被**回答**」。实现时才发现
268+
`xpkg_payload_at` 把整个版本位当目录名比对:`>=8.5.0` 装上了载荷,然后回答
269+
`nullopt`
270+
271+
**这是让规则包无法声明下界的那道缝,而整份 §6 建立在它之上。** 少了这一处修复,
272+
`[feature-xlings]` 里写 `>=` 的规则会「声明、装上、然后找不到」。
273+
274+
形状是熟悉的一种:**判据只走了一半的路**。供给与查询是同一条链的两端,而 §1.1 的两个
275+
方向都落在供给那一端 —— 反向腿(`>=2099.1` 被拒)证明了范围被求解,却完全不涉及求解
276+
之后谁去读它。
277+
278+
修法:版本位是常量就先按目录名精确匹配(保留「钉了就是钉了」,也保留 `8.0.RC1` 这类
279+
解析不了的拼法可寻址),是约束就在已安装的版本里挑满足它的最高一个。判据里有一条
280+
**双侧有界**的范围 —— 只用下界的话,一个忽略约束直接取最新的实现照样通过。
281+
282+
### 10.2 落败的精确钉不是「违反」,只有被陈述的**要求**才是
283+
284+
正文 §2.3 写「赢家必须满足其余每一条**约束**」。按字面实现,两条互不相同的精确钉会
285+
互相「违反」,于是**每一个「依赖钉了某工具、工程也钉了」的组合都在升级当天变成硬
286+
失败** —— 而那个分歧正是 §2.2 的裁决存在的理由。
287+
288+
改成:`>=` / `^` / `~` / 逗号组合是**要求**,可以被违反;不带运算符的裸版本是**选择**,
289+
由裁决处理并被报告。§2.3 的例子本来就是「钉 vs 下界」,所以这是把正文的措辞收紧到它
290+
自己的例子上。
291+
292+
**这条不对称随后成了机制。** 规则包写精确版本 = 提供一个默认;写 `>=` = 陈述一条要求。
293+
同一个字段承载两种意图,而使用侧看到的行为恰好不同:覆盖默认是安静的,击穿要求是被
294+
拒绝的。
295+
296+
### 10.3 默认的形状是「耦合判断」,不是风格 —— §6.1 的通篇 `>=` 是错的
297+
298+
§6.1 写 `"xim:cuda-nvcc" = ">=12.9.86"`。实测:索引里有 12.9.86 与 13.3.33,`>=`
299+
最高,于是**默认变成 13.3.33** —— 而 13.x 把驱动下界抬到 r580,本轮实测的机器是 12.4。
300+
一条本意为「至少这么新」的下界,把整条 lane 换成了没验证过的那条。
301+
302+
规则:**版本耦合着规则看不见的东西时,默认写精确版本;不耦合时写下界。** CUDA / HIP
303+
的运行时耦合驱动 → 钉 12.9 线;glslang / dpcpp / CANN 不耦合 → `>=`
304+
305+
### 10.4 边界:规则声明它**编译时**用的,工程声明它**运行时**跑在上面的
306+
307+
`xim:mesa-lavapipe` 是一个软件 Vulkan 设备。把它挪进 `rules-spirv` 会给每一个消费者
308+
强加一个软件渲染器,包括有 GPU 的那些。它留在工程里。
309+
310+
同理 `compat:cuda-runtime` / `compat:sycl-runtime` / `compat:vulkan-runtime`:它们是
311+
产物的运行期适配器,而且有一条结构性理由 —— 插件包是一条 `[build-dependencies]` 边,
312+
它自己的 `[dependencies]` **有意**不到达消费者的 target。
313+
314+
所以「插件自带环境」覆盖的是 xim 载荷那一半,不是全部。这条写进 plugins 的 README 与
315+
manifest 注释,因为它是唯一能回答「为什么这个还要我写」的地方。
316+
317+
### 10.5 修好一处判据,第一批红的是自己的夹具
318+
319+
把 plugins CI 的 `MCPP_VERSION` 从 2026.9.6.1 抬到 2026.9.6.6 之后,`hip-consumer`
320+
当场变红:它的 glob 写 `accel = "hip, cuda12.9+{sm_89}"`,而 `[package] accelerators`
321+
只有 `["hip"]``sycl-consumer` 与 mcpp 自己的 `examples/09-heterogeneous/{hip,sycl}`
322+
同形。
323+
324+
**两边的 CI 都看不见它。** mcpp 侧那两个示例在 `build_examples.sh` 里是 SKIP;plugins
325+
侧的引擎 pin 停在检查出现之前。这是一条只有**跨仓库、且两边都动**才会暴露的缺陷。
326+
327+
### 10.6 告警码:新开一个,不复用
328+
329+
正文 §2.2 说跨包这一趟复用 `xlings/axis-override`。没有采纳:那个码的含义写在它自己的
330+
注释里,是「同一份 manifest 的两条****」。跨包的版本分歧是另一件事,而告警码是给机器
331+
读的分类。新码是 `xlings/version-override`
332+
333+
### 10.7 落地顺序(不可交换)
334+
335+
| # | 仓库 | 内容 | 前置 |
336+
|---|---|---|---|
337+
| 1 | mcpp | 引擎 + 文档 + 判据 + 2026.9.6.6 ||
338+
| 2 || 发布 2026.9.6.6 | 1 合入 |
339+
| 3 | mcpp-plugins | 五条规则自带环境 + 0.2.4 | 2(CI 要下载这个引擎) |
340+
| 4 || 0.2.4 进索引 | 3 合入 |
341+
| 5 | mcpp | 示例瘦身到 0.2.4 | 4(示例从索引解析 plugins) |
342+
343+
第 5 步是 mcpp 的**第二个** PR。它不是拆分,是两次跨仓库发布夹在中间的必然结果:
344+
示例引用的是已发布的 plugins,而那一版依赖第 1 步的引擎。

0 commit comments

Comments
 (0)