`vendor/MetasequoiaImeEngine` submodule 改为 `engine/` 目录,导入的是 product-lock.json 原本钉住的提交 c810d201,逐文件核对过 blob,因此这是一次 搬迁而不是引擎升级。引擎自己的嵌套 submodule(googlepinyinime-rev、utfcpp、 miniaudio)按各自 gitlink 一并展开,来源与提交见 engine/UPSTREAM.md。 Windows 专门化裁掉了不属于本产品的部分:whisper.cpp 与本地推理 provider、 macOS 示例宿主、整个 dictionary/ 建库流水线、上游 CI 与 release-please 配置。 词库仍按 product-lock.json 在构建时取发布产物。 引擎不再进 product-lock.json:没有 gitlink 就没有可比对的东西,锁里写一个上游 commit 等于宣称这棵树仍等于上游,而第一个 Windows 专门化改动落地时这句话就假了。 verify-contracts / verify-checkout 随之移除,verify-published 保留。 CI 与工具链:引擎源码并入根 scripts/format.sh(删掉引擎自己的那份,避免两套排除 列表分叉);引擎 voice.yml 里的 silero_vad.onnx 摘要校验移到本仓 lock job; engine-bump-triage 工作流与其测试删除;gitsubmodule 的 dependabot 频率由 daily 改为 monthly。 README、README.en、AGENTS.md、CONTRIBUTING、docs/product-release.md 及各子目录 文档同步说明新的位置与边界。
Runtime assets contract
assets.json is the shared inventory for the desktop runtime bundle. Each entry declares
its stable ID, installation path, role, source and profiles. user entries name writable
user files and are deliberately excluded from shipping profiles. Dictionary database
format/schema compatibility remains owned by contracts/dictionary/.
generate.pyproducesassets.hfor C++ resource lookup and helpcode scheme selection. This is the live part: roughly twenty engine translation units include that header.product.pyreads the inventory for packaging and verifies the exact ZIP member set, individual sizes/digests, contract version, dictionary product and source-commit agreement.
The builder that produced the engine-assets-desktop.zip bundle described below is not in
this repository; it left with the dictionary pipeline (see UPSTREAM.md). The
inventory and its verifier are kept because the header is generated from them and because the
bundle format is still what the release side is checked against.
Run python3 contracts/assets/generate.py --check after editing the inventory. CI checks the
generated header.
A consumer of the bundle uses the shared verifier before extraction:
from pathlib import Path
from contracts.assets.product import verify
manifest = verify(Path("engine-assets-desktop.zip"), expected_sha256=product_lock_digest)
The expected ZIP digest comes from the platform product lock, not the downloaded manifest. Verification is read-only and does not extract into application directories. The returned manifest records the producer commit and Google Pinyin source commit. The bundle carries source/permission notices without changing the underlying data permissions.
mutable-copy files are immutable release inputs but writable runtime dictionaries after
installation. resource files remain in the resource directory; user files remain under
the user's durable data directory. engine-assets-manifest.json is versioned separately
from the dictionary database format. Older standalone dict-* assets remain supported.