title: Carry out a long milestone whose steps build on each other check: python -m pytest -q .bench_check plan: | Milestone 1: add due dates to the task tracker. Run `python -m pytest -q` after each step; every test must still pass before you start the next one. Use `datetime.date` for dates throughout. 1. `tracker/models.py`: add a field `due: date | None = None` to `Task`, after `done`. 2. `tracker/storage.py`: `save` writes `"version": 2`, and each task's `"due"` as an ISO string ("2026-10-01") or null. `load` reads version 1 files (their tasks have no "due"; use None) and version 2 files. Any other version raises `ValueError("unsupported tasks file version: N")`, with N the version found. 3. `tracker/core.py`: `add_task` takes a keyword argument `due: date | None = None` and stores it on the new task. 4. `tracker/core.py`: change `sort_tasks` so that tasks not done come before tasks done; within each of those two groups, tasks with a due date come first, earliest due date first, then tasks without one; ties are broken by id. 5. `tracker/core.py`: add `overdue(tasks: list[Task], today: date) -> list[Task]`: tasks not done whose due date is before `today`, in `sort_tasks` order. 6. `tracker/formatting.py`: `format_task` takes a second argument `today: date`. A task with a due date gets " (due 2026-10-01)" after its title. An overdue task (as in step 5) shows `[!]` instead of `[ ]`. Examples: "[ ] 3 Buy milk", "[x] 4 Call Bob (due 2026-10-01)", "[!] 5 Pay rent (due 2026-09-01)". 7. `tracker/cli.py`: pass today's date to `format_task`. Today is the `TRACKER_TODAY` environment variable (YYYY-MM-DD) when it is set, else `date.today()`. `add` gains an option `--due YYYY-MM-DD`; an invalid date must call `parser.error("invalid --due date: VALUE")`, which exits with status 2. `list` gains a flag `--overdue` that lists only overdue tasks. 8. Add tests under `tests/` for each of steps 1-7, run `python -m pytest -q` until everything passes, then check the whole flow by running: `TRACKER_FILE=/tmp/tracker-check.json TRACKER_TODAY=2026-10-05 python -m tracker add "Pay rent" --due 2026-10-01` then the same with `list --overdue`, which must print `[!] 1 Pay rent (due 2026-10-01)`. Delete /tmp/tracker-check.json before and after. 9. Call finish.