BBramaDocs

Brama changelog

Changelog

All notable Brama changes are documented here: what each release changed, why it changed, and what an operator has to do about it. Brama follows Semantic Versioning and the pre-one compatibility policy in RELEASE.md. This page is the index; the entries themselves are on the five pages below, newest first.

Older entries describe the contract as it stood at the time. Where a later change replaced it — most recently the route contract, under which an alias resolves to exactly one route — the entry says so and links the change that replaced it.

Unreleased

Unreleased changes holds the entries that are committed but carry no published release coordinate yet and do not concern the subscription pool:

  • a decision served by a chat route carries its answer's JSON Schema, sent on the OpenAI chat wire as a strict response_format named decision, so a route that decodes under it cannot write one question's label under another; the answer is still checked against what the caller declared;
  • brama subscription sign-in takes --by weles|hand, stated every time, and sign-in-manual is gone: signing an account in by hand is sign-in --by hand, with the same flags, paste on stdin and gateway options. The routes follow: POST /v1/admin/subscription-pool/sign-in requires "by": "weles"|"hand", the paste goes to …/sign-in/:sign_in_id, and …/sign-in-manual[/:sign_in_id] no longer exist; Brama Desktop sends the method on both of its sign-in actions;
  • brama subscription authenticator list and authenticator enrol replace second-factor and enrol-authenticator: one object, the authenticator behind each account's second factor, with the verbs that read and create it; inputs, output and refusals are unchanged;
  • a Claude Code grant travels in Claude Code's own shape - user agent, beta list, billing attestation and sentence - which is the only shape Anthropic honours it in for the newest models;
  • an omitted temperature is omitted on the wire too, instead of an invented 0.7 the newest Claude models refuse;
  • brama subscription import (since removed with held and sync, 0.4.4x) takes a grant any harness on the machine - omp, Claude Code, Codex CLI, Kimi Code - already holds, and every grant that reaches Brama without Weles is proved by a probe;
  • brama subscription sign-in-manual (now sign-in --by hand) signs a Claude account in through the operator's own browser and a pasted code, without Weles;
  • the manual sign-in no longer takes --code: the code is a credential and is read from stdin only, pasted or piped;
  • brama voices remove VOICE_ID --confirm and DELETE /v1/audio/voices/{voice_id}?model=… delete a voice from the deployment's account, beside listing and cloning;
  • an alias resolves to exactly one route, the registry document keeps schema_version, deployments and routes only, and brama routes migrate moves an existing registry file to that shape;
  • subscription plan usage replaces four invocations with POST /v1/plan-usage;
  • the subscription pool replaces eleven invocations with one capability and one leaf command;
  • the backend alias is the client's name, wisent-backend;
  • subscription usage and failure reporting across the CLI and Brama Desktop.

Unreleased: subscriptions and credentials holds the rest of the unpublished entries: the pool that sees every account the machine holds, the imports and sign-ins that fill it, the one vault listing every reader shares, the grant shapes Anthropic and Codex honour, and the readiness the gateway reports before its subscription sweep ends. One more is unpublished: the pool banks only real accounts' subscriptions, so re-banking an existing member whose vault item names no account, without naming one, is refused with account email address is required: the selected subscription names no account, and the pool holds only real accounts' subscriptions (pool membership; real journey tests/subscriptions/accounts/bank_requires_account.sh).

Unreleased: pool membership: the pool lists only the members the vault holds, and ids only the usage history remembers are answered apart under remembered, counted by nothing.

Published releases

Released 0.4.46 to 0.4.13 covers 0.4.46 (a gateway that signs itself in, with borrowed grants gone), 0.4.14 (image-aware best selection) and 0.4.13 (the Codex imports proved by a completion probe, and the concurrent catalogue discovery behind them).

Released 0.2.77 to 0.2.42 covers 0.2.77 (the managed backend identity derived from the required backend aliases), 0.2.76 (the managed launcher's aliases, and reviewing and adopting existing route configuration) and 0.2.42 of 2026-08-27, the large re-cut of 0.2.41 that carried streaming, the Anthropic Messages and OpenAI Responses ingress, plan usage read from the providers' own reports, credential refresh and classification, the readiness endpoints, and the archive that no longer ships a signing key.

Released 0.2.5 to 0.2.2 covers 0.2.5, 0.2.4 and 0.2.3 of 2026-08-05 — a shared HTTP client, routes-file validation on the snapshot path, and the desktop control plane — and 0.2.2 of 2026-08-04, which established the documented product contract: error codes, attempt bounds, request limits, public-surface versioning and immutable release provenance.

What a release coordinate means

A published coordinate is immutable, and a tag alone is not a release: a tagged revision whose release workflow did not finish leaves a coordinate with nothing installable behind it. The machine-maintained records are released-surface.json and the GitHub Releases list; release and support policy states how a version is chosen and how long it is supported.