scripts/run_lint_gates.sh derives its command list from test.yml literally. #8928's step is backslash-continued:
python3 scripts/ci_cargo_test_shard.py --package perry \
--total-shards "\${{ fromJSON(needs.plan.outputs.plan).cargo_test_perry.total }}" \
--validate
Locally the expression is not substituted, so the gate runs with --total-shards "" and fails with invalid int value: ''. The gate itself is fine — --self-test passes and --validate exits 0 for every valid total (2, 4, 6).
Why it is worth fixing: the runner now reports 1 of 57 FAILED for everyone, permanently. A local gate runner that is always one-red trains people to skim past reds, which is precisely the habit this script exists to prevent — its own header documents two occasions where hand-picked gate runs let main go red.
Why the obvious fix does not work: the extractor emits only the first line of a multi-line run:, so the \${{ never appears in the extracted command and a filter on the extracted text cannot see it. The fix has to join backslash continuations first, then skip commands containing \${{ (naming them as skipped, not hiding them). That edit lives inside the script's quoted heredoc, which is easy to break — I tried and backed it out rather than ship something unverified.
Found while batch-merging #8926/#8927/#8928.
scripts/run_lint_gates.shderives its command list fromtest.ymlliterally. #8928's step is backslash-continued:Locally the expression is not substituted, so the gate runs with
--total-shards ""and fails withinvalid int value: ''. The gate itself is fine —--self-testpasses and--validateexits 0 for every valid total (2, 4, 6).Why it is worth fixing: the runner now reports
1 of 57 FAILEDfor everyone, permanently. A local gate runner that is always one-red trains people to skim past reds, which is precisely the habit this script exists to prevent — its own header documents two occasions where hand-picked gate runs letmaingo red.Why the obvious fix does not work: the extractor emits only the first line of a multi-line
run:, so the\${{never appears in the extracted command and a filter on the extracted text cannot see it. The fix has to join backslash continuations first, then skip commands containing\${{(naming them as skipped, not hiding them). That edit lives inside the script's quoted heredoc, which is easy to break — I tried and backed it out rather than ship something unverified.Found while batch-merging #8926/#8927/#8928.