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
/v1prefix 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 requiresadmin_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.