yams/scripts/ci/install_surface_policy.json
Trevon dc7a4fb499
fix: unblock the 0.20.5 release (aarch64 budget, MSVC linkage, mobile configure, Windows MSI) (#263)
* fix(ci): size the onnx resource budget for aarch64 page alignment

libyams_onnx_resource.so is 67,624 bytes on aarch64 against a 64,000-byte budget, which failed the v0.20.4 linux-arm64 release job. It holds 23 KB of sections; aarch64 links with 64 KiB segment alignment (LOAD align 0x10000), which pads the file. The budget was measured on x86_64. 81,000 is the aarch64 size plus 20% headroom. Every other aarch64 payload is within 86% of its budget.

Signed-off-by: trvon <me@trevon.dev>

* fix(plugins): declare the S3 legacy factory with the plugin export macro

93f24394 marked the S3 plugin's yams_plugin_create/destroy_object_storage definitions YAMS_PLUGIN_API so they stay exported under hidden visibility, but include/yams/plugins/object_storage.h still declared them without it. MSVC rejects a definition whose linkage differs from the first declaration (C2375), so the v0.20.4 Windows release job failed to compile s3_plugin.cpp. GCC and Clang accept the mismatch, which is why the Linux and macOS lanes passed.

The header now includes yams/plugins/abi.h and declares both functions YAMS_PLUGIN_API, matching how abi.h declares the rest of the plugin C ABI. Checked with MSVC 14.51 (x64 target): a translation unit with the s3_plugin.cpp definitions fails with C2375 against the old header and compiles against the new one.

Signed-off-by: trvon <me@trevon.dev>

* fix(build): drop install_tag from the mobile install_headers call

324be33a passed install_tag: 'devel' to install_headers(), which accepts no such keyword. Meson 1.12 fails the configure with "install_headers got unknown keyword arguments install_tag" whenever -Denable-mobile-bindings=true, which broke the Tests linux-x86_64-mobile lane on experimental. Meson tags installed headers 'devel' by itself, so the header still ships only with the devel set (checked with meson introspect --install-plan and meson install --tags devel|runtime --dry-run on grim).

Signed-off-by: trvon <me@trevon.dev>

* fix(packaging): install the Windows onnx resource DLL next to the executables

yams-cli.exe, yams-daemon.exe and yams-mcp-server.exe import
yams_onnx_resource-0.dll at load time, but Meson installed it to lib\ and
yams.wxs never packaged it. The shipped v0.20.3 MSI therefore installs a
yams.exe that cannot start: extracting it (msiexec /a) and running
`yams.exe --version` exits 0xC00004BC with no output, and dumpbin
/dependents lists yams_onnx_resource-0.dll. The release job never runs the
staged CLI on Windows, so CI stayed green.

Drop the explicit Windows install_dir so Meson installs the DLL to bindir
(the import library stays in libdir) and add it to the MSI. With the change
`meson install` stages bin\yams_onnx_resource-0.dll and the staged
`yams.exe --version` prints the version.

Signed-off-by: trvon <me@trevon.dev>

* ci(release): smoke-test the staged Windows CLI before building the MSI

The v0.20.3 MSI shipped a yams.exe that exits 0xC00004BC because a load-time DLL was not packaged, and nothing in the release job ran the staged binary. Run the staged yams.exe --version with a 60 s timeout after meson install and fail the job on a non-zero exit. Checked on a Windows host against the old stage layout (exits 0xC00004BC, step fails) and the fixed one (prints 0.20.5, step passes).

Signed-off-by: trvon <me@trevon.dev>

---------

Signed-off-by: trvon <me@trevon.dev>
2026-10-02 18:47:16 -06:00

155 lines
3.3 KiB
JSON

{
"_comment": "Runtime install surface contract for scripts/ci/check_install_surface.py. Paths are relative to the install prefix; {libdir} is the Meson libdir relative to the prefix. Size budgets apply to ELF payloads and carry ~20% headroom over the measured Linux x86_64 release payload (grim, clang 21, 2026-10); the onnx/glint budgets come from the v0.20.3 packages. Raise a budget only with a measured reason in the commit message.",
"paths": {
"allowed": [
"bin/yams",
"bin/yams-cli",
"bin/yams-daemon",
"bin/yams-mcp-server",
"{libdir}/yams/plugins/*.so",
"{libdir}/yams/plugins/*.dylib",
"{libdir}/yams/*.so",
"{libdir}/yams/*.so.*",
"{libdir}/yams/*.dylib",
"{libdir}/yams/onnxruntime/*",
"share/yams/**",
"share/licenses/yams/*",
"share/doc/yams/**",
"lib/systemd/user/yams-daemon.service",
"lib/systemd/user-preset/80-yams.preset"
],
"forbidden": [
"include/**",
"**/*.h",
"**/*.hpp",
"**/*.a",
"**/*.la",
"**/*.pc",
"**/pkgconfig/**",
"**/cmake/**"
],
"required": [
"bin/yams",
"bin/yams-cli",
"bin/yams-daemon",
"share/yams/sql/reference_schema.sql",
"{libdir}/yams/plugins/*"
]
},
"third_party_exempt": [
"{libdir}/yams/plugins/libzpdf.*",
"{libdir}/yams/onnxruntime/*"
],
"size_budgets": [
{
"pattern": "bin/yams-cli",
"max_bytes": 40600000,
"kinds": [
"elf"
]
},
{
"pattern": "bin/yams-daemon",
"max_bytes": 34200000,
"kinds": [
"elf"
]
},
{
"pattern": "bin/yams-mcp-server",
"max_bytes": 20100000,
"kinds": [
"elf"
]
},
{
"pattern": "{libdir}/yams/plugins/libyams_object_storage_s3.*",
"max_bytes": 7500000,
"kinds": [
"elf"
]
},
{
"pattern": "{libdir}/yams/plugins/libyams_onnx_plugin.*",
"max_bytes": 2000000,
"kinds": [
"elf"
]
},
{
"pattern": "{libdir}/yams/plugins/yams_glint.*",
"max_bytes": 850000,
"kinds": [
"elf"
]
},
{
"pattern": "{libdir}/yams/plugins/yams_zyp.*",
"max_bytes": 77000,
"kinds": [
"elf"
]
},
{
"pattern": "{libdir}/yams/libyams_onnx_resource.*",
"max_bytes": 81000,
"kinds": [
"elf"
]
}
],
"export_budgets": [
{
"pattern": "{libdir}/yams/plugins/libzpdf.*",
"max": 256
},
{
"pattern": "{libdir}/yams/onnxruntime/*",
"max": 100000
},
{
"pattern": "{libdir}/yams/plugins/*",
"max": 16
},
{
"pattern": "{libdir}/yams/libyams_onnx_resource.*",
"max": 32
},
{
"pattern": "bin/*",
"max": 64
}
],
"forbidden_exports": [
"^sqlite3_",
"^libsql_",
"^SSL_",
"^EVP_",
"^OPENSSL_",
"^CRYPTO_",
"^curl_",
"^Curl_",
"^deflate",
"^inflate",
"^ZSTD_",
"^LZ4",
"boost::",
"google::protobuf",
"spdlog::",
"fmt::",
"nlohmann::",
"^Ort"
],
"hardening": {
"pie": true,
"bind_now": true,
"relro": true,
"nx": true,
"cet_x86_64": "warn",
"fortify_imports": "warn"
},
"stripped": {
"no_debug_sections": true,
"no_symtab": true
}
}