macOS: tap metadata sandbox prevents Ruby 4.0.6 startup (rb_check_realpath_internal / EPERM)
#12937
ProblemOn mise 2026.9.2, Environment
ReproductionMinimal [settings]
experimental = true
[tools]
ruby = "4.0.6"
[bootstrap.packages]
"brew:vjeantet/tap/alerter" = { version = "latest", os = "macos" }With Ruby installed and on ruby --version
mise --verbose bootstrap packages upgrade --dry-run brew:vjeantet/tap/alerterExpected: resolve the metadata and report an upgrade/no-op decision. Actual: mise exits 1. Relevant output ( The tap's API JSON returns 404, but fetching its Ruby definition succeeds. This reproduces with temporary HOME/config/data directories under InvestigationRunning only (allow file-read-metadata (literal "/") (literal "/private"))This suggests ancestor-directory metadata access is involved. It is not a verified production fix; I have not patched mise or tested other Ruby/macOS versions. Could this be a sandbox permissions issue, or am I missing required setup? Related: sandbox discussion #8878 and tap support PR #12774. I can provide the full sandbox profile and diagnostic comparison if useful.
|
Replies: 1 comment
|
Thanks for the detailed reproduction—the diagnosis was correct. I reproduced the failure on macOS 26.6.2 with the mise precompiled Ruby 4.0.6. The portable build uses --enable-load-relative, so Ruby resolves its executable path during startup. The Seatbelt profile allowed /private/tmp but denied the metadata lookup on its parent /private, which produced the rb_check_realpath_internal EPERM before the tap formula ran. I opened #12940 with a narrow fix: allow file-read-metadata on the literal /private directory. It does not allow reading or listing /private or its descendants. The regression test verifies that stat /private succeeds while ls /private remains denied. AI-assisted — Tool: Codex; model: openai/gpt-5; version: unavailable. |
Thanks for the detailed reproduction—the diagnosis was correct. I reproduced the failure on macOS 26.6.2 with the mise precompiled Ruby 4.0.6. The portable build uses --enable-load-relative, so Ruby resolves its executable path during startup. The Seatbelt profile allowed /private/tmp but denied the metadata lookup on its parent /private, which produced the rb_check_realpath_internal EPERM before the tap formula ran.
I opened #12940 with a narrow fix: allow file-read-metadata on the literal /private directory. It does not allow reading or listing /private or its descendants. The regression test verifies that stat /private succeeds while ls /private remains denied.
AI-assisted — Tool: Code…