Skip to content

test: run the last manual macOS Seatbelt spot-checks in CI - #16

Merged
factory-ain3sh merged 3 commits into
mainfrom
ci/macos-spotchecks
Aug 10, 2026
Merged

test: run the last manual macOS Seatbelt spot-checks in CI#16
factory-ain3sh merged 3 commits into
mainfrom
ci/macos-spotchecks

Conversation

@factory-ain3sh

Copy link
Copy Markdown
Collaborator

The macos-runtime job already runs macos-nfs-git-validation.sh on macos-latest, which is real macOS with real Seatbelt and mount_nfs — so the two spot-checks docs/TESTING.md still assigned to "real hardware" were automation debt. This PR makes them script legs:

  • Quoted profile paths: one session homed under home with "quote" and based under base with "quote" dir, so every (param "NAME") / -D NAME=value path on the sandbox-exec command line carries spaces and a double quote. Mount + write + read-back must succeed.
  • Exit-status parity: vfs run /nonexistent… must exit 127 and a present-but-non-executable file must exit 126, per the reserved startup exit-status contract.

Docs shrink accordingly: the only remaining macOS gap is that shell suites beyond the remote pair aren't platform-aware yet, and TESTING.md now says exactly that instead of pointing at a laptop.

Validation: bash -n clean; on Linux the script still self-skips with exit 77. The macOS legs are what this PR's macos-runtime job run is for.

factory-ain3sh and others added 3 commits August 10, 2026 00:25
…ript

"Real hardware" stopped being a meaningful distinction when the
macos-runtime job started running this script on macos-latest: the runner
is real macOS with real sandbox-exec and mount_nfs. The two remaining
manual items were automation debt, not hardware requirements.

Two new legs in macos-nfs-git-validation.sh: a session homed and based
under directories with spaces and a double quote in their names must mount
and run (every parameterized Seatbelt path exercised; a regression back to
profile string interpolation fails), and vfs run must exit 127 for a
missing command and 126 for a present but non-executable one, matching the
Linux run path and the reserved-exit-status contract.

The manual macOS list in TESTING.md and the AGENTS.md gotcha shrink to the
one honest gap: shell suites other than the remote pair have no macOS
runtime coverage until made platform-aware the same way.

Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
…mands

The new CI exit-parity leg caught a real contract violation on its first
run: vfs run of a missing command exited 71 on macOS. The sandbox wrapper
always spawns because /usr/bin/sandbox-exec is a pinned system binary, so
spawn_error_exit_code never fired; sandbox-exec itself failed to exec the
target and reported EX_OSERR, which passed through as the session's exit
status. Linux never had the problem because it execs the target directly
and maps the io error.

The darwin run path now resolves the target the way sandbox-exec's execvp
will — bare names search PATH (read through the config edge), slashed
paths resolve against the child's working directory, an empty PATH entry
means the working directory — and exits with the reserved status before
mounting a child: 127 not found, 126 present but not executable. Both the
owner and joiner paths preflight; the owner unmounts before exiting so no
stale mount is left behind. Unit tests cover the resolution table;
the validation script leg asserts the end-to-end statuses in CI.

Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
The macos-latest clippy wall denies redundant_static_lifetimes, and the
darwin module only compiles there.

Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
@factory-ain3sh
factory-ain3sh merged commit 7502cfd into main Aug 10, 2026
15 checks passed
@factory-ain3sh
factory-ain3sh deleted the ci/macos-spotchecks branch August 10, 2026 07:58
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