Skip to content

Release v0.23.0#2374

Open
itomek wants to merge 1 commit into
mainfrom
v0.23.0-release
Open

Release v0.23.0#2374
itomek wants to merge 1 commit into
mainfrom
v0.23.0-release

Conversation

@itomek

@itomek itomek commented Jul 22, 2026

Copy link
Copy Markdown
Collaborator

GAIA v0.23.0 Release Notes

GAIA v0.23.0 is a large release built around making the Agent UI a real application instead of a developer tool with a browser front end. It can now install and update itself, walk a new user through hardware checks and model download on first launch, and run every agent as an isolated process supervised by a background daemon instead of code loaded into the UI. The email agent grows a full-autonomy mode that decides what to handle silently and what to ask about, and Outlook support extends to work and school accounts with a zero-setup sign-in flow. Underneath, every agent now shares one model and one context size so switching between them is instant, Lemonade Server moves to 11.0.0, and a dedicated security-audit pipeline replaces a general weekly pass with deterministic scanning plus reasoning over CWE-specific classes.

Why upgrade:

  • Install and update from inside the app — the Agent UI can install itself, pull updates from a real feed, and open gaia:// links from the website; a first-run wizard checks your hardware and downloads a model before you ever open a terminal.
  • The email agent can run your inbox for you (beta) — turn on autonomy and it files low-signal mail silently, always asks before anything destructive, and gets less chatty over time as it earns your trust — correct it once and it goes back to asking.
  • Outlook now works for work and school accounts — sign in with a short device code, no Azure app registration required.
  • Agents run as their own processes — each agent is a daemon-supervised sidecar instead of code living inside the Agent UI, so a scheduled job or a long chat outlives closing the window.
  • Switching agents is instant — every agent now shares one model and context size, so the Lemonade-side cold reload that used to cost seconds on every switch is gone.
  • A dedicated security audit — deterministic scanning plus a reasoning pass over specific vulnerability classes, feeding CVSS-scored findings into GitHub's private code-scanning tab instead of a public issue.
**Email autonomy is beta.** It only auto-executes reversible actions, each with undo, and the confirmation floor for anything destructive (send, forward, permanent delete, RSVP, quarantine) never relaxes — not even for a fully-trusted sender. It's genuinely useful, but it's new this release: watch what it does for the first few days rather than trusting it blind, and report anything that looks wrong. **This release moves a lot of the platform onto a new foundation.** Agents now run under an always-on `gaia` daemon, and the desktop app installs and updates itself in place. Both are built and tested, but this is the first release they ship in and they're still settling — so if a sidecar gets stuck or an in-app update doesn't apply cleanly, restarting the daemon (`gaia daemon stop`) or reinstalling the app are the fallbacks. Please report anything that looks off.

Breaking Changes

Closing the Agent UI no longer stops the email agent

Sidecar agents (currently email) are now supervised by the always-on gaia daemon, not the Agent UI backend process. Before, closing the UI killed the email sidecar along with it. Now the sidecar keeps running — so a scheduled briefing or a long-running job survives the window closing — and you stop it explicitly: gaia daemon stop-agent email or gaia daemon stop (PR #2144).

Hub agent packages moved to an agent-first layout

Hub packages used to be split by language first — hub/agents/python/email/ and hub/agents/npm/agent-email/ for the same agent. They're now grouped by agent first: hub/agents/<id>/{python,npm}/ (e.g. hub/agents/email/python/, hub/agents/email/npm/). The published wheel name (gaia-agent-email) and npm package name (@amd-gaia/agent-email) are unchanged — only the on-disk source paths moved. If you have local scripts, forks, or docs referencing the old hub/agents/python/<id>/ or hub/agents/npm/<id>/ paths, update them to hub/agents/<id>/<lang>/ (PR #2060). gaia agent init --layout hub was added afterward so scaffolding a new agent produces the correct layout in one command (PR #2295).

What's New

Install, update, and onboard without a terminal — Agent UI

The Agent UI shell had three install/update paths that either didn't exist or were dead stubs. Clicking install on a Hub agent used to hit an IPC handler that threw "not yet implemented"; now it drives the real backend install runtime with streaming progress, so importing an agent from the Hub actually works. Auto-update moved off a hard-wired GitHub Releases check onto a configurable R2 feed with a mutable channel pointer, and an app with no feed configured says so loudly instead of silently checking a dead URL. The website's "Open in GAIA" button now has somewhere to land: the app registers the gaia:// protocol and handles gaia://hub/install/<id> deep links on all three desktop platforms (PR #2196).

None of that helps if a new user doesn't know where to start, so first launch on a fresh machine now opens a wizard: it scans your hardware and gates on real capability (RAM, disk, NPU, GPU) instead of finding out at runtime, downloads the recommended model with visible progress and retry instead of swallowing a failed download, and offers to connect an account (Google, for email triage) before you ever reach chat (PR #2204). The in-app Hub itself is reorganized into Apps, Components, and Agents lanes, and every install now goes through a trust gate — anything that isn't AMD-verified requires an explicit override tick before it will install (PR #2201).

The email agent can decide for itself — full autonomy (beta)

Until now the email agent only ever acted when you asked it to. Turn on autonomy and it triages and files low-signal mail on its own, on an earn-trust gradient: cautious the first day, and progressively quieter for senders and categories that have proven themselves — correct it once and it's back to asking immediately. It never silently sends, forwards, permanently deletes, quarantines, or RSVPs; those always wait for your confirmation regardless of how much trust a sender has earned. Every auto-executed action is reversible and comes with undo (PR #2363):

POST /v1/email/agent/autonomy      {"level": "earn_trust"}   # "off" is the kill switch
GET  /v1/email/agent/autonomy/{id}                           # inspect earned trust

Outlook for work and school accounts — gaia connectors

The Microsoft connector was pinned to personal Outlook.com accounts only, so a work or school (Microsoft 365 / Entra ID) account was rejected before a token was even issued — and connecting required registering your own Azure app. It now defaults to the tenant that accepts both personal and work/school accounts, and adds a zero-setup device-code sign-in: enter a short code at a URL, no Azure registration, no redirect URI. Available from the CLI (gaia connectors connect microsoft --device) and as a "Sign in with a code" button on the Microsoft tile in the Agent UI. A related Windows-only fix means Outlook's longer refresh tokens no longer fail to save to Credential Manager (PR #2364).

Agents run as isolated, daemon-supervised processes

Agents used to run as code loaded directly into whatever hosted them — the email agent's sidecar lived and died with the Agent UI backend, and every future agent would have needed to reinvent that lifecycle plumbing. Now the always-on gaia daemon owns agent supervision: the UI, gaia email on the CLI, and gaia api are all thin clients of the same daemon-managed sidecar, so they share one running instance instead of each spawning their own. A killed daemon reaps its orphaned sidecars on the next start instead of leaking processes (PR #2144).

Behind that one architectural move: gaia email and gaia api now both relay through the daemon instead of running the email agent in-process (PRs #2191, #2205), chat streams over a proper SSE reverse proxy (PR #2188), a host-owned broker serializes model loads across agents so two sidecars can no longer race-evict each other's model out from under them (PR #2194), a per-agent-scoped custody API keeps one agent from ever reading another's memory or sessions (PR #2197), scheduled jobs (briefings, sends, snoozes) move onto one daemon-owned clock so they keep firing after the process that used to own them closes (PR #2199), OAuth tokens forward from the daemon to a sidecar as short-lived access tokens rather than the sidecar holding your refresh token (PR #2203), and existing ~/.gaia sessions and memory migrate into the new layout automatically, once, without data loss (PR #2200).

Every agent shares one model — instant switching

Agents that left their model unset used to default to a different model than chat and email, so moving between agents forced Lemonade to unload and cold-reload — measured at 7.9 seconds on a warm server. Every agent now resolves to Gemma-4-E4B at one context size per device profile, so the resident model is simply reused: three consecutive agent switches measured 0.00s each with the same llama-server process still running (PR #2284).

Lemonade Server 11.0.0

The pinned Lemonade Server moves 10.10.0 → 11.0.0 (PR #2130). This doesn't move existing installs — a machine already on a 10.x that clears every profile's minimum is left alone — but it fixes a version-check bug found while crossing the major boundary: GAIA compared Lemonade's major version for equality, so every 10.x install was about to start seeing a false "version mismatch" warning on every run, the exact opposite of what gaia init reported. The check is now a floor (10.2.0), not an equality check, so a newer server is never flagged as wrong.

A dedicated security audit

The weekly audit's single general security pass sampled a large repository in one go and missed a real path-traversal bug in hub archive extraction because it read an existing # noqa comment as a settled decision rather than re-checking it. A dedicated security-audit workflow replaces that: deterministic semgrep scanning across the whole tree feeds a private GitHub code-scanning tab, and a reasoning pass runs three specific lenses — path/injection sinks, authorization gate-asymmetry, and a from-scratch re-review of every existing suppression comment — over an explicit worklist instead of a sampled one. Findings are scored with real CVSS 4.0 arithmetic against a reviewed vector, not a guessed severity number (PR #2346).

Alongside the new audit, this release also closes out a batch of security hardening found by earlier passes: the file-read sandbox now actually enforces --allowed-paths (PR #2344), hub archive extraction is hardened against path traversal (PR #2342), the MCP bridge binds to loopback instead of all interfaces (PR #2246), the API's CORS policy no longer allows a wildcard origin with credentials (PR #2238), SQL is parameterized and sensitive values are redacted from logs (PR #2239), API errors no longer leak stack traces (PR #2236), and exposed routes are rate-limited (PR #2237). A new lint gate requires every future security suppression to be reviewed in an allowlist instead of silently accepted (PR #2343).

Agent Hub / infrastructure

A hub-installed wheel agent could be installed successfully and still fail to import in a fresh process, because installation only patched the installing process's own sys.path. That's now fixed generically for every wheel agent, and gaia init can install the chat agent from the Hub catalog when it's missing (PR #2373). This is infrastructure, not a finished user path: chat's own publish to the Hub catalog is a separate, still-pending step, so a plain pip install amd-gaia still doesn't give you a working gaia chat yet — that milestone stays open until the publish lands and is verified end to end.

Elsewhere in the Hub: agent packages are catalogued with a manifest type discriminator so an app, component, or agent can be told apart before install (PR #2183), and file-based custom agents now report their real health in the UI instead of always showing "error" (PR #2277).

Agents propose their own next steps

The base Agent class gained the hooks its autonomy work is built on: on_heartbeat/propose, letting an agent surface an approval-gated suggestion for something it thinks should happen next, instead of only ever reacting to a prompt. The email autonomy engine above is the first concrete consumer (PR #2187).

Bug Fixes

  • Bulk gaia agent init scaffolding put files in the wrong place after the hub layout move (PR #2295) — --output had no way to produce the new agent-first layout, and could even set the agent's id to the literal string "python".
  • Lemonade device validation didn't recognize grouped GPU device keys (PR #2368) — amd_gpu/nvidia_gpu now returning as lists broke hardware capability checks.
  • A missing hub-installed agent binary produced a confusing error (PR #2357) — the message now names what's missing and how to fix it instead of a generic failure.
  • gaia init output ate bracketed text (PR #2340) — Rich markup parsing swallowed tokens like [some-model] from status lines instead of printing them.
  • Unknown-language routing killed the process (PR #2337) — an unrecognized language now defaults to TypeScript instead of crashing.
  • GPU wasn't detected on every platform (PR #2244, #2285) — detection now reads Lemonade's real payload shape and honors default_device everywhere.
  • The builder agent returned a generic error for a missing model (PR #2245) — a 404 from Lemonade now surfaces as a specific "model not found," not boilerplate.
  • The Agent UI blamed Lemonade for turns the user cancelled (PR #2141) — a cancelled or empty turn is no longer reported as a backend failure.
  • Stop didn't actually stop generation (PR #2166) — clicking Stop now aborts the in-flight streaming turn instead of leaving it running in the background.
  • Outlook inbox pre-scan failed with more than one mailbox connected (PR #2129) — pre-scan now consolidates across every connected mailbox instead of erroring.
  • REST triage ignored the model's own spam verdict (PR #2125) — the endpoint now honors what the LLM actually decided instead of a narrow sender-based check.
  • Outlook thread fetches could fail with a Graph API error (PR #2140) — an unnecessary $orderby triggered Microsoft Graph's InefficientFilter rejection on some threads.
  • Calendar listing without an explicit date range returned nothing useful (PR #2168) — it now defaults to a forward-looking window.
  • Explicitly targeting an unconnected mailbox silently used a different one (PR #2172) — it now errors instead of substituting.
  • A model-load failure could fail silently (PR #2185) — _ensure_model_loaded now raises loudly instead of swallowing the error.
  • The amd-gaia[agents] extra could downgrade the core wheel (PR #2262) — pip's resolver could pull in an older core package than the one already installed.

Contributors

Thanks to the community member who contributed to this release:

  • @alexey-tyurin — adaptive, review-gated onboarding conversation for agent memory (PR #2143)

Full Changelog

106 commits since v0.22.0:

Full Changelog: v0.22.0...v0.23.0

Release checklist

  • util/validate_release_notes.py docs/releases/v0.23.0.mdx --tag v0.23.0 passes
  • cd docs && npx mintlify validate passes (v0.23.0 parses clean)
  • src/gaia/version.py0.23.0
  • src/gaia/apps/webui/package.json0.23.0
  • src/gaia/apps/webui/package-lock.json0.23.0
  • Navbar label in docs/docs.jsonv0.23.0 · Lemonade 11.0.0
  • All 106 commits in range (v0.22.0..HEAD) represented in the notes
  • Community contributors credited (@alexey-tyurin)
  • Review from @kovtcharov-amd addressed

@itomek
itomek requested a review from kovtcharov-amd July 22, 2026 00:40
@github-actions github-actions Bot added the documentation Documentation changes label Jul 22, 2026
@itomek
itomek marked this pull request as ready for review July 22, 2026 01:02
@github-actions

Copy link
Copy Markdown
Contributor

Verdict: Approve

This is the v0.23.0 release PR — version bump plus the release-notes page and nav wiring. I verified the mechanical parts a release depends on and they all line up: the version is bumped consistently everywhere, the Lemonade 11.0.0 pin matches what the notes claim, the release-notes validator passes clean, and the new page is wired into the docs navigation. The notes themselves read clearly and flag the beta/first-ship caveats honestly. Nothing blocking.

🔍 Technical details

Verification performed

  • python util/validate_release_notes.py docs/releases/v0.23.0.mdx --tag v0.23.0 → ✅ validated successfully.
  • Version consistency: src/gaia/version.py:__version__ (version.py:9), package.json, and package-lock.json (both top-level + packages[""]) all move 0.22.00.23.0. No stragglers.
  • Lemonade pin: notes claim "10.10.0 → 11.0.0"; src/gaia/version.py:12 already has LEMONADE_VERSION = "11.0.0" (set in chore(deps): bump Lemonade Server to v11.0.0 #2130), so the notes are consistent with the shipped value — this PR correctly does not re-touch it.
  • Nav wiring: docs/docs.json adds releases/v0.23.0 to the Release Notes group and updates the navbar label to v0.23.0 · Lemonade 11.0.0. New MDX file present and referenced.
  • docs/releases/index.mdx does not enumerate individual releases, so no update needed there.

Issues

  • None blocking. No security, correctness, or convention concerns — the change surface is version strings, one new docs page, and two JSON nav lines.

🟢 Minor (nit, optional): the frontmatter description in docs/releases/v0.23.0.mdx:30 is a single ~90-word sentence. It's used as the page meta description, so a tighter one-liner reads better in search/preview — matches how earlier release pages keep it short. Not worth blocking on.

Strengths

  • Notes lead with user-observable impact ("run your inbox for you", "instant switching", "install without a terminal") rather than a commit dump, and the two <Note> blocks are honest about the beta/first-ship risk and the fallbacks — exactly the right tone for a foundation-shifting release.
  • Breaking changes are called out up front with concrete migration guidance (the hub/agents/<id>/<lang> path move, the gaia daemon stop-agent email lifecycle change).
  • Release mechanics are complete and self-consistent — the checklist items are actually verifiable and I confirmed the important ones pass.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Documentation changes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant