Cluster
Files: elements/oci/k3s-sysext.bst, elements/k3s/k3s-bin.bst, files/k3s/sysext/extension-release.k3s, files/os/sysupdate.d/70-k3s.transfer, project.conf (options.arch, variables.release-version).
Problem 1 — the sysext straddles two version axes
elements/oci/k3s-sysext.bst names the artifact on the OS axis:
FNAME="k3s-%{release-version}.raw" # release-version = the FSDK point release
while the extension declares its own identity on the k3s axis:
# files/k3s/sysext/extension-release.k3s
VERSION_ID=v1.36.2+k3s1
and the payload is pinned on the k3s axis too (elements/k3s/k3s-bin.bst → v1.36.2+k3s1).
Three consequences fall out of the mismatched axis:
- A k3s security bump cannot ship on its own. Bumping
k3s-bin.bst changes the binary but not %{release-version}, so the asset filename is unchanged. files/os/sysupdate.d/70-k3s.transfer matches k3s-@v.raw.zst, extracts the same version, and declines to update. Patching k3s requires an unrelated OS point-release bump to move the filename.
- Every OS point release forces a no-op k3s update. Conversely, an FSDK bump renames the sysext even when the k3s binary is byte-identical, so every host in the fleet downloads and re-merges an unchanged extension.
systemd-sysext status can never agree with the artifact. It reports VERSION_ID=v1.36.2+k3s1; the file on disk is k3s-25.08.13.raw. Nothing in the repo maps one to the other, so an operator cannot answer "which k3s am I running" from the filename or "which asset do I have" from sysext status.
The element's own comment states the intent — "versioned on the OS release axis like the other release assets" — but k3s is not an OS asset; it is an independently-pinned third-party payload, and the sysupdate transfer treats the filename as its version oracle.
Problem 2 — undeclared x86_64-only constraint
project.conf declares aarch64 as a supported value of options.arch, and elements/freedesktop-sdk.bst carries a full per-arch bootstrap_build_arch conditional. The k3s subsystem has no such conditional:
elements/k3s/k3s-bin.bst fetches github:k3s-io/k3s/releases/download/v1.36.2%2Bk3s1/k3s with one fixed SHA256. That URL is the amd64 binary; upstream publishes arm64 as a separately-named asset. The doc comment says "Pinned to the latest stable release for x86_64", but no (?) arch guard enforces it.
files/k3s/sysext/extension-release.k3s hardcodes ARCHITECTURE=x86-64.
An arch=aarch64 build therefore succeeds and produces a publishable sysext containing an x86_64 ELF binary labelled ARCHITECTURE=x86-64. It fails only later, on the host, when systemd-sysext refuses to merge it. The architectural gap is that a declared build option has an unsatisfiable subsystem behind it with no fail-closed guard at build time.
Proposed direction
- Version the k3s sysext on the k3s axis (derive
FNAME and extension-release VERSION_ID from one pinned k3s version variable) so 70-k3s.transfer tracks the thing it actually delivers, and decouple k3s patching from OS point releases.
- Either add per-arch source/SHA/
ARCHITECTURE conditionals to the k3s elements, or make elements/oci/k3s-sysext.bst fail closed under arch != x86_64 so the unsupported combination cannot produce a release asset.
Related: #31 (the release-version axis itself has two competing sources of truth).
Filed by architect agent (ACMM L5 — hold-gated mode).
🐝 Hive Agent: architect | Instance: hosted-projectbluefin-knuckle-gjvq | SHA: 5e263a0
— hive: agent=architect backend=copilot model=claude-opus-5
Cluster
Files:
elements/oci/k3s-sysext.bst,elements/k3s/k3s-bin.bst,files/k3s/sysext/extension-release.k3s,files/os/sysupdate.d/70-k3s.transfer,project.conf(options.arch,variables.release-version).Problem 1 — the sysext straddles two version axes
elements/oci/k3s-sysext.bstnames the artifact on the OS axis:while the extension declares its own identity on the k3s axis:
and the payload is pinned on the k3s axis too (
elements/k3s/k3s-bin.bst→v1.36.2+k3s1).Three consequences fall out of the mismatched axis:
k3s-bin.bstchanges the binary but not%{release-version}, so the asset filename is unchanged.files/os/sysupdate.d/70-k3s.transfermatchesk3s-@v.raw.zst, extracts the same version, and declines to update. Patching k3s requires an unrelated OS point-release bump to move the filename.systemd-sysext statuscan never agree with the artifact. It reportsVERSION_ID=v1.36.2+k3s1; the file on disk isk3s-25.08.13.raw. Nothing in the repo maps one to the other, so an operator cannot answer "which k3s am I running" from the filename or "which asset do I have" from sysext status.The element's own comment states the intent — "versioned on the OS release axis like the other release assets" — but k3s is not an OS asset; it is an independently-pinned third-party payload, and the sysupdate transfer treats the filename as its version oracle.
Problem 2 — undeclared x86_64-only constraint
project.confdeclaresaarch64as a supported value ofoptions.arch, andelements/freedesktop-sdk.bstcarries a full per-archbootstrap_build_archconditional. The k3s subsystem has no such conditional:elements/k3s/k3s-bin.bstfetchesgithub:k3s-io/k3s/releases/download/v1.36.2%2Bk3s1/k3swith one fixed SHA256. That URL is the amd64 binary; upstream publishes arm64 as a separately-named asset. The doc comment says "Pinned to the latest stable release for x86_64", but no(?)arch guard enforces it.files/k3s/sysext/extension-release.k3shardcodesARCHITECTURE=x86-64.An
arch=aarch64build therefore succeeds and produces a publishable sysext containing an x86_64 ELF binary labelledARCHITECTURE=x86-64. It fails only later, on the host, when systemd-sysext refuses to merge it. The architectural gap is that a declared build option has an unsatisfiable subsystem behind it with no fail-closed guard at build time.Proposed direction
FNAMEandextension-releaseVERSION_IDfrom one pinned k3s version variable) so70-k3s.transfertracks the thing it actually delivers, and decouple k3s patching from OS point releases.ARCHITECTUREconditionals to the k3s elements, or makeelements/oci/k3s-sysext.bstfail closed underarch != x86_64so the unsupported combination cannot produce a release asset.Related: #31 (the
release-versionaxis itself has two competing sources of truth).Filed by architect agent (ACMM L5 — hold-gated mode).
🐝 Hive Agent:
architect| Instance:hosted-projectbluefin-knuckle-gjvq| SHA:5e263a0— hive: agent=architect backend=copilot model=claude-opus-5