# PR Review Checklist

Walk this list before you click "Approve". If anything is unchecked, leave a comment instead.

## Scope

- [ ] PR does one thing — title describes that thing in one line
- [ ] No drive-by refactors mixed with the change
- [ ] Diff fits in your head (< 400 lines, or split)

## Correctness

- [ ] Acceptance criteria from the linked ticket are met
- [ ] Edge cases handled: empty input, max input, concurrent calls, network failure
- [ ] Off-by-one and timezone bugs ruled out
- [ ] Error paths return useful errors, not silent failures

## Tests

- [ ] New code has tests — at least one per acceptance criterion
- [ ] Tests assert behaviour, not implementation
- [ ] Tests would actually fail if the code regressed
- [ ] No `skip`, `xit`, `it.only`, or commented-out assertions

## Readability

- [ ] Names describe intent, not type or position
- [ ] Comments explain WHY, not WHAT
- [ ] No magic numbers, no copy-pasted blocks
- [ ] Public APIs documented

## Security

- [ ] User input validated at boundary
- [ ] No secrets / tokens / keys in code or tests
- [ ] Authorization checked, not just authentication
- [ ] No new SQL injection / XSS / SSRF surface

## Performance

- [ ] N+1 queries ruled out (count queries in tests)
- [ ] No unbounded loops or unbounded result sets
- [ ] Indexes added for new query patterns
- [ ] Heavy work backgrounded, not in request cycle

## Operations

- [ ] Migrations are reversible (or explicitly forward-only)
- [ ] Feature flag added for risky changes
- [ ] Logs / metrics added for new flows
- [ ] Runbook / docs updated if behaviour changed

## Approve / request changes

- **Approve** if every box is checked
- **Request changes** if any blocker is unchecked
- **Comment** if you have suggestions but no blockers

---

Definition of Done glossary: https://sprintflint.com/glossary/definition-of-done
