fix(#3191): anchor remaining diff-base greps, portably (#3437)

* fix(#3191): anchor remaining diff-base greps, portably

The #2989 fix anchored only the Tier-3 grep, and did so with \b — not a
POSIX ERE token, so on macOS regex(3) it silently matches nothing and
Tier 3 always fails closed. spawn_reviewer's agent-context DIFF_BASE and
the fallow structural pre-pass's --changed-since base each still ran the
original unanchored --grep="${PADDED_PHASE}", whose oldest substring
match is routinely a version-string/date commit from months before the
phase existed — feeding the reviewer agent a bogus diff_base exactly
when files: is empty, and widening fallow's changed-files scope.

All three derivations now use the same anchored, POSIX-portable
'[Pp]hase N([^[:alnum:]_]|$)' with --extended-regexp; spawn_reviewer
also gains Tier-3's parent-exists guard so the two computations are the
same algorithm. Behavioral regression tests execute the shipped bash
extracted from the workflow files against a git fixture on every
platform, so the macOS \b hole is covered, not just the Linux CI view.

* chore(#3191): backfill changeset PR number 3437

* fix(#3191): scope fallow test snippet past the gsd-tools resolver

The CI runners have no installed gsd-tools, so executing the resolver
line that precedes FALLOW_SCOPE_ARGS in the extracted fence exits 1
before the derivation under test ever runs. Slice the snippet to start
at FALLOW_SCOPE_ARGS=() — the resolver is orthogonal to the base
derivation the regression test binds.

---------

Co-authored-by: sim <sim@local>
This commit is contained in:
Tom Boucher
2026-08-14 00:53:13 -04:00
committed by GitHub
parent 483083aea6
commit dbbcb8f736
6 changed files with 307 additions and 19 deletions

View File

@@ -237,12 +237,14 @@ against the diff and warn about (then add) any changed files the SUMMARY extract
surface — so a partial SUMMARY result can no longer silently mask the rest of the phase.
```bash
# Compute diff base from phase commits — fail closed if no reliable base found.
# #2989: anchor the grep to the phase-mention convention ("Phase N" / "phase N"
# with a word boundary) so a bare digit substring doesn't match version strings,
# dates, issue refs, or other phases' numbers. With --extended-regexp, \b is
# a word boundary. When no commit genuinely references the phase, this yields
# empty and the fail-closed warning below actually fires.
PHASE_COMMITS=$(git log --oneline --all --grep="[Pp]hase ${PADDED_PHASE}\b" --extended-regexp --format="%H" 2>/dev/null)
# #2989: anchor the grep to the phase-mention convention ("Phase N" / "phase N")
# so a bare digit substring doesn't match version strings, dates, issue refs,
# or other phases' numbers. When no commit genuinely references the phase, this
# yields empty and the fail-closed warning below actually fires.
# #3191: the trailing boundary is the POSIX class ([^[:alnum:]_]|$), NOT \b —
# \b is not a POSIX ERE token, so under --extended-regexp it silently matches
# nothing on macOS regex(3), making this fallback dead on Apple platforms.
PHASE_COMMITS=$(git log --oneline --all --grep="[Pp]hase ${PADDED_PHASE}([^[:alnum:]_]|$)" --extended-regexp --format="%H" 2>/dev/null)
DIFF_BASE=""
if [ -n "$PHASE_COMMITS" ]; then
DIFF_BASE=$(echo "$PHASE_COMMITS" | tail -1)^
@@ -423,11 +425,19 @@ Compute the review output path:
REVIEW_PATH="${PHASE_DIR}/${PADDED_PHASE}-REVIEW.md"
```
Compute DIFF_BASE for agent context (in case agent needs it):
Compute DIFF_BASE for agent context (in case agent needs it). #3191: this must be
the SAME anchored, POSIX-portable derivation the Tier-3 scope step uses — the
reviewer agent consumes `diff_base` exactly when `files:` is empty, i.e. the same
fail-closed scenario Tier 3 protects, so a divergent unanchored recomputation here
re-arms the mis-scoping one tier down:
```bash
PHASE_COMMITS=$(git log --oneline --all --grep="${PADDED_PHASE}" --format="%H" 2>/dev/null)
PHASE_COMMITS=$(git log --oneline --all --grep="[Pp]hase ${PADDED_PHASE}([^[:alnum:]_]|$)" --extended-regexp --format="%H" 2>/dev/null)
if [ -n "$PHASE_COMMITS" ]; then
DIFF_BASE=$(echo "$PHASE_COMMITS" | tail -1)^
# Verify the parent commit exists (first commit in repo has no parent)
if ! git rev-parse "${DIFF_BASE}" >/dev/null 2>&1; then
DIFF_BASE=$(echo "$PHASE_COMMITS" | tail -1)
fi
else
DIFF_BASE=""
fi