v0.12.26

macro-inc/macrov0.12.26Aug 31, 2026by DmitriyG228

Upgrading?

AI Summary

This release improves Zoom integration with accurate speaker attribution and better admission reliability, along with enhanced error reporting.

Key Highlights

  • Per-participant speaker attribution replaces mixed-lane guesses.
  • Browser-signal hardening allows the bot to join more Zoom meetings.
  • In-meeting popups are dismissed during the call to prevent interference.
  • Join failures now report typed reasons and failure stages.

New Features

  • Per-participant speaker attribution
  • Improved Zoom admission
  • Dismissal of in-meeting popups
  • Typed reasons for meeting join failures

Full Release Notes

## v0.12.26

### Zoom
- **Per-participant speaker attribution (#1018, @jbschooley).** Zoom transcripts are named per participant with a self-correcting vote, replacing the mixed-lane guess. Maintainer hardening on top: the deaf-capture guard restored on the per-track branch, typed observations on the Zoom lane, and the page-side name resolver extracted into a tested module with a Speaker A/B fallback and a self-exclusion backstop.
- **Better admission (@jbschooley).** Browser-signal hardening lets the bot into Zoom meetings that previously refused it.
- **In-meeting popups are dismissed during the call (@jbschooley)** — the mic advisory, the AI-Companion notice and the hardware-acceleration toast no longer sit over the meeting or the recording.

> **Known limit — the Zoom bot joins as a web client, so not every Zoom meeting can be recorded.** Some Zoom accounts and meetings block automated browser clients outright; the bot is refused at the door there, ends as `failed` with reason `zoom_requires_rtms`, and no transcript is produced. This is a platform policy on the host's side, not a fault in the bot — those meetings need Zoom's Realtime Media Streams path, which this release does not ship ([#706](https://github.com/Vexa-ai/vexa/issues/706)). Meetings that do admit a web client are unaffected.

### Meetings
- **Join failures name themselves (#1075).** A failed join now records a typed reason, the stage it failed at, whether the cause was ours or the platform's, and how long it took — instead of one opaque `failed`. Visible on the meeting record and through the API.
- **Text-only custom STT responses reach the transcript (#1148).** OpenAI-compatible endpoints that return only `text` no longer have their output discarded for missing timestamps.
- **Voxtral / JSON-only transcription backends (#1342, @Cantfirmed).**

### Deployment
- **Noble base image for the bot, lite and full (#1011, @jbschooley).**
- **`DEFAULT_BOT_NAME` is honoured without rebuilding the terminal (#1258).**

### Fixed
- The probe's live-view listener re-sends its subscribe until acked (#1354) — it raced meeting-row creation and a refused subscribe was permanent.
- The full bot image builds again on the new base: `awscli` is no longer in the noble archive, so AWS CLI v2 installs from the vendor package.

---

**Images:** `vexaai/vexa-lite:v0.12.26` and the compose set (`v012-runtime`, `v012-meeting-api`, `v012-gateway`, `v012-admin-api`, `v012-agent-api`, `v012-agent-worker`, `v012-mcp`, `v012-terminal`, `vexa-bot`), published from the reviewed candidate packet `releases/v0.12.26/candidate-images.json` and validated by [run 33421145816](https://github.com/Vexa-ai/vexa/actions/runs/33421145816).

**In production:** this release is what vexa.ai runs, pinned as channel entry `0.12.23-estate-20260829-seq12` on 2026-08-31 and re-verified against the cluster after the pin.

Related Repositories