Skip to content

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

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#10
lassebenni merged 1 commit into
mainfrom
fix/grader-arithmetic-crash

Conversation

@lassebenni

Copy link
Copy Markdown
Contributor

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>
@github-actions

Copy link
Copy Markdown

📝 HackYourFuture auto grade

Assignment Score: 47 / 100 ❌

Status: ❌ Not passed
Minimum score to pass: 60
🧪 The auto grade is experimental and still being improved

Test Details

=== Week 9 Autograder ===
  ✓ PASS  found validation_queries.sql
  ✓ PASS  found schema_setup.sql
  ✓ PASS  found data_dictionary.md
  ✓ PASS  found verification_results.sql
  ✓ PASS  found AI_ASSIST.md
  ✓ PASS  Level 1: required files (10/10 pts)
  ✗ FAIL  validation_queries.sql: file is empty or still contains unfilled TODO stubs
  ✓ PASS  Level 2: Task 1 validation queries (0/20 pts)
  ✓ PASS  schema_setup.sql: file filled (no stub TODOs)
  ✓ PASS  schema_setup.sql: vw_dim_zones view defined
  ✓ PASS  schema_setup.sql: vw_fact_trips view defined
  ✓ PASS  schema_setup.sql: negative fare filter (fare_amount >= 0) present in vw_fact_trips
  ✗ FAIL  schema_setup.sql: vw_fact_trips must cast pickup_datetime as TIMESTAMP (pickup_datetime::TIMESTAMP) — required for time-pattern queries in Task 4 (Task 2)
  ✓ PASS  Level 3: Task 2 star schema views (22/30 pts)
  ✓ PASS  data_dictionary.md: file filled (no stub TODOs)
  ✓ PASS  data_dictionary.md: 'Grain' heading/label present
  ✓ PASS  data_dictionary.md: primary key documented
  ✓ PASS  data_dictionary.md: measures list includes at least one aggregatable column
  ✓ PASS  Level 4: Task 3 data dictionary (15/15 pts)
  ✗ FAIL  verification_results.sql: file is empty or still contains unfilled TODO stubs
  ✓ PASS  Level 5: Task 4 verification queries (0/15 pts)
  ✗ FAIL  screenshot missing: /home/runner/work/c55-data-week-9/c55-data-week-9/assignment/assets/borough_count.png not found
  ✓ PASS  Level 6: borough screenshot (0/5 pts)
  ✗ FAIL  AI_ASSIST.md: file is empty or still contains unfilled TODO stubs
  ✓ PASS  Level 7: Task 5 AI log (0/5 pts)

Score: 47 / 100  (passing: 60)  pass=false

@lassebenni
lassebenni merged commit e563133 into main Jul 12, 2026
1 check failed
@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