fix(triage): diff the flake-gate file list against the pinned base OID (#9464)

The "Record changed test files for the flakiness gate" step runs its
`git diff 'HEAD^1' HEAD` inside the env -i scrubbed child. On the
persistent pool, resolving the `^1` parent there intermittently fails
with "Could not access 'HEAD^1'" — the shallow merge-ref object store is
left unreadable by prior `--depth=2` fetches — which takes down the whole
verify lane.

The "Pin agent inputs" step already captures the base OID to
$RUNNER_TEMP/verify-base-oid while .git is still root-owned. Diff against
that content-addressed OID instead of re-resolving the parent: it needs
no parent walk and is the same value the workflow already trusts for its
post-build re-pin. Add a pin asserting the record step reads the recorded
OID rather than re-deriving HEAD^1.
This commit is contained in:
易良 2026-08-19 07:09:49 +00:00 committed by GitHub
parent daa7d61990
commit 0530cb04df
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 20 additions and 2 deletions

View file

@ -1014,9 +1014,14 @@ describe('qwen-triage: flakiness gate (#9125)', () => {
// executes, so it is a changed test file exactly like M.
assert.match(
recordStep.run,
/^\s*git -c core\.quotePath=false diff -z --name-only --diff-filter=ACMRT 'HEAD\^1' HEAD \\\n\s*> "\$GATE_HOME\/files-all"$/m,
/^\s*git -c core\.quotePath=false diff -z --name-only --diff-filter=ACMRT "\$BASE_OID" HEAD \\\n\s*> "\$GATE_HOME\/files-all"$/m,
'the NUL diff must flow straight into its file — $( ) strips NUL bytes, a pipeline swallows the exit status',
);
assert.match(
recordStep.run,
/^\s*BASE_OID="\$\(cat "\$\{RUNNER_TEMP:\?\}\/verify-base-oid"\)"$/m,
'the record step must diff against the base OID captured while .git was root-owned, not re-resolve HEAD^1',
);
assert.ok(
recordStep.run.includes(
"grep -zE '\\.(test|spec)\\.(ts|tsx|js|jsx|mjs|cjs|mts|cts)$'",

View file

@ -2975,7 +2975,20 @@ jobs:
# T (typechange) included: a symlink->regular flip changes what
# the runner executes, so it is a changed test file exactly
# like M — excluding it silently drops the file from the gate.
git -c core.quotePath=false diff -z --name-only --diff-filter=ACMRT 'HEAD^1' HEAD \
# Diff against the base OID the "Pin agent inputs" step recorded
# while .git was still root-owned, never `HEAD^1` again: this
# step runs in the env -i scrubbed child, and resolving the `^1`
# parent there intermittently fails with "Could not access
# 'HEAD^1'" on the persistent pool — the shallow merge-ref object
# store is left in a state prior --depth=2 fetches made
# unreadable. The OID is content-addressed and needs no parent
# walk, so the diff works from the already-captured value.
BASE_OID="$(cat "${RUNNER_TEMP:?}/verify-base-oid")"
case "$BASE_OID" in
[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]*) ;;
*) echo "::error::No trusted base OID recorded; refusing to record the flakiness-gate file list."; exit 1 ;;
esac
git -c core.quotePath=false diff -z --name-only --diff-filter=ACMRT "$BASE_OID" HEAD \
> "$GATE_HOME/files-all"
# .mts/.cts included: vitest's default include set collects them.
# Only a no-match (status 1) may yield an empty list: a grep