Skip to content

fix(grading): stop autograder from silently crashing under bash 5#5

Merged
lassebenni merged 1 commit into
mainfrom
fix/grader-arithmetic-crash
Jul 12, 2026
Merged

fix(grading): stop autograder from silently crashing under bash 5#5
lassebenni merged 1 commit into
mainfrom
fix/grader-arithmetic-crash

Conversation

@lassebenni

Copy link
Copy Markdown
Collaborator

Summary

  • ((var += expr)) reports a failing exit status whenever the resulting arithmetic value is 0 -- a well-known bash gotcha. Combined with set -euo pipefail, the grader silently dies mid-run the moment a student's running score hits exactly 0 at a checkpoint (e.g. a mostly-empty early submission).
  • This only shows up on GitHub Actions' Ubuntu runners (bash 5+); it's invisible when testing locally on macOS (bash 3.2 ships without this strictness), which is how it went unnoticed.
  • Also guards bare check_*() helper calls (which legitimately return 1 to signal warn/fail, not a script error) with || true so they don't trip set -e either.

Test plan

  • bash -n .hyf/test.sh
  • Reproduced against an empty scaffold repo with GNU bash 5: exit code 1 before the fix, exit code 0 after.
  • Re-ran against a known-good local solution: score/pass output unchanged (regression-free).
  • Confirm a real PR run in CI now completes the "Run tests" step for a low/zero-scoring submission.

🤖 Generated with Claude Code

`((score += l1))`-style compound assignment is a false command in bash
whenever the resulting value is 0 -- exit status 1 even though the
assignment succeeded. Under `set -e` (used by every autograder here),
that silently kills the script mid-run on GitHub Actions' Ubuntu
runners (bash 5), while working fine locally on macOS (bash 3.2, which
does not enforce this). Any student whose running score hits exactly 0
at a checkpoint -- most commonly an early, mostly-empty submission --
got a grading run that failed with a bare "exit code 1" and no
score.json update, not a real 0 score.

Reproduced locally with bash 5 against an empty scaffold; confirmed
exit 0 after the fix, and re-verified real solution runs still score
correctly. Fix: rewrite every `((var += expr))`/`((var -= expr))` as
`var=$((var + expr))`, and guard bare check_*() calls that can
legitimately return non-zero (a warn/fail signal, not a script error)
with `|| true` so `set -e` does not treat them as fatal.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@lassebenni
lassebenni merged commit 67958bb into main Jul 12, 2026
@lassebenni
lassebenni deleted the fix/grader-arithmetic-crash branch July 12, 2026 21:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant