diff --git a/.github/workflows/governance-enforce.yml b/.github/workflows/governance-enforce.yml
index e68aef6..9458b82 100644
--- a/.github/workflows/governance-enforce.yml
+++ b/.github/workflows/governance-enforce.yml
@@ -7,6 +7,7 @@ name: governance-enforce
on:
pull_request:
+ merge_group:
push:
branches: [main, master]
@@ -35,15 +36,24 @@ jobs:
run: |
mkdir -p "$RUNNER_TEMP/gov" && cd "$RUNNER_TEMP/gov"
printf '@wave-av:registry=https://npm.pkg.github.com\n//npm.pkg.github.com/:_authToken=${NODE_AUTH_TOKEN}\n' > .npmrc
- npm install @wave-av/governance@^0.4.4 --no-save --no-audit --no-fund
+ # Floor 0.4.6: earlier 0.4.x diffed `...HEAD` (three-dot needs a COMMIT base) inside
+ # a fail-open catch, so the empty-tree fallback below scanned 0 files and passed. 0.4.6
+ # diffs ` HEAD` (two-arg form accepts a tree) and fails closed on git errors.
+ npm install @wave-av/governance@^0.4.6 --no-save --no-audit --no-fund
- name: A_BLOCK enforce (secrets + hardcoded paths on the diff)
env:
PR_BASE_SHA: ${{ github.event.pull_request.base.sha }}
+ MERGE_BASE_SHA: ${{ github.event.merge_group.base_sha }}
PUSH_BEFORE_SHA: ${{ github.event.before }}
run: |
- BASE="${PR_BASE_SHA:-$PUSH_BEFORE_SHA}"
+ BASE="${PR_BASE_SHA:-${MERGE_BASE_SHA:-$PUSH_BEFORE_SHA}}"
if [ -z "$BASE" ] || [ "$BASE" = "0000000000000000000000000000000000000000" ]; then
- BASE=$(git rev-parse HEAD~1 2>/dev/null || git rev-parse HEAD)
+ # Indeterminate base (first push / force-push). Do NOT silently scan a partial range —
+ # HEAD~1 would skip earlier commits in a multi-commit push and let a violation through
+ # (a config-no-silent-noop hole). Diff the full tree against git's empty-tree object so
+ # every introduced file is scanned; loud, never a silent empty/partial pass.
+ BASE=$(git hash-object -t tree /dev/null)
+ echo "::warning::indeterminate diff base; scanning full tree (empty-tree base) so no commit is skipped"
fi
echo "diffing against $BASE"
node "$RUNNER_TEMP/gov/node_modules/@wave-av/governance/bin/enforce.mjs" --changed "$BASE"