Nobody has started this yet — be first.
Business impact
A job's owner relies on chronos to tell the truth about whether their webhook actually did what it was supposed to. If a target returns an ambiguous or redirect-class status code and chronos silently marks it "succeeded," the job's owner has no signal that something needs attention -- no retry happens, nothing shows up as dead, nothing gets logged as unusual. This erodes trust in a scheduler specifically: the system is up and confidently wrong, which is worse for on-call because there's no alert to respond to.
Problem
pkg/executor/executor.go's Execute classifies a response as successful with if resp.StatusCode >= 200 && resp.StatusCode <= 300. The upper bound is inclusive, so HTTP 300 (Multiple Choices) counts as success. The standard definition of the "2xx success" class is [200, 300) -- 300 itself belongs to the 3xx (redirection) class and should be treated as a failure like any other non-2xx response.
Current behavior
A target returning exactly 300 makes Execute report Result.Success == true instead of false.
Expected behavior
Only status codes 200 through 299 inclusive should be treated as success. 300 and above should follow the normal failure path (retry with backoff, or dead-letter once max_retries is exhausted).
Steps to reproduce
Why this matters
This is a classic off-by-one on a range boundary -- the kind of mistake that's easy to introduce in a one-character edit (< to <=) and easy to miss in review because "300" doesn't look obviously wrong next to "200" at a glance.
Suggested approach
Compare the current condition against the standard definition of the 2xx status class. The fix is a single-character change to one comparison operator.
Acceptance criteria
Verification
go test ./tickets/tests/... -run TestTicket04 -v
Hints (0/2)
Try it without hints first — the reading is the exercise.
Working on this ticket
Work on a branch named for the ticket — that's what you'll submit.
Branch off your fork
Sign in to create it automatically, or do it yourself:
$git checkout -b fix/executor-status-boundaryFix it and commit
Meet every acceptance criterion, and add a test that would have caught this.
Push the branch
$git push -u origin fix/executor-status-boundarySubmit it below
Paste your fork URL and the branch name, with a short write-up of the root cause.
Questions
Ask about anything unclear in the ticket — the maintainer and anyone who has solved it can answer. Please don't post full solutions.
Sign in to ask a question or reply.
Sign inhttp://localhost:8081app-1http://localhost:8082app-2http://localhost:8090curl localhost:8081/healthzcurl localhost:8081/readyzWork the tickets in tickets/docs/ (ordered easy → hard); each names one Go test in tickets/tests/. Most tickets need a real Postgres (tickets 4, 11, and 18 are pure-function tests and do not):
export TEST_DATABASE_URL="postgresql://chronos:chronos@localhost:5432/chronos?sslmode=disable"
go test ./tickets/tests/... -run TestTicket08 -v # a single ticket
./tickets/run_tickets.sh # all 20, clean pass/fail summary
Use -race when working on tickets 15, 16, or 17 (the concurrency ones) -- run_tickets.sh already does this for every ticket. Tickets 15 and 16 are adjacent bugs in the same function (pkg/leader/leader.go's lock-release path); fix ticket 16 first, since ticket 15's test keeps failing for ticket 16's reason until that one is fixed too.
Level 1
Fix a bug
Read existing behaviour, correct it.