orca/.github/workflows
Hyeonho Lee (Ethan) 850342a3e0
fix(ci): run the root-directory guard on stock macOS bash 3.2 (#12879)
* fix(ci): run the root-directory guard on stock macOS bash 3.2

The guard script builds its base-tree lookup with `declare -A`, which
needs bash 4+. Its test spawns plain `bash` from PATH, and stock macOS
has shipped /bin/bash 3.2 since 2007, so on any Mac without a Homebrew
bash the script exits 2 before asserting anything and the default
`pnpm test` suite fails 3 of the guard's 4 cases. Machines with a
Homebrew bash on PATH never see it, which is why it went unnoticed.

Replace the associative array with a plain-array linear scan. Root
directories number in the dozens, so the O(n^2) membership check is
negligible, and the NUL-delimited reads that protect unusual filenames
stay as they were. The empty-array expansion is guarded for
`set -u` under bash 3.2.

All four guard tests now pass with /bin/bash 3.2; behavior under CI's
bash 5 is unchanged.

* fix(ci): run the root-directory guard under node instead of bash

The guard is the only check in the repo written in shell, and it used
`declare -A`, which stock macOS `/bin/bash` 3.2 does not have — so the
guard's own test suite failed 3 of 4 cases on any Mac without a Homebrew
bash. CI never noticed because runners ship bash 5.

Porting it to node removes the interpreter-version variable instead of
working around one construct: node is what the sibling script in this
directory already uses, it is the runtime that runs the test, and the
NUL-delimited read is the same shape as check-changed-code-quality.mjs.
It also drops a latent false pass — a failing `git ls-tree` inside the
shell's `< <(...)` was not caught by `pipefail`, so the read loop saw
nothing and the guard reported success. `execFileSync` throws instead,
which is why the two `git rev-parse --verify` probes are no longer
needed.

Output and exit codes are otherwise unchanged; the usage line now prints
node's script path where the shell printed `$0`.

Tests pin each guarantee and fail when it is reverted: NUL-delimited
reads so odd paths are reported unmangled, exit 2 on bad usage, and
git's own 128 with no node stack trace when a sha does not resolve.

* fix(ci): keep root entry bytes intact and fence guard output

git pathnames are arbitrary bytes, but the guard read ls-tree with
encoding 'utf8', so every invalid sequence collapsed to U+FFFD. That
mangled the reported name and, because the replacement is not
injective, let two different entries compare equal — a genuinely new
root entry could be waved through as pre-existing. Read the bytes as
latin1 and write them back unchanged.

The blocked-entry list is also attacker-controlled and went straight to
stdout. The runner trims leading whitespace before matching '::', so an
indented entry name still parses as a workflow command, and a pathname
may embed a newline. Wrap the list in ::stop-commands:: with a random
resume token so only the guard's own annotation is acted on.

---------

Co-authored-by: Brennan Benson <79079362+brennanb2025@users.noreply.github.com>
2026-08-09 14:06:25 -07:00
..
adhoc-mac-build.yml fix(ci): vet the adhoc build ref before running it with release secrets (#12161) 2026-08-03 18:52:44 -07:00
computer-e2e.yml fix(terminal): fence detached daemon endpoint ownership (#12709) 2026-08-05 21:12:32 -07:00
daemon-relocation-spike.yml chore: declutter top-level repo layout (#11890) 2026-08-01 00:25:35 -07:00
e2e.yml ci: run only changed e2e specs on pull requests (#11834) 2026-07-31 16:25:13 -07:00
golden-e2e-experiment.yml ci: run only changed e2e specs on pull requests (#11834) 2026-07-31 16:25:13 -07:00
homebrew-bump.yml
hourly-mac-build.yml fix(ci): stop hourly prune from deleting the just-published release (#13266) 2026-08-08 16:01:48 -07:00
issue-os-labeler.yaml
linux-wayland-gpu-sandbox.yml ci: run only changed e2e specs on pull requests (#11834) 2026-07-31 16:25:13 -07:00
mobile-android-release.yml fix(mobile): keep Android release versionCode committed (#7271) 2026-07-03 15:26:11 -07:00
mobile-ios-release.yml Prepare mobile 0.0.42 and fix TestFlight CI hang (#12961) 2026-08-07 16:52:37 -07:00
mobile.yml fix(mobile): unblock iOS releases (#10224) 2026-07-23 14:23:44 -07:00
pr.yml fix(ci): run the root-directory guard on stock macOS bash 3.2 (#12879) 2026-08-09 14:06:25 -07:00
pullfrog.yml Improve inactive workspace cleanup UX (#3600) 2026-06-28 11:38:23 -07:00
readme-downloads-badge.yml Use generated README downloads badge 2026-06-16 11:09:40 -07:00
release-cut.yml [P2] fix(release,settings): restore signing preflight portability, bootstrap diagnostics, and skill re-check (#11692) 2026-07-31 06:08:26 -07:00
release-mac-build.yml Fix ssh watcher isolation (#8463) 2026-07-12 21:34:59 -07:00
skill-update-roundtrip.yml Add safe skill freshness detection and update rail (#8637) 2026-07-16 14:47:28 -07:00
terminal-ime-e2e.yml Revert the terminal IME composition-ownership change (#13282) 2026-08-08 19:06:50 -07:00
terminal-perf.yml Expose terminal perf workflow profile knobs (#4826) 2026-06-07 12:48:46 -07:00
track-community-prs.yaml
win-crash-survival-e2e.yml move folders (#12758) 2026-08-05 12:09:24 -07:00
win-update-e2e.yml chore: declutter top-level repo layout (#11890) 2026-08-01 00:25:35 -07:00
win-update-survival-e2e.yml chore: declutter top-level repo layout (#11890) 2026-08-01 00:25:35 -07:00
windows-signing-rehearsal.yml fix(release): survive PSGallery outages in the Windows signing preflight 2026-07-30 18:16:38 -07:00
windows-terminal-restart-e2e.yml ci: run only changed e2e specs on pull requests (#11834) 2026-07-31 16:25:13 -07:00