3.18.0

Policies and handbook sections can now be saved with the data tables as the main copy and WordPress rewritten from them, behind a switch that is off everywhere and turned on nowhere in this release. Nothing changes on a site until someone turns it on, and every old table keeps receiving rows so a rollback loses nothing.

  • Added Every policy write goes through one save path. It is proved identical to the old writers on stored data, so a screen, an import and a command line save a policy the same way.
  • Added `wp kenii authority policy` reports, turns on or turns off the write switch for policies. Turned on, a save is planned and checked in the tables first, then WordPress is rewritten from them. It refuses to turn on while any condition fails and names the one that does.
  • Added `wp kenii shell heal –entity=policy` rewrites a policy post from its row in the tables. It does nothing without `–commit`, and says how many posts it compared.
  • Added `wp kenii store health` reports the policy switch, and whether the tables, the posts and the old meta agree, with counts.
  • Added `wp kenii rollback-prepare –entity=policy` returns offline and discontinued policies to a status the previous release can hold, turns the policy switch off and forgets the read verdict, so going back to the older release is safe.
  • Added The data tables can hold a policy that is offline or discontinued, and the source id and source address of a policy. Core schema version 36.
  • Added The old tables keep receiving the rows that now go to the data tables (the legacy echo), and `wp kenii legacy-echo` compares them and copies what was missed.
  • Changed Handbook sections and policies sort by position, then title, then id on every page and screen, so two policies at the same position never swap places.
  • Changed The admin library is Kenii UI 2.2.1. Icons inside library components change from Lucide to Phosphor, table cells line up under their column headers, and the neutral admin grounds come from the library.
  • Changed A proposal comment shows the time it was written in UTC, not in site time.
  • Fixed Cloning a handbook into a year that already holds the clone answers with a clear refusal instead of an error.
  • Fixed Reading the next id of a table on MySQL 8 no longer returns a stale value.
  • Fixed The board meeting types and the redirect list are held as rows in the data tables, and a mirror that stops part way reports what it refused.