refactor(node-bootc-arm64): the ARM gates are shell, and they now run #287

Merged
binjovi-bot merged 1 commit from sean/arm64-shell-gates into trunk 2026-09-10 21:23:12 +00:00 AGit
Owner

verify_kernel.py, verify_inputs.py and installed_kernel.py are shell. node-base-arm64:v2 carries jq and the image already had GNU tar. verify_kernel.py was a byte-for-byte copy of binjovi-plans/recipes/linux/verify-artifact.py, one trailing newline apart, with nothing saying the two had to agree; the shell version is vendored from the one already proved on 28 differential cases and carries a CANONICAL COPY note naming both paths. verify-inputs keeps the order that matters -- every path and symlink target is proved from the listing before anything is extracted -- and was run against the Python inside the real image on GNU tar 1.35: 14 cases, zero disagreements. Three tests were orphaned, run by no Makefile, script or pipeline; they run in the image build now, 12 + 5 negative controls, each proved to go red. The hostile archives are frozen base64 fixtures whose digests the test checks, because tar normalises a traversing or absolute member away. NODE_BASE moves to node-base-arm64:v2; VERSION goes to 4. https://claude.ai/code/session_01KZoQin34jeyt6nDGqvJA76

verify_kernel.py, verify_inputs.py and installed_kernel.py are shell. node-base-arm64:v2 carries jq and the image already had GNU tar. verify_kernel.py was a byte-for-byte copy of binjovi-plans/recipes/linux/verify-artifact.py, one trailing newline apart, with nothing saying the two had to agree; the shell version is vendored from the one already proved on 28 differential cases and carries a CANONICAL COPY note naming both paths. verify-inputs keeps the order that matters -- every path and symlink target is proved from the listing before anything is extracted -- and was run against the Python inside the real image on GNU tar 1.35: 14 cases, zero disagreements. Three tests were orphaned, run by no Makefile, script or pipeline; they run in the image build now, 12 + 5 negative controls, each proved to go red. The hostile archives are frozen base64 fixtures whose digests the test checks, because tar normalises a traversing or absolute member away. NODE_BASE moves to node-base-arm64:v2; VERSION goes to 4. https://claude.ai/code/session_01KZoQin34jeyt6nDGqvJA76
refactor(node-bootc-arm64): the ARM gates are shell, and they now run
Some checks failed
binjovi/ci Binjovi failed the frozen plan
78b25bf484
`verify_kernel.py`, `verify_inputs.py` and `installed_kernel.py` are
shell. node-base-arm64:v2 carries `jq`, and the image already had GNU
tar, so the tools the rewrite needs are there.

`verify_kernel.py` was a BYTE-FOR-BYTE COPY of
`binjovi-plans/recipes/linux/verify-artifact.py`, one trailing newline
apart, with nothing saying the two had to agree. The shell version is
vendored from the one already proved against the Python on 28
differential cases, and it carries the CANONICAL COPY note naming both
paths, the shape `lint-no-runtime-fetch.sh` uses for the same problem.

`verify-inputs` was the hard one: it walks the ZFS archive member by
member for path escapes, symlink ancestry and the ELF `e_machine` of
every executable. The order is unchanged and it matters -- every path
and every symlink target is proved from the LISTING, and only then is
anything extracted, so a hostile member cannot be written while it is
still being judged. Run against the Python inside the real image on GNU
tar 1.35: 14 cases, zero disagreements, including a traversing member,
an absolute member, an escaping symlink, an arbitrary /dev/null mask, a
host x86 ELF and a dangling helper target.

THREE TESTS WERE ORPHANED. `test_verify_inputs.py`,
`test_installed_kernel.py` and `test-wireguard.sh` were run by no
Makefile, script or pipeline -- nothing said whether these gates still
refused what they exist to refuse. They run in the image build now, on
the image that carries them. 12 + 5 negative controls, both proved to go
red when the property is removed.

The hostile archives are frozen base64 fixtures whose digests the test
checks: `tar` normalises a traversing or absolute member away, so the
archives under test cannot be produced by an ordinary tool, which is the
property being tested.

NODE_BASE moves to the node-base-arm64:v2 digest, the first with `jq`.
VERSION goes to 4.

Claude-Session: https://claude.ai/code/session_01KZoQin34jeyt6nDGqvJA76
sean force-pushed sean/arm64-shell-gates from 78b25bf484
Some checks failed
binjovi/ci Binjovi failed the frozen plan
to 016f2af212
All checks were successful
binjovi/ci Binjovi completed the frozen plan
2026-09-10 21:18:50 +00:00
Compare
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
sean/builder-images!287
No description provided.