3.11.0
Four repairs for things that had no way to fix themselves: a note that outlived its problem, a calendar missing from the catalog PDF, programs never joined to the ones they were copied from, and a column the design had dropped.
- Added `wp kenii store recheck` now looks at notes saying the tables refused a record, not only at writes that failed. It clears one only when the table really holds the row, nothing would refuse it today, and it matches WordPress. Anything still refused is named with the reason.
- Added `wp kenii repair term-years` gives a term the catalog year it names, and fills in the written year from the tag when that is the half missing. It refuses when the two disagree, when a term carries neither, when more than one year is tagged, and when no catalog year of that name exists yet.
- Added `wp kenii repair program-lineage` joins a program copied into a new catalog year to the one it was copied from, matching on both the name in the address bar and the title. It refuses a rename, a missing original, a copy named for the wrong year, a line already taken in that year, and anything circular. Two programs sharing a name where neither is a copy are reported for a person to judge.
- Added `wp kenii schema retire-columns` removes a column the design has dropped, and only when asked. It refuses while the column is part of any index or key, while the move it belongs to is unfinished on that site, and while any record is marked there and nowhere else, saying how many.
- Fixed A term carried its academic year in two places and the editor only ever set one of them, so a year's calendar could show on the site and be missing from the catalog PDF. Saving a term now works the tag out from the year it names, and refuses a year that does not exist instead of quietly creating a catalog year by that name.
- Fixed The check that decides whether a kind of record may read from the tables counted refusals that had already been dealt with. A cleared note could be dropped to make room and a new refusal would then not raise the count, leaving reads open on a record that shows on neither the page nor the admin list. It now counts only refusals nobody has dealt with.
- Fixed Making room in the list of notes had stopped protecting writes that never reached the tables, and notes that only record what happened could trip the shutdown that closes reads across a whole site. Room is now given up in order, oldest settled history first.
- Fixed A refusal that came back after being cleared was swallowed by its own cleared ancestor, so a problem returning went unrecorded.
- Fixed A note written while a recheck was running was overwritten when the recheck saved its own older copy of the list.