v0.15.0

 ## Added
   - Minions register with the backend on startup and take no checks until the backend has a row
     for them. They send a heartbeat every 30 s. A minion the backend hasn't heard from in 5 minutes
     is marked expired, and it registers again on its next heartbeat
   - Minions report their own shutdown (with the signal) or panic (with the stack) when they
     deregister. The backend records registrations and expiries, and keeps every event in a history
   - Each uptime result records which minion ran it
   - The admin Minions page lists registered minions and the latest minion events, refreshed every
     30 s
   - `GET /api/minions/registered` and `GET /api/minions/events?limit=` (default 100, max 500), both
     WHITE or higher. `GET /api/minions/basic-stats` is a stub that returns 501
   - A Manage Graders button on the IR reports management page
   - Check forms hide settings that don't apply. Skip TLS verification only shows for an `https://`
     target, and `continue_on_failure` hides on optional chain steps
   - The HTTP check's URL must start with `http://` or `https://`. The form flags a bad URL once you
     leave the field

 ## Changed
   - `Round_Ledger` and `Round_Scores` are now `Uptime_Round_Ledger` and `Uptime_Round_Scores`
   - The backend, scheduler and minions retry Postgres and RabbitMQ with backoff (capped at 16 s)
     forever instead of exiting. A scheduler that loses its lock connection reconnects and competes
     for the lock again
   - Log names and log files are `<service>-<machine>-<instance>`. The instance is
     `HERMES_INSTANCE` (the Swarm task slot in prod), else the port the process holds, else the pid,
     so a replica keeps its log file across restarts
   - Swarm runs 10 minion replicas by default and updates them one at a time, stop-first. A minion's
     healthcheck only passes once it is registered and consuming checks
   - The database container creates the `hermes` database through `POSTGRES_DB`. The backend no
     longer creates it, and `just redeploy-ephemeral-postgres` sets `POSTGRES_DB` too
   - A minion waits for in-flight checks before exiting on a signal. A second signal exits right away
   - Default IR rubric is now 30 points for Professionalism and 70 for Accuracy of attack (fresh
     databases only)

 ## Fixed
   - Two processes starting together could be given the same port, because the port was probed and
     released before use. The process now keeps the listener it found
   - Editing a check swallowed every error except a 401, and creating a check didn't show the server's
     validation message. Both now show it
   - References to the old setup scripts now point at `just setup-environment`