What shipped in aicanvas, newest first. Dates are release dates; the project is
pre-1.0 and unversioned, so entries are grouped by day rather than by tag.
2026-07-24 (hardening)
Added
- Failures now say so — an app-wide toast system. A denied mic permission,
a missing transcription relay, an unsupported browser, or a router outage
used to look identical: the Live toggle silently turning itself off.
Each now announces what happened and what to do about it. - The "Heard" panel — a toggle next to the composer opens the utterance
log: everything the mic heard, what the router did with each utterance
(goal / refine / correction / ignored as noise), and a one-tap "send
anyway" for words the assistant set aside. "Misheard", "misrouted", and
"broken" are finally three different, visible things. - Voice on the landing page — the mic controls now exist before the first
message does. Push-to-talk dictates into the composer; Live sends your first
utterance as the first message of a new chat. - Zero-token refinements — a spoken narrowing ("five stars or better")
that can be evaluated against the set already on screen now applies locally:
no model call, the narrowed set persists to the transcript with the same
query IR trust display, and soft preferences re-rank without dropping rows.
Widening, new fields, or possibly-truncated sets still go to the model. - Per-org daily ambient budget (
AMBIENT_DAILY_BUDGET_USD, default $5) —
enforced server-side, degrade-don't-fail: near the cap speculative dispatch
pauses (words land in the composer, with a toast saying so); at the cap
routing stops too. Speech is never dropped, and the utterance log keeps
recording. - Ambient instrumentation — the eight metrics the evaluation doc called
for (STT socket seconds, VAD false triggers, router intent mix and
confidence, speculative task outcomes, local-refine ratio, assumption
lifecycle, barge-ins) now exist in/api/metrics. - Golden gate, live —
pnpm run golden:livescores the intent router
against the real model with a printed scoreboard, the corpus grew to six
transcripts, and an admin export turns any real session's utterance log into
a draft golden fixture for review.
Fixed
- A restart no longer eats corrections. The dispatcher's per-context
constraint log is durable (amb_constraint_logs) and reloads on demand, so
"actually, not Toronto" still retracts after a deploy mid-session — it used
to silently do nothing. - Out-of-order routing race. Utterances now route and dispatch strictly in
spoken order per context; a slow-routed goal can no longer cancel and
overwrite the fast-routed refinement that followed it. - The trust rails no longer vanish. Assumption chips, the decision rail,
and the task ledger are on regardless of mic mode and repopulate on reload —
work running under an assumption is never invisible. Typing users get the
same rails as voice users.
2026-07-24
Added
- Duplex speech in chat — narrate mode (voice: speak) is now a two-way
conversation, not a monologue. Talk over a spoken reply and it stops
instantly, cuts the turn off, and records in the transcript how much you
actually heard ("You cut in — about 25% was heard"), so the assistant's own
memory knows not to build on the part you missed. And it speaks the delta,
never the data: a turn that just returns results — twelve hotels, say —
says "Found 12 places" instead of falling silent or reading the rows aloud.
Streaming TTS and echo cancellation (already shared with AI Meetings) carry
over, so first audio lands mid-sentence and laptop speakers no longer make
the mic interrupt itself.
Added
- Contexts — the goals you have in flight, each with its own transcript,
constraints, assumptions, and running work, shown as a rail above the chat.
Folding is not stopping: a folded context keeps working, and the spinner
on its chip says so. Branch a new goal off the current one and it inherits
what was already decided there — a short distillation, not the whole
conversation, so a long session never drags its history into everything
spun out of it. You can also just say it: "go back to the hotels" switches,
and "also plan an itinerary" branches while the hotels keep running. A
reference that doesn't clearly match a context is left alone rather than
guessed at. Contexts nobody has touched in a couple of weeks retire to
their summary and step off the rail — still there, just not in the way. - The decision surface — as your results narrow, a rail above the composer
offers the questions still worth asking ("Which neighborhood — Shibuya,
Ginza, or Shinjuku?"), and it asks a better one each time: fields that no
longer tell the remaining options apart drop out, and questions you keep
ignoring step aside for fresher ones. Every option is computed from the
results actually in front of you, so a pick can never filter down to
nothing. Answer by tapping, or just say it — "the lobby one", "the cheaper
option", "the second" all resolve against what's on screen, and an
ambiguous answer is left alone rather than guessed at. - Assumptions, visible and revocable — when you say "close to the
airport", the assistant picks a concrete airport and keeps working, and the
pick appears as a chip above the composer: what was assumed, on what basis
(something you said, your profile, or a bare guess — guesses are the loudest
chips), with one-tap alternatives. Confirm it, revoke it, or swap it;
revoking or swapping revises the in-flight work immediately. - Your profile (
/settings/profile) — durable facts the assistant may
use to resolve vague references and rank results: home city, preferences,
the airport you fly from. Everything it knows about you is on that page,
editable, nothing else — facts it inferred are visually distinct from ones
you stated, and your own words always outrank what it learned. - The promotion loop — an assumption you confirm (or simply never revoke
across a few conversations) becomes a profile fact automatically, so it
stops needing to be asked. Every promoted fact records which assumption
produced it. - Ambient speculation and the task ledger — in continuous dictation mode
the assistant now acts on what you meant, not on every pause: a confident
goal ("find me hotels in Toronto") starts work immediately, a burst of
refinements coalesces into a single revision after you stop talking for a
beat, and filler dispatches nothing at all. New work supersedes the
in-flight guesses it invalidates instead of queueing behind them. - Task ledger above the chat composer: every background task with live
status and its own stop button. Speculative work — started on a guess — is
visually distinct (dashed, sparkled), and a superseded guess reads
"Replaced", not "Failed". - Set transitions — result tables now animate their differences: entering
rows fade in, leaving rows fade out in place, surviving rows slide to their
new position. While a revision is in flight the current rows render as
provisional. Honors reduced-motion preferences.
2026-07-21
Added
- Shared workspaces — an organization can now have more than one member.
Owners invite teammates by email from/settings/org, assign them theowner
ormemberrole, and remove them again. An invitation sent to someone who has
never signed in is redeemed automatically the first time they log in. - Organization switcher in the header for anyone who belongs to more than
one workspace. The active organization lives in your session and is
re-checked against your memberships on every request.
2026-07-20
Added
- Dark mode — a light / dark / system toggle in the header, remembered in
your browser and applied before first paint. - Diagnostics page (
/admin/diagnostics, admin only) — process and memory
stats, feature-key presence, migration state, per-table row counts, live rate
limit buckets, open SSE connections, and recent errors. - Slow query log — queries over
SLOW_QUERY_MS(default 100ms) are logged
with the route that issued them, on both the Postgres and PGlite drivers. - Demo data —
pnpm run seedboots a populated workspace (schemas, objects
with mixed provenance, chats covering every block type, an ended meeting).
Fixed
- Removed two sources of flake in the end-to-end suite.
2026-07-19
Added
- Admin conversation log improvements: AI calls are attributed to the signed
in user, regenerated calls are marked superseded, the timeline stays live as a
chat progresses, backfill run outcomes persist, and latency percentiles are
shown alongside the averages.
Fixed
- Concurrent turns in a single meeting are now rejected instead of interleaving.
- Telemetry write failures surface instead of failing silently, and several
admin display gaps were closed. - The AI request snapshot captures the output configuration it was sent with.
Changed
- Slide image generation moved to
gpt-image-2.
2026-07-18
Added
- AI Meetings: multi-participant rooms — several AI personas take turns in
one meeting, chosen by a director each round, with real-time streaming
speech-to-text and AI-generated slide images.
Fixed
- Concurrent chat turns no longer duplicate regenerated objects.
- Deployment: repaired the migration client and a runtime crash on boot.
2026-07-13
Added
- AI payload storage is deduplicated, and admin payloads load on demand rather
than with the page.
Changed
- Model fallback arrays moved to Claude Sonnet 5.
Fixed
- Corrected AI cost telemetry, and closed a production fail-open on
/admin.
2026-07-12
Added
- Admin conversation log — a paginated view of conversations and the model
calls behind them, with request and response payload inspection.
2026-07-05
Initial aicanvas release: the typed AI workspace.
Added
- Object store — a schema registry with append-only versions, objects
carrying row- and field-level provenance, and chats. - Chat — a streaming loop that extracts typed objects from conversation, and
can define a new structure inline mid-chat. - Schema evolution — a schema side panel, plus add-a-column with backfill
across existing objects. - ObjectView — one schema-aware view shared by chat, the workspace browser,
and query results: table, cards, map, chart, and kanban. Sticky headers, row
striping, global search, enum filters, column visibility, grouping,
pagination, expandable rows, row selection, bulk actions, and double-click
cell editing. - Query surface — natural language compiled to a visible, editable filter
IR, with progress feedback while it runs. - Trust and export — cell provenance popovers, inline corrections, a CSV /
copy-all / print export menu, and a full JSON workspace dump. - Sign-in — a dedicated
/loginpage with Google OAuth. - Navigation progress bar, an escalating thinking indicator during long waits,
fade-in as chat blocks stream, and a Cmd/Ctrl+Enter send shortcut.