Skip to content

chore: 身份对齐上游 —— ggml-org:llamacpp@b10069,版本即 checkpoint - #2

Merged
Sunrisepeak merged 3 commits into
mainfrom
chore/upstream-identity
Aug 6, 2026
Merged

chore: 身份对齐上游 —— ggml-org:llamacpp@b10069,版本即 checkpoint#2
Sunrisepeak merged 3 commits into
mainfrom
chore/upstream-identity

Conversation

@Sunrisepeak

Copy link
Copy Markdown
Member

生态规范化第三例(前两例:imgui-m#12ffmpeg-m#7)。规则与全量迁移表见 mcpp-index#163

理由就写在 README 里

Version 0.1.0 maps to llama.cpp b10069.

一个需要对照表才能读懂的版本号,没有在告诉消费者他拿到的是哪一版库 —— 而这是版本号唯一的用途。

b10069 不是 semver,mcpp 能处理

我先判断它"根本装不上"(照 resolve_semver 会跳过不可解析键推的),实测推翻了:造本地索引写入 b10069 版本键,解析、版本键匹配、wire 寻址全部正常 ——

 Downloading probe.tinyver vb10069
  wire address tried: probe:tinyver@b10069

不成立的只有范围(^b10069 解析不了),所以消费者精确 pin。范围支持见 mcpp#363

版本方案被写进了代码和测试,所以一起改

  • tools/check_release.pyVersion:major/minor/patch → (build, revision)b10069;同 checkpoint 的 wrapper 修复是 b10069.1。排序仍成立(build 是整数),"不得发布更旧版本"的检查原样保留。
  • 新增一条更强的不变量:_identity_from_text 校验版本命名的 checkpoint 与 lock 里 vendored 的 checkpoint 一致。以前这靠转换规则事后监管,现在两者是同一个字符串,漂移在结构上不可能。
  • release tag 即版本本身(b10069),也就是上游自己的 tag 形态。
  • docs/upstream-update-policy.md Version Model 整节重写,并诚实记下代价:排序不再可比,原先由版本分量承载的 major/minor/patch 契约改由 API 快照闸门与发布说明承担。
  • 单测改写;test_build_contract 另加一条断言把 package.version 与 manifest 生成的 #define GGML_VERSION 绑定。

验证

9 个 python 测试模块全过:

tests.unit.test_audit_snapshot        OK
tests.unit.test_build_contract        OK
tests.unit.test_check_ci_run          OK
tests.unit.test_check_release         OK
tests.unit.test_check_upstream        OK
tests.unit.test_fetch_model           OK
tests.unit.test_gen_exports           OK
tests.unit.test_import_upstream       OK
tests.unit.test_repository_contract   OK

README 里那句话就是这次改动的理由:

    Version `0.1.0` maps to llama.cpp `b10069`.

一个需要对照表才能读懂的版本号,没有在告诉消费者他拿到的是哪一版库 —— 而这正是版本
号唯一的用途。同一条修正在整个生态展开(mcpp-index#163):imgui@0.0.6 其实是 ImGui
1.92.8,ffmpeg@0.0.3 是 FFmpeg 8.1.2,opencv@0.0.10 是 OpenCV 5.0.0。

命名空间同理。`mcpplibs` 是 mcpp 的默认命名空间(`kDefaultNamespace`),不是"上游是
谁"的答案;llama.cpp 是 ggml-org 的。

**b10069 不是 semver,mcpp 能处理 —— 已实测。** 造本地索引写入该版本键,解析、版本
键匹配、wire 寻址(`probe:tinyver@b10069`)全部正常。不成立的只有范围(`^b10069` 解
析不了),所以消费者精确 pin。范围支持见 mcpp#363。

版本方案是被写进代码和测试的,所以一起改而不是只改 manifest:

* `tools/check_release.py` 的 `Version` 由 major/minor/patch 换成
  (build, revision):`b10069`,同 checkpoint 的 wrapper 修复为 `b10069.1`。排序仍
  然成立(build 是整数),"不得发布更旧版本"的检查原样保留。
* **新增一条更强的不变量**:`_identity_from_text` 现在校验版本命名的 checkpoint 与
  lock 里 vendored 的 checkpoint 一致。以前这靠 major/minor/patch 的转换规则事后监
  管,现在版本与 checkpoint 是同一个字符串,漂移在结构上不可能发生。
* release tag 即版本本身(`b10069`),也就是上游自己的 tag 形态,不再是 `v` 前缀。
* `docs/upstream-update-policy.md` 的 Version Model 整节重写,并诚实记下代价:排序
  不再可比,原先由版本分量承载的 major/minor/patch 契约转由 API 快照闸门与发布说明
  承担。
* 单测相应改写;`test_build_contract` 另加一条断言,把 package.version 与 manifest
  生成的 `#define GGML_VERSION` 绑在一起。

9 个测试模块全过。
CI 此前就已经红,与本次身份迁移无关:pin 的 mcpp 低于索引声明的 min_mcpp,
每次都停在同一个地方 ——

    error: index requires mcpp >= 2026.8.3.3 but this is mcpp <old> [E0006]

索引下限是一道机器闸门(mcpp#349):索引是数据、mcpp 是程序,发布数据不得让程序
失效,所以下限只在描述符真的读不动时才抬。这里要动的是客户端这一侧。
`--tag v0.1.0` 是版本号的第二份拷贝,版本方案一改它就落后 ——

    ValueError: release tag v0.1.0 does not match package version b10069

check_release.py 已经强制 tag 等于版本,那就从 manifest 读,不再留第二处要记得改
的地方。
@Sunrisepeak
Sunrisepeak merged commit 9553c9d into main Aug 6, 2026
7 checks passed
@Sunrisepeak
Sunrisepeak deleted the chore/upstream-identity branch August 6, 2026 01:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant