Completed for GA

Capacity-tier session licensing — now operable from the console

The alpha shipped the Licensing page and said plainly that it "cannot yet
operate activation." It can now. Three defects stood between the page and a
working activation, all fixed:

  • The three licence routes were missing their /v1 prefix and returned 404
    on every call, so the page could not read status or fingerprint at all.
  • A trailing newline invalidated valid licences. A licence pasted from a
    text editor or downloaded to a file failed verification for a reason the
    operator could not see.
  • Activation itself did not work from the console — the shipped CLI carries
    the service key, while activation requires admin_only.

The page now reads status, shows the fingerprint, and activates a pasted or
uploaded licence. The capacity in force, and its provenance, are stated rather
than inferred from the number.

Full accounting — records now come from live traffic, and nothing waits on a browser

The alpha marked usage records a preview: held, downloadable and prunable,
but not produced from live subscriber traffic.

GA produces them. The console now runs a background drain that claims the controller's
accounting spool every 30 seconds, writes it to a durable SQLite ledger in one
transaction, and acks only after the commit lands. That ordering is the one
non-negotiable property in the design: a crash before the ack costs a harmless
re-drain, while a crash the other way destroys billing records permanently,
because the ack prunes them upstream.

Previously the browser consumed that queue. Records drained only when
someone opened a page, and the ack — which permanently removes what it consumes
— was driven from the UI.

The ledger holds immutable CDRs for completed sessions, a live row per open
session, and per-subscriber daily usage rollups, with a daily prune and a
scheduled export that exports what is about to be pruned rather than the whole
ledger every day.