v0.12.25
Maintenance release: everything merged since v0.12.23 (v0.12.24's lite/compose images were never published — its tag predated the release-commit convention; this release closes that gap too).
Added
- Meeting participants read —
GET /meetings/{platform}/{native_meeting_id}/participants, rows labelledinvite/speaker, owner-scoped, with an honestobserved_roster: "not_recorded"marker (#451). - Teams passcode joins — numeric Teams id +
passcodenow builds the real…/meet/<id>?p=<passcode>URL; unknown aliases are a typed422; the passcode stays out of stored URLs and logs (#892). - Sized spawned pods — bot and agent-worker pods declare CPU/memory requests + limits via
runtime.workloadResources, so quota-controlled namespaces admit them (#1005). - MCP
report_issue— an agent can file a ticket from inside its session, bound to the cluster's record of the same meeting (#1272).
Changed
- One API home for interactive acts —
POST …/actsper ADR-0035; speak/chat kept as aliases; screen/avatar retire fromapi.v1; the status page stops overstating speak (#1089). - Meetings list ordered by event time, active meetings pinned to the top (#1226).
Fixed
- Capture-fault ≠ empty room — a bot whose audio capture breaks mid-meeting no longer ends a live meeting as
completed(left_alone); it logs a suspected capture fault and attempts a restart (#1192). - Restart mid-leave no longer strands meetings in "stopping" (#1280).
- Text-only STT hardening — the transcription client tolerates JSON-only/Voxtral-style engines (#1149, #1343).
- Terminal honors
DEFAULT_BOT_NAMEwithout a rebuild (#1259). - Gate failures print their diagnostic — empty stdout Buffer no longer swallows the real error at 21 call sites (#1107).
Delivery evidence
Validated at station t25-01225 (vexa-stations: battery, row-0 image-ID proofs, live-meeting run, five promise-exercises, full-green lite probe S0–S8). Production runs this train as channel entry 0.12.23-estate-20260829-seq11 (cosign-signed, verifier verdict ELIGIBLE).