Skip to content

Changelog

What's shipped in aicanvas, newest first.

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, livepnpm run golden:live scores 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 the owner
    or member role, 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 datapnpm run seed boots 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 /login page 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.