This release fixes three things a brand-new install was missing.
They were found by doing something that should have been routine and was not: cloning the public tag onto an empty database and running the documented install steps. On its very first run, the self-check added in 4.1.1 reported that a fresh install did not satisfy its own schema. Every check before that had run against a long-lived development database where the missing objects already happened to exist.
Upgrading
git pull
php sql/run_migrations.php
Docker: git pull && docker compose up -d --build
Fixed
responder_notes was created by no migration. Two endpoints created it on the fly just before writing, so saving a unit note worked. But three other places read it — including the Notes Log report — so on an install where nobody had written a note yet, those queries hit a table that did not exist. Lazy creation at the write site is not a schema; it is a table that exists only if you happened to use the right feature first.
permission_review_dismissals had the same problem, created on demand by the RBAC code. It is also one of the tables a user lost to crash recovery — and because nothing ever created it, no repair could put it back.
user_tfa.last_used_counter (two-factor replay protection) only appeared the first time somebody enrolled in 2FA.
The schema check missed tables it only reads. It covered tables written with an explicit column list, so a table the code merely reads from could be dropped without anything noticing. Of the four tables one user actually lost, only two would have been named. Coverage is now every table the code touches — 169 tables and 1011 columns, up from 128.
Verified
On a genuine fresh install — public tag, empty database, documented steps — the self-check passes.
Then, on that same install: dropping all four of the tables that user lost and running the ordinary php sql/run_migrations.php, with no flags, names all four, repairs them, and passes the re-check. A team saves afterwards through the real save path, and the Notes Log query works before any note exists.
Full suite 3605 passing, 0 failed.
Keeping up to date
git pull gets you fixes as they land. Short walkthroughs if git is new to you:
- Windows: https://youtu.be/uZl3teJMMHM
- Linux / macOS: https://youtu.be/Zczb4ypmDc8
Full changelog: CHANGELOG.md