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`