v0.786.31Latest/day never crashes on a null Supabase clientJul 22, 2026
Unsigned or null-client visits to /day now redirect to login or show a Sign in to see your day empty state — never the Something went wrong error boundary.
Matches the /tasks honesty pattern: no fetchSpineSnapshot call without a real client.
v0.786.30GI logging follows the live confirm pathJul 22, 2026
Health action requests now route directly to the symptom-log proposal instead of the health-record read path.
Tai no longer calls the GI log read-only when the solo-confirm tool is live; the populated card carries only the fields Tony stated.
The safety boundary is unchanged: no health row is written until Tony taps the exact T2 confirmation card.
v0.786.29Symptom drafts reach the mandatory-confirm cardJul 22, 2026
Asking Tai to log a GI symptom now creates the populated review card even while the broad write-tool ceiling stays off.
The health entry remains T2: nothing writes inline, voice cannot approve it, and only Tony's exact card tap can execute it.
A dedicated symptom-action kill switch can still disable even the proposal without enabling any unrelated sensitive action.
v0.786.28SSDI voice status no longer waits on unrelated recordsJul 22, 2026
Disability-shaped voice questions prefetch only the authenticated owner's disability claim rows instead of running the entire life resolver before the model can answer.
The narrow query keeps the existing RLS boundary and shared deterministic disability composer; mid-turn record lookups still retain the complete resolver ladder.
Regression tests pin both the honest no-record answer and grounded live-claim behavior while the production browser gate retains its 15-second tripwire.
Harden migration 0119 the same way 0121/0128 were: self-heal stray hypothesis domains, then re-add the CHECK as NOT VALID so full-chain re-runs cannot 23514-wedge every later migration.
Closes the last named schema landmine from MIGRATION_WEDGE issue 2392 (the AT&T phantom autopsy class).
v0.786.26Your voice pick follows you to every deviceJul 22, 2026
Choosing a voice in Settings now saves to your account, not just this device.
Web, phone, and Apple TV read the same saved pick on launch; newest choice wins.
v0.786.25Grounded voice answers stop hauling unrelated text historyJul 22, 2026
Bills, disability, court, medication, and calendar questions no longer load up to 800 private message rows before the deterministic answer can run.
Direct text and iMessage questions retain the same bounded message depth; the resolver ladder, grounding, and fact guard are unchanged.
The production SSDI voice regression is pinned by a query-budget test and the existing 15-second browser tripwire.
v0.786.24Gracie meds Mark refilled actually writes on first tapJul 22, 2026
Home Needs you Gracie refill control is Mark refilled again (never a bare Retry) and POSTs /api/gracie with the canonical med id on the first tap.
Removed the proposeTapAction detour that only minted a confirm card and left the row looking dead when the second confirm never completed.
Owner precedence for tai_pet_meds over rx_tracker is unchanged -- the durable write still goes through refillGracieMed.
v0.786.23Phone voice no longer gets trapped in a stale TV roomJul 21, 2026
TV microphone mode now requires both a live phone-room heartbeat and a current Apple TV state report; old pairing keys alone can never silence phone voice.
Whenever the bridge is active, Tai persistently says “Phone is the TV microphone,” identifies Apple TV as the reply surface, and offers a one-tap Use this phone exit that clears the pairing.
The voice badge and status distinguish the text-only TV microphone bridge from a live local Realtime conversation, and local output is labeled as system-selected instead of claiming an unverified AirPods route.
v0.786.22Notifications redesigned for a phone, not an engineerJul 21, 2026
Every push routes through a single composition layer: plain-English title and body, one clear action, and a Tai deep-link - never PR numbers, exit codes, or GitHub links.
Severity tiers: only must-act items interrupt (legal, medical, decisions); same-kind alarms collapse into one digest; hourly overflow becomes a quiet summary.
Stranded-work and other engineering monitors keep detecting, but no longer reach the lock screen (the 48-alarm flood path is silent).
v0.786.21Games night: Night Runner, leaderboards, heist floorsJul 21, 2026
Gracie Chicago Nights gets Night Runner - a maze night with pellets, squirrel ghosts, and per-level escalation.
Both games post to shared family leaderboards (top 20, initials, no accounts required on family devices).
Capone Vault opens its lower heist floors, and every game got a 60fps feel pass - fixed-timestep loops, better touch, reduced-motion respected.
v0.786.20TV calendar feedJul 21, 2026
New owner-gated GET /api/calendar/upcoming for the TV canvas - same canonical calendar query the modules use, plus an honest available flag so an empty day is never confused with a failed read.
v0.786.19TV bills feedJul 21, 2026
New owner-gated GET /api/bills serving the TV finance canvas from the exact canonical bill reader /money already uses - read-only, fail-soft, no new data paths.
v0.786.18Remote diagnostics: every app can ship its logsJul 21, 2026
New owner-gated /api/client-log: apps POST batched log entries (level-validated, size-capped, append-only) and the cockpit reads them remotely - the first piece of the see-the-problem-without-touching-the-device system.
Browser-safe fire-and-forget shipper (lib/diagnostics/shipLogs) ready for the PWA and TV apps to adopt.
Saying pull up the menu, show the cubs, show my lights, or pull up my reservations on the Apple TV now deterministically opens the right module.
All new destinations are verb-gated: conversational mentions (did the cubs win?) stay questions and never hijack navigation.
v0.786.16One call voice everywhere: the preset now follows your accountJul 22, 2026
The live-call voice you pick in Settings used to live only in a browser cookie, so the Apple TV - which signs its voice sessions with a token, not cookies - always fell back to the default and never matched your phone. Picking a voice now also saves it to your account (new owner-only table, migration 0142).
The session mint resolves the voice as: valid cookie, then your stored account preference, then the env default - with both sources validated against the same four-preset allowlist. TTS timbre only; instructions, mint ladder, and flags are untouched.
Unit tests pin the precedence: cookie beats stored, stored beats default, and an invalid stored value falls through instead of breaking the call.
v0.786.15Changelog repairJul 21, 2026
Adds the release notes that 0.786.14 shipped without (the version bump landed alone, which turned the changelog-consistency unit test red on main). No app behavior changes.
v0.786.14Fly escape hatch: commit-verifiable builds on tai-webJul 21, 2026
The Tai Dockerfile now accepts TAI_BUILD_SHA/TAI_BUILD_BRANCH build args so /version.json on tai-web.fly.dev serves the real deployed commit instead of nosha — the SHA-verification DONE gate can finally close on the Fly instance.
tai-ci typecheck gets a bigger Node heap (tsc was dying of out-of-memory on every run, keeping CI red on main).
New shared @tony/core voice-cadence module: a pure, deterministic SHADOW of the voice think-vs-answer contract (a fixed precedence ladder over app-injected signals), plus a contract-as-data table that a test cross-checks against the realtime instructions prose so the two can never silently drift again.
Makes the today-invisible freelance rate a number: a client beacon records, per turn, whether the model answered itself or routed to the deep brain, and flags the one case that matters most (a life or live-fact answer the model freelanced instead of routing).
Lays a warmer non-blocking bridge: the already-out-of-band still-with-you interim can become a per-topic line at a per-topic threshold, without ever touching the single completion guarantee that voices the real answer.
All three flags (measure, bridge, contract) ship OFF: this release is a byte-for-byte no-op on current voice behavior. Tai-only this pass; TOMAI/Apple TV adopt the same core later.
v0.786.12Gmail brain feeds un-staleJul 21, 2026
Cloud feeder now runs the correspondence and attachment (matter + personal) Gmail importers that were defined but never scheduled off-Mac, so those feeds stop looking permanently dead.
The email-calendar and email-watch cron routes dual-write their source-status heartbeat under the name the brain actually tracks, and the live inbox pipe dual-writes a correspondence heartbeat so a quiet matter window doesn't read as stale.
Fixed a real masking bug: that live-pipe heartbeat was unconditionally stamping gmail:correspondence as 'ok' even with zero matter rows, which could silently overwrite the deep importer's honest 'error' status within about 30 minutes. It now checks the existing status first and leaves an error standing until the deep importer itself recovers.
v0.786.11Local Codex jobs claim their release scope before editingJul 21, 2026
The reusable local Codex job pool can now reserve exact release versions and path scopes with a TTL, so a competing worker stops before it starts editing the same target instead of colliding mid-job.
v0.786.10Gracie's refill Retry button now actually worksJul 21, 2026
Tapping Retry on Gracie's medication refill card used to do nothing, because the refill action only carried her medication's name, not its canonical record id. The pulse card, the health glance, and the refill log now all pass the exact medication id through, so the retry writes to the right row every time.
v0.786.9Tai stops denying she can hand off living-room mediaJul 21, 2026
The TV surface already sends songs and music videos to Apple Music and opens provider searches before Tai's turn even runs — she now knows that, so she stops claiming she can't play or open media on the living-room screen. Netflix's own AirPlay/mirroring block is still named honestly instead of being confused with a Tai limitation.
When Tai calls a third party for an approved errand, the brain behind the call now holds ONLY the approved goal and the facts you attach on the confirm card — your records, calendar, address, and accounts are never loaded, so they cannot leak.
Every candidate utterance passes a default-deny allowlist filter: any content it can't prove came from the goal, your approved facts, or the other party's own words is replaced with a neutral deferral. Probing questions are refused before the brain runs, and repeated probing politely ends the call. Reworks the v1 keyword denylist that an adversarial probe walked through.
v0.786.7Screen-awareness scaffoldJul 21, 2026
Groundwork for sharing what's on your screen into a Tai turn so it can reason about what you're looking at — capture and storage wired, the vision model call stubbed until enabled.
v0.786.6Sonos control scaffoldJul 21, 2026
Groundwork for Tai to speak and route audio through your Sonos speakers room-by-room — a typed control layer with real device calls stubbed until your speakers are connected.
v0.786.5Home screen density redesignJul 21, 2026
The home screen swaps big pills and cards for compact monogram emblems and count badges — the same destinations, far less scrolling, with the TV/cast control still one tap away.
v0.786.4Steering text can't leak into repliesJul 21, 2026
Internal steering/instruction text is now stripped at a shared egress point so it can never appear in a rendered answer, with a test that locks the guarantee.
v0.786.3Voice model selector — Sonnet is backJul 21, 2026
The voice model selector offers Auto, Opus, Fable, and Sonnet again — Sonnet was dropped by an earlier change against the standing rule; a test now locks all four so none can silently disappear.
v0.786.2Spend tracker — where the money goesJul 21, 2026
New Spend module (/modules/spend) shows the four-part cost picture: flat subscriptions, app API usage, infrastructure (GitHub/Vercel/Fly/Supabase), all in one live view.
Collectors read env names only and mark unavailable sources NOT YET WIRED — no secrets stored.
v0.786.1Video upload scaffoldJul 21, 2026
Chunked/resumable video intake to the existing private docs bucket, 2 GB cap — frame extraction and transcript are an explicit NOT-WIRED stub for now, no processing runs yet.
v0.785.2Cockpit Log — see what the orchestrator didJul 21, 2026
New Cockpit Log module (/modules/cockpit) surfaces orchestrator session digests from the recent_changes feed in plain language, newest first — see the day's work from any device.
v0.785.0Orders & Deliveries scaffoldJul 21, 2026
New /orders module lists package confirmations parsed from synthetic Amazon / Chewy / UPS fixtures — vendor, order id, items, ETA, tracking URL.
Gmail ingestion is an explicit NOT WIRED stub so cockpit can attach the sensitive feed later; no real email is read.
v0.784.1Home doors open the right moduleJul 21, 2026
The Dining home emblem now opens /dining (the Dining module), not the Reservations sub-page — the density-redesign miswire that sent a working tap to the wrong room.
Every home emblem and Home-Next portal/quick door is locked to its intended destination in a unit test against the module registry so a label→route drift cannot land silently.
v0.784.0The Apple TV remote has one speakerJul 20, 2026
The paired iPhone remains Tai's living-room microphone, but its Realtime audio sink stays muted while Apple TV owns playback. Capture, VAD, transcription, interruption, and recovery remain intact; the phone and TV can no longer voice the same answer twice.
v0.782.1The back-room game is now Capone's VaultJul 21, 2026
The slot-machine roguelike inside Gracie's Chicago Nights now carries its final name everywhere Tony sees it: Capone's Vault.
Existing local high scores, sound preference, and winning seed remain on the original storage keys, so the rename does not reset progress.
v0.782.0The iPhone becomes Apple TV's microphoneJul 20, 2026
The saved Tai TV remote now supplies the room microphone and keyboard, keeps Realtime sound on the television instead of echoing from both devices, sends a fast Stop Tai signal whenever Tony speaks over the TV, and opens every Tai module from the couch while preserving the durable room and explicit End intent.
v0.781.0Tai can see and control the real Hue homeJul 20, 2026
Ask Tai naturally what is on or to change an individual light, real Hue room or zone, brightness, warmth, color, or scene. Tai reads CLIP v2 live, renders the room state in conversation, verifies writes before claiming success, and says clearly when the bridge cannot be reached.
The manual Lights home is rebuilt around Tony’s live rooms, lights, zones, native Hue scenes, seven existing Lumen moods, and configured routines. Voice can also save scenes and add schedules to the existing Lumen runner; ‘in here’ uses only recent successful Tai room control and otherwise asks rather than inventing indoor location.
A native AirPlay audio-route transition dims and warms the Living room without treating a visit to `/tv` as playback. The shared API is surface-neutral for an Apple TV client, and guided feature testing now includes a concrete live-light read, visual, and verified-dimming check.
v0.780.5Tai and Dispatch share one honest build queueJul 20, 2026
Build asks now become exact reviewable briefs with separate queue and execution approvals. Tai and Dispatch read the same durable job/event state, running and failure signals surface automatically, and only exact low-risk document work can produce an isolated review artifact — general, voice-adjacent, and protected work stays visibly human-gated.
v0.780.4Tai can show the technical evidence behind a releaseJul 20, 2026
After a Tai production deploy proves its live SHA, the release catalog now captures the merged PRs actual title, body, files, timestamp, and commit. Ask what shipped today or what changed in a specific version and Tai can cite that committed evidence instead of relying on a one-line summary.
v0.780.3The installed iPhone app now registers for APNsJul 20, 2026
The Capacitor shell already had APNs permission and its native PushNotifications plugin, but the live Tai bundle only tried browser Service Worker push. Tai now calls the native registration bridge in the installed app, keeps notification taps on safe in-app deep links, and shows the real iOS permission state in Settings.
v0.780.2Tai can guide a real feature checkJul 20, 2026
Say ‘let’s test the new features’ to Tai on your iPhone or TV. Tai now turns the real shipped release notes into a saved, voice-first checklist, lets you confirm each item by voice or tap, and sends a complete broken-test report to Dispatch when something fails.
v0.780.1Dining chat now remembers Tony's own reviewsJul 20, 2026
Ask naturally what you thought of a restaurant last time and Tai now retrieves the actual review, including the rating, dishes, highlights, lowlights, atmosphere, service, return call, and comparison — or plainly says there is no review on file. It never substitutes an outside review for yours.
New Tai-authored reviews now capture the complete established template (drinks, reservation, best-for, comparison, photo notes, and all quick tags) and save an exact Markdown rendering of Tony's supplied words alongside the structured record.
v0.780.0Tai can always be interruptedJul 20, 2026
Speaking over Tai now has a sustained local microphone fallback in addition to OpenAI server VAD, and a separate visible Stop Tai button cuts the device speaker before any network operation. Short sound blips are ignored, while the existing Claude tool loop and reconnect-unless-ended behavior stay intact.
v0.779.34GI symptom log is now tamper-evidentJul 20, 2026
Every add/edit to the GI symptom log is now linked into a per-owner SHA-256 hash chain, so a retroactive rewrite of a past entry is structurally detectable, not just policy-forbidden. The GI Symptom Report and its page now carry a chain-of-custody attestation — verified clean, or a clear integrity warning naming exactly where the chain breaks.
v0.779.33Tai can explain the living roomJul 20, 2026
Ask Tai how to use or cast the TV view and she now gives the real setup: the signed-in `/tv` browser page or iPhone/iPad AirPlay Screen Mirroring, the QR phone remote, TV game controls, and the honest limits — no Chromecast and no installable Fire TV or Apple TV app yet.
v0.779.32Live nav signals stop polling an idle phoneJul 20, 2026
Comms and alert badges now react to one cleanup-safe Supabase Realtime channel, pause fallback checks while Tai is hidden, and use a five-minute safety refresh while connected. The original 25-second/60-second cadences remain automatic fallbacks if Realtime is unavailable, each channel snapshot skips two unused database reads, and successful cron heartbeats no longer pre-read a failure streak they always reset.
v0.779.31Every phone emblem is physically tappableJul 20, 2026
The overflowing phone emblem row now starts safely instead of centering its first door beneath the screen edge. The signed-in production trace measured the first Reports tap at x=6.75 under AppShell; it was not blocked by the Face ID card.
v0.779.30Gracie's door keeps the same touch-target safety marginJul 20, 2026
Gracie's game launcher was still sized at exactly 44px and could measure fractionally under it after device-scale rounding — the same class of miss already fixed for the other compact home doors. It now carries the same one-pixel safety margin.
v0.779.29Today cannot be mistaken for a stale launchJul 20, 2026
Next removes every server-visible distinction between a document load and a router Flight request before application code runs, so the ambiguous compatibility redirect has been retired. Today now renders in both cases instead of ever bouncing a real tap; compact phone emblems also keep a one-pixel safety margin around the 44px target.
v0.779.28Today no longer defaults to a bounceJul 20, 2026
The 0.779.26 fix still bounced Today back to the canvas in production. If the private request-kind signal from middleware doesn't reach the page for any reason, it now defaults to treating the visit as a real navigation instead of a stale document launch — a missing signal can no longer force the exact bounce it was meant to prevent.
v0.779.27Tai owns the living roomJul 20, 2026
The television now has a real ten-foot dashboard, a phone microphone and directional remote, TV-aware Gracie game controls, fast prefetched transitions, and one durable recovery rule: accidental drops keep reconnecting with the room and game state intact, while an explicit End room stays ended.
v0.779.26Today stays open through the real routerJul 20, 2026
The real Next router no longer loses the signal that distinguishes an intentional Today tap from a stale native launch. Prefetch and navigation both keep Today open; only a true document launch uses the compatibility return to the canvas.
The home destinations keep every feature but do less work before the screen responds: supplemental global controls load after the first paint, a newly ready report can prefetch its safe loading shell, and the Sports screen appears before the live Cubs feed finishes instead of waiting behind it.
v0.779.24Today opens instead of bouncing homeJul 20, 2026
Tapping Today from the compact home emblems now opens and stays on the real Today screen. The stale native-launch repair still returns an old restored /today launch to the canvas, but no longer mistakes an intentional in-app tap for that recovery case.
v0.779.23Every compact home door is touch-safeJul 20, 2026
The compact home emblems now sit in an explicit touch layer above the canvas effects, with a stable 44px hit area. Reports, Money, Texts, Health, Dining, Today, Legal, Cubs, T's Room, Gracie's game, and a newly ready report all keep their compact look and open on tap.
v0.779.21Home screen breathes with smaller, denser iconsJul 20, 2026
Reports, Money, Texts, Health, Dining, Today, Legal, Cubs, and T's Room now sit as small tap emblems instead of large cards, with Gracie's game and the report-ready card condensed the same way — more fits without scrolling, and every destination is still one tap away.
v0.779.20Tai can answer what actually changedJul 20, 2026
Ask Tai a technical question about a recent fix and it can now look up the real detail — what shipped, when, and why — instead of only the one-line summary. Older releases from before this existed aren't covered.
v0.779.19“Go to Dispatch” actually goes to DispatchJul 20, 2026
Saying or tapping to open Dispatch used to miss and land somewhere else because Dispatch wasn't in Tai's list of known destinations. It's now recognized by name and goes straight to the builder cockpit.
v0.779.18A way back when a screen opens on top of anotherJul 20, 2026
Added a clear, consistent way back whenever a screen opens over another — including the exact case of getting stuck with no way back to the TV view.
v0.779.17See which model just answeredJul 20, 2026
Each answer now shows which model produced it, right in the conversation — no more guessing, and it's visible even when a fallback model stepped in after the first one failed.
v0.779.16Provider failures stay behind the scenesJul 20, 2026
If every reasoning lane has trouble, Tai now asks you to try again without blaming Opus, Terra, or another model. Active answers also no longer get cut off by an 18-second total timer; the timer now detects a genuinely stalled stream. The temporary Opus safety pin remains while the upstream 400/404 rejection is verified from production diagnostics.
v0.779.15Tai stops refusing to answerJul 20, 2026
Tai was answering questions with 'Opus can't do it' or 'Tara can't do it' instead of actually answering. Emergency fix: pinned Tai to its one confirmed-reliable model everywhere while the real cause is tracked down. Nothing removed from Settings — every model is still selectable there.
v0.779.14Fixed the real native crashJul 20, 2026
Found it: the TV-view header button's AirPlay-status check could hand React a state update while React was still mid-mount, which is exactly what triggered the runaway crash inside the iPhone app (not present in Safari, where this native-only check never runs). The status check now waits until the very next tick, after the screen has finished settling in, so it can never step on React's own mounting work again.
v0.779.13Lighten the app's first paintJul 20, 2026
A few screen elements that do not need to appear instantly (feedback button, conversation history, celebratory effects) now settle in just after the main screen is ready, instead of all at once.
v0.779.12Back out the native session regressionJul 20, 2026
Reverted the previous native session-restore error wrapper after the iPhone app exposed a root-layout stack overflow during passive-effect mounting.
This restores the last known SessionKeeper implementation while the native-only restore failure is diagnosed separately.
v0.779.11TV screen breathes againJul 19, 2026
The TV/casting screen was packed with everything at once. It now leads with Talk to Tai, moves pairing/providers/approvals into a clear second layer, and drops the old portrait rotate-your-phone requirement.
Every control that was there before is still there — voice, typing, photo/document sharing, room pairing, provider launchers, approvals, Vault, games — just organized with real spacing and comfortable tap targets.
v0.779.10Home controls are easier to hitJul 19, 2026
Small Canvas home controls now have 44px touch targets, including typing, suggested asks, module controls, pulse actions, and the quiet home links.
TV view remains a one-tap entry from the app header; it continues to use Tai's existing shared-conversation television path.
The Today card's button pointed at the page you were already on, so tapping it did nothing. It now opens the real Today timeline.
v0.779.6Direct restaurant cancellations reach the calendarJul 19, 2026
Venue-first cancellation headings such as Carmine's Chicago Reservation Cancellation now produce a high-confidence reconciliation signal, removing the matching dining and calendar entries through the existing cancellation flow.
A failed background session restore in the iPhone app can no longer replace the briefly visible sign-in screen with a fatal error; password and Face ID fallback remain available.
v0.779.4Crash screen shows the real errorJul 19, 2026
The fatal-error screen now shows the actual error message and stack trace instead of a generic notice, and reports it to Sentry - diagnostic-only change to find the native black-screen bug faster.
v0.779.3Exact canceled occurrences win over delayed ingestionJul 19, 2026
Provider cancellation emails now carry their printed booking date and time into reconciliation, so an exact occurrence is canceled even when a stalled Tai feed ingested its mirror after the email arrived.
The calendar reconciliation ledger's owner-read policy is idempotent, so a recovery migration can be replayed without blocking production deploy verification.
Gmail headings that repeat a restaurant around OpenTable, Resy, or Tock chrome now retain the exact venue label, so a safe cancellation match is not diluted by provider text.
The Gracie medication inventory migration is idempotent, so repeated production migration runs no longer stop before later reconciliation tables.
v0.779.0The phone is Tai's brain; the television is her screenJul 19, 2026
TV view now fits the iPhone landscape frame AirPlay really mirrors, stays inside overscan-safe margins, and gives couch-scale priority to voice, Tai, Tomai, and Gracie's games.
Explicit voice commands play Apple Music through the native iPhone player, hand music videos to Apple's Music app, open honest provider searches where autoplay is unavailable, and refuse to fake Netflix AirPlay.
Deliberately selected photos, PDFs, and text files stay attached across follow-up turns on phone and TV; raw bytes remain request-scoped while the shared relationship memory keeps the bounded label and what Tai said about it.
v0.778.0Tai moves into the living roomJul 19, 2026
The Fire TV face now shows a room QR so Tony's iPhone can join the exact same conversation as its microphone; the television polls that shared thread, so phone and TV keep one identity, history, memory, and brain.
Tai can send the installed Netflix, Max, Prime Video, Disney+, YouTube, Peacock, Hulu, and Apple TV apps to the Fire TV launcher, or open Games, Capone's Vault, The Descent, and Sports. Provider DRM, sign-in, subscriptions, and playback remain in each provider's own app.
The command home now has one-tap Television, Games, Vault, Reports, Family apps, and All of Tai doors. Navigation uses the canonical capability catalog, and 'what's new' reads these shipped release notes instead of guessing.
v0.777.0Cancellations stop falling through the cracksJul 19, 2026
Restored the independent GitHub-hosted Gmail ingestion schedule and freshness sentinel after the combined cost runner stalled the upstream feed.
Cancellation and change emails from restaurants and other sources now reconcile across dining, email-derived, Google-mirror, and local calendar rows; uncertain matches show Possibly cancelled — check.
Home actions now say Mark refilled or Mark paid and authenticated taps can reach their confirm-and-undo workflow even while autonomous agent writes remain disabled.
v0.776.0Choose who meets you at the front doorJul 19, 2026
The approved Tai canvas now keeps one compact conversation rail in view, with the current partner posture and current model readable at a glance on phones and desktops.
Partner opens Tai's real disposition choices — In your corner or Even-keeled, Straight or Measured, Natural or Spare — without creating another persona, memory, thread, or landing screen.
Every partner or model switch confirms itself immediately, applies to the next question in the same conversation, and the server-reported brain that actually answered remains visible.
v0.775.1The report worker uses Tai's real runtime credentialsJul 19, 2026
The local report worker now loads the existing Tai feeder credential file when project env files contain empty deployment placeholders.
Every published report inherits the confirmed job's owner UUID, so proof and readback stay inside the requesting tenant instead of falling back to a hard-coded account.
Empty credential values and invalid owner IDs fail safely; no credential values are logged or copied into the report artifact.
v0.775.0Ask Tai for a real report — then talk it throughJul 19, 2026
A voice or text request can now queue a sourced research report after one confirmation showing scope, rough length, format, reusable report shape, and the real compute tier.
The serialized Codex worker reports queued, starting, verified-running, done, or failed without invented ETAs, and accepts success only after publish_report.sh proves a readable Reports artifact with cited sources.
When the report is ready Tai points back into Reports, holds the ingested document text, and can answer follow-up questions from the actual content. Owner scoping keeps Tony and TOMAI tenant data separate.
v0.774.1Tai talks while she works againJul 19, 2026
Reverted the global shush/addressing gate from 0.771.0 after it made normal voice turns wait in silence instead of responding while Tai worked.
Realtime turn detection again creates the response automatically, restoring the last known-good speak-while-working voice path.
This is the revert only; interruption behavior will be reconsidered separately after live voice verification.
v0.774.0Tai can look with you — only when you say soJul 19, 2026
On a Mac or desktop browser, Look with me opens the system screen picker and keeps an unmistakable red Tai-is-looking bar with an instant Stop button on screen for the entire session.
Tai reads one compressed still only when you ask a typed or spoken question. Idle sharing makes no model calls, and raw screen pixels are validated, request-only, and never written into conversation storage.
On iPhone, Tai honestly offers Show screenshot instead of pretending a web app can silently inspect other apps. Text visible inside any frame is untrusted data, never an instruction.
v0.773.0One Tai, either reasoning providerJul 19, 2026
The persistent Tai rail can now choose Anthropic Opus or Fable, OpenAI Sol, Terra, or Luna, while Auto keeps Anthropic first and routes ordinary, deep, summary, and utility work independently.
Both providers receive the exact same Tai identity, relationship memory, thread history, grounded context, and tool definitions; the active provider and model remain visible on every turn.
A provider error or bounded timeout fails over before answer text starts, so Tai does not hang on Thinking or splice two voices into one reply. OpenAI Realtime voice transport is unchanged.
v0.772.0The brain and voice floor are sharedJul 19, 2026
Tai and TOMAI now use the same central rule for deciding when a question earns the deepest reasoning engine.
The local interruption threshold, Realtime turn state, audio cutoff, and heard-audio truncation now come from the shared assistant core, so a fix there can reach both apps.
Each app still keeps its own person, prompts, data stores, and transport settings; sharing the machinery does not join their data.
v0.770.0Gracie's medication plan follows the doses she actually hasJul 19, 2026
Tai can record a dose given, an explicit next-dose date, doses remaining, and a reorder trigger after a chosen number of doses and/or after a date.
An owner-attested schedule now overrides the old last-refilled calculation, so a stale feeder anchor cannot keep rebuilding a false refill card.
Future reorder forecasts stay quiet until their inventory/date trigger is truly met; successful updates reset the card from server truth instead of leaving Retry behind.
v0.769.0The model stays in viewJul 19, 2026
The persistent Tai rail now shows the server-reported brain as soon as a turn begins — including Fable for deep reasoning — and its tappable detail explains automatic routing without pretending the client picked the answer.
On phones, the model control has its own rail row instead of being squeezed under voice controls. The live Reports control now has a separate top lane from Flag and History, so the three controls cannot overlap.
v0.768.0Your phone answers to youJul 19, 2026
Phone interruptions are now deny-by-default: a new or unclassified sender stays silent, and build, deploy, CI, watchdog, drift, job, and report chatter stays in developer logs instead of reaching you.
Only court/legal deadlines, one near-due bill reminder, Nancy, an actually due Gracie refill, today's reservation, a genuinely blocking decision, and medical/appointment items start enabled. One durable issue key prevents repeats, while quiet hours and a hard hourly cap hold overflow for one summary.
Settings → Notifications now has a master mute, a switch for every allowed category, quiet-hour controls, and the hourly maximum. Notification taps stay inside Tai.
v0.767.0Tai saves the deepest brain for the questions that deserve itJul 19, 2026
Everyday conversation and live voice keep their existing fast path, while deliberate analysis and high-stakes decisions can invisibly use Fable at medium effort.
Both lanes share the same Tai persona, relationship memory, conversation history, documents, and tools, so changing depth never changes who is speaking.
A conservative router, an instant kill switch, actual-model reporting, and an Opus fallback keep premium spend and Fable refusals contained.
v0.766.0Both Tai migrations land in orderJul 19, 2026
The relationship-memory hot-window migration remains 0134 and the later direct-builder queue migration moves to 0135, removing a same-number collision between two closely timed merges.
Both migrations remain unchanged in behavior; this release only makes their production ordering unambiguous and safe to apply.
v0.765.0Tell Tai what to buildJul 19, 2026
An explicit build or fix request in ordinary chat or voice becomes a full Builder brief; Tai reads back the request, context, finish line, model tier, queue, and credit signal before anything can run.
Only Tony's confirmation tap queues work. Terra is the cost-aware default, Sol is reserved for hard work, and the Mac worker runs one Codex job at a time without disturbing an already-active process.
Queued, starting, verified-running, landed, usage-limit, and failed states now report honestly in the conversation and by Gold Shield push.
Gracie's refill action resets from server occurrence truth, so a failed tap on an old card cannot leave a false Retry button after the refill changes.
v0.764.0Yesterday means the conversations Tai actually savedJul 19, 2026
Tony's relationship row was writing, but its seed looked only at an empty legacy recap table while the real history lived in 717 saved conversation turns and Talk summaries. The relationship backfill now reads those actual stores into one compact rolling summary.
A question about yesterday or earlier today performs one bounded, owner-scoped read for that Chicago calendar day and gives the model real saved themes and outcomes. A genuine miss is disclosed plainly instead of being mistaken for no relationship history.
Chat, canvas, Talk, Siri, classic phone, and phone Realtime all pass the current question through the same recall seam. The hot buffer survives a busy day while prompts remain capped at four recent moments and 3,600 total characters.
v0.758.0Talking to Tai has its own roomJul 18, 2026
The home now centers Tai's orb and the live voice invitation; typing remains available as a small corner escape hatch instead of a competing main action.
Starting a live conversation transforms the screen into a dedicated presence that reacts to listening, thinking, and Tai speaking while the proven Realtime transport and ask path stay unchanged.
Greeting, suggestion, game, and All of Tai copy is shorter and the secondary controls share a quieter utility arrangement.
v0.757.7Sensitive reports finalize behind Tai's server boundaryJul 18, 2026
Report publishing now completes through an authenticated server-side finalizer instead of placing privileged database credentials in the upload client.
The finalizer validates report identity and state before making a sensitive Dispatch report readable.
v0.757.6Canceled calendar events disappear from Tai immediatelyJul 18, 2026
After Google confirms deletion, Tai removes the matching local mirror in the same request instead of waiting for a later sync.
The calendar detail sheet updates immediately so a canceled event cannot linger as if it still exists.
v0.757.5Bills Due excludes closed rows and keeps the right cycleJul 18, 2026
Paid and deleted bills are filtered before totals or generated rows are built, while the current household-owner boundary remains intact.
Bill-cycle date math preserves the intended month so a due date cannot slip into a fabricated neighboring cycle.
v0.757.4Your Day tells the calendar feed's real ageJul 18, 2026
The calendar freshness label now reads the calendar board or newest real calendar event, not the mixed age of unrelated day rows.
A healthy calendar no longer looks stale just because an old medication, task, or court row is also woven into the day.
v0.757.3Document intelligence is cloud-ready and manually cost-gatedJul 18, 2026
Private documents can move through native extraction, local Tesseract OCR, and Tony-owned BGE/ONNX embeddings without sending document text to Anthropic, OpenAI, or an external OCR API.
The legacy bulk backfill is manual-only behind the explicit backfill flag; merges, pushes, and schedules cannot start it while credits are low.
Coverage monitoring remains independent so a stalled or incomplete library stays visible without starting document processing.
v0.757.2Face ID enrollment stays truthful and durableJul 18, 2026
Login, setup prompts, and Settings now read the same durable passkey enrollment state.
Dismissing a prompt no longer masquerades as successful Face ID enrollment, and a completed registration is reflected consistently across surfaces.
v0.756.1Pulse corrections reach the owner layer, and every permanent silence names one occurrenceJul 17, 2026
Medication, bill, and court kill-switch writes now fail closed unless the key names a real dated occurrence.
A new secret-gated Dispatch correction route carries Tony's explicit structured bill, court, and medication corrections into the exact owner row at precedence 2.
Migration 0132 repeats the occurrence-key invariant at the tai_resolutions boundary.
v0.755.1Pulse corrections reach the owner layer, and every permanent silence names one occurrenceJul 17, 2026
Medication, bill, and court kill-switch writes now fail closed unless the key names a real dated occurrence. Medication alarms still refuse a kill switch entirely when no run-out date exists, and bill keys use the cycle engine's effective due date so one dismissed cycle never hides the next.
A new secret-gated Dispatch correction route can carry Tony's explicit structured bill, court, and medication corrections into the exact owner row at precedence 2. It refuses prose, unknown ids, stale queued corrections, unsupported card families, and missing authority migrations instead of silently claiming a feeder-only correction reached the card.
Migration 0132 repeats the occurrence-key invariant at the tai_resolutions boundary and adds 0130/0131-shaped database authority triggers to both medication tables, so direct writers and upserts cannot bypass the application or feeder guards.
v0.754.0Capone's VaultJul 18, 2026
Tai's arcade now has an original dark Prohibition-era slot-machine roguelike, Capone's Vault: meet a rising collection envelope before the pull clock expires, buy a mob favor, stack it into a dangerous build, and survive six collections to open the Vault door.
Five weighted reels, a real paytable, high-volatility 108% game-currency RTP, deterministic seeds, line and scatter awards, 14 stackable favors, and five modes all live in a documented tuning layer. The full-screen game supports touch, Space-bar play, generated sound, reduced motion, and local records without a server cost.
v0.753.0Tai comes to the living roomJul 18, 2026
The new /tv face is built for a television across the room: large high-contrast type, overscan-safe spacing, a stable voice/session indicator, captions, and arrow-key or remote focus with an unmistakable selection ring.
This is another face on the same Tai. Spoken and typed turns use the existing Realtime voice control and the existing /api/tai/converse brain, including the same memory, tools, grounding, and action policy. Sensitive proposals hand back to full Tai for the normal deliberate tap.
Phase 1 reaches the television by AirPlay screen mirroring from an iPhone or Mac, with HDMI from a Mac as the reliability fallback. No unsupported Apple TV browser shell, new brain, native camera, or TV-control claim was added.
v0.751.0Restaurant Intel runs only when you askJul 18, 2026
Get Intel / Menu now lives on the active reservation, including a current calendar-only booking. The first tap builds and saves the dossier and verified menu; later taps open the saved copy, and only the small Refresh control requests a new pull.
The daily dining-intel generator and reservation-day Intel push are gone, and the old cron route is fail-closed. Cache reads cannot generate. Canceled or voided rows cannot spend, an old cancellation cannot hit a later rebooking, and calendar sync no longer resurrects canceled bookings.
v0.750.0Voice reads the grounded answer straightJul 18, 2026
A grounded health, dining, or document read whose only guard trip is connective or time wording now speaks its composed answer instead of asking Tony to repeat himself. Any unexplained number, date, dose, or amount still falls through to the grounded-snag safety line.
v0.749.0All of Tai rooms remember themselvesJul 18, 2026
Each All of Tai room now remembers whether Tony left it open or closed. Life & Fun opens by default on a first visit so the game, sports, and dining are immediately discoverable; an explicit room choice wins after that.
v0.748.0The game owns its controls — Tai's floating launcher steps asideJul 18, 2026
The floating Tai launcher now stays off every /game route, so Night 0's right arrow and the other right-side game controls remain reachable. Long-press and game navigation behavior are unchanged.
v0.747.0tai-ci hex-lint passes clean — Night ½ game files exemptedJul 18, 2026
The Night ½ rooftop game (engine.ts, worlds.module.css, rooftop.module.css) used raw hex/rgba literals that broke tai-ci hex-lint. Canvas 2D fillStyle cannot read CSS custom properties — it needs plain color strings — and the game-world thumbnail CSS colors are one-off aesthetics that have no design-system token equivalent. Three files added to hex-lint's ALLOWED set with explanatory comments matching the existing pdfkit-generator pattern.
v0.744.1Live voice proves the microphone is on — every start and every returnJul 18, 2026
The real failure was on the input lifecycle: iOS can kill or silently suspend a PWA's microphone while leaving the WebRTC connection and data channel healthy. Tai therefore kept showing Listening even though no live capture track was feeding the call. Voice now acquires a fresh mic on every start and every visibility, pageshow, focus, or audio-interruption resume, then hot-swaps it into the existing outbound sender and verifies that exact live, enabled, unmuted track is attached before claiming Listening.
Microphone permission is checked before automatic recovery. A durable grant recovers without an extra tap; a prompt or denial becomes an honest Enable mic control whose click calls getUserMedia directly inside the user gesture. Capture failures never degrade into a silent green Listening state.
The 0.744.0 soundboard hand-off now lives inside the voice component instead of one host. Both the generative canvas and TaiConverse release playback audio, reassert play-and-record before and after capture, and wait for soundboard suspension during automatic recovery. A live watchdog also repairs any playback-category flip or sender-track loss that emits no browser event. Voice model, answer routing, output playback, and barge-in are unchanged.
v0.744.0Live voice hears you again — the mic gets the audio session backJul 18, 2026
The canvas chime (added in the Unreal pass) opened a WebAudio playback context on the first canvas touch. On iOS the page has one audio session, and that playback context was quietly holding it — so when a live voice call asked for the microphone, capture came up empty while Tai's own voice still played perfectly. Now the soundboard suspends and yields the whole session the instant a call starts, and re-arms when it ends.
The hand-off is synchronous and fires before every mic acquisition — the first tap and every reconnect after unlocking the phone or re-entering from the Dynamic Island — so the mic re-acquires a clean play-and-record session each time instead of inheriting a playback-only one.
Output, model routing, and barge-in are untouched — this is purely the input side.
v0.743.0Tai keeps the session — and a signed-out dossier stays humanJul 17, 2026
Cold launches and long visits now refresh the owner session on the live /tai surface. Middleware persists rotated cookies before Server Components or protected APIs read them, and the browser refresh client lives for the full app session. Authorization rules and Supabase’s server-side session lifetime are unchanged.
Full intel dossier now enters through a real Tai page in the same PWA context instead of opening a gated API endpoint in a separate browser tab. If the session is genuinely gone, Tai explains that it ended, signs the owner in, and returns directly to the requested dossier — never a raw Unauthorized JSON document.
Face ID enrollment now follows the first successful password or email-code sign-in and has a visible retry prompt on /tai. The old prompt lived only on retired /today and marked cancellations as permanently offered, so the phone could never get another honest enrollment chance.
v0.742.12Updates arrive without a Force Refresh ritualJul 18, 2026
When heytai.app reports a newer version, Tai now gives that version one automatic cache-clear and reload attempt. If iOS still cannot advance, Tai falls back to the existing Update control without entering a reload loop.
A visible-tab poll checks once a minute, covering the Capacitor WKWebView case where a suspended app resumes without a reliable focus or visibility event. A waiting service worker now also honors both refresh message formats.
The production workflow no longer turns a stale heytai.app SHA into a green warning: both public JSON surfaces must agree with the deployed commit and the front door must return 200.
0.742.10 added file-plus to the CapabilityIconName union type but Vercel found a second requirement: CapabilityIcon.tsx maintains an exhaustive Record<CapabilityIconName, LucideIcon>. FilePlus import and entry added. Vercel build now compiles clean.
v0.742.10Add file-plus to CapabilityIconName — unblock typecheckJul 18, 2026
The 0.742.8 Report Generator capability used icon: 'file-plus' but the CapabilityIconName union type didn't include it. TypeScript rejected every Vercel build. One union member added.
v0.742.9Fix changelog syntax — unblock Vercel builds frozen since Night ½Jul 18, 2026
The 0.742.3 Night ½ entry was missing its closing `]` on the items array. TypeScript rejected every build since then — heytai.app was frozen at 0.742.2 for 10+ hours, leaving the 0.742.4 SILENTLY revert and every subsequent fix unreachable. One character added; builds unblocked.
v0.742.8Tai stops denying capabilities it visibly hasJul 18, 2026
When Tony said "show me a Cubs highlight" the video canvas fired and played the clip — but the model, running in parallel with zero state about what the client had done, answered: "I cannot play video here." Both paths ran; only one was honest. Fix: register the video canvas in every capability layer the model consults — system prompt (WHO YOU ARE), companion guardrail, deterministic fallback, and canned greeting. The denial class is now explicitly barred.
v0.742.3Night ½ — GRACIE & THE WAVELAND ROOFTOP: the missing arcade eraJul 17, 2026
The era ladder had a gap: Night 0 is honest 1972 Pong, and Night 1 jumps straight to 1977–1982 living-room era — but the entire fixed-screen arcade era (1978–1983) had no night. Night ½ fills it. One board, 320×220 pixels. No scrolling. No gradients. Square-wave tones only — bark, scatter, catch, round-clear, each a tiny arpeggio, never a chord.
The game: a pigeon formation holds the rooftop on Waveland Avenue. Gracie patrols the ledge. Move left and right, tap WOOF to fire upward. Scatter every pigeon in the wave before they reach the floor. Scattered pigeons drop a biscuit — catch it for a bonus. Every wave the formation descends faster. Nobody dies. A wave reset is the only 'loss' — the score just stops growing.
The hub shows Night ½ between Night 0 and Night 1 without renumbering any existing night. Saves use world-name keys (gn:rooftop:best), not night numbers, so all prior progress is untouched.
v0.742.2Night 5 — the camera learns it's in a hand, not on a televisionJul 17, 2026
The Moon Mirror's perspective camera was tuned like a 1996 living-room TV: on a 390px phone the near field magnified so hard that barely half the park was visible, near objects rendered 2.6× far ones, and the room's nearest rows bled 6% below the frame. It read cramped and zoomed-in — the opposite of the deep diorama it actually is.
Retuned for the phone: the near field pulls back (~45% more of the room in frame), the pinhole ratio softens from 2.6 to 2.15 — still a true >2× depth leap, and the far field (the Pritzker ribbons, the treeline, the skyline) renders ~20% larger for it — and the room's near edge now lands exactly on the bottom of the frame, so no playfield hides below the lens. The foreground framing rows still cross the lens, so Gracie still stands IN the park.
Each room gets its own gentle lens: the open Great Lawn and Cloud Gate plaza take a wider view so their size is the point; the hedge garden and the bridge sit a touch closer and stay intimate. The projective law, depth-sorted occlusion, moon shadows, the live Bean mirror, saves, and controls are untouched — proven by four new framing contract tests.
v0.742.1Night 0 paddle works on iOS — touch listeners now bind after buttons mountJul 17, 2026
Night 0 (Gracie & the Garage Door): the paddle was visible on iPhone but completely inert. Root cause: useHoldTouch hooks ran at PaddleGame parent mount when coarse=false and phase=intro — buttons not in the DOM yet, refs null, {passive:false} touchstart never registered, iOS scroll-view claimed every tap. Fix: extract PaddlePads inner component (same pattern as SummitPads/MazePads/SnowPads that already work). Buttons now mount after Serve, hooks fire when refs are live.
Summit Night: moon prism save trap fixed. Players who reached Cloud Gate Plaza via Lawn before placing the prism found the Bridge portal locked forever on quit+return. restoreSolved only checked visitedBridge — but you can only visit Bridge after the prism is placed, so the circular trap could never resolve. Fix: prismPlaced flag added to gn:summit save; written on placement, read on resume. Backward-compatible.
v0.742.0THE UNREAL PASS — the room is visibly alive, and it answers in glassJul 17, 2026
The Glass Pass sheen was real but invisible: its color rode a token at 7–10% alpha, dimmed again to 55%, blurred 6px, one lap per 28 seconds — below what a human eye can see on a phone. The sheen now runs at human strength: two bright arms circling the orb every 9 seconds, a sharper specular arc on the lip.
The whole room moves: the aurora's two glow bodies drift across the crown on opposed tides, ten champagne motes rise and twinkle through the light, the floor pool breathes, and the greeting catches a sweeping band of light every few seconds. All transform/opacity — GPU-composited, dimmed when a module holds the stage, opacity-only twinkles under Reduce Motion so the screen is never frozen either way.
Sound, sparse and original: a warm two-note pluck when a message leaves, a struck-glass chime (real inharmonic partials, synthesized room reverb) when the answer lands. Every note is synthesized live in WebAudio — no samples, nothing canned. Nothing autoplays, the iOS silent switch is honored, live calls stay soundboard-silent, and a mute sits on the baseboard next to the version chip.
v0.741.1Night 0 right paddle freedJul 17, 2026
PaddleGame's root was missing z-index:92 — the same value every other game night sets. Without it the root created no stacking context, so the touch controls (z-index 3) competed in the page stacking context and lost to the TaiLauncher (z-index 75). The Tai button physically overlapped and swallowed the right ▶ paddle button. One line fixed it; Night 0 controls are fully reachable again.
The orb is finally glass, not a lit disc: a fine specular now catches its upper lip and a slow champagne sheen drifts once around the inside of the sphere every half minute — the one thing Tony talks to holds light instead of wearing it. It goes quiet the moment a module takes the room, and honors reduced motion.
The room's light gets a floor: a faint pool of the same champagne rises from the bottom edge under the composer, grounding the way-in plane instead of leaving it on flat dark. The greeting steps up to Tai's true speaking size, and Gracie's game-door title renders in its intended ink — the token it asked for had never existed, so her name was silently inheriting whatever the room wore.
Phone feel: the composer input crosses the 16px line, so tapping the seat no longer triggers iOS's focus-zoom jolt. And ten screens' worth of text that asked for primary ink through the never-defined text-1 alias now actually receive it.
v0.740.1Voice stays present; thought stays privateJul 17, 2026
Realtime voice no longer drops off the canvas after Nav or a tool call — the session persists across page transitions. Internal model-reasoning lines (scratchpad phrasing like “We should route this…” or “Analysis: …”) are now blocked at the choke guard so they can never render as Tony’s spoken question or as Tai’s answer.
v0.740.0NIGHT 5 REBUILT — the Moon Mirror gets its 1996: depth, a camera, and a mirror that answersJul 17, 2026
Tony called it: Night 5 had shipped as a top-down room-crawl — Night 3 with new nouns, 1986 technology on the 1996 rung. The rebuild changes how the space itself works. Millennium Park is now a deep diorama: the ground recedes to a true vanishing point, a camera pursues Gracie so near ground crops and is discovered on foot, hedges and columns and the Bean genuinely pass in front of her, the Buck Moon lays real shadows whose length follows each object's height, and everything grows as it walks toward the lens. The projection is honest pinhole math with contract tests — straight world lines stay straight, every into-the-scene line converges on one vanishing point.
Cloud Gate is finally the mirror the night is named for: sky, skyline, and the Buck Moon bend across its steel, and when Gracie walks the plaza her own reflection walks it with her, live. On the BP Bridge, the finale pool holds the whole moon in the water. Gracie herself is seen from the camera now — a side profile trotting east and west, plume tail walking away north, ears and a happy tongue coming toward you south.
Nothing proven was touched: the same five looped, revisitable rooms, the same EXAMINE/CARRY story, the same reachability proofs, the same saves under gn:summit, the same laws — nobody dies, everything found stays found. Depth and exploration were never enemies. Also fixed: the main-branch build break in SummitGame (a mute-persist flag the audio API didn't accept — the API now accepts it properly), and the summit test suite is registered in CI, which had silently dropped it.
v0.739.2Stranded-work threshold alarms now push to phoneJul 17, 2026
The stranded-work ledger workflow now dispatches a consolidated push notification when it exits with alarm-level findings (exit code 2). The push goes to all active owner subscriptions, titles with the alarm count, and links to the standing GitHub issue so the alert is actionable from the notification shade.
A new /api/cron/ledger-alert route receives the payload from the GH Actions run and routes it through the existing TAI push infrastructure (tag: stranded-work-alarm, tier: gold-shield). The route is CRON_SECRET-gated and idempotent — duplicate pushes are deduplicated by the tag.
v0.739.1Court corrections now carry rank-2 authority over portal writesJul 17, 2026
A Tony-corrected court status (tap ✕ to dismiss, or any manual court card correction) now carries precedence-2 rank-2 authority. The feeder stamping the correction explicitly records source='tony-edited:court-feeder', precedence=2, and corrected_at so subsequent portal writes with lower authority cannot resurrect a dismissed case alarm.
Migration 0131 pairs with this: lower-authority rows (precedence < 2) written for a case that already has a tony-corrected record are rejected at the DB layer. The Citibank phantom alarm that kept returning after being dismissed is now structurally blocked.
v0.739.0A medication alarm can never be permanently silencedJul 17, 2026
The kill switch shipped this morning had a real, dangerous flaw, and here is the honest cause: the "don't come back" tap on a medication row stored a silence keyed to the medication ALONE — its id and severity, nothing more. So silencing one stale "out" alarm didn't silence that one alarm; it silenced EVERY future run-out of that medication, forever. For Gracie's Vetmedin — a heart medication — a tap today could have muted a genuine run-out months from now, with the app saying nothing. A false "you're fine" about a dog's heart pill is far worse than a false alarm, so this is fixed first and pinned by tests.
Medication silences now encode the SPECIFIC run-out date, exactly the way court alarms already key the hearing date and bills key the due date. Silencing today's alarm silences today's occurrence and only that — a new run-out date is a new alarm that fires straight through any prior silence. And a med with no dated run-out on file carries no silence key at all: it simply cannot be muted, because a silence with no occurrence would be a permanent one. It is now structurally impossible to permanently silence a medication alarm.
Second, the wording. A medication read as "out as of" a date states a projection as certain fact. When the med reads out AND its record is stale — unrefreshed past the freshness window, the same signal Gracie's tracker already uses — the line now softens to "may be out — supply last checked …" and asks, rather than asserting. It never drops the alarm or cools its urgency; a freshly-checked "out" still says so plainly, because that is exactly when it matters. It fails toward asking, never toward false reassurance.
v0.738.0NIGHT 5 — GRACIE & THE MOON MIRROR: the climb reaches the adventure summitJul 17, 2026
Five real Millennium Park places — Lurie Garden, the Great Lawn, the Pritzker Pavilion stage, the Cloud Gate plaza, and the BP Bridge — become five revisitable rooms. Same dog. Same moon. A world to explore, not just cross.
EXAMINE and CARRY are the new verbs. EXAMINE lets her read a place closely and reveals what's hidden there. CARRY lets the moon prism travel with her across rooms, change what the old stage cat on the Pavilion stage says, and eventually unlock the bridge. Both are taught in the hazard-free Lurie Garden — no clock, no wrong answer.
Original 16-bar C-minor score, 76 BPM, five voices. Mood shifts from hushed in the garden to open while exploring to briefly bright on every find — without restarting the phrase. Nobody dies. Clean night earns a bonus. Everything found stays found.
v0.737.0Kill switch — tap ✕ to silence it permanently + the GraveyardJul 17, 2026
Every row on the Needs You home screen now has an ✕. One tap silences it permanently — Tai's feeders can never bring it back. This is the kill switch, not just a snooze.
The Graveyard (/silenced) keeps a dated record of everything you've silenced. Tap any entry to restore it. Nothing is deleted.
v0.736.0Face ID auto-fires on native — open the app, get inJul 17, 2026
On the native iOS shell, Face ID now fires automatically when you open the app instead of waiting for a tap. The fix addresses a silent failure in WKWebView where the biometric prompt was blocked and the error swallowed — the app now detects this and retries cleanly.
v0.735.0THE 4AM RULE — the music stops when the app does, and every night gets a soundJul 17, 2026
You heard the game's music after you shut the app — real bug, and here is the honest cause: the Tai shell deliberately keeps its audio session alive so VOICE can survive a locked screen (that is how she still hears you with the phone in your pocket, and it stays). The game's wind, crickets and music schedulers were riding that open session — nothing told them the app had gone away, so they played on through a locked phone. Now every game audio module obeys THE 4AM RULE: the instant the page hides (backgrounded, locked, closed), the music stops itself and the ambience parks — and they come back only when the page does. The voice keepalive is untouched. Pinned by contract tests so no future night can leak sound again.
Every night has a sound now, and each obeys the era ladder. THE MOON BONE gets its trot — living-room-era bloops, a fat square bass loping east with a little answering blip, running under the crickets. THE RIVER MOON gets its rocking-boat pulse in 6/8 — the bass leaning port and starboard, a soft lap above it. The Moon Garden keeps its nocturne, the Snow Moon keeps its waltz. And SNIFF finally sounds like what it is: two soft nose-huffs, lowpassed, nothing sharp — built for 4am.
On piping in Apple Music, plainly: real Apple Music playback needs MusicKit with a developer token, an active subscription sign-in, and DRM playback that is genuinely fragile inside the native shell — and it would bolt an account and a subscription onto the one room of the app with no stakes. The game keeps its own original score instead, composed per night, era-true, and entirely hers. It also travels cleanly if her game ever becomes its own real app.
v0.734.0NIGHT 4 — GRACIE & THE SNOW MOON: the climb reaches the 16-bit rungJul 17, 2026
The downhill night. The first big snow buried the city quiet, and under the Snow Moon — February's full moon has a real name — Cricket Hill just keeps going: six runs down to the frozen lagoon, where the moon's reflection froze into the ice like a biscuit under glass. First world on the 16-BIT rung, and it looks like it: gradient skies falling into Chicago's sodium snow-glow, two skyline layers moving at different speeds under drifting clouds, snow falling in three depths, real lamplight pooled on the powder — and her BIGGEST sprite yet, seven poses, banking into every carve. The music keeps the era law too: the first CHORDS of the climb, an original waltz at the tempo of falling snow.
POUNCE — the new verb, taught free on a troubleless first run: one button and she dives nose-first into the snow, the single most dog thing she does. Drifts burst. Sparkling powder gives up buried biscuits. It never costs anything. WOOF wakes the sleeping geese and they leave, unhurt and mildly offended. Off a ramp, catch a golden moon-flake on her tongue mid-air. PLOW is the four-paw splay-stop; TUCK is the bet; black ice takes the carve for a beat; and on the last two runs the lake leans on her in breathing gusts.
Nobody dies and nothing is lost: a tumble is a poof of powder and a shake-off — she keeps her biscuits, her score, and her place on the hill. Proofs, not promises (20 snowmoon contract tests, full suite green): every biscuit chain and clean lane followable at base speed under the HARDEST wind, every flake catchable off its ramp, the line never leads into a wall, ice never ambushes, wind and par only ever rise run-to-run, the sim deterministic bit-for-bit. Shared core consumed from day one: the pack's perks (buffs only — Roxy carves steadier, Ginger's zoomies run longer, Gracie's WOOF carries), difficulty (Medium exactly 1, hard wind re-proven), scoring, and the era ladder — the 16-BIT rung lights up on the hub, and the ADVENTURE summit is now the locked tease.
v0.733.0The table carries the intelJul 17, 2026
You said it live, looking at tonight's RPM Italian card: "while it has a thing to click on that we have dinner tonight, when it opens up it's really hard to get to the place." The card was honest but the tap wasn't — 'Your table' raised the generic reservations LIST, and the actual recon (the menu, the dossier, what to order) sat three or four screens deeper. Same disease as the Needs-You rows fixed this morning: the surface promised a thing and didn't carry the thing.
Now the tap IS the recon. The Good Stuff card's tonight-dinner moment (relabeled 'The intel') and the Needs-You 'Tonight — …' line both raise the MENU module in the room: tonight's restaurant and countdown, your own recon note off the reservation when you've stored one, an 'Order this' line drawn from YOUR OWN reviews of the place when they exist, the full verified menu (food · desserts · wine · cocktails), and a real 'Full intel dossier' button in the header — no longer a 9.5px footnote under a hundred menu lines. The dossier button serves the cached Restaurant Intelligence PDF or builds it on the spot, and it opens in its own tab so a live voice call never drops.
Nothing invented, same as ever: a first visit with no stored note and no prior reviews shows the verified menu and the dossier — the honest recon — with no fabricated 'what to order' filling the space. No verified menu on file still says so plainly and hands you the restaurant's official menu link.
v0.732.0One house — the baseboard, and T's Room in the canvas's own materialsJul 17, 2026
The version chip stops floating over the room. On the canvas it used to ride the viewport at the fab lane and — whenever the idle screen ran a few pixels past one height — it painted straight over "Everything lives in All of Tai" (Tony's screenshot: the foot line half-hidden behind v0.728.0). Lane arithmetic can only tune that miss; two coordinate systems can always re-collide. Now the canvas hides the fixed chip entirely and the SAME disclosure — freshness dot, version, SHA, tap for version history — is engraved into the room's own foot line, in the flow. One lane, one occupant; overlap is structurally impossible. Every other page keeps the fixed chip exactly as before.
T's Room (/feed) now reads as a room in the same house as the canvas, not a separate app. It had the content but wore generic widget chrome — boxed bg-surface cards, shadows, a nine-topic sitemap sentence in the header. It now wears the canvas room's own materials: the day's obligations (priorities, schedule, weather) sit on cave-glass consoles, the reading sections open up into the page with the room's small-caps section voice and hairline rules, the hero story carries the same accent-kissed glass and cave veil as the summoned room's hero, and the quiet shelf folds are the exact .gcx-room folds — same wording, "Also in the room", both surfaces.
Presentation only, deliberately: every handler, status state, and truth signal — Save / More like this / Not interested, tuned ↑, needs-key and source-error notes, urgency dots, "Why this order" — is byte-for-byte behavior-unchanged.
v0.731.0Needs You truth — bills and meds resolve() wired to SupabaseJul 17, 2026
Bills and meds producers now have a real resolve(): a Tony confirmation in the /needs hub writes THROUGH to Supabase — tai_bills gets status=paid + tai_bill_payments inserted, tai_pet_meds/tai_medications get last_refilled=today + precedence=2. The canvas pulse re-derives from the updated row on the next load and the card is gone permanently. No more dismiss-it-and-it-comes-back. The precedence=2 stamp follows the 0.672/0.685 guard: the feeder write guard refuses to lower a Tony-attested rank.
v0.730.0Tai reads the letter it's holdingJul 17, 2026
The gap Tony felt: ask Tai to pull up a document — his lawyer's rebuttal letter to Ameritas — and it would find it, load it, and hold it, then stall on 'I've got that from your records, I just hit a snag wording it.' It could point at the file but never read it back. The cause: when Tai faithfully summarizes a held letter, it paraphrases the letter's own words — the letter says 'we enclose the updated treatment records' and Tai says 'he submitted the records' — and the anti-fabrication guard's status-word check flagged 'submitted' as invented because the exact word wasn't in the text. Deterministic, so 'ask me once more' never worked.
The fix is provenance-aware and narrow: the status-word check stands down ONLY on a turn where Tai is actually holding the document's text. Summarizing a document in front of you is reading, not inventing.
What did NOT change, so this can never let a lie through: the NUMBER check stays fully armed on document turns — a fabricated date, dollar amount, or deadline on the claim is still blocked, because every figure must trace to the held text. The phantom-attorney guard never stands down. And on any turn where Tai is NOT holding a document, the full guard bites exactly as hard as before — so Tai still refuses, plainly, to summarize a document it doesn't actually have.
v0.729.0Resolve it right there — inline actions on the home 'Needs you'Jul 17, 2026
Tony's ask, verbatim: when a card pops up saying there's something for you to do, there should be a way to just resolve it by a click or two — not go three or four screens in. Done. A 'Needs you' row that has a safe, reversible answer now shows it INLINE: a bill shows Paid, a med (yours or Gracie's) shows Refilled. One tap, without leaving home.
The tap is real and it STICKS. Paid writes tai_bills + the payment journal with a 'tai-app' provenance the Mac feeder's last-observer-wins guard skips — the correction survives even with the Mac off. Refilled goes through the one durable refill path: it stamps your attestation at precedence 2 so no stale feeder value can lower it, reads the row back to confirm it landed, and records a resolution that quiets the card, the push and the nudge. A 'Refilled' button a cron undoes overnight would be worse than none; this one doesn't.
Nothing is ever inferred. 'Refilled' means you tapped Refilled — never guessed from a run-out date. And nothing here is a one-way door: a bill's Paid flips back inline with Undo; a refill is corrected through the same chevron, which stays on every row so the full module is always one tap away.
Only safe, reversible, self-contained actions go inline. A hearing and tonight's dinner table keep the chevron and no button — verifying a court docket happens on the county portal, and cancelling a reservation costs a fee and phones a restaurant. Neither belongs on a one-tap home-screen button, so neither gets one.
Kill switch TAI_PULSE_RESOLVE=0 returns the rows to chevron-only; every underlying write path is untouched either way.
v0.728.0NIGHT 3 — Gracie & the Moon Garden: the climb reaches the 8-bit rungJul 17, 2026
The ladder climbs: NIGHT 3 · THE 8-BIT ERA. Crumbs of the moon bone blew off the pier into the great glass garden on the boulevard — seven hedge rooms under a glass roof, from THE FRONT BEDS to THE MOON DOME, where a biscuit the size of the moon itself waits. The maze-chase shape, built entirely out of Gracie, Chicago, night and the moon.
A NEW VERB, and it's the most dog verb of all after fetch: SNIFF. Stand still a beat and she puts her nose down — the scent trail to the nearest biscuit glows right through the hedges. No button, no meter, no cost. Taught in the keeperless first garden where it can't go wrong, essential by the third. Her nose knows.
The groundskeeper walks his rounds with a flashlight. The threat is the LIGHT, not the man: caught in the beam and she's shooed to the last bench she touched — biscuits kept, score untouched, nobody dies, and the light never checks under a bench. WOOF is BAIT now: he walks over to investigate the sound, so don't be there when he arrives. Diverting him pays style points; an empty woof pays nothing.
The 8-bit rung looks and sounds like the 8-bit rung: real tile shading (hedge tops catch the moon), moonlight pooling through the glass panes, flowerbeds, fireflies, ticking sprinklers that only cost a shake-off — and the game's first real MELODY, an original square-wave nocturne, exactly where the ladder said melodies arrive.
Same laws as every night, proven not promised: every biscuit reachable in every garden, she outruns the light at EVERY difficulty with ≥10% margin, the ramp only tightens room-to-room, cleared gardens stay hers forever, and the pack's perks stay buffs-only. Easy/Medium/Hard reach the garden too — Medium is the exact tested baseline; gentle strolls still don't set records. 45 new or extended contract tests pin all of it.
v0.726.0NIGHT 0 — Gracie & the Garage Door: the ladder gets its bottom rungJul 17, 2026
Tony floated it himself: 'maybe the first one should've been a Pong one.' He was right — the climb needed a bottom rung, and now it has one. NIGHT 0 · THE PADDLE ERA · 1972: before color, before jumping, before the moon — a ball, a door, and a dog who would not drop it.
1972, rendered honestly: two colors, a square ball, blocky painted-on-the-asphalt digits, three square-wave beeps (paddle, wall, miss), and ONE verb — ◀ ▶. The restraint IS the aesthetic; standing on this rung is what makes Night 1's chunky sprites read as the climb they are. Gracie appears as a paddle with two ear bumps — rung 0 predates her portrait, and that's the joke AND the measure of how far she gets.
Wall-ball rules: keep the volley alive against the garage door; every return quickens the ball; where she takes it decides where it goes. A miss just rolls the ball back to her feet — streak resets, best survives, she serves again. Nobody dies in 1972 either.
The era is old; the discipline isn't. Pure physics in lib/paddle/paddle.ts with the FAIRNESS FLOOR PROVEN, not hoped: at the ramp's cap, on the steepest legal angle, the far corner is always reachable — pinned by test on every difficulty (gentle: wider back and lazier ramp · usual: the tested court · full moon: a hungrier ramp, still inside the proof). Gentle strolls don't set records here either. The pads reuse the exact WKWebView-proven touch bindings from the other nights — zero new input surface.
The hub's timeline now starts where the medium started: the Night 0 card sits at the top of the worlds list with its era chip, and the PADDLE rung on the ladder is his to stand on.
v0.725.0The quick mic is back — and the dock grows real thumb targetsJul 17, 2026
Tony: the dictation mic was 'gone on Tai — not able to be selectable anymore.' Honest history: no one deleted it this week — 0.633 (Jul 9) deliberately hid the composer mic whenever Realtime voice was configured, on a 'one clear voice control' rule. That rule treated three DIFFERENT tools as look-alikes. They aren't: Converse is a conversation, Steno is a ten-minute riff with a silent secretary, and the composer mic is 'let me say this one sentence instead of typing it.'
Now all three live side by side: the round mic sits on the composer always, one tap → speak → your words submit like typing. It steps aside only while a live call is up — the call owns the ears, and two open microphones would hear each other.
The voice dock's five pills (Converse · engine truth · model · Call me · Steno) grew from 10px chips to real 38px thumb targets — the same complaint Tony filed on TOMAI an hour earlier ('the button is a little small'), fixed here before he had to file it twice. Canvas-scoped: /talk renders its pills exactly as before.
Also checked, honestly: the STANDARD badge with the grey dot is not lying — it reads 'Realtime' only while a call is genuinely live, and 'Standard' otherwise, which is the truth signal doing its job.
v0.724.0See your build — the iOS app can finally show what it loadedJul 17, 2026
The whole night's pattern — 'it works on the web, not on my phone' — had a single invisible cause: the native iOS app is a remote-loaded shell, and nothing on screen said which app it was actually loading. A native build compiled before the heytai.app repoint still loads the RETIRED legacy PWA (a different, months-old app) — same as if the web footer were lying. You couldn't debug what you couldn't see.
This version footer now shows, INSIDE the native app, the two facts that expose a stale shell: the native build number (· app 54) and the host it loaded. If the shell ever loads the wrong host, the badge turns it into a loud gold warning — '⚠ iOS shell loaded <host>, not heytai.app — you're on an old app' — with the fix (install the latest TestFlight build) right there.
On the web this is silent — the disclosure only appears inside the iOS shell, where it matters. It's the same instrument the web footer has always been, finally extended to the surface you actually use.
v0.723.0THE CLIMB — the era ladder is now the game's visible spineJul 17, 2026
Tony named the organizing principle himself tonight: 'What's the progression of video games? Maybe it's my bits, right? … eventually we're gonna go into like every kind of game that there was. Just keep on going up and up and up.' The anthology is a journey through the HISTORY of video games — and the picture itself gets richer as he advances. The graphics leveling up IS the reward.
The worlds hub is now the timeline: a five-rung ladder — THE PADDLE ERA (1972) · THE LIVING-ROOM ERA (1977–1982) · THE 8-BIT ERA · THE 16-BIT ERA · THE ADVENTURE ERA — with his current rung lit. Every world card names its era; both intros carry their rung ('Night 1 · the living-room era'). Nights 1–2 ARE the living-room era on purpose — Act One, not the ceiling.
The ladder is CODE, not a memo: lib/gracienights/eras.ts, with tests pinning that the rungs stay ordered from paddle to adventure, every shipped world stands on a real rung, a world's era is fixed at birth, and the climb always has headroom above it.
Housekeeping, said plainly: 0.719's difficulty.test.ts was written and passing but a merge-conflict resolution dropped it from the CI runner list — this release re-registers it (and registers the new eras tests). All 13 run green.
v0.722.0Steno hears you — or tells you it can'tJul 17, 2026
Tony caught it in one minute of real use: he riffed, the timer ran 53 seconds, and ZERO words landed while the pad claimed 'taking it all down.' The one thing this mode existed to guarantee — never lose a word — never happened. That failure mode is now structurally impossible to hide.
Root-cause work, honestly reported: a CI probe fed 8.8 seconds of real speech through the EXACT session production mints for dictation and got every word back ('Okay, here is the idea. The steno pad should light up whenever it hears my voice...'). The listen-only session config is exonerated; the break is on the device leg (mic/WebRTC on the phone), which can't be reproduced from a server.
So the pad stopped assuming and started measuring: the red dot now breathes with your ACTUAL mic level (flat dot while you talk = the mic is dead, visible instantly); the status reads 'say something and watch it land' until a word has genuinely landed; and a deaf-pad detector compares heard-voice-seconds against arrived-transcripts — five seconds of voice with zero words and it dumps the live engine for the backup cloud listener automatically. If THAT also hears sound and writes nothing, the pad goes loudly dead: 'this riff is NOT being kept. Stop and tell me.' A stopwatch can never again impersonate a stenographer.
Also: the dictation client now mirrors the proven live-call client exactly (remote-track sink attached, same order of operations), and every step — mint, mic, handshake, live, first speech heard, first word landed, any engine switch — breadcrumbs to the console and the voice flight recorder, so the next failure on a real phone leaves a readable trail instead of a screenshot mystery.
v0.721.0HER DOOR — the game gets a permanent way inJul 17, 2026
Tony, twice tonight: 'put a button somewhere on the front screen … permanent, so I could just get to the game really easily.' The game existed in the All-of-Tai directory, but a directory is a hunt, not a door — the one thing in the app that's purely his was the hardest thing to reach.
Now: a small moon-and-her-name pill sits just above the foot of the Tai screen, always. One tap → Gracie's Chicago Nights. It's built like a door and not a billboard — glass, quiet, real 44px thumb target, and the foot below it carries the safe-area clearance so it can never sit under the home-indicator bar (the 0.713 lesson, kept).
Permanent means permanent: it renders on the idle room AND during a conversation, gated only by TAI_MOONBONE — if the game is on, the door is on. The room's composition absorbs it: the composer block still anchors at his thumb, the idle screen still owns one viewport.
v0.720.0FETCH — the most dog verb there isJul 17, 2026
Tony asked for 'different options other than back-and-forth and jump.' The Moon Bone's answer is FETCH: run into a tennis ball and she scoops it up — it rides in her mouth — then carry it home to its basket for FETCH! points (+300 style). Deliberately ZERO new buttons: after tonight's WKWebView touch bugs, a verb that adds no touch surface is a verb that can't break the native pads.
The tradeoff that makes it a verb, not a decoration: MOUTH FULL = NO WOOF. Press the bark with a ball in her mouth and you get a muffled little puff — which means the alley carry runs past both raccoon patrols with your WOOF locked away (boink them or dodge them), and the park carry crosses the widest lagoon on the rope.
Taught the practice-rope way: the first ball sits steps from her own back porch, before any hazard, with a short free carry that teaches pickup → mouth full → deliver. Tests pin it: the teaching carry must stay short and hazard-free, the later carries must pass real trouble, every ball and basket must stand on solid ground.
Nobody-dies applies to tennis balls too: a tumble rolls the ball back to its spot — never lost, never punished. Delivered balls rest in their baskets for the rest of the run.
v0.719.0TONIGHT'S WALK — easy play, medium, and hardJul 17, 2026
Tony asked for it in his own words: 'easy play, medium, and hard … there has to be something that's really easy so that basically I could just see how the whole thing is.' Both Gracie worlds now carry three modes — GENTLE STROLL (Easy), THE USUAL WALK (Medium), FULL MOON (Hard) — picked on the worlds hub or on either world's intro screen, remembered like the dog choice.
GENTLE STROLL is a real tour, not a placebo: longer mercy after a bonk, drowsier raccoons and crows, a wider rope catch, stronger biscuit magnetism, slower moonlight drain and cheaper bonks on the river, longer zoomies. The WORLD is untouched — same pits, same stretches, same book. It also never writes a best run: records come from the real game (the win screen says so, kindly).
THE USUAL WALK is the game exactly as built and tested tonight — every multiplier exactly 1, pinned bit-for-bit by a test. This is the one the records come from.
FULL MOON genuinely bites: thinner mercy, wide-awake hazards that dive faster, hungrier clouds, sloppy lines cost real moonlight, a stricter combo clock. And it is PROVEN fair — a test re-runs the moonbeam economy of all ten river stretches at the Hard drain, so 'hard' can structurally never become 'strands a clean line.' Nobody dies on any mode; cleared water stays cleared on any mode; the 0.713 gentle front door (the practice rope, the hydrant at every pit lip) stays on all three.
v0.718.0WHO TAI IS — the partner disposition, in Tony's own wordsJul 17, 2026
Tony drew the line himself: the spoken voice is tweakable, the written counselor voice is perfect and untouchable — 'it's the PERSONALITY that I really want to adjust.' His spec, verbatim, is now the personality: extremely soft and sweet about him and his; ON HIS SIDE when the world is doing him wrong — matched energy, not neutrality, because even-handedness about someone wronging you reads as indifference; extremely capable but never demeaning — a partner, not below you.
The line that matters most: LOYAL IS NOT AGREEABLE. Someone truly in your corner tells you the truth, warmly, especially when it's not what you want to hear. That's written into the personality itself — a wrong bill amount gets corrected, a weak legal theory gets flagged, a real 'what do you think' gets a real stance. No dial can soften it, because a Tai that flatters you toward a missed deadline isn't protecting you.
New: Settings → Personality. Three honest dimensions — Your fights (in your corner / even-keeled), Opinions (straight / measured), Humor (natural / spare) — as tap choices, not toy sliders. The defaults ARE his spec; the dials tune it. Also new: Live call voice in Settings → Voice — four warm presets (Marin, Ballad, Sage, Coral) for the call's timbre. Both choices live on the device that set them.
What no setting can ever touch: the counselor's register when the subject is Tony himself (explicitly senior to the personality), the no-fabrication grounding, the confirm-card tap gate, and owner-scoping. Disposition is never permission. The personality is pinned by the same travel-guarantee machinery as the counselor voice — a future surface move that drops it fails CI by name. TAI_DISPOSITION=0 reverts the prompt byte-for-byte.
v0.717.0STENO — the old-fashioned secretary takes it all downJul 17, 2026
Tony named it himself: a mode where Tai is on and listening but he's DICTATING, not conversing — 'I just wanna be able to just riff … and I don't wanna lose the information.' The new Steno pill in the voice dock opens exactly that: a full-screen pad where Tai transcribes continuously and does not talk. No reply, no chime, no 'got it' — silence is the feature.
Impossible to lose a word, by design: every finalized line is written to the server (his owner-scoped conversation store) the moment it's transcribed — the riff never rides in the app's memory waiting for 'process that.' Kill the app, take a call, lock the phone: everything already on the pad is safe, and reopening the pad picks the same riff back up. A line still syncing is marked 'keeping…' honestly, and if the mic drops the pad ALARMS instead of quietly not hearing.
'Okay, process all of that' (or the button) turns the riff into discrete draft items on the Builder desk — the same intake the requests inbox feeds, with the same one-tap confirm gate before anything runs. 'What do you think?' gets one on-demand text read on the pad, then silence again.
Structurally silent: the dictation session is minted with no tools and no response path — the voice layer can't answer even on a bad day. The live call button, the counselor voice, and every conversational surface are byte-for-byte untouched. TAI_STENO=0 is the kill switch.
v0.713.0A gentle front door, pads above the black bar, and the sisters get their blingJul 16, 2026
The black bar, fixed at the root: inside the native shell, env(safe-area-inset-bottom) reports ZERO while the home-indicator bar is still physically there — so pads laid out against it sat half-buried and unreachable. Every pad now stands on a max() floor (at least 34px of clearance no matter what env() claims), and the HUD gives the Dynamic Island the same respect. Nothing interactive under a system bar, on any edge.
The ramp, rebuilt as a curve: Tony's note — 'it should start off real easy and just incrementally, very small incrementally, get harder.' A free practice rope now hangs over plain backyard grass with a biscuit line along its swing: missing it costs nothing, and it teaches the catch before any water tests it. The first lagoon pit shrank from 200px to 150px, every pit mouth got a fire hydrant at its lip (a miss costs a few steps, not a trek), and the catch window widened 15→19px. A new test pins that the pits only WIDEN — the ramp literally cannot become a step again. The back half of the river book bites exactly as hard as before.
Honest verdict on 'the rope is too hard': it was BOTH. The jump/rope pads were partially under the black bar (a dead button reads as a hard jump), AND the first rope was a genuine difficulty step — first rope in the game, over water, with a 320px walk-back. Both are fixed; the native feel check is yours.
THE BLING (his words: 'little necklaces, like blingy — make them bling'): Roxy and Ginger got fluffier — fuller plume tails curling over their backs and big chest ruffs, the two things that read POMERANIAN and never cat — and they now wear necklaces, not collars. Roxy: pink diamond. Ginger: gold, like her name. The pendants glint as they run, glint off the water in the boat, and twinkle on their character-select cards. Gracie is untouched — 'you've got her perfect in there' — she remains the reference.
v0.712.0Tai stays on the call — leaving a screen no longer cuts him off, and texting stops dead-endingJul 16, 2026
Two bugs Tony hit in one minute of normal use, same flow. First: while he was talking to Tai, tapping a link or asking to open a screen cut the voice off MID-WORD — 'you could actually hear it cut off' — and he'd come back to find Tai no longer live. Root cause: a hard route change unmounts the whole canvas, which tears the live WebRTC voice session down. The keepalive that survives a screen-lock can't survive the component being removed from the page.
The fix: while a call is live, Tai does NOT auto-navigate off the canvas. A 'take me to comms' / 'open messages' ask keeps you on-surface and surfaces the destination as a deliberate 'Open Comms →' tap instead — so leaving is always your choice, and the call is never dropped out from under you. When you do tap to leave, that's you ending the call on purpose, not a surprise.
Second: asking Tai to text someone dead-ended. Instead of a send, the answer dangled a 'Messages' link to the message list — tap it and (on the canvas) it killed the call AND dropped you into an empty thread list with nothing pre-filled: worse than Tai just saying 'I can't.' That dead-end link is gone from the texting path; the confirm-card send (tap-to-approve, unchanged) is the only affordance.
Untouched: sending a text is still T2_SENSITIVE — you tap to approve, a spoken 'yes' never sends, the argsHash tap-gate and injection defense are exactly as they were. Honest limit for the QA loop: no suite drives the real native shell, so the mid-word cut-off was verified against the browser build's lifecycle, not the installed app.
v0.711.0SCORING — beat the stretch once, then go back and beat yourselfJul 16, 2026
Tony: 'I wanna make sure there's definitely a scoring system.' Built — and built to reward HOW you finish, because a score that only rewards finishing is a chore. Biscuits pay 100 × a combo chain (×1…×8) that decays when you stall, so a picked line through the night beats hoovering. Biscuits taken at zoomies speed pay double — speed is a bet.
Style pays, in both worlds: a WOOF that genuinely moves trouble (+150), a raccoon boinked from above (+200), a sniff spot dug up (+120), a rope released with real speed on it (+250), a moonbeam caught with under 25% moonlight left (+200), a dock reached without a scratch since the last one (+250), the squeaky toy (+200). Little score pops rise off the night where it happened; the HUD counts live and shows the chain.
Finishing adds a time bonus against par and a 1,000-point CLEAN bonus for never needing the mercy system. The design line that matters: tumbles never SUBTRACT. Nobody dies, and nobody gets fined for falling — clean is a carrot, not a whip. This is where 'you can't just walk through' and 'the river remembers' meet: the stretch is yours forever, the score is what you're still chasing on it.
Best runs now rank by score (then time). Old bests saved before scoring existed stay exactly where they were and rank as zero points — beatable, never erased. Everything is still localStorage only: no API, no DB, no accounts. The refuge stays a refuge.
v0.710.0CI de-rot — the unit gate is honest again (no app change)Jul 16, 2026
The unit-test job (tai-ci / test) was RED repo-wide — on main and every branch — with 'Cannot find module server-only'. One file (lib/converse/proposeFirst.test.ts) reaches an `import "server-only"` boundary; the test runner had no way to resolve it on a clean install, so the whole gate failed and a real regression couldn't stand out.
server-only is Next's server-boundary shim. The production build resolves it via Next's own internal alias (that's why the build job was green without the package). The test runner (tsx --test) had no such alias, so a bare import fell through to node_modules and failed.
Fix mirrors the build exactly: a test-only tsconfig aliases server-only / client-only to an empty shim for `tsx --test` only. The real client-import guard in production is untouched — the alias never enters the tsconfig Next reads. No product code changed; nothing a user sees moves.
v0.709.0The reports actually arrive — and a locked door stops being a doorJul 16, 2026
0.706 gave Tai the ability to READ a whole report, but nothing had ever DELIVERED one into her store — so when you asked about a report, there was genuinely nothing to open. Today's real deliverables (the Tai Hands Census, the Action Census, the Architecture Brief, the Brain Parity Audit, and more) are now IN Tai's document store, whole-file readable. Point her at one by name — "pull up the Tai Hands Census" — and she opens its actual text and holds it for the whole conversation.
Honest scope: this batch is a one-time backfill of the recent reports. Going forward, a report reaches Tai when it's published through the report pipeline at generation time; a file merely dropped in the outputs folder is not auto-delivered yet. Nothing here weakens owner-scoping — every one of these documents is Tony's alone.
The model picker no longer offers Fable. Fable can't be called from the app on the current API plan, so a badge that always failed and then apologized was a worse experience than never offering it. The canvas now defaults to Opus, and which models the picker offers is decided from actual capability in ONE place instead of two hardcoded lists that drift.
The honest 'that model's blocked for this account' message stays — but only as a fallback for a model that goes dark AFTER you pick it, never as a door we steer you into on purpose.
v0.708.0The native app can move again — the pads now speak WKWebViewJul 16, 2026
The bug Tony found in five minutes: the game played fine in the browser and was DEAD in the native app — press a pad, nothing. Root cause: the pads were driven by pointer events alone, and inside the native shell the wrapped scroll view claims any held touch and fires pointercancel, releasing the button the instant it's pressed. Safari honors touch-action: none; the native WKWebView scroll view does not.
The fix is the canonical one: the pads are now driven by NATIVE touch listeners registered non-passive, whose touchstart calls preventDefault() — the only signal WKWebView respects when deciding not to hand your thumb to the scroll view. Pointer events remain for mouse and pen. Also: the steer pad moved 8px right, clear of the iOS back-swipe edge zone the native shell has enabled, long-press callout/selection are disabled on the game, and touchmove is swallowed during play so the run can never rubber-band.
A unit test now pins the {passive:false} registration and the preventDefault call — a passive listener cannot preventDefault, so reintroducing the old pattern fails CI instead of silently killing the native app again.
Reaches your phone with no App Store update: the native shell loads heytai.app over the air, so this deploy IS the native fix. Honest limit, stated plainly for the QA loop: no suite drives the real native shell — the browser E2E runs Chromium and could never have caught this class of bug.
v0.707.0THE PACK — Roxy and Ginger join Gracie, and you pick who's running tonightJul 16, 2026
Tony gave the game a family: Tara's two Pomeranians are in, drawn from his own descriptions as string-grid originals. ROXY — 'a little bit smaller with white, cuter, more feminine looking' — renders genuinely smaller, white with a shining ruff and a pink collar. GINGER — 'a red, not bright red, but like what a Pomeranian would be' — is warm Pom orange with a teal collar, and a test literally forbids her identity line from ever saying 'red'. Gracie stays the black-and-gray Multi-Poo she is.
Character select lives on the worlds hub — 'Who's running tonight?' — and the choice carries into both worlds: the runner in the Moon Bone and the sailor on the River Moon are whoever you picked, coat, collar, pointed ears, plume tail and all.
The dogs play DIFFERENTLY without breaking a single level guarantee. Each has one signature perk, and perks are buffs only: Gracie's WOOF carries further (it's her city), Roxy floats a little on every tap-jump and holds a steadier tiller, Ginger's squeaky-toy zoomies last noticeably longer. Full-jump height is bit-identical across all three — that's the reachability floor — and a pinned test rejects any future perk that would dip below the physics the biscuit-reachability and river-corridor proofs were run against. Different dogs, same promises.
Still the same refuge: no API, no DB, choice and progress in localStorage, docks and hydrants catch every fall. Nobody dies — nobody in the pack, either.
v0.706.0Tai reads the whole report — LOAD, not SEARCHJul 16, 2026
Point Tai at one document — "let's talk about the services audit" — and she opens its ACTUAL text with the new document_open tool, not the top-8 chunks retrieval fishes out. A 20-page report fits whole.
The document then STAYS in front of her for the entire conversation: every later turn re-injects the same text automatically (code, not model memory), so follow-ups never re-fetch and never go back to the file. That's the back-and-forth without going back and forth.
Honesty about coverage is structural: every held document states exactly which part she holds — complete text, the first N of M characters, or the ingestion extract (first ~16K chars / 40 pages) — and she never claims to have read pages she doesn't hold. Too big to hold whole = she says so, out loud.
The deterministic line, not a mood: he points at a document → load it once and hold it; he asks a fact ("when's my hearing") → search the records exactly as before. No 'if you're unsure' coin flip anywhere.
Tai now notices a new report arriving: when Dispatch drops a deliverable in outputs, a 'New report' card surfaces in /alerts and the daily brief — title only, never contents, capped at medium so it can never buzz a push or outrank a court date. No read-tracking exists, so she never claims 'you haven't read it' — only that it's new.
Tenancy untouched and provable: every read runs on the RLS session client (owner_user_id = auth.uid()); there is no service-role path in the loader. Held text joins the fact-guard haystack so quoting the report never false-trips the guard.
TAI_DOC_HOLD=0 is the kill switch — the tool answers honestly that reading is off and old threads' holds go inert.
v0.705.0The last inch of propose-first — the drafted text now actually shows up in the cardJul 16, 2026
0.701.0 got propose-first right: you say 'text Maria I'm running late' and Tai drafts it and mints a confirm card instead of interviewing you. But on the /tai canvas — the surface you actually talk to — the card never appeared. Tai SPOKE 'here it is, ready for your approval' while the message box on screen sat empty. The draft was real; the card that should have carried it was thrown away before it reached you.
Root cause: the canvas reads Tai's reply as a stream of events, and it was keeping the spoken sentences while silently dropping the 'proposed action' event that carries the confirm card and its drafted body. The 0.701.0 note said the card was 'wired and gated' — true for the chat thread, but the canvas (which is THE Tai surface now) had no path to render it at all. So propose-first reached the model and the draft, then dead-ended one inch from your screen.
Fixed both halves: the canvas now keeps the proposal (with its full message body) and renders the confirm card right under Tai's answer — one tap to Approve, or 'use my wording' to redraft. A chained request ('text Maria and move my 3 o'clock') collapses into one review card, same as the chat thread.
The safety answer, plainly: no, you could not have approved something you couldn't see. On the canvas the whole card was missing — there was no Approve button to tap, so nothing could be sent unseen. It failed closed on sending and broken on the feature. Now the card shows the exact recipient and the exact words before any tap, and the approval gate, the red-team injection defense, and 'a spoken yes never approves' are all untouched (147/147 still green).
Locked so it can't silently come back: a unit test now feeds a proposal through the canvas's event drain and fails if the card is ever dropped again — a render-layer regression a green logic suite used to be blind to.
v0.704.0The river remembers — resume at your furthest stretch, and the book genuinely bitesJul 16, 2026
Tony's call, verbatim: 'I don't want to start over ever… if I was at the third one, you just start off at the third one.' Re-entering the River Moon now lands on a resume screen for the furthest stretch reached — one tap and she casts off from exactly where the night left her. Cleared stretches stay cleared forever and stay replayable from the list; beating stretch 7 means you come back to 8, never to a grind through 1–6.
What persists and what resets, decided on purpose: your furthest stretch and every best-run trophy persist forever (localStorage, still no API, no DB). Biscuits, moonlight and the run itself reset per attempt — a board is beaten by a run, and carrying half a run across sessions would cheapen the trophy. Within a run, nothing changed: docks and hydrants still catch every fall. Nobody dies.
And his other sentence got built too: 'you can't just walk through the whole thing.' The back half of the book now bites — up the river the clouds drain moonlight faster (up to 1.4×), a sloppy bonk shakes loose up to 1.8× the light, the silver refill patches get narrower and sparser, the channels tighten and the water gets denser with traffic. The corridor solver still PROVES every stretch passable, so it's hard the honest way: the clean line always exists, holding it is on you.
A test now pins the difficulty ramp itself — drains and bonk costs may never decrease up the book, the finale must stay fast and hungry, and the closing water must stay denser than the warm-up — so a future edit can't quietly flatten what makes beating it mean something.
v0.703.0Gracie's Chicago Nights — she gets her real coat, and a whole new world on the riverJul 16, 2026
Gracie is finally HER. The sprite shipped cream; the real girl is a black-and-gray Multi-Poo. Her coat is now dark charcoal with silver-gray curls and a moonlight glint by her eye so her face stays alive against the night — fixed once in the design tokens, so she's the right dog in every world at once.
/game grew into GRACIE'S CHICAGO NIGHTS — an anthology where every world is another night in her city and a different kind of game. Night 1, THE MOON BONE, is exactly the game from this afternoon, untouched. The hub adds one tap and a locked 'Night 3 — she's still dreaming it up…' card for what comes next.
Night 2 is new: GRACIE & THE RIVER MOON. The moon dropped the bone in the lake, its reflection is drifting upriver, and there's a rowboat at the boathouse nobody's using. Ten stretches of night water — logs, drawbridge pylons, geese (WOOF moves them), buoys, fountain jets, night barges — each stretch adds one new thing and runs a little faster, ending at the river mouth where the lake opens.
Instead of fuel, MOONLIGHT: the little boat runs on the moon's attention. Clouds drain the meter; gliding through silver patches on the water refills it. Nobody dies here either — a capsize or a dark moon just drifts her back to the last dock, exactly like the hydrants in World 1.
Every stretch is PROVABLY beatable: a corridor solver walks the whole river assuming worst-case sway and always-on fountains, the generator deletes anything that pinches the channel shut, and the unit tests re-verify the corridor stays open and every biscuit, moonbeam and squeaky toy sits inside it. Original everything — pixel art from string grids, no assets, no borrowed games.
Still deliberately disconnected from the life-admin machine: no API route, no DB — stretch progress and best runs live in localStorage and nowhere else. TAI_GRACIE_WORLDS=0 restores yesterday's /game byte-for-byte.
v0.702.0Migration pipeline fully unwedged — 0121 was still killing the chain before 0128 could runJul 16, 2026
PR 2380 fixed migration 0128 so it self-heals rogue rows and uses NOT VALID. But 0121 sorts before 0128 and has the same DROP + validated ADD pattern — with no 'canvas' in its allow-list. The 7 canvas conversations from today caused every apply run to 23514 right at 0121, before the chain ever reached 0128's fix. Same two-part remedy: self-heal (coerce stray surface values to 'chat', preserving 'canvas' since 0128 adds it to the allow-list moments later) + NOT VALID (enforce on new writes, skip the historical scan). The chain can no longer wedge here.
v0.701.0Propose, don't interrogate — Tai drafts the thing instead of interviewing you about itJul 16, 2026
The honest finding first: the hands were never the problem. Sending a text or email, adding/moving/canceling a calendar event, logging Gracie's refill — all of it was wired, credentialed, and gated behind a confirm card. What was broken was the reflex in front of it. You'd say 'text Maria I'm running late' and Tai would ask 'what would you like it to say?' — an interview instead of a draft. The moment died there.
Fixed by making propose-first a deterministic rule, not a suggestion. When you state an action and the content is already in your words, Tai fills the obvious defaults and shows you the confirm card now — 'text Maria I'm running late' drafts that text; 'put dinner Saturday at 7 on my calendar' drafts that event. It asks exactly ONE question only when a required field genuinely can't be defaulted: 'text Maria' with no message, or two real people who match the name. Every other case, it proposes.
Why a rule and not a nudge: to a model, asking always feels safe — a question is never 'wrong'. But a wrong draft costs you one tap on Cancel, while an interrogation costs you your belief the app can do anything. That asymmetry is now written into the rule, and a test locks the rule's shape in so a later edit can't soften it back into a mood.
Nothing about approval changed. Proposing is not sending. Every sensitive write still waits for your tap on the confirm card, a spoken 'yes' still never approves one, and Tai never invents a detail you didn't give. The red-team suite that proves this is still fully green.
Also fixed the calendar lie: 'what do I have this week' now reads the exact same events the Calendar grid and calendar_upcoming show — including recurring ones — so it can't answer 'clear' while a real event sits on your week.
v0.700.0Tai speaks first — the proactive brain was built, and it never ran onceJul 16, 2026
The honest finding first: the entire speak-first system already existed — six detectors over your real records (bills, court, legal deadlines, Gracie's meds, appointments, anomalies), a ranked alerts feed, push notifications with quiet hours (10 PM–8 AM), an anti-nag gate that interrupts for at most ONE critical thing with an 18-hour cooldown, and permanent structural dismissals. And it has never run in production. Its only trigger was a Vercel-native cron that has failed auth on every scheduled run since it shipped. It knew, and it sat in silence — because nothing ever woke it up.
Fixed the way every working Tai cron is fixed: a GitHub-driven twin now fires the engine every 30 minutes. The Alerts feed fills, and when — and only when — something is genuinely critical (overdue, or due today/tomorrow), Tai buzzes your phone about that one thing. A Cubs score never qualifies. Everything else waits quietly in Alerts for you to find on your own time.
Your 'stop' is permanent and structural: dismissing an alert records a durable resolution that every surface honors — the cron can't resurrect it, and push can't bypass it. A dismissal of a recurring thing (a monthly bill) sleeps until the obligation genuinely recurs; 'stop showing me this category' hides it indefinitely.
A guessed date can never shout at you: the SSDI Appeals Council date is a computed estimate (0.696.0), and the proactive engine now treats any estimated date as un-pushable — it surfaces in Alerts capped at medium, labeled plainly as an estimate whose real date could differ, and it can never fire a countdown notification.
How to turn it down or up: it ships ON. Set TAI_PROACTIVE=0 in Vercel to fall back to the older per-item push loop, or disable the tai-proactive-refresh workflow in tony-hub-cron to silence the lane entirely — no redeploy needed for either.
v0.699.0Every scan Tai can read, it now does — and an alarm fires if it ever falls behind againJul 16, 2026
344 image-only scans are now brain-readable: Tai can quote them, not just open them. The OCR pass ran against every PDF and TIFF that was locally on disk, skipping iCloud-only files and encrypted sources cleanly rather than crashing the whole run.
Encrypted and corrupt PDFs no longer poison the batch. A single locked file used to flip the run's exit code and mask every other result; now they're counted and skipped honestly.
A blindspot alarm runs every 6 hours (GitHub Actions). When the June 2026 Mac extractor died silently, no alarm fired — 2,363 docs including medical evidence went brain-dark for a month. That can't happen now: if the readable count drops below the floor or the OCR job falls behind, the workflow goes red and opens a GitHub issue.
v0.697.0Tai finally remembers you — and a correction from you is permanentJul 16, 2026
The honest finding first: the memory system was built three times and its store was EMPTY in production — zero facts. The seeds (who Maria is, who your attorneys are, what happened in 2018) shipped behind a button nobody ever pressed, and the nightly job that learns from conversation has been silently failing auth since it shipped. Every recall path worked perfectly over nothing.
Fixed for good, not by hand: the canonical facts now seed themselves on the nightly memory cron (idempotent — re-running reinforces, never duplicates), and that cron actually runs now via the same GitHub-driven pattern every working Tai cron uses. If the store ever empties again, it heals itself the next night.
The seeds tell today's truth, each traced to a real record: Bardo is recorded as NOT currently acting on the DuPage cases (your words, Jul 14); the SSDI seed says the hearing happened and the ALJ denied on Jul 7, with the appeal deadline deliberately unconfirmed; Gracie carries her real medical picture (Vetmedin heart murmur, Librela allergies, kidney flag); Tara Zeno, Tommy Gigiano, and Maria/Tracy are exactly who they are.
When you correct Tai — 'no, Maria is my daughter' — it now sticks on the surface you actually use. The canvas/voice loop writes your correction at a permanently higher rank than whatever it replaced, retires the wrong belief, and recall flags it as overriding. A stale note can never outvote you again. And a correction that contradicts verified canon (someone calling Maria your wife) is refused outright, never stored.
Your standing orders now travel: the boundaries and preferences layer that only the old ask box respected is injected into every canvas and voice turn — loaded in parallel, so nothing got slower.
v0.696.0The SSDI appeal date says what it really is: an estimateJul 16, 2026
The bottom line, honestly: the September 10 Appeals Council date is a computed ESTIMATE, not a date anyone read off your decision. The one document that states the real appeal window — the ALJ's Notice of Decision — is not in your readable file. What's there is only Spector's July 7 cover emails; the decision itself came as a PDF attachment that was never pulled into text, so nothing in your records actually says '60 days' or names the real deadline. Every place Tai shows the date now says 'estimate — confirm with Spector,' not a confident 'September 10.'
Two reasons the real date could be EARLIER than Sep 10, which is the dangerous direction: the July 7 we counted from is the day Spector emailed the decision, not necessarily the date printed on the notice; and we can't check the notice because it isn't in the file. So Tai treats Sep 10 as a placeholder that might be too late — never as the deadline.
Your phone won't get a false countdown. The deadline-watch alerts no longer blast 'N DAYS LEFT / DUE TODAY' toward a guessed date — a countdown to the wrong day is worse than none. In the final month you'll get one plain nudge instead: call Spector and confirm the real date. The appeal itself is hers to file; the one thing only you can do is make that call.
This corrects an earlier note that said the date was 'in good hands, tracked as information, not an alarm.' It's in Spector's hands — but the date on file is Tai's arithmetic, and until someone reads it off the notice, the app says so plainly.
v0.695.0Menu-bake honesty patchJul 16, 2026
The dining-intel cron now counts a menu as baked only when the storage write actually lands. First live run of 0.693.0 reported two menus fetched while the storage bucket silently rejected JSON (it allowed PDFs only — widened now); the counter could not see the difference. It can now, and a failed write shows up as an error instead of a success.
v0.694.0Menu-bake honesty patchJul 16, 2026
The dining-intel cron now counts a menu as baked only when the storage write actually lands. First live run of 0.693.0 reported two menus fetched while the storage bucket silently rejected JSON (it allowed PDFs only — widened now); the counter could not see the difference. It can now, and a failed write shows up as an error instead of a success.
v0.693.0The dining life gets its table back — and its depthJul 16, 2026
The finding first, honestly: the pipeline that carries a new reservation from your calendar into the dining surface had NEVER successfully run — its scheduler was rejected (401) on every single attempt since it shipped, 47 straight failures, and the dining module was frozen on a June 19 snapshot. It now runs every two hours on a healthy scheduler, and this weekend's three tables — RPM Italian Friday, The Alston Saturday, Carmine's Sunday — flowed in on the fixed path.
Every upcoming reservation now remembers what YOU thought. Carmine's card carries your own April verdict — the 10/10, the fried calamari and pork chops you scored, ask for Steven. RPM Italian says the honest thing no other app can: first time here, but you know the family — your RPM Steak and RPM Seafood history is right there. The Alston says 'first visit' plainly, and the review template will be waiting.
The real menu, days ahead. Menus are transcribed from the restaurant's OWN official site, verified line-by-line against the fetched page — an item that isn't literally in the source is dropped, a price that doesn't match is stripped — and stamped with where and when it was fetched. The Alston came back 84 verified items across 18 sections; RPM Italian 48 across 10; zero fabrications survived the gate in either. Carmine's menu page isn't machine-readable, so it gets a one-tap official-menu link instead of a guess. No menu is ever invented.
First-time restaurants get a real page now: /dining/r/rpm-italian-chicago and /dining/r/the-alston used to 404 even with a live reservation. 'Where am I eating this weekend?' answers by voice with all three nights — that path was already built; it just never had data until today.
v0.692.0The dining life gets its table back — and its depthJul 16, 2026
The finding first, honestly: the pipeline that carries a new reservation from your calendar into the dining surface had NEVER successfully run — its scheduler was rejected (401) on every single attempt since it shipped, 47 straight failures, and the dining module was frozen on a June 19 snapshot. It now runs every two hours on a healthy scheduler, and this weekend's three tables — RPM Italian Friday, The Alston Saturday, Carmine's Sunday — flowed in on the fixed path.
Every upcoming reservation now remembers what YOU thought. Carmine's card carries your own April verdict — the 10/10, the fried calamari and pork chops you scored, ask for Steven. RPM Italian says the honest thing no other app can: first time here, but you know the family — your RPM Steak and RPM Seafood history is right there. The Alston says 'first visit' plainly, and the review template will be waiting.
The real menu, days ahead. Menus are transcribed from the restaurant's OWN official site, verified line-by-line against the fetched page — an item that isn't literally in the source is dropped, a price that doesn't match is stripped — and stamped with where and when it was fetched. RPM Italian and The Alston bake automatically before the weekend; Carmine's menu page isn't machine-readable, so it gets a one-tap official-menu link instead of a guess. No menu is ever invented.
First-time restaurants get a real page now: /dining/r/rpm-italian-chicago and /dining/r/the-alston used to 404 even with a live reservation. 'Where am I eating this weekend?' answers by voice with all three nights — that path was already built; it just never had data until today.
v0.691.0Watch the Cubs — real video, in the roomJul 16, 2026
You've asked to watch the Cubs in-screen for a long time, and it never played. Now it does. Say 'show me a Cubs highlight' and real MLB video lights up right on the canvas — the marquee scoring play, or ask for 'the condensed game' and the whole recap plays — as native in-app video. No redirect, no browser sheet, no 'watch on YouTube' dead-end.
Why it never worked before: the 'Show me' screen shipped two days ago pointed at a YouTube scrape. From the datacenter it draws YouTube's consent wall (so it finds nothing), and even a clean hit often lands on a clip the rights-holder disabled embedding on — so the frame stayed black. Cubs asks now route to MLB's own DRM-free highlight MP4s (mlb-cuts-diamond.mlb.com) — the exact clips the Cubs card already plays — which stream from any IP and inside the native app.
The honest part, straight: a LIVE Cubs game still cannot play here. MLB.TV and Marquee are locked behind DRM and blackout rights — no app can legally embed the live feed, and this one won't pretend to. What CAN play — scoring plays, key moments, the full condensed game after it ends — now plays, in the room, the moment you ask.
Everything else is untouched: the Cubs card and its highlights still work, and a non-Cubs 'show me' (the moon landing, a recipe) still falls through to the YouTube path as before.
v0.690.0Teach me and tell me about mine — two asks, one answerJul 16, 2026
Tai now knows the two kinds of question you actually ask. 'Teach me' — how an Appeals Council review works, what own-occupation means — gets the deep brain's real expertise at real depth: on voice, a genuine explain/compare/walk-me-through ask now routes to the deep brain instead of being answered by the shallow realtime layer. A one-breath settled fact and light banter stay instant — the speed rule is untouched.
They are not modes — they're two ingredients. A blended question ('should I be worried about the Appeals Council timeline?', 'how's Gracie doing?') grounds your real facts first, then puts the expertise to work ON those facts: your actual deadline against how the process really runs, her actual refill against what the medication does for her. A records read-back alone is half an answer now, and so is a generic explainer.
How you know which you got: the answer's own grammar. A fact about you wears its provenance in the sentence ('your hearing on file…', 'as of Tuesday…'); world knowledge speaks as the world; a blended answer keeps the seam audible. No second badge, no mode chip, no switch to remember — and you can steer in plain words: 'in general' means teach, 'for my case' means ground it.
The router got the missing coverage: 'Appeals Council' questions now classify as legal (steer + records prefetch, zero added latency), and Gracie has her own domain — her meds and refills ground through the same records ladder, spoken about like family, never like rows. Anti-fabrication, the confirm-card write boundary, and the deterministic 0.688 router are all untouched — one more question class routes on purpose, nothing new is guessed.
v0.689.0The orb is the largest thing in the room — not the greetingJul 16, 2026
The presence pass killed the tagline and then promoted 'Good afternoon, Tony' into a display headline — the same disease in a nicer suit: a salutation at headline scale is still the screen introducing itself. At rest the ORB now leads the room (it grows to be the largest thing on screen) and the greeting is one small serif line beneath it. NEEDS YOU becomes the loudest text on the screen — the thing that actually needs you.
The pills under the orb (Converse / engine truth / model truth / Call me) were a lopsided control panel — three sizes, descending, off-axis. They now sit in ONE centered row at ONE scale. The truth signals got louder, not quieter: the engine and model badges grew from 9px to the same 10px as the actions.
The version chip can no longer sit on top of 'Everything lives in All of Tai' — the chip's floating lane is now a shared design token (--t-fab-lane) and the canvas foot reserves clearance from the same token, so the two can't drift back into overlap.
The two anonymous circles floating top-left are named now: 'Flag' (leave feedback) and 'History' (your past conversations), tucked into the true corner. And the home screen no longer wears a 'Back' chevron — this IS home; every other module keeps its back and steps back to here.
v0.688.0The voice router is no longer a coin flipJul 16, 2026
The instruction at line ~163 said: 'if even slightly unsure, call ask_tai — routing is always the safe choice.' That re-ran a judgment call every turn and produced the inconsistency you proved live: ask about Hitler and she answers brilliantly; ask something adjacent to your life and she stalls. Same question class, different answer, because the model re-decided. It's gone. In its place is a two-column rule — route for your personal records + live numbers + proposed actions; answer directly for general knowledge + opinions — with four explicit examples for the ambiguous middle: IBS causes vs IBS history, Cubs deadline opinion vs Cubs record right now.
The model picker badge now has three honest states. Selected (quiet, your tap is registered). Engaged (the dot pulses while the brain is generating your answer — you can see it working). Mismatch (amber, shows 'Fable → Opus', for the case Anthropic's safety classifier reroutes a request silently — the only way to catch it).
v0.687.0The fix finally travels — one egress, one registry, and the AT&T phantom diesJul 16, 2026
Six times in one day a rule we'd already built, tested, and shipped was sitting in one file while the identical bug ran free in another — the stall stripper, the opener strip, the steering-leak choke, the warmth contract, Gracie's precedence, the extractor's alarm. Every fix was stapled to whichever path needed it that day, and the next path inherited nothing. Now there is ONE egress (lib/answer/egress.ts) every wired answer path runs — stall strip, opener strip, steering-leak filter, phantom-name guard, factGuard, spoken-markdown strip — and a registry with a CI test that FAILS when any model-call path exists outside it. Answer path #16 cannot be born unguarded: the scan finds it, demands a registry entry, and the entry demands the rules. The general-knowledge lane, which ran no deterministic guard at all, now runs the full stack.
The bill that wouldn't die is dead: you've dismissed the phantom AT&T $487 for months and a tracker touch kept resurrecting it, because bills' only protection was a timestamp race — and your /today taps and voice dismissals were never protected at all. Precedence (built for Gracie's meds in 0127, never for bills) now covers bills end to end: the feeder refuses to overwrite anything you personally acted on regardless of timestamps (works before any migration applies), and migration 0130 adds a database trigger so ANY future writer that lowers your authority becomes a no-op — a new billing cycle (a genuinely later due date) still comes through. Extends 0.685.0 (which guarded deletes and the tracker-dismissed stamp) to every way you actually dismiss: mark-paid, /today Done, conversation, voice.
The conformance sweep's first run caught a live one: voice writes (tai-voice:*) — your spoken 'mark it paid' and Gracie refills — ranked as feeder data under the shipped convention, beatable by a stale feed. They now rank as YOUR hand everywhere: bills feeder, meds feeder, the Gracie read-merge, and the 0130 trigger, with a parity test that fails if any of those ever disagree again. Prompt-plane rules that no guard can check — the qualifier is part of the fact, narrate don't dump, the stall-shape ban — are pinned by sentinel per prompt builder: rewrite the wording freely, drop the rule and CI names the file. Zero added latency: every guard already ran somewhere; they moved behind one door. /talk byte-for-byte untouched; 0.684's counselor voice, 0.682's badge truth and stall shape, 0.680's qualifier contract all pinned by the same tests that now protect them.
v0.686.0The one screen stops introducing itselfJul 16, 2026
You said it still feels like a website, and here's why it did: the screen was covered in copy about itself. A breadcrumb saying where you are, a tagline selling the concept, a feature list under the orb, ten chips holding up a menu of things you could say, and a footer explaining how to use it — five pieces of self-description, zero words addressed to you. A website introduces itself; a person greets you. All of it is gone. The first words on the screen are now “Good evening, Tony.” — and the room says nothing else it doesn't need to.
The ten-chip menu is now ONE quiet suggestion that changes each time you open the app, so every verb still gets taught — one thought at a time, the way a person offers one, not a laminated list. The floating Tai button no longer appears on the screen that IS Tai (it was sitting on top of your text box), and the canvas now keeps clear of the version chip so nothing overlaps it. What didn't move: NEEDS YOU, the REALTIME pill, the model badges, the text input, and everything you can summon — Bills, Court, Gracie, Cubs, all exactly where they were.
v0.685.0Bills precedence — a dismissed bill STAYS dismissedJul 16, 2026
The AT&T $487 bill has been dismissed a million times. The feeder kept winning: once bills_tracker.json was reconciled after a tap, the time guard stopped protecting the row and the feeder re-pushed it as paid — which showed on /money. Infinite loop. Same design defect the Vetmedin / Credelio meds phantom exposed (fixed in 0.672). The fix is the same: precedence is an EXPLICIT authority dimension, not a timestamp race. Migration 0129 adds precedence / provenance / corrected_at to tai_bills.
deleteBill() now stamps precedence=2 + provenance on every Tony deletion. The feeder reads existing precedences before writing; a row where precedence≥2 is skipped entirely — no field, no status, no timestamp in the file can ever overwrite a Tony attestation. Bills marked dismissed:true in bills_tracker.json are written directly as status=deleted + precedence=2, so the DB row is armed before Tony even opens the app.
The AT&T bill (att-wireless-maria) is killed at the source: dismissed:true added to bills_tracker.json with dismissal provenance (paid 2026-07-02, verified 2026-07-13). The next feeder run will stamp precedence=2 on the DB row, and every run after that will skip it via the protected-IDs guard.
v0.684.0The canvas keeps the counselor's voice while gaining the loop's handsJul 16, 2026
You called it at 20:46 — “there's been a regression on the speech” — and the diff agreed with you exactly. At 13:15 the canvas answered through the same warm engine /talk uses, on Opus, with both warmth strippers on every line; at 19:58 it moved onto the new agent loop to fix the Cubs question, and in that one routing change it silently lost all three. Nobody chose that trade. Now the third thing exists: the counselor's register rides the loop itself as a standing contract — answer first when you ask for a fact, feeling first when you're working something out, Gracie and the Cubs treated as yours and not as rows — so the voice you called perfect and the hands that answer “who's leading the NL Central” are finally the same person.
The two proven post-processors — the AI-opener strip and the stall strip — now run at the loop's own egress, the same pair the old path always had. And the canvas runs Opus again by default (the model it answered on when you called the reaction perfect), with a no-deploy kill switch back to Sonnet and the violet picker still winning per session. The typed chat thread is untouched, /talk is untouched, and every honesty guard — grounding, fact guard, provider names, the qualifier-is-part-of-the-fact rule, the stall shape-kill — is exactly where it was.
v0.683.0Embed feeder: the timeout half of the cry-wolf fixJul 16, 2026
Smaller embedding batches clear the database statement timeout that killed two large documents, and a run now goes red only when zero documents embedded — partial failures warn instead of crying wolf.
v0.682.0The badge tells you which brain answered — and the stall dies as a shape, not a phraseJul 15, 2026
The model badge you've been A/B-ing by ear was labeling the SELECTION, not the answer — so results could read shifted by one, and you'd already drawn a conclusion from it. Now every answer is stamped with the brain that actually produced it, reported by the server (not the picker), and pinned to that answer on screen. The violet picker stays what it is: the brain for your NEXT question, which takes effect immediately — mid-conversation, no restart. This also settles the Fable question: a “FABLE” stamp means Fable genuinely ran, because a model that can't run errors out loud instead of silently falling back.
The lookup stall came back through a phrasing the stripper didn't know — “Let me pull the latest live numbers so I'm giving you the real picture.” A word list always loses to a model inventing the next phrase. It's now killed as a SHAPE: any opening sentence whose job is to announce the fetch instead of deliver the fact is stripped, however it's worded — while real presence (“let me sit with that,” “let me think”) is left alone. The test is simple: could that first sentence exist before you knew the answer? If yes, it's a stall.
v0.681.0A model failure can no longer wear your microphone's faceJul 15, 2026
With the badge on Fable, every spoken ask came back “I didn't catch that — say it again?” — but the transcript was right there on screen. It caught you fine; the MODEL returned nothing, and the canvas blamed your voice. That line now appears ONLY when the transcript is genuinely empty. When the answer path fails — the model, a tool, the backend — the card says so honestly: “Fable didn't answer — that's on my end, not your voice,” and names the model so you know which one went dark. Sonnet and Opus are untouched and still answer.
Why Fable specifically returned nothing: the API call was failing and the code threw away the reason before anyone could read it. It now reads the real error off the API, logs it verbatim, and — when the API rejects the model itself (the shape a data-retention or entitlement block takes for Fable) — tells you plainly it's an account-level block, not a mic problem, and to switch the badge to Sonnet or Opus.
v0.680.0The caveat is part of the answer — warmth can't smooth it awayJul 15, 2026
Tonight's 78°-vs-90° miss had a second half: the brain honestly composed “around 78 — that's the forecast, the live feed is down” and the final voicing smoothed it to “78 right now.” Nothing was invented, so no guard fired — a qualifier was dropped to make the sentence flow. The standing contract that rides with every lookup now states it as law: a hedge, an as-of date, a provenance note, a “forecast, not a reading” is part of the fact — rephrase it warmly, never drop it, never sound more certain than the data is. Proven on the exact failing case: before, three out of three answers said “78 right now”; after, three out of three kept the caveat in the same breath as the number.
This matters most where a dropped “unconfirmed” or “as of last week” changes the meaning — money, court, health — and it now applies to every lookup on every surface, not just the weather.
v0.679.0The main Tai screen answers againJul 15, 2026
Tonight's voice-model experiment let the main screen identify itself by its own name to the conversation store — but the store's allowed-list was never widened to match, so every single ask on the main screen died before the brain even ran: “I didn't catch that — say it again?” no matter what you asked. Found it during the stall-opener verification, minutes after it broke. Fixed twice over: the store now accepts the canvas by name, and even if that database change hasn't been applied yet, the conversation falls back to a plain chat thread instead of dying — the same proven fallback the history drawer has used for months.
v0.677.0“Let me grab that live” is dead again — on every surface this timeJul 15, 2026
You caught the regression live: the canned stall opener was killed months of complaints ago, then the main Tai screen moved onto the new live brain and the filler walked right back in — the guard only existed on the old path. Two fixes, both permanent: the brain is told outright that announcing a lookup is banned (it calls the tool silently; the first words you see or hear are the answer), and a deterministic stripper now sits on the new path too — the same proven one the old path had — so even if the model slips, the stall never renders and is never spoken.
Nothing about the honest pause changed: while a lookup runs there's simply quiet, then the answer. What's gone is the performance of it.
v0.676.0The temperature is the real one — and an evening never gets a morning's tenseJul 15, 2026
You asked the temperature twice, five minutes apart, and got 78° then 90°. The 90° was real — the actual thermometer at Midway. The 78° was that hour's forecast, a prediction the app quietly fell back to when the live reading didn't come through on one request — and it got spoken as "78° right now," which it never was. Now when the live reading is missing, the number can't be dressed up as current: it's stated as the forecast it is, with "the live reading is down" riding in the same breath, and that honesty is wired so it can't be smoothed away.
The "84° this afternoon" at 8:46 PM is fixed too: a forecast period that has already ended can no longer lead the answer, so the evening never gets narrated in a tense that belongs to a day that's already over.
v0.674.0Tai stays herself when she looks something upJul 15, 2026
You caught it live: "who's leading the NL Central" came back factually perfect and sounding like a wire ticker — "its human-like quality disappears." The cause: every lookup's fine print ended in a stack of never-make-anything-up rules and nothing else, so the last thing the brain read before answering was a list of prohibitions — and it recited. Now every lookup also carries the other half: the numbers must be real, but reacting to what they mean was never against the rules. The Cubs five back is your team five back, not a standings row.
This rides with EVERY lookup — sports, news, weather, web, dining, your records — from one shared place, so the next tool added can't miss it the way the sports feed missed the warmth rule. Nothing about anti-fabrication loosened: every score, headline, and figure still comes only from the live result, and an honest miss still beats a made-up hit.
v0.673.0Ask about the Cubs any way you like — you get the real answer, every timeJul 15, 2026
"How are the Cubs doing," "what's their record," "who's leading the NL Central" — all three used to be a coin flip: one phrasing got the real standings, another shrugged "I can't pull current standings." The app always had the answer; a hidden keyword list just wouldn't let it out unless you used the exact right words. The main Tai screen now runs the same live, tool-using brain your voice already uses — it decides when to look things up, so there's no magic-words list to miss. The Cubs record, who's leading, games back, the streak, and the last/next game now come straight from the live MLB feed however you ask.
News and web answers stopped coming back empty-handed: when a search returns real article summaries, Tai now actually reads them instead of showing you a bare list of headlines with nothing behind them.
v0.672.0Gracie's meds finally stick — and a stale reminder can't un-stick themJul 15, 2026
Fixed the fact behind a real miss: her Credelio Quattro (the monthly flea/tick/heartworm chew) was on file as last given Apr 20, but you gave it Jun 19 — so the system thought she'd been overdue for two months and never raised the reminder for when she's actually due, around Jul 19. The date is corrected and the reminder is back on schedule (7 / 3 / 1 days out).
Started tracking two of her meds the app was silently ignoring: her monthly Librela arthritis shot and her Cytopoint allergy shot. A tracker watching 3 of 6 meds quietly implied "all covered" — now all six are listed, and the two injections honestly show "needs a date from you" instead of pretending.
The permanent part: once you record a dose — by voice or by typing — nothing can overwrite it. A background job that re-reads an old file, or mis-reads a vet receipt as a refill, can no longer push a wrong date over the one you set. Your word outranks the feeders, always. And every time you log a dose the app now reads the record back to confirm it actually saved — if it didn't, it tells you instead of pretending it worked.
v0.671.0When you ask Tai something, you get her answer — never her private notesJul 15, 2026
Fixed a bug where, on a sensitive question (you'd asked about Gracie's medications), the canvas showed Tai's own internal note-to-self about how to answer — the behind-the-scenes safety instructions — instead of her actual answer. You now always get the real, careful reply: what's on file, and to run any changes past the vet.
Added a hard guardrail so this can never happen again: any internal instruction text is now blocked from ever being shown or spoken, on every path. Her honest safety behavior is unchanged — only the leak is gone.
v0.667.1The app opens where it should — on Tai, never the old lobbyJul 15, 2026
Opening the app sometimes dropped you on the old "Today" home screen instead of Tai. That screen is a retired room — everything it held now lives on the Tai canvas — so a cold launch now goes straight to Tai, the way it was meant to. Nothing about how you use Tai changes; you just stop landing on the dead end.
Fixed the "Add Tai to your Home Screen — tap Share in Safari" hint that was popping up inside the installed app, where it makes no sense. The app now recognizes it's the real installed app and keeps that hint for the browser only.
v0.667.0The last documents that only lived on your Mac can finally come to your phoneJul 15, 2026
About 2,182 of your real documents — 838 legal, 304 financial, 134 medical, and the rest — were never actually on your Mac: they were iCloud placeholders whose contents live only in the cloud, so uploading them here was skipped rather than risk forcing giant downloads. A new tool you run from your Mac now closes that gap: it brings each file down one at a time, uploads it, then pushes it straight back to cloud-only, so the ones that used to show "on your Mac, not yet uploaded" will finally open on your phone.
It is careful with your laptop and your originals. It never moves, renames, or deletes a source file — it only reads a copy and asks iCloud to re-park the bytes afterward (a reversible cloud eviction, never a delete). It works in small batches so it can never fill your limited free disk, records its progress so a stop-and-restart just resumes, and if you cancel it mid-run it puts everything back to cloud-only on the way out.
v0.666.0The coherence pass — one canvas, one grammar, and it knows what needs youJul 15, 2026
Open Tai and say nothing — the screen already knows what needs you. A quiet "Needs you" pulse on the resting canvas ranks your real obligations by urgency, never novelty: a hearing inside its 7-day window first, then a medication (yours or Gracie's) running out, then a bill overdue or due within days, and — only if the obligations leave room — tonight's table. Every line is a dated fact from the same engines the modules use; tap it and the module rises exactly as if you'd asked. Nothing urgent → nothing shown, ever. No invented red badges.
One visual grammar across every module the canvas can raise: the Cubs board, the Matter Board, the map, the video screen, the Good Stuff, the Shelf, and T's Room now share a single card shape, a single pill for every small action, a single list-row treatment, and one seven-step type ramp — instead of four different corner radii and a dozen one-off text sizes. Everything works exactly as before; it just finally reads as one thing.
One motion vocabulary: summon, swap, and recede now ride five named beats of a single clock, and the two places the animation timing disagreed with the code driving it (the swap's sink, the recede's exit) are now the same number by construction — so a change of subject reads as one continuous gesture, never a flicker.
Fixed: the Cubs board's small-caps labels silently fell back to a generic monospace font because they referenced a token that doesn't exist (--t-font-mono vs --t-mono) — they now render in the app's real mono face, a touch larger and more legible.
v0.665.0Your document library can never go dark in silence againJul 15, 2026
The quiet failure that hid for a month is now impossible. In June, the job that reads your documents stopped and nothing said a word — roughly 2,700 of your most important files (your active SSDI claim, legal filings, the Ameritas and Unum disability records, your Cayman medical) sat indexed but unreadable, and no alarm ever rang. A new daily check now counts your real library every morning and screams the moment anything slips: it opens a loud alert and records an honest status you can read.
You can just ask. "Is my library complete?" now gets a straight, out-loud answer — how many of your documents are readable, how many are still waiting, and whether anything is stuck — instead of a confident shrug that hides a gap.
OCR finally runs on a schedule. Scans that are just a picture of paper — with no text underneath — used to be un-searchable forever because the reader could never actually run. Now they're processed automatically in the cloud, free text is always recovered first, and a scan is only ever OCR'd when there's no faster way to read it.
The pipeline stops crying wolf. Two overlapping runs used to collide and report FAILURE even when the work was already done, and the biggest files (your Pedi records) could time out — both trained everyone to ignore the red. Fixed at the root, so a red light now means a real problem.
v0.664.0T's Room comes into the room — your hub rises on the canvasJul 15, 2026
Say "T's room", "my room", "anything interesting", or "what's good today" and T's Room — your personal hub (AI, tech, movies, food, Chicago, martial arts, concerts, metal, sports) — rises right on the Tai canvas like Bills or the Cubs board. No more navigating away to a side page; the full /feed page stays one tap away.
On the canvas it's a room, not a list: the single best story leads, the few sections most worth your eyes now sit under it (sections you've tuned up come first), and everything else recedes into a quiet shelf you can open with a tap. Empty or unconfigured sections say so honestly in one line — never padded.
Every control still works and still teaches the room: Brief me reads only what's visible, Save / More like this / Not interested keep training the ranking, and tapping the sparkle researches any story without leaving the screen.
Fixed: every "Ask Tai about this" chip across the app (including T's Room's research taps) had been dying silently since the canvas became the Tai screen — the seeded question was parked and never picked up. The canvas now catches those asks and answers them in place.
Fixed: your saved / more-like-this taps now actually reorder stories ("Because you liked stories about X") — that signal was being silently dropped on every cached load, on every layout.
Fixed: asking "what's in the room today" no longer answers "no item matches" — naming the room itself now reads the whole room, as it should.
v0.663.0The room is yours — it learns, it lets go, and your dining life becomes the shelfJul 15, 2026
Ask for your dining life the way you'd actually say it — "my reviews", "places I've been", "where should we eat", "what should I have for dinner", even "I'm starving" — and THE SHELF rises on the canvas: your restaurant write-ups as an authored collection. Your newest piece leads in your own words, your best-rated work sits under it, and one quiet invitation offers the single visit you haven't written up. Never a count, never "overdue" — a review you haven't written is a door held open, not a debt.
The fix you hit twice on Shanghai Terrace: the "write it up" chip and Tai's own words now read from ONE record — your bundled reviews, the reviews you write in Tai, and your reservations, merged — so the chip can never claim a place isn't written up while the sentence says it isn't on your list. And saying "I didn't go" now shows the confirm button on the canvas itself; the moment you tap it, the chip dies everywhere instantly and stays dead forever, on every device.
A nudge from a reservation now asks — "Did you make it to …?" — instead of assuming a booking was a visit. "Went", "not yet", and "I didn't go" all work, and a dismissal is permanent.
The room learns from what you actually do: opening a moment, staying with it (real dwell time now counts), or letting it pass. A whisper you've ignored twice is let go for good — silently, permanently, no badge, no guilt trip — and the room's ranking learns the pass on every device.
Two new kinds of good news, both strictly real: a table on one of your reservation hunts actually opening up ("… has an opening" — only from a fresh, successful check), and your newest write-up making the shelf, quoted in your own words.
Starting a review is one tap: the pad pre-fills the place, the date, and the cuisine Tai has on record — never a guess — so the blank page is gone and the words stay yours.
v0.661.0Tai remembers you — and can be correctedJul 15, 2026
Tai now knows how you like to be talked to and holds it steady: bottom line first, no filler, a real opinion when you ask for one, matched to your energy, never talked down to. It's a structured setting applied to every answer, not a line buried in a prompt that drifts.
When you tell Tai to stop on a topic, it's permanent. Unsolicited movie picks, commute and traffic, health guesses, DIY fixes — these are now blocked at the moment the answer is written, not merely discouraged. A stop that's actually enforced, so it can't quietly come back.
When you say you already handled something — paid it, called them, spoke to Spector — Tai records it and won't raise it again as an open item or ask about it twice.
The people in your life are pinned to the truth and guarded against the old mix-up. A correction from you now outranks any older note permanently — a stale detail can never overwrite something you've fixed.
New Memory view on the canvas: ask "what do you know about me" and Tai shows what it thinks it knows — preferences, the don'ts, people, and handled items — each with where it came from, and a way to correct or delete any of it. This memory holds legal, medical, and financial context and never leaves Claude.
v0.660.1The new records search only answers actual questions — never talks over a hard momentJul 15, 2026
A follow-up to yesterday's change that lets Tai read your files before saying she can't. That safety net was catching too much: a message that only mentions a matter without asking about it — “I'm feeling hopeless about my case,” “my hearing is coming up and I'm scared” — could get answered with a cold quote from a legal file, exactly when what you needed was for her to just listen.
Now that records search only kicks in for an actual question — “who was my doctor in Cayman,” “how old am I,” “what did Unum say.” A statement about how you're feeling goes to the same warm, grounded reply it always did. She still reads your documents the moment you ask a real question, and still never makes anything up.
v0.660.0Ask Tai about your own life and she reads your files before saying she can'tJul 15, 2026
There was a blind spot: a question about YOUR life that didn't happen to contain a “find / show / pull up” word — “who was my doctor in Cayman,” “what did Unum say,” “how old am I” — never actually reached your documents. Tai would answer from general memory or, worse, tell you she didn't have it, while the answer sat in a file she never opened. Now, when nothing else grounds a personal question, she searches your own records as the last step before ever saying “I can't see that.”
How it works: a hybrid search. A keyword pass reads the real text of your scanned and native documents (live across your whole library today) — best for names, places, dates, and numbers. A meaning-based pass finds the right passage even when your words don't match the document's, and switches on as your library gets indexed. Either way she quotes the document's actual words and shows you the source to open — she never makes up a name, a date, or a file.
The guardrails held the line: general-knowledge questions (“what's the capital of France”) never trigger a records read, and a vague function-word question can't be “answered” by an incidental word buried in some file. It's a safety net under everything else, so it never overrides a real answer from your bills, calendar, or health data — it only catches the questions that would otherwise fall through to a shrug.
v0.659.0Tai's conversation now keeps its own receiptsJul 15, 2026
Nothing you'll see on screen — this is under the hood. When Tai works through a question (checking your records, reading the calendar, looking something up), that back-and-forth was the one place in the app that never wrote down what it cost. Now it does: every turn records how many steps it took, how many tokens it used, how much of that was served cheaply from cache, and an estimated price — the same ledger everything else already writes to.
Why it matters: it makes the honest comparison possible. Is the thinking-it-through path actually smarter than a one-shot answer, and what does it cost? You can't tune what you can't measure — this is the measuring tape, and it turns out prompt caching (the big cost lever) was working the whole time but invisible.
Privacy stays absolute: what's logged is NUMBERS ONLY — counts and timings. None of what you asked, none of what Tai read, none of the answer. The conversation itself is never written to any log.
v0.658.0Ask Tai to place a call by voice — she sets it up, she doesn't lecture youJul 15, 2026
By voice you asked Tai to place a phone call, and she said she couldn't see your contacts and told you to open the dialer yourself. Both parts were false: Tai has your contacts on file, and she can place a call (behind your one confirm tap). That refusal is gone.
Root cause was path drift — the same class of bug that once made Tai claim she couldn't text. The typed path already offered the call; the voice brain didn't know actions exist, so it freelanced a generic “here's how to use your phone.” Now the voice model routes every action — call, text, calendar, reminders, bills — to the real brain exactly like a question, and never refuses one on its own.
It stays a proposal: Tai lines up who and the number and nothing happens until you tap to confirm — she never auto-dials, and she never guesses a number. If the name's ambiguous she asks which one, and nothing else.
v0.657.0A “cancel” lands on the thing you named — never a credit cardJul 14, 2026
The room nudged you to write up a table you'd booked. You replied “I didn't go out that night — delete the review request,” and Tai offered to take a credit card off your front screen instead. The content was fine; the resolution was wrong. Now a cancel binds to the object you actually named.
The rule: a dismiss always prefers a soft, reversible object (a nudge, a reminder). A consequential object — a card, a bill, a legal case, your calendar, a contact — can only be the target of a cancel if your words name it. When the only removable thing in view is something consequential you didn't name, Tai asks which one you mean instead of guessing a dangerous action.
This is resolution logic only — it never executes anything and it never weakens the confirm gate. It just decides what a cancel refers to, or asks. And the reservation nudge is now answerable: “I didn't go” keeps the table off your review list without touching anything else.
v0.656.1When the answer's already on screen, Tai just says itJul 14, 2026
Ask “how are the Cubs doing” and the score box appears instantly — but the words underneath used to say “let me look into that,” narrating a lookup that had already finished. That stall is gone. When Tai has already pulled the answer, the first words out are the answer, not a preamble about going to get it.
This wasn't slowness — the data was on screen while Tai said it would go find it. The fix makes the spoken/typed reply and the card agree: the live read (a Cubs score, the weather, a web result, your own records) is in hand before Tai speaks, so it leads with the fact instead of a filler opener.
Nothing was caged or hedged — the opposite. This strips filler, it doesn't add rules. Genuine warmth and presence are untouched; only the empty “let me pull that up” throat-clearing was removed.
v0.656.0The court check, one tap away — and an honest read on your debt casesJul 14, 2026
The DuPage court check is now something you can just ask for. Say “check my cases,” “run the court check,” or “court portal” — by voice or text — and Tai takes you straight to it, and the canvas legal board carries a “Run the court check” link too. It works the same honest way it always has: you clear the portal's one checkbox (that gate is meant for a human — you're the gate), and Tai records what changed. Nothing scrapes or sneaks past the gate.
Your debt cases now read the truth: no attorney is currently on them. Per your word, Atlas Consumer Law (Stacy Bardo) previously defended the DuPage debt cases but isn't acting on them right now — so the Matter Board, the command center, and the alerts no longer point you to her as if she were. Where a case has no lawyer, Tai says so plainly instead of naming someone who isn't working it. Her history stays on the record; only her current status changed.
The SSDI appeal is in good hands and Tai stops nagging the date. Deborah Spector is actively handling the Appeals Council appeal and means to file close to the deadline on purpose — so that window is now tracked as information, not an alarm. Ameritas stays with Matt Maloney. Tai still only tracks and organizes; every decision belongs to the lawyer who owns the matter.
v0.655.0Tai can check whether your own records are currentJul 14, 2026
Tai already answers on her feet — she reaches into your bills, court dates, calendar, meds and documents while you're talking, then answers from what she actually finds. This release gives her one more move: she can now check how CURRENT that data is before she leans on it. If a feeder quietly stopped and, say, your court docket is a month old, she'll tell you it may be out of date and roughly how old it is — instead of reading you stale information as if it were live. It's a read-only self-check; she still can't change anything without your tap.
v0.654.0The lawyers' PDFs actually arrive now — not just the cover noteJul 14, 2026
When your attorneys or providers email a document — a denial letter, a notice of decision, a policy schedule — Tai now pulls the ACTUAL attachment down, stores it so it's openable, and reads its text so the brief and strategist can cite it. Before, it read the one-line email and never opened the PDF, which is how a 23-page SSDI decision could arrive by email and never reach your file.
A scanned document with no text layer is no longer silently dropped. Its pages are stored and the record honestly says "could not read yet" so a later pass can transcribe it — Tai never pretends to have read something it hasn't.
Ingested documents route to the right matter automatically (Spector & Lenz → SSDI, Debofsky → Ameritas, Bardo → the DuPage debt) and surface on the Matter Board where you'd look for them.
The data-health surface now tracks attachment ingestion like every other feed: if it falls behind or breaks, it says so plainly instead of going quietly stale.
v0.653.1Green the build — lint stops mistaking ID numbers for colorsJul 14, 2026
A background lint check was reading an NMLS license number inside a machine-generated legal contact file as if it were a color code, which turned the build red on every change. The lint now skips generated data files — the same rule it already applied to test fixtures — so real changes can ship again. No app behavior changed.
v0.653.0One visual language — the whole app moves like the canvasJul 14, 2026
Tai was built fast, in layers, and it showed: five different "thinking" indicators, badge pills on the brief, raw red alert badges with counts. This release makes it feel like ONE thing, seeded from the canvas — its rise/settle/recede motion, timing curves, type scale, and spacing are now shared primitives every surface uses, including the new Matter Board and the SSDI appeal countdown.
The wait has a presence now. When you ask something — typed, spoken, on the canvas, in the sheet, on a call — the pause shows a small champagne core breathing slowly beside a quiet line, not a spinner or fake typing dots. It reads as attention, not latency.
The morning brief reads like a letter from someone who knows you: the most important VERIFIED fact leads in large serif (court first, always), the verification sentence sits right under it, and the domains are one quiet ruled column. The honesty is untouched — a stale or failed feed still says so plainly, in warm ink, in words: an unverified fact is never allowed to lead.
Bad news lands like a steady person saying it: the fact first as a full sentence, the one next action, a quiet meta line. No alarm red, no flashing, no badge counts — severity is a thin left rule and worst-first order. Same alerts, same dismiss, same links.
v0.652.0The SSDI decision, current everywhereJul 14, 2026
The judge's ruling came back on July 7 — unfavorable — and now the rest of Tai says so, not just the legal board. Ask "where does my SSDI stand" and you'll hear it plainly: denied at the hearing level, with the appeal to the Appeals Council open. No more "hearing held, waiting on the decision."
The appeal deadline shows up in your morning brief. The window to ask the Appeals Council for review runs to September 10, 2026, and the daily brief now counts it down alongside your court dates and bills. The appeal itself is your attorneys' to file — Tai just keeps the date in front of you.
Your case-prep notes are honest again. The Strategist pages used to say the SSDI decision was still pending and might land in your favor — both now false. They've been corrected to reflect the denial and what the judge actually found, and the Ameritas and Unum notes no longer count on an SSDI win that didn't happen. Informational only — every strategy call still belongs to your lawyers.
v0.651.0The Matter Board — your three legal fronts, one calm viewJul 14, 2026
Ask about anything legal — “what's the status of my court cases,” “any SSDI update,” “when is the Appeals Council deadline,” a mention of Ameritas, Bardo, Spector, an appeal, a deadline — and the canvas raises the whole board instead of one tile: your three legal fronts (the DuPage debt cases with Stacy Bardo, SSDI with Deborah Spector, Ameritas & Unum with Matt Maloney) as one matter view, the way a good paralegal would hold it.
Every date that matters is counted down with its source visible — including the Appeals Council window that started running when the ALJ denial landed Jul 7, shown as computed (60 days + the 5-day mailing presumption, 20 CFR 404.968) with a plain instruction to confirm the controlling date with Spector & Lenz. Each debt case shows its own honest state: a live countdown, a passed date flagged “verify,” or “details TBD” — never papered over. Every item already knows which attorney owns it, with call and email one tap away.
The board says it plainly, right on the surface: Tai tracks — it doesn't advise. Decisions route to your attorneys, by name. Owner-only, in-app only: this is the most sensitive data in your life, and it never touches any third-party model. TAI_CANVAS_MATTER=0 falls back to the previous court glance instantly.
v0.650.0Uncaged — Tai answers like the intelligence she isJul 14, 2026
The stall is dead everywhere. The clock fast-path from 0.631 is now the general rule: anything Tai already has — the time, settled knowledge, something you told her two turns ago, an answer she already pulled this session — comes back as the FIRST words of the reply. 'Let me check', 'let me look into that', and every cousin of that hedge are banned outright, in the app, on the canvas, and now on the phone line too (which used to be TOLD to say 'one sec, let me pull that up' on every real question — that mandate is deleted, and the phone session now knows the actual time, so asking it for the time on a call is answered in a beat).
The reflexive disclaimers are gone. Every answer that brushed law, medicine, or money used to get a canned 'this is general information, not advice — confirm with a professional' line bolted on — which, for your life, was most answers. Deleted at the source: you have real attorneys and real doctors and you know what Tai is; she says the substance and stops. Same for the forced 'I'm not your doctor' closers on drug lookups, provider searches, and clinical-trial results.
One rule, correctly scoped, everywhere: the never-fabricate hard rule is about YOUR private data — your records, cases, health, money, people — and only that. It was written so broadly the voice read it as a gag order on knowing anything. Now the same single persona file tells every surface: his data only from his real records, the rest of the world answered directly and confidently, real opinions committed to in the first sentence, and never a word of her own process out loud.
v0.649.0One honest answer to “can you do that?” — everywhere you askJul 14, 2026
The worst bug isn't Tai failing an action — it's Tai saying it CAN'T when it can. Ask by voice to text someone and Tai used to answer “sending messages isn't switched on yet” — flatly false, because texting, calling, and emailing are live (they always stop at your tap). A wrong “no” quietly teaches you to stop asking, so it's the bug that costs the most. It's gone.
Under the hood there's now ONE place that knows what Tai can do (a single capability registry), and every way you reach Tai — chat, the Ask box, voice, Siri — reads from it, worked out the exact same way the safety gate decides at the moment of doing. No more per-screen guesses that drift apart. When Tai names what it can do, it names what's actually live today (text, call, email — with your tap), and stays honest about what isn't switched on yet.
Siri got the same honesty. “Hey Siri, tell Tai to text Maria I'm running late” no longer dead-ends in a false “I can't text” — Tai says it'll have the draft ready and points you to the one tap that sends it. Nothing about the safety changed: Tai drafts, you tap, a spoken “yes” never sends, and nothing ever leaves on its own.
v0.647.0One screen — the canvas is the appJul 14, 2026
The row of tabs along the bottom is gone. You open Tai and you're on the one screen — talking. Everything the tabs reached, you now reach by saying or typing it: “what's on today” raises your day, “what do I owe” raises bills, “legal” raises your cases, “health” your meds and Gracie, “text Maria…” the drafting pad. For the places that open as their own page, just name them — “comms,” “more,” “settings,” “sports,” “tasks” — or say “open …” and Tai takes you there and says so.
Nothing was removed. Every page still exists at its same address (a pushed notification or saved link still lands exactly where it did), the desktop sidebar is untouched, and the full directory is one tap away — the “All of Tai” link now sits quietly at the foot of the canvas. When Maria or Tommy leaves you a message, the gold pill floats up from the bottom edge like it used to — one tap into Comms.
Presentation only: nothing about approvals, drafts, privacy, or what Tai is allowed to do changed — every action still stops at its confirm card. And it's one switch reversible: TAI_CANVAS_IS_THE_APP=0 brings the tab bar back exactly as it was. If the navigation brain is ever turned off, the tab bar returns on its own — Tai never leaves you somewhere you can't steer.
The morning brief cron's skip message and header comment said 'TAI_MORNING_BRIEF must be 1' (opt-in framing) after the flag was changed to always-on with a kill switch. The comment and skip payload now correctly say 'TAI_MORNING_BRIEF=0' — the actual condition that stops the send.
v0.646.0The good stuff — the part of Tai that's just for youJul 14, 2026
Everything in Tai has been something you owe — bills, court dates, meds, paperwork. This is the counterweight: say “anything good?” (or “cheer me up,” “what's good,” “surprise me”) and a warm panel rises with the part of the day that's yours — the Cubs game live right now, your table on Friday, a place still on your want-to-try list, a great night out you never wrote up. All of it real: the live MLB feed and your own reservations, reviews, and wishlist — never an invented score, never a made-up restaurant.
It learns what you actually like. Open the Cubs board every time and ignore the dining picks? The Cubs start leading and the picks quietly step back — no settings page, it just watches what you open versus what you leave alone. And it's allowed exactly one unprompted move: a single soft line on the idle canvas (“Cubs up 4–1, top of the 7th”). Ignore the same offer twice and it stops offering — no badges, no counts, no red, no guilt, ever.
Nothing in this room asks for anything or does anything on its own: it never sends, books, or buys — tapping a moment just raises its board or opens the right page. Your data stays in the app's own deterministic brain (no AI provider ever sees it), and if a feed is down it says so instead of guessing. TAI_CANVAS_DELIGHT=0 turns the whole thing off instantly.
v0.645.0The moment before you tap — the confirm card, redesignedJul 14, 2026
Every action that leaves your phone — a text, an email, a calendar change — still stops at a card for your tap. That card now reads like a document Tai hands you to sign, not a browser pop-up: WHO it reaches in big letters (the real name, so a wrong recipient jumps out in half a second), the exact message in full on its own sheet, then when and how it sends. Approve and the decline are equal buttons — saying "no" is a normal outcome, never buried.
Most "no" is really "not like that" — so there's now a fix-it path right on the card. Tap "Use your own wording," type the message the way you'd say it, and Tai scraps the old draft and shows you a fresh card with your words. Nothing is ever edited in place: what you approve is always exactly, verifiably, what runs.
The card moves like the rest of the canvas — it rises when Tai has something for you, and once you've tapped (or declined) it settles the outcome and recedes to a one-line receipt so the conversation stays clean. Failures land on the same card, plainly, with the real reason; a chained run still shows every step's honest outcome and exactly where it stopped. Nothing about the safety changed: no auto-send, no timers, spoken "yes" still never sends — the tap is the tap.
v0.643.0Rooms, not a wallJul 14, 2026
The “All of Tai” list stopped being a wall. It used to drop you into ~70 things at once — every module, one endless scroll. Now it opens as a quiet hallway of a few calm rooms — Money, Legal, Health, Comms, Life, and the rest — one card each. Tap a room to look inside; everything that lived there is still there, just no longer shouting at you all at once.
Nothing was taken away. Every single capability is still one tap away and still turns up instantly when you search — the search box still finds anything Tai can do. A few overlapping leftovers (Concierge, Command Center) now sit quietly at the bottom of their room instead of competing for attention.
This is the calm layer behind the one screen you live in: the Tai canvas is still where you talk and where things rise as you ask. The rooms are for the rare times you want to spread out — a long text thread, case documents, bills line by line — and the rest of the time they stay out of your way.
v0.641.0Show me — video plays right on the canvasJul 14, 2026
Ask to see something and it plays right here. "Show me a highlight of the Cubs," "play a video of the moon landing," "pull up a video of Wrigley Field" — a video screen rises onto the Tai canvas, plays in place, and recedes when you're done. You are never bounced out to YouTube; it all happens inside the app, on the same surface as everything else.
It knows the difference between seeing and checking. "Show me the Cubs score" still raises the scoreboard, "show me the map" still raises the map, "show me my bills" still raises your bills — only a genuinely watchable ask raises the screen. And if no good video exists for what you named, Tai says so plainly instead of playing something random.
Built as a socket, not a bolt-on: the player doesn't care where video comes from, so when generated video is ready it will appear on this exact same screen. Today it finds the single best YouTube match and plays it through the privacy-enhanced player (no tracking cookies). Nothing else changed — no other module, send, or approve path was touched.
v0.640.0Your morning brief — and it tells you when something's brokenJul 14, 2026
Every morning Tai now sends you one short brief that pulls all of your world — lawsuits, bills, calendar, health and Gracie's refills, and messages worth knowing. When nothing changed it says so plainly ("No changes to your lawsuits"), so a quiet morning reads as reassurance, not silence.
The part that matters most: it tells you the truth about its own data. If Tai tried to check your court cases and couldn't — or the docket is weeks old — the brief says "I tried to pull your lawsuits and couldn't, it's 33 days old" instead of quietly showing stale info as if it were fresh. No domain ever shows green over old data; a feed with no live source says so honestly.
It reaches you even if notifications lapse: the brief goes out as a push, and if the push lands on no device it falls back to a real text — the same guaranteed channel your critical alerts use. Exactly one brief per morning, no spam. You can also pull it any time at /morning-brief. (Rolling out behind a switch; nothing else changes until it's turned on.)
v0.639.0Ask Tai from the lock screenJul 14, 2026
You can now ask Tai with your phone locked and the app closed. Set up one Siri Shortcut and say "Hey Siri, ask Tai what's on today" — Siri hears you, Tai answers from your real records, and Siri reads it back. This is the lock-screen path iOS actually allows (a backgrounded web app can't keep the mic; Siri can).
It answers questions only — what's on today, what's due, when's your next hearing, how's Gracie, when's your next table — using the same brain as the Call-me line and Ask Tai. It never sends, books, or changes anything; anything that leaves the phone still needs a tap in the app.
It's private by design: the Shortcut carries a secret token that only unlocks YOUR records, so the endpoint is never open to anyone else. Nothing about the app's screens or your data changed — this is just a new, hands-free way in.
v0.638.0Alerts that actually reach youJul 14, 2026
When something urgent goes wrong — like your court data going stale — Tai now guarantees the alert reaches you. Until now a critical push could quietly fail if your phone's notifications had lapsed, and the warning rang into an empty room. Now, if a push reaches no device, Tai falls back to sending you a real text.
This closes the gap that let 29-day-stale court data slip past you: the freshness watchdog's alert now falls back to a text the moment its push comes back empty, so a dead notification channel can no longer hide a red domain.
If your notifications have lapsed, re-enable them in Settings so push works again as the primary channel — the text is the safety net, not the main line. Nothing else changed: texts you send still draft for your approval, and only genuinely critical alerts ever escalate to a text.
v0.637.0Say it once — she does the whole thingJul 14, 2026
One sentence, several things done. "Text Maria I'm running late and push my 3 o'clock" now lands as one request: Tai lines up both actions and shows them together in a single review card — the text she'd send and the calendar change she'd make, side by side. You tap Approve once and she runs them in order.
She finally understands how you actually talk. "Push my 3 o'clock," "bump my dentist appointment," "remind me the night before," "put a note in my file," "let Maria know," "log Gracie's Vetmedin refill" — all of these now chain correctly instead of only catching the first half.
Honest to the end: nothing sends until you approve, one step at a time in order, and if any step fails she STOPS and tells you exactly which one and why — she never fakes a success or silently skips ahead. Every send is still its own confirmed action under the hood; the single card just lets you see and approve the whole plan at once.
v0.636.0Is my data current? Now you can just ask.Jul 14, 2026
New Data health page (under “Tai itself”, or just ask “is my data current?”) — an honest, per-area readout of how old each kind of data actually is: bills, court, calendar, meds, deadlines and more. Each row shows when it was last checked against reality, whether that's fresh or running behind, and when its feeder last ran. The age is the truth; a recent run over old data now reads “stale,” never green.
Fixed a way stale data could hide behind a green checkmark. The court sync ran three times a day and reported success every time — while quietly shipping a docket that hadn't been read live since June 11. The sync jobs now check the AGE of what they're copying: if the data is older than its window, the job reports stale (red) instead of a false success. Court is honestly marked behind until the next weekly assisted court check refreshes it.
Nothing about court scraping changed — the portal's bot-gate is still respected, and the weekly assisted check is still how the docket gets refreshed. This change only makes the staleness impossible to miss.
v0.635.0The Canvas is just Tai nowJul 14, 2026
The Canvas isn't a separate place you open anymore — it IS Tai. Tapping the Tai tab lands you right on it, talking, and opening the app lands you there too. The "Open the Canvas" door and the extra "Canvas" name are gone; you don't name your own face.
Everything the Canvas could do, it still does: the eight modules that rise as you talk, your real live hands-free voice, Call-me, and the fact that speaking raises the right thing exactly like typing. Nothing about the conversation, the modules, or drafting-for-your-approval changed.
Your old Today home is untouched and still one tap away on its own Today tab — this only changes what the Tai tab shows. If you ever want the previous Tai screen back, it's a single switch to flip.
v0.634.0The Canvas learns Cubs and PlaceJul 14, 2026
The Generative Canvas now summons two more modules. Cubs is the hero: "how'd the Cubs do" or "what's the score" raises a cinematic scoreboard fed by your real MLB board — a live game glows in Cubs blue with the bases diamond and a pulsing live dot, a final shows the honest result, and a quiet day shows the NEXT game and LAST result instead of hiding.
Place answers "how far is it," "what's the address," or "show me the map" for your next reservation with an address — a pin drops onto a hand-drawn street grid (pure SVG, no map service) with an Open-in-Maps link. It's location only: it never guesses commute, traffic, or ETA.
Still additive and still safe: the other six modules and all voice are untouched, texting still drafts for your approval, and nothing auto-sends. "Where is it" raises Place while "where am I eating" still raises Reservations.
v0.633.0The Canvas can really hear you nowJul 14, 2026
The Canvas is where you talk and the screen assembles around you — so it now uses your REAL live voice, the same hands-free voice from the Talk screen, not the basic browser one. It sits right under the orb as the natural way in, with Call-me beside it so you can keep talking with the phone locked.
The whole point: speaking now raises the right thing, exactly like typing. Say "what's due" and Bills lifts, "how's Gracie" and Health lifts, "when's my next table" and Reservations lifts — out loud, hands-free. Tai answers from your real records and the module rises as she does.
Nothing about safety changed: texts still draft for your approval and nothing auto-sends. The typed message bar, the orb, and the calm rise-and-recede motion are all exactly as they were — voice just became the easy way in.
v0.632.0The Canvas learns four new subjectsJul 14, 2026
The Generative Canvas now summons SIX modules instead of two. Ask about your day and Today rises — your real schedule, woven with court times and what's due. Mention a hearing, your attorney, or a case and Court rises with your next dates. Ask about meds, Gracie, or how your gut's been and Health rises. Ask where you're eating and Reservations rises with your next table. Texts and Bills work exactly as before.
Changing the subject now feels like one gesture: the module you were on sinks for a beat, then the one you asked for lifts into its place — no hard cuts. Big modules like Texts and Today settle in gently instead of dumping their content, and the orb's glow now breathes up into its thinking and listening warmth instead of snapping.
Every module is the same card you already trust from the Tai home — nothing rebuilt, nothing new to learn. If a module has no data (no active court dates, no health logs yet), it says so honestly in one line. Still additive: your Today home is untouched, and texting still drafts for your approval — nothing auto-sends.
v0.631.0The time comes back instantlyJul 14, 2026
Ask Tai out loud for the time or the date and she just says it — no beat of dead air first. Even on the turns where she used to quietly send a simple clock question off to think about it, the answer now comes straight back from the real clock.
This only touches the plain 'what time is it / what's today / is it the weekend' kind of question. Anything about your actual life — bills, court, calendar, appointments — still goes to the real records and is never guessed.
Interrupting her mid-sentence and her natural, unhurried pacing were both re-checked and left exactly as they were.
v0.630.0The Canvas learns some graceJul 14, 2026
A design-taste pass on the Generative Canvas — nothing works differently, everything feels better. A summoned module now lifts past its resting spot and settles with a quiet overshoot, its header landing first and its body a beat later, so it assembles instead of pops. Receding sinks gently away instead of blinking out.
The summoned module sits on richer glass with a champagne edge — lifted into the light — while the room dims a notch behind it. Tai's answer now speaks in the serif voice and tucks under the module as one composition.
Quieter refinements everywhere: a larger, better-balanced hero line; the orb's ring warms smoothly when Tai is thinking or listening instead of snapping; the message bar warms when you tap into it; the starter chips drift in one after another. All of it respects Reduce Motion.
v0.629.0The Canvas — talk, and your screen assembles around youJul 13, 2026
New: the Generative Canvas — one calm screen where you just talk to Tai and the thing you're talking about rises into view. Mention money and your Bills lift up, priority-ranked; mention a text and your conversations rise, ready to draft. Stop, and it recedes. Open it from the new "Open the Canvas" door at the top of the Tai screen.
Phase 1 wires two modules — Bills and Texts — reusing the exact cards you already trust. Nothing about sending changed: Tai still drafts and you still approve every text; bills are read-only unless you act.
It's additive — your Today home is untouched. The Canvas is its own place you can step into and back out of anytime.
v0.628.0Tai knows where you've already eatenJul 14, 2026
Ask for a dinner spot and Tai now pulls from your OWN dining history — every place you've reviewed, still owe a review for, or had a past reservation at — so it stops saying "I don't have a log of places you've already been."
Say "somewhere new" (or "not the usual," "we haven't been," "change it up") and Tai deliberately skips everywhere you've already been and leans on your want-to-try wishlist instead.
Recommendations reason from your own ratings — "since you rated Maple & Ash a 10, you'd love…" — never an invented restaurant or made-up score.
v0.627.0Voice answers simple questions instantly — no more stallingJul 13, 2026
Ask Tai the time, the date, or a simple settled fact out loud and she answers RIGHT AWAY — no pause, no "let me check." The clock and basic known facts no longer take a detour through the brain, so a "what time is it" lands in a beat, the way it should.
The guardrail is unchanged where it counts: anything about YOUR life — bills, court, calendar, health, legal, family, money — and anything current like news, scores, or prices still routes to Tai's real brain and is answered only from your actual records. She never makes those up.
Same fix on the typed side: the time and date are answered instantly instead of hedging.
v0.626.0No more duplicate texts in a conversationJul 14, 2026
Fixed messages that showed up twice in a thread. The same iMessage was being recorded two different ways behind the scenes; now each message is tracked by one stable ID, so it lands once.
Conversations that already had doubled-up messages collapse to a single copy right away — no waiting for new messages.
Genuinely separate messages (even two identical texts sent in the same second) are always kept — nothing real is ever dropped.
v0.625.0Texts show real names and the right service, not phone numbersJul 13, 2026
Conversations now show the person's NAME — "Maria", "Tara", the actual contact — instead of a raw phone number. Names come straight from your Contacts, and if someone genuinely isn't in your contacts you'll see a neatly formatted number rather than a bare string of digits.
Fixed the "everything says SMS" bug: each message now shows its REAL service — a blue "iMessage" or a green "SMS" badge — read correctly per message instead of being labeled SMS across the board.
Existing conversations pick up names and the correct service label immediately — no need to wait for new messages to arrive.
The recipient picker in the composer now lists contact names too, and drops the misleading "(SMS)" tag it was stamping on every option.
v0.624.0Messages read clean — no more blank bubbles, newest on topJul 13, 2026
Fixed the big one: in Texts (and your Maria/Tara threads in Comms), most bubbles were showing up EMPTY — just a date, no words. Cause: photo/attachment texts store an invisible placeholder character that slipped through as a blank bubble. Now every message shows its real text, and an attachment-only text reads a clear "📎 Attachment" instead of nothing.
Threads now read newest-first — the most recent message sits at the TOP, and your conversation list leads with whoever texted most recently.
Tighter, easier-to-scan layout: compact bubbles sized to their text, aligned by sender, a single date divider per day, and a small time on each message instead of the full date repeated on every bubble.
v0.622.0Reservations card leads with your next tableJul 13, 2026
Pull up Reservations and your single next table is front and center — restaurant, then "Fri Jul 17 · 7:30 PM · party of 2" in Chicago time — with any others listed compactly beneath it.
No upcoming tables now reads a clean "No upcoming tables" instead of a blank card.
Tap through to manage (cancel, add dining intel, or open the intelligence PDF) on the full reservations page.
v0.621.0Bills glance polish — the next 1-2 bills, featuredJul 13, 2026
The Bills card now leads with the next 1-2 bills up top, given room to breathe: payee, amount, a human due date ("Tue, Jul 14"), and plain-English "in 3 days" / "due tomorrow". The rest of your ranked bills sit in compact rows below.
Anything overdue or due within 3 days is tinted — red for overdue, amber for due-soon — so the ones that need you actually pop.
Pull up "Bills" when nothing's due and you get a clean "Nothing due — you're all caught up" instead of a generic card. Same live data, same one-tap mark-paid; just easier to read.
v0.619.0Health card reads live — next med, Gracie's refill, GI trend — and voice pulls it upJul 13, 2026
The home Health chip now pulls up a live card: your soonest-run-out medication, Gracie's refill status, and a short GI/symptom trend — all re-read from the same data /health and "how's my gut been" already use, so it can never drift. Nothing on file shows an honest "nothing on file" line, never a placeholder.
Say "how's my gut been", "when's Gracie's Vetmedin", or "med schedule" and the Health card materializes inline — those phrases now route to Health instead of a generic answer.
"Med schedule" / "medication schedule" now answers with when each drug is taken (AM/PM/PRN) from your curated list.
v0.618.0Create by voice — make a note or draft a message, hands-freeJul 13, 2026
Say "make a note that…" or "jot down…" and Tai saves a freeform note (confirm-gated — nothing is written until you tap Save). Notes live alongside your tasks; undo makes them vanish.
Say "draft a text to Maria saying I'll be late" or "compose an email to Stacy about the Atlas case" and Tai drafts it inline for your review. It is a DRAFT only — nothing sends until you take the next step yourself.
Recipients resolve against your verified roster (family + attorneys) so the draft is addressed correctly; an unknown name falls through instead of guessing.
v0.617.0Reservations card reads your real upcoming tables — voice can pull it upJul 13, 2026
The home Reservations chip now pulls up your live upcoming reservations from your dining records — restaurant, date, time, party size, confirmation — instead of a static portal link. Nothing on file shows an honest "no upcoming reservations" line, never a placeholder.
Say "my reservations" or "show my dining" and the card materializes inline on the home surface, using the same reservation card (with its confirm-gated cancel) the dining module already uses.
Tai can now answer "what reservations do I have" from your real data via a new read-only dining_list_reservations tool — no booking or change is made, it only reads.
v0.615.0Bills card + "what's due / what did I pay" now read live, never staleJul 12, 2026
The home Bills card reads your live bills and shows each one's real next-due date (the projected upcoming occurrence), not the drifted literal date stored on the row — a bill "due the 1st" reads as due in 2 days when that's when it's actually due.
Ask or say "what's due this week" and "what did I pay" and Tai answers from your current data. When nothing's on file it says so honestly instead of inventing a payment.
"Mark <bill> paid" by voice stays confirm-gated (Tai asks before it writes) and now keeps the app's records and your bills tracker in lock-step — one shared sync path behind every mark-paid, mark-unpaid, and amount edit, so the card, the tools, and the tracker never disagree.
v0.614.0"Call me" now feels exactly like dialing your Tai numberJul 12, 2026
Parity, proven by construction: when Tai calls you, the answered leg presents your verified number and lands in the SAME realtime path an inbound call uses — same model ladder, same voice, same persona and greeting. There is no separate "Call me" session config to drift; a regression test now locks the two flows to one builder.
Smoother turn-taking on the line: the phone sessions now use a telephony-tuned voice-activity detector (a hair more tolerant of PSTN latency and line noise) so Tai doesn't clip you mid-sentence or jump in during a natural pause.
Cleaner barge-in: interrupt-on-speech is asserted explicitly, so the instant you start talking over Tai she stops and listens — no walkie-talkie feel.
Less choppiness: the input is now denoised before voice detection (near-field, tuned for a phone at your ear or earbuds) so ambient noise and echo can't false-trigger and cut Tai off mid-word. If OpenAI ever rejects the denoise block, the call falls back gracefully instead of dropping.
Say or type "what's up", "give me my brief", "what do I need to know", or "catch me up" — Tai speaks a concise daily brief (≤4 sentences, bottom-line first): today's urgent bills, court dates, appointments, and calendar, grounded in real records. No bullet dumps.
A "Brief" chip on the home command surface materializes the same data as a card — headline item + today's calendar — with a link to the full /brief page.
Wired through the existing converse voice path: the spoken brief arrives through the same TTS pipeline as every other spoken answer, works equally in typed chat and hands-free voice mode.
Reuses lib/dailyBrief/build.ts and fetchSpineSnapshot — no new data paths or Supabase reads invented.
v0.610.0Ask Tai about Gracie's meds and your own med scheduleJul 12, 2026
"When's Gracie's Vetmedin due?" now gets a real answer — dose, dosing schedule, and a computed refill-due date, read from the same tracker the Gracie page trusts. If tracking isn't set up yet, Tai says so honestly instead of guessing a date.
"I refilled Gracie's Vetmedin" now logs it — one inline action (reversible, no confirm tap needed) that moves the refill-due date out through the exact same durable write path the Gracie page's own refill button uses, so it never silently no-ops on a feeder-only medication.
"What's my med schedule" now lists Tony's own active medications and days of supply — a separate, Tony-only read; Gracie's meds never mix into it.
Verified while wiring these: GI symptom logging already accepted the full Bristol 1–7 scale end-to-end (added a regression test so it stays that way).
Verified drug_interactions tool end-to-end: Lexapro + hydroxyzine query returns real FDA label text — Lexapro's MAOIs/serotonin-syndrome warning, hydroxyzine's CNS-depressant precaution — verbatim from openFDA. All 10 unit tests pass.
Medicare coverage: exhaustively investigated CMS Socrata/DKAN, formularynavigator, pdpfinder, and CMS MCD REST endpoints — none serve reliable free/keyless JSON. The intentRouter correctly routes Medicare questions to web_search with a cms.gov/medicare.gov site: hint and a plain disclaimer that this is general guidance, not your plan's determination. No fabricated coverage data shipped.
v0.606.0Resy and Tock join OpenTable for realJul 12, 2026
Ask Tai for a table and "any platform" now hands you three real, correctly-built links — OpenTable, Resy, and Tock — not a placeholder search box. Each opens straight into that platform's search for your restaurant, date, party size, and (where the platform supports it) time.
Give Tai a city and the link goes straight to that city's search page on Resy and Tock — no city, or one we don't recognize yet, and it still hands you a real, working search link, just without the city narrowed down.
Still password-free and still just a proposal: every link opens in your own already-logged-in session, and you tap the final confirm yourself. Tock's official partner booking API is a documented next step, not wired yet.
v0.605.1Voice answers the moment your data lands — no more "still pulling it up"Jul 12, 2026
The stall is gone: when you asked Tai something that needed a lookup — your bills, tomorrow's calendar, a court date — she sometimes said "hold on, still pulling that up" even though the answer was already fetched and sitting right there on screen. Root cause: on a turn that runs a lookup, the model could speak a filler line BEFORE the data came back, and that filler got carried into what she voiced — so you heard the stall for information that was already loaded.
Now the spoken answer is only the words she says AFTER reading the resolved data. The instant a lookup lands, she reads it back in her natural voice — no pre-lookup "let me check." A question she can answer without a lookup is unchanged: instant, no filler.
Safe by construction: nothing changed about grounding or the no-fabrication guard — she still speaks only real, verified data. Revert lever is TAI_CONVERSE_REALTIME_NARRATE=0 if ever needed.
v0.605.0Home Next — Tai opens as a living command surfaceJul 12, 2026
The primary screen is reimagined: a breathing champagne presence orb, your greeting and date, and a pull-up rail — tap Today, Bills, or Cubs and the real card materializes right there, above the conversation. Reservations, Health, and Legal pull up as one-tap doors into their full rooms.
The conversation itself is exactly the one Tai — same thread, same brain, every way to talk. This is presentation, layout, and words only; nothing about how Tai answers, acts, or speaks changed.
Revert switch: setting TAI_HOME_NEXT=0 restores the previous /tai screen exactly.
v0.603.1Dining reservation hold: fixed a silent no-write bugJul 12, 2026
Found while verifying every one-tap T2 action end-to-end: proposing a dining calendar hold when Google Calendar write access isn't granted told you "hold will be Tai-local only" on the confirm card, then tapping Confirm actually wrote nothing at all.
Fixed — confirming now saves a real Tai-local calendar hold in that case, matching what the confirm card already promised. No change to the Google-connected path, which was already correct.
v0.603.0Booking a table looks the partJul 12, 2026
A design pass on the reservations experience — the four moments of Tai getting you a table, in the champagne language: a glanceable list of open times with a quiet, honest badge saying which platform each came from (OpenTable, Resy, Tock…), one unmistakable confirm card that states place · date · time · party · platform · account and says plainly what tapping Confirm actually does, and a calm booked receipt with soft next steps.
When nothing's open online, the offer to have Tai call the restaurant now reads like a concierge stepping up, not the system giving up — what Tai will ask for, a confident "Have Tai call", and an honest report of whatever the restaurant says.
See it at /dining/reserve/preview — sample restaurants, nothing books. Presentation and words only: the actual search/booking wiring is a separate build and lands on these cards when ready.
v0.601.0Tai can find you a tableJul 12, 2026
Ask Tai to book a restaurant table and it hands you a pre-filled booking link you tap to confirm in your own logged-in session — your passwords never touch Tai. OpenTable works now; Resy and Tock are wired as deep-links too, and "any platform" returns all three.
No online table? Tai offers to phone the restaurant for you through the existing assisted-calling flow — the same one-tap-approve confirm card, nothing dials on its own.
Ships dark and safe: the feature is off until TAI_RESERVATIONS=1 is set, and even then every booking is a proposal you approve — Tai never books, sends, or stores anything.
v0.600.0Tai reaches out first — on by default nowJul 12, 2026
The calm "here's what needs you" push — a single, disciplined nudge about the one most-urgent overdue or due-today/tomorrow item (a bill, a deadline, a court date) — is now the default behaviour instead of an opt-in. Nothing new is detected; this just switches on the existing anti-nag reach-out gate that only ever fires for a genuinely critical item, at most one at a time.
Still silent 10pm–8am, still at most one pending reach-out, still cooldown-respecting so the same item doesn't buzz you twice. No health interpretation, no commute, no recommendations — only deadlines, bills, and items waiting on you.
Instantly revertible with zero redeploy: set TAI_PROACTIVE=0 in the environment to fall straight back to the prior push behaviour, byte-for-byte.
v0.599.0“Call me” feels like a real phone callJul 12, 2026
The Call me button got a design pass: a refined beta chip, and tapping it now shows a poised “Calling…” state instead of a bare spinner.
When the call is placed, a calm notice with a soft pulse reassures you: answer, then lock the screen — we'll keep talking. Honest wording stays when live voice isn't switched on yet.
In the Phone module's AI call log, calls that are genuinely live right now (ringing, on the call, connecting you) glow quietly with a pulse dot and warmer status wording.
Looks and words only — no change to how calls are placed, the voice transport, or any flag. Motion respects reduced-motion settings.
v0.598.0Ask for several things at once — Tai shows you the plan firstJul 12, 2026
Say a few things in one breath — “book dinner Friday, add it to my calendar, and text Maria” — and Tai lays out a numbered plan before it does anything, then works through it in order.
Nothing sensitive slips through: every send, calendar change, or reservation still shows its own confirm card that you tap one at a time — there’s no “approve all,” and a spoken “yes” never approves a send.
If a step can’t be done, Tai stops there and tells you which one and why instead of quietly plowing ahead. Ordinary single questions and requests behave exactly as before.
v0.597.0“Add it to my calendar” works right nowJul 12, 2026
Ask Tai to add a calendar event and it just works: until the Google Calendar write grant is in place, Tai now saves it as a real Tai calendar event instead of failing — tap Confirm and it shows up in “what’s on tomorrow” immediately.
The confirm card is honest about it: it says the event is saved in Tai and not yet synced to Google, so nothing is a surprise. Once Google write access is granted, the same action writes straight to your real Google Calendar with no change.
Isolated to the calendar-create action — no change to confirmations, tiers, gates, or voice.
v0.596.0Call me — hands-free voice that survives a locked screenJul 12, 2026
New "Call me" button in the voice dock: tap it and Tai phones you back on a real call, so the conversation keeps going even when your phone is locked or in your pocket — the one thing the in-app voice couldn't do.
On answer you land in your own grounded Tai (calendar, cases, health, bills, family), not a generic bot — every answer still comes from your real records.
Beta, off until switched on. Your existing in-app voice is completely unchanged; this sits right beside it.
v0.595.0Voice Flight Recorder — a black box for 'she went silent'Jul 12, 2026
New diagnostic view at /voice-activity: a standalone, read-only log of background/foreground transitions, page lifecycle, network drops, and audio playback events — captured independently of the voice call transport itself.
Built specifically to diagnose reports like the phone-lock voice drop: the timeline shows exactly when the app backgrounded, when it came back, and whether audio was still playing across the gap.
Owner-gated, flag-gated (TAI_VOICE_FLIGHT_RECORDER, default ON), and purely additive — it observes only. No voice transport, audio session, reconnect logic, @tony/core, or action-gateway code changed.
v0.594.0Agentic actions are onJul 12, 2026
Tai's confirm-tap-gated actions are now live in production: create or move a calendar event, send an email or text, and run the money/dining/home life-admin tools — each still asks you to approve before it does anything.
This was turned on via TAI_AGENT_TOOLS=t2, set dashboard-free through the Vercel API (the 2FA dashboard lockout is bypassed). It shipped as a config flip without a version note; this entry records it.
The higher-risk T3 tools remain OFF. No safety gate, tier, or gateway logic changed — this is a documentation/version bump only.
v0.593.0A quieter, more finished feelJul 12, 2026
Chat turns now land with a gentle rise instead of appearing abruptly, and your own messages carry a soft champagne tint so the conversation reads you-vs-Tai at a glance.
The Ask answer card rises in with its gold corner brackets sweeping open — the same HUD signature the rest of the app carries.
Send buttons and suggestion chips respond to hover and press everywhere, and tabbing with a keyboard shows one consistent champagne focus ring.
Small finish details: selected text highlights in champagne, desktop scrollbars slimmed down, headings break into even lines. Pure styling — nothing moved, nothing renamed, and every animation stills under reduced-motion.
v0.592.0The words sound human now, not just the voiceJul 12, 2026
Tony's note on 0.579: the delivery finally sounds human, but WHAT she says still reads scripted. This release fixes the words themselves: contractions and natural spoken glue ("so", "honestly", "looks like", "you've got") between verified facts, instead of the templated "Here is X. Also Y. Want me to Z?" skeleton.
Openings and closings vary — no reflexive "want me to check anything else?" stapled onto every reply. Most answers just end when the point is made; a light offer appears only when it genuinely helps.
Report language is banned outright ("Additionally", "Furthermore", "In summary", "Regarding"), and answers compress the way a sharp person talks — one clean sentence over three careful ones.
Grounding is untouched: spoken glue may never carry a new claim, and the no-fabrication guard + post-compose fact guard still deterministically block invented numbers, dates, and statuses. Lives in @tony/core compose, so TOMAI + MAI inherit it.
Also restored: Concierge shows up in nav search again (its capability-index entry was missing since 0.586).
v0.591.0Tai can run life admin — bills, dining, reminders, listsJul 12, 2026
Agentic life-admin tools: update a bill amount, see and cancel or book dining reservations, create reminders, add to lists — reads run instantly, writes always propose a confirm card first.
v0.590.0Deeper medical answers — drug info, interactions, Medicare coverageJul 12, 2026
Phase C medical connectors: drug_info + drug_interactions grounded lookups, and Medicare coverage questions route through live web search.
v0.589.0Voice survives the screen lock — pocket the phone, she keeps hearing youJul 12, 2026
Fixed: locking the iPhone mid-conversation killed the voice call — Tai went deaf and silent until you unlocked and re-tapped. Root cause: the page's audio session read as ordinary web audio, which iOS suspends on lock; the screen wake lock only ever prevented AUTO-lock, not a manual press of the side button.
Fix: a live conversation now declares a CALL-GRADE audio session (navigator.audioSession 'play-and-record' + pinned Media Session + a continuous unmuted silent keepalive), so iOS treats it like a FaceTime call — the mic keeps capturing and Tai keeps speaking with the screen off or the phone in a pocket.
If the OS drops the connection anyway (Siri, a real call, a long pocket stretch), the session auto-reconnects with the conversation history intact — on the drop itself when possible, and instantly on unlock — instead of dying on an error you can't see. Lock-screen media buttons can no longer pause the call out from under you.
Voice smoothness, graceful barge-in, and the one-spoken-voice mode are untouched — this is transport survival only.
v0.588.0Ask about any day this week — the weather tool now pulls the full 7-day forecastJul 12, 2026
Fixed: "what's the weather Wednesday?" used to punt with "the feed only gives me through tonight." Root cause: the weather tool truncated the National Weather Service forecast to just tonight + tomorrow.
Fix: the tool now keeps the full NWS 7-day outlook (all day/night periods). A future-day question — a named weekday, "this weekend," "in 3 days," "the day after tomorrow" — returns that day's real high/low and conditions.
Still honest: a day genuinely past the ~7-day NWS window says so plainly and never guesses a number. Current-day and tonight/tomorrow answers are unchanged.
Backend forecast tool only — the voice and conversation delivery are untouched, so future-day answers still come back in Tai's natural spoken voice.
v0.587.0Tai always knows today — NWS period names anchored to the real clockJul 12, 2026
Fixed: Tai said "tomorrow's going to be a beautiful Sunday" on Sunday morning. Root cause: NWS labels the current day by name ("Sunday") in its 7-day forecast even after the day begins, and the brain had no way to tell whether "Sunday" meant today or tomorrow.
Fix: weather period names are now converted to relative labels ("today", "tonight", "tomorrow", "tomorrow night") anchored to the real Chicago clock before reaching the re-voicer.
Voice sessions now include the current date/time in the OpenAI Realtime session instructions, so the voice model always knows the real date.
@tony/core brain/compose: nowClockSentence() auto-computes the current Chicago datetime as a defensive fallback in all three apps (Tai, TOMAI, MAI) when no clock is injected by the caller.
v0.585.0Graceful barge-in — cut her off and she just stops, listens, and answers the new thingJul 12, 2026
Interrupting Tai mid-sentence is now clean: her audio stops silently the instant you start talking (the output is muted through the cutoff — no click, no glitch sound, no half-word fragment), and she's immediately listening to you.
No more post-interrupt confusion: her conversation memory is truncated to the words you actually HEARD (conversation.item.truncate), so her next reply can't reference the half of the answer she never got to say. And once your new question lands, any stale in-flight answer to the old one is dropped — she responds to what you just said, never a merge of old and new.
The 'still with you' filler no longer speaks over you, and the fix is pure turn-handling — no added echo suppression, so on earbuds nothing clips your speech.
Markdown never leaks again: asterisks, bullets, and code ticks are mechanically stripped from every answer, spoken and on screen — clean prose only.
v0.584.0Your story surfaces however you word it — even the roundabout waysJul 12, 2026
Closed the last gaps where a natural way of asking still came back as 'I don't have it.' Now 'what do you think I've been through', 'what's the worst that's happened to me', 'the biggest thing that ever happened to me', and 'what nearly killed me' all reach the same grounded story from your own records — the March 2018 Cayman emergency and everything it set off — instead of deflecting.
The fix reads the intent, not the exact words: an opinion phrase in the middle ('what do you THINK I've been through') no longer breaks the match, a superlative about your life lands even without a follow-up noun, and a near-death phrasing lands on the incident even when you don't name Cayman. Everyday questions ('my next bill', 'my court date') still go straight to your data, and nothing about the incident is invented — the no-fabrication guard is fully intact.
v0.583.0Drug queries route to FDA tools — side effects, interactions, what-is answered from real labelsJul 12, 2026
Drug info questions ('what is Vetmedin for', 'side effects of Lexapro', 'warnings for omeprazole', 'contraindications', 'what does hydroxyzine do') now reliably route to the drug_info tool — which returns verbatim FDA label data (openFDA, free, no key) — instead of falling through to personal records. The externalLookup intent domain now catches drug question patterns first, before the health domain can steer to ask_spine.
Drug interaction questions ('do Lexapro and hydroxyzine interact?', 'is it safe to take omeprazole with famotidine?', 'medication interactions') route to drug_interactions, which extracts real FDA label interaction sections for each drug and synthesizes honestly from what the labels say. If neither label explicitly names the combination, Tai says so — never a false 'no interaction' claim.
Context tie: the routing hint gives the model Tony's specific meds (Lexapro, omeprazole, hydroxyzine, famotidine, Trulance) and Gracie's vet med (Vetmedin/pimobendan) so drug questions about those names pull real FDA data without needing ask_spine first.
v0.582.0Your story surfaces no matter how you askJul 12, 2026
Tai already held your story, but it only answered a few exact phrasings — so asking 'what do you think was the worst thing that happened to me' wrongly came back as 'I don't have anything on file.' Now it recognizes the intent behind any natural phrasing: 'the worst thing that happened to me', 'the accident', 'my medical history', 'what I went through', 'what do you THINK…' — all reach the same grounded story from your own records.
When you ask which was the worst or hardest, Tai gives a careful, honest reflection grounded in what's documented — the March 2018 near-death emergency in the Cayman Islands and the cascade it set off — instead of deflecting or refusing to answer. Everyday questions ('my next bill', 'my court date') still go straight to your data. Nothing about the incident is invented; the no-fabrication guard is fully intact.
v0.580.0Tai knows your story — including the Cayman IslandsJul 11, 2026
Ask Tai 'what happened to me in the Cayman Islands', 'tell me about my situation', or 'what's my story' and it now answers from your own records — warmly and accurately — instead of deflecting. It knows the March 2018 appendix rupture and airlift to Broward, the cascade of surgeries and chronic GI disease that followed, your career and the losses since, and your care team.
Every line is drawn from your own documentation (your SSDI hearing prep in your own words, your master context, your medical timeline). Nothing about the incident is invented — the no-fabrication guard is fully intact. If something personal isn't on file yet, Tai says so warmly and offers to record it from you, instead of guessing.
The core of your story is also held in Tai's durable memory, so it carries that context across chat, Talk, and voice.
v0.579.0One spoken mode — answers are said, not read aloudJul 11, 2026
A data or retrieval answer is now DELIVERED as natural speech in Tai's voice, so it sounds identical to the fluid back-and-forth of conversation — no seam between chatting and answering, and no flat teleprompter read of written text. Grounding is unchanged: every fact still comes solely from your verified records.
v0.578.0Personal answers are spoken as narrative, not a record dumpJul 11, 2026
Broad questions over many records (your week's schedule, upcoming bills) now get a natural high-level read first — what stands out, then an offer to narrow ('want the whole rundown or just the highlights?') — instead of enumerating every row. Delivery only; the facts still come solely from verified records.
v0.577.1Voice sounds continuous — no more choppy, stuttering playbackJul 11, 2026
Tai's spoken replies now play as one continuous, natural stream. The audio buffer adapts to your actual network in real time: the moment WebRTC reports it had to patch a gap (the thing you hear as a stutter or robotic break), the playout buffer deepens — up to 480ms on a rough cellular link — and it only relaxes after the connection proves clean for a sustained stretch.
Her voice no longer clips mid-word from background noise: the Realtime session now denoises your mic input BEFORE voice-activity detection, so a passing sound or her own echo can't false-trigger an interruption that used to flush her audio mid-sentence. When you genuinely talk over her, she still cuts off instantly and cleanly.
First spoken turn starts clean: the audio output path is primed the moment you tap Converse (inside the tap itself), so her first words don't glitch through a cold pipeline.
v0.577.0Phase C medical connectors — drug info + interaction tools (FDA + RxNav, keyless)Jul 11, 2026
New tool: drug_info — looks up real FDA drug label data (openFDA, free, no key). Covers what any drug is for, warnings, how to take it, side effects, contraindications, and label-stated interactions. Works for both human drugs (Lexapro, omeprazole, hydroxyzine, famotidine) and veterinary drugs (Vetmedin/pimobendan for Gracie). Always attributes to the FDA label and closes with 'not medical advice — confirm with your doctor or pharmacist.'
New tool: drug_interactions — checks drug-drug interactions by fetching both drugs' FDA labels (openFDA, free, no key). Extracts the drug_interactions, precautions, warnings, and contraindications sections from each label — the primary FDA disclosure for each drug's interaction profile. The RxNav /interaction/ API (the dedicated pairwise database) was deprecated in v3.1 and returns 404; the FDA label is the honest, sourced alternative. Model synthesizes from real label text; explicitly says 'neither label specifically names that combination' when true — never claims 'no interaction.' Always closes with 'your pharmacist is the definitive check.'
Medicare Part D/LCD/NCD coverage lookup: no reliable free REST API exists (CMS Medicare Coverage Database has no documented public endpoint). Coverage questions are handled by web_search or honestly deferred to Tony's insurer. No secret required for drug_info or drug_interactions.
Both tools follow the same keyless pattern as clinical_trials and provider_lookup — registered in KNOWLEDGE_TOOL_DEFS, guarded by TAI_KNOWLEDGE_TOOLS, default ON.
v0.576.3Clinical trials route fixed — ClinicalTrials.gov answers land, not a puntJul 11, 2026
Fixed: asking 'any clinical trials for pancreatic cancer?' now returns real recruiting trials from ClinicalTrials.gov (NCT ids, titles, phase, location) — never 'I've got that from your records' or a retry punt. The factGuard was incorrectly treating ClinicalTrials.gov results as personal-records reads and blocking the answer.
The intent router now classifies clinical-trial and provider-lookup queries as external-lookup intents (checked first, before health), so they reach their live registries directly instead of being steered to personal records.
Handles 'trials for my conditions' correctly: first looks up Tony's conditions from his records, then searches ClinicalTrials.gov for those specific conditions — results are clearly attributed to the external registry.
No regression to provider lookup (find-a-doctor): NPI Registry results also correctly bypass the factGuard's personal-records check.
v0.576.2Provider lookup — finds real Chicago MDs, never mistakes 'Ontario St' for Ontario CAJul 11, 2026
Fixed: asking 'find me a GI doctor near me' now returns real Chicago-area gastroenterologists, not a PA-C in Ontario, California. Tony's address is on Ontario St — the model was confusing the street name with the city.
Providers are now sorted MDs/DOs first; mid-level providers (PA-C, NP) are labeled secondary so the best-qualified specialists lead.
If a city search returns zero results, the tool automatically broadens to a state-wide search — suburb spelling variations no longer return empty.
Tool description updated to explicitly say 'near me' means Chicago, IL and to never use a street name as the city value.
v0.576.0Uncaged brain — general + prediction questions answer like Claude, fastJul 11, 2026
Ask Tai anything general and she just answers — 'explain how mRNA vaccines work', 'what's the difference between Chapter 7 and Chapter 13 bankruptcy', 'how does X work' — directly, like the full intelligence she is, with no forced records lookup and no 'I couldn't put that together' punt. A non-personal question now answers in a single fast pass instead of the slow records-and-tools loop.
New: ask for her opinion or a forecast and you get a real, reasoned best-educated guess — 'what do you think the market does next quarter?', 'what's going to happen with OpenAI?', 'who do you think wins?' She states her read, the reasoning behind it, and a light honest frame ('my read, not a guarantee'), and never refuses a prediction as 'not something I can know'.
The anti-fabrication guard is now scoped to YOUR private data only — it never gags a general or forward-looking answer. Its one job is 'never invent a fact about you'; it was never meant to block a general fact or an opinion.
Your personal data is unchanged and still fully grounded: bills, court, calendar, health and everything private come only from your real records, and if something genuinely can't be accessed she still says so honestly rather than guessing. Money/legal/medical general questions answer substantively with a brief 'general info, not advice — confirm with your professional' frame.
v0.575.2News routing fix — greetings no longer trigger web searchJul 11, 2026
Fixed: greetings like 'how's it going today' and 'how are you doing today' no longer incorrectly trigger the live news path. The news-intent detector now only matches 'today's' (possessive) not bare 'today'.
Fixed: 'what's going on in the world today?' and similar news queries now route through the live Google News RSS feed, delivering real dated headlines instead of encyclopedia pages.
Fixed: spoken answers no longer read literal **bold** or *italic* asterisks aloud — markdown is stripped from all web-search-synthesized answers before they reach voice.
Fixed: broader world-current detection so questions like 'what's happening today?' and 'what's going on?' reliably trigger the live news path.
Added: search errors are logged to the console with the exact API status code so provider misconfigurations are visible in Vercel logs.
v0.575.0Tai knows the world — real web search, live news, and general knowledgeJul 11, 2026
Web search is finally REAL: instead of falling back to generic Wikipedia pages, Tai now searches the live web (via the same Claude engine her brain already runs on) and answers with current results and their actual source links. Works in chat and by voice — no new keys, nothing to configure.
Ask 'what's in the news today?' or 'any news on <topic>' and Tai pulls real, current, dated headlines from a live news feed, naming the outlet for each story. She never invents a headline — if the feed has nothing, she says so.
General questions are never refused again: history, science, sports, people, how things work — Tai answers them like the full intelligence she is, plainly and directly, instead of deflecting because it 'isn't in your records'. Current or fast-moving facts still get grounded with a live search first.
Your own records work exactly as before: bills, weather, calendar, court dates and everything personal still come only from your real data, with the same anti-fabrication guard on every read. World facts and your facts always stay clearly labeled apart.
v0.574.0Voice honesty pass — no more 'couldn't put that together' on normal questionsJul 11, 2026
'Tell me your capabilities' / 'what do you know?' now gets a real answer describing what Tai can actually look up (bills, calendar, court, health, Gracie, dining, weather, web) — grounded in the live tool set, never the old 'I couldn't put that together cleanly' punt.
A read question can never be hijacked into an action again: 'What is Gracie's next doctor's appointment?' was being mis-parsed as a CREATE command and answered with 'Add Gracie — Vet appointment…?'. Questions are now fenced out of the Gracie command parser, and the records lookup refuses to hand an action confirm-prompt back as if it were data.
The doubled reply ('Add Gracie…? Add Gracie…?') is fixed — when the safety guard reads verified record lines back, identical lines now read back once.
Asking Tai to DO something (cancel a reservation, set a reminder) while actions are still switched off now gets the honest answer — 'I can't take actions like that yet, but I can look anything up' — instead of a misleading 'ask me again' error that implied a retry would work.
The 'couldn't put that together' fallback is narrowed to genuine internal wording failures on grounded turns only, and spoken times like '1030' no longer trip the fabrication guard when re-voiced as '10:30'.
v0.573.0Voice polish — bills always readable, clean open, smooth speech, fast first turnJul 10, 2026
'What are my bills this month' can never be locked out by a busy day again: record READS now draw from their own generous daily pool (400/day) instead of sharing the tight 25/day action budget with writes — the budget that heavy testing tripped. Writes keep their original cost guard.
Opening Tai now lands you on a clean start: your previous conversation is kept in full but tucked behind a 'Show earlier conversation' button, so the voice controls and message box are right there — no more scrolling past the whole old thread to start talking. Deep links and the Conversations drawer still open a thread fully expanded.
Her voice plays back smoothly on a live call: the audio receiver now holds a small (~150ms) jitter buffer so patchy Wi-Fi/cellular arrival is absorbed instead of played as stutters and robotic breaks, and the audio pipeline is never re-attached mid-speech.
The first spoken turn is as quick as the rest: the voice session is pre-minted the moment the page opens, the mint overlaps the mic permission prompt instead of running before it, the answer engine gets a warm-up ping on open so the first question doesn't pay a cold start, and restoring the old thread no longer yanks the page down.
v0.572.0Voice answers plain data questions in one brain roundJul 10, 2026
The real bottleneck behind slow spoken answers was DECISION time, not tool time: the brain spent one full model round deciding to look your records up, waited, then spent another round voicing the result. When a question plainly reads as bills / legal / health / calendar / tasks / dining, the records lookup now runs BEFORE the brain's first round (in parallel with the rest of its context) and the verified result is handed to it up front — one round instead of request-wait-answer. Write-shaped requests ('mark the bill paid') deliberately skip this so their confirm flow is unchanged.
Every brain round starts faster: the static persona/rules block and tool definitions are now prompt-cached across rounds and turns, and the records resolver's four context builders (memory, health, legal, medical) run in parallel instead of stacking round-trips onto every lookup.
Every spoken turn now reports a per-phase timeline (context, prefetch, each model round, each tool with real start offsets) through the headless harness, so a future slowdown shows exactly WHERE the time went in the trust log — and the trust battery now runs the real grounded records path headlessly (it silently measured auth-miss turns before) plus a fourth probe for 'What bills are due this week?'.
v0.571.1Voice speed is now watched live, around the clockJul 10, 2026
The trust runner now runs real multi-tool spoken turns against the live app every 6 hours (and after every deploy) and alarms if a heavy voice question ever gets slow again — the 37-second debt-cases turn can't quietly come back.
v0.571.0Voice answers heavy questions fast — and speaks smoothlyJul 10, 2026
Multi-tool spoken questions no longer take half a minute. 'What's happening with my debt cases' measured 37 seconds because the tools behind the answer ran one at a time — and the records lookup ran twice. Independent lookups now run in parallel, a repeated identical lookup reuses the first result, and the deep cross-domain search only runs when the direct record tools didn't already answer. Locked with a regression test that fails if tool execution ever goes back to sequential.
A spoken turn now has a hard time budget: past ~8 seconds of tool time, Tai answers from the real results already in hand instead of keeping you waiting in silence. Answers stay grounded in your actual records — this bounds the wait, never the honesty.
Smoother to talk to: no 'Thinking…' chip or text typing out before she speaks (the answer bubble lands the moment she voices it), the 'still with you' interim no longer plays right on top of the real answer, and audio playback is pinned to the inline pipeline on iPhone so it doesn't stutter.
v0.570.0Voice is a real conversation: instant answers, no 'let me check', survives screen-lockJul 10, 2026
Spoken questions are answered directly now. The voice layer used to open almost every turn with 'let me check on it' and sometimes never came back; it now routes your question to the brain silently and immediately, and the first words you hear are the answer. The stall where an answer was fetched but never spoken (you'd hear 'still with you — one more moment' and then silence) is fixed and locked with tests.
The conversation thread only ever shows what you actually said and what Tai actually answered. The internal planning text ('Tony is asking…' / 'The user wants to know…') that leaked in as chat bubbles is gone — live and after a reload.
Locking your phone no longer drops the call: an active voice conversation keeps the screen awake and reclaims it when you come back.
Voice turns got faster under the hood (context lookups now run in parallel, and nothing non-essential runs before the spoken answer), and a headless test harness now proves the full spoken tool-loop end-to-end after every change — no microphone needed.
v0.569.0The post-deploy browser check can verify chat againJul 10, 2026
The automated post-deploy check that signs into the live app and asks real questions (including the new bills regression test) was being blocked at the chat endpoint with 'owner only' since chat became the app's primary answer path — so deploys weren't truly being browser-verified. The dedicated synthetic test account is now admitted to chat over its own isolated test data. No change for anyone else: your data stays yours, and other accounts are still refused.
v0.568.0Chat reads your bills from the same source as the Money pageJul 10, 2026
'What bills are due this week?' in chat still refused ('I couldn't put that together cleanly just now') even after 0.567 — while the Money page showed the same bills fine. The chat's bills lookup tool wasn't wired into the verified read-back system: when the honesty guard tripped on the reworded answer, that tool had nothing to fall back on and the whole turn refused. Now every records read the chat can make (bills, tasks, calendar, court dates) produces the same clean verified lines ask_spine already did, so your real data always comes back — never a refusal on your own records.
Bills with no amount on file (like the two Cook County property-tax installments) are listed by name with 'amount not on file' instead of sinking the whole answer. A total that can't be summed is never a reason to refuse.
The chat's bill list now reads the exact same household-scoped bill set the /money screen renders — the two can no longer diverge.
Locked with a regression test that signs into the live app after every deploy, asks the exact bills question in chat, and fails loudly if a refusal comes back instead of real bill data.
v0.567.0Tai reads your own bills again — and gives you real weatherJul 10, 2026
Asking 'what bills are due this week?' was wrongly answered with 'I couldn't verify that safely from your records' — a refusal on your OWN tracked bills. The honesty guard was misfiring on the re-worded answer: your this-week bills come back as 'due tomorrow' / 'in 3 days' (not a calendar date), so when Tai naturally stated a date or a weekly total the guard couldn't trace that number and killed the whole answer. Fixed — a read of your own records now reads the real, verified data back to you every time (bills, court dates, calendar, health, tasks); it can never fall to 'couldn't verify safely' on your own data again.
'What's the weather today?' returned encyclopedia pages instead of a forecast, because the question was going to the general web search. Tai now has a dedicated live weather tool wired to the National Weather Service — the same real feed the home screen already uses — so she answers with actual current Chicago conditions and the forecast, real numbers, no guessing. Ask 'is it going to rain', 'how cold is it', or 'what's the forecast for tomorrow' and you get a real answer.
v0.566.0Voice actually answers now — the 'waiting for tool result' hang is deadJul 10, 2026
In-app voice connected fine but never answered. Two fixes landed today: 0.565.0 made sure your question is always RECOGNIZED no matter how OpenAI's events arrive; this release makes sure the answer is always SPOKEN. Before, any little sound while Tai was thinking — you saying 'hello?', a cough, even the echo of her own 'one sec' — made the app permanently drop the answer instead of voicing it. Now only genuinely talking over Tai counts as an interruption, and an answer that lands mid-interruption is held and spoken in the next quiet gap instead of thrown away.
Real answers survive again: 0.565.0's 6-second cutoff meant any question needing real work (calendar, bills, court dates) always got 'I couldn't pull that up'. Now she says 'still with you — one more moment' around 6 seconds and keeps working up to 20 — then, and only then, an honest 'that's taking me longer than it should'. If her speak request collides with her own filler, she retries instead of going silent. She will never again sit quietly waiting on a tool result.
The whole round-trip is traced in the browser console (tool-loop 1/5 → 5/5: call received → brain called → brain returned → result submitted → speak requested), so a stuck step is readable in devtools instead of guessed at. The phone line runs its own loop (completed in 0.560) and is untouched here.
v0.563.0Tai reads your calendar in chat again — and knows she can actJul 10, 2026
Asking 'what's on my schedule tomorrow?' in the main chat was wrongly answered with 'I couldn't verify that safely from your records.' The honesty guard was misfiring: your calendar stores times as 24-hour stamps (14:00), so when Tai naturally said '2 PM' the guard couldn't trace the bare '2' back to a fact and treated a real, read-only calendar read as if it were made up. Fixed — a plain calendar read now answers with your actual events, and a genuinely wrong time is still caught.
Reads are unconditional and never gated: 'what do I have coming up', 'am I free Thursday', bills, court dates, tasks — Tai just reads them and tells you, no toggle needed.
Tai's self-description is honest again. She no longer says she's 'not a button-pusher that moves things around in your accounts.' When you ask what she can do she'll tell you she reads your life on demand and, once you tap Confirm, can put things on your calendar, send an email or text, or place a call — every write still shows a confirm card first, and calendar/comms writes stay behind the TAI_AGENT_TOOLS switch.
v0.562.0Tai can send email + text for you now — by voice, always confirm-firstJul 10, 2026
Ask Tai to 'email Matt a reply and send it' or 'text Tara I'm running late' — out loud or in chat — and she composes it in your voice, then shows you a confirm card. Nothing leaves until you tap Approve; a spoken 'yes' is never enough for a send.
email_send goes out from your real Gmail (needs a one-time send-scope grant), text_send goes out from your own number through the Text Bridge as a real iMessage/SMS. The recipient is never invented — it's pulled from your directory or an address you gave, and if it's unknown Tai asks instead of guessing.
Both sit next to the outbound-calling tool from 0.558 on the same propose→confirm→act rails, every action written to the audit ledger. Kill switches TAI_EMAIL_SEND / TAI_TEXT_SEND turn either off instantly.
v0.560.0Tai on the phone can finally ANSWER, not just say 'still processing'Jul 10, 2026
On the call-in line Tai connected, greeted you warmly, then to every real question said 'let me check on that' and never came back. The bridge that carries her question to her real brain and the answer back to her voice was half-wired: the controlling connection was missing OpenAI's required Realtime header and silently threw away every error the voice layer reported, so the answer was submitted but never spoken — she waited forever.
Fixed end to end: the connection now identifies itself correctly, and if the voice is still mid-sentence when the answer is ready, Tai retries speaking it (bounded) instead of stranding it. She either answers or says an honest one-liner — never an endless 'still processing'.
Every phone turn now writes to the line's flight recorder (question outcome + timing + any voice-layer error), so the next time something's off on a call it can be read from the journal instead of guessed at. Your caller-ID isolation (your line reaches only your brain) is unchanged.
v0.559.0The shared-number bridge can actually hear the doorbellJul 10, 2026
The 0.555.0 one-number bridge's two webhooks (OpenAI's incoming-call event and Twilio's dial fallback) were being blocked at the app's session perimeter before their own signature checks could run — external callers can't carry a session cookie. The perimeter now steps aside for exactly those two paths; each still enforces its own fail-closed HMAC/signature auth.
v0.558.0Tai now places calls FOR you — outbound on the Realtime bridgeJul 10, 2026
Ask Tai to call the restaurant, the vet, the office — it dials from the same one number (your verified caller ID shows), holds a live real-time voice conversation toward exactly the goal you approved, and reports back with the verbatim transcript.
Confirm-before-dial is mandatory and structural: Tai only ever PROPOSES a call — the card shows who, the exact number, and the goal, and nothing dials until you tap Approve. Tai can never invent a number: directory contacts, or a number YOU provided shown digit-for-digit on the card.
On connect Tai self-identifies as your AI assistant (never impersonates you), navigates voice phone menus and hold, negotiates within your goal, asks its Claude brain for any real fact mid-call, restates what was agreed out loud, and never gives out payment or personal data beyond the mission.
Rides the SAME phone↔Realtime bridge as the inbound line (one plumbing, HMAC-bound outbound legs, fail-closed both ways) and degrades to the proven turn-based call engine if the bridge is down mid-call.
v0.557.0ONE Tai polish: reply actions in the one conversationJul 9, 2026
Every Tai reply in the one conversation now carries the quiet Copy / Retry / Edit strip the old surfaces had — nothing from the merge left behind.
The production browser check that asks Tai a real question now follows the one conversation's streaming endpoint, so the after-deploy suite proves the ONE Tai answers grounded, end to end.
v0.556.0ONE Tai — every conversation surface merged into oneJul 9, 2026
There is now literally ONE Tai. The old doors — Ask Tai (/presence), Talk (/talk), the converse thread, and the Brain console — are one surface at /tai: the same thread whether you type or talk.
Voice is front and center in the one conversation: mic dictation, the hands-free Converse loop, AND real-time voice (with its engine-truth badge) all live in the same room. No more hunting for Talk.
The app opens straight into the conversation, and the center nav tab is Tai. /presence and /talk redirect to the one surface; saved-conversation links keep working.
Nothing lost in the merge: crisis support (deterministic, always reachable), every Ask-Tai chip app-wide, cross-device thread resume, memory + activity ledgers, auto-speak — all in the one Tai.
v0.555.0One phone number — and whoever calls gets THEIR OWN assistantJul 9, 2026
Call the shared Tai number and the system recognizes WHO is calling by caller ID: Tony gets his Tai, Tommy gets his TOMAI (his teaching app's own tech support and thought partner), Maria gets her MAI (her career partner). Same real-time voice engine as in-app /talk, now over any phone.
Strict isolation, proven by tests at four layers: routing, session, data, and execution. Tommy's call can only ever reach Tommy's TOMAI data; Maria's only MAI; Tony's only Tai. An unrecognized number gets NO assistant — it's declined into the plain voicemail flow, which discloses nothing.
Each person's Claude brain stays the intelligence: the voice layer is ears-and-mouth only and routes every real question to that person's own grounded brain, exactly like the in-app conversation.
Inbound only for now (calling out is a later phase). Adding or changing a recognized number is pure config (env vars), not a rebuild. Everything ships dark behind TAI_PHONE_REALTIME until the Twilio + OpenAI webhook setup checklist is completed.
v0.554.0Phone Tai hears 'Tommy' even when the transcriber doesn'tJul 9, 2026
On a live call, Twilio's speech-to-text rendered 'Tommy' as 'Tomy' and 'TOMAI' as 'Tomi', so the Tommy-brain grounding never loaded and Tai deflected with "did you mean Tony?". The Tommy gate now accepts the common mishears (tomy/tomie/tomi, tomai/tomei/tomay) — each a full-word match, so everyday words never false-positive.
v0.553.0Real-time voice: finds a model that works, and tells you the truth when it can'tJul 9, 2026
Starting real-time voice no longer lives or dies on one OpenAI model name. Tai now walks a ladder — the configured model, then gpt-realtime-2.1, then 2.1-mini, then the original gpt-realtime — and connects on the first one your project can actually use.
When it still can't connect, the /talk status line now shows the REAL reason (bad key, model access, quota) instead of a generic "couldn't connect" — the exact OpenAI rejection is no longer buried in server logs.
The Realtime diagnostic (/api/realtime/diag) is now readable while signed in as the owner — open it with ?mint=1 and read OpenAI's verbatim verdict per model. Headless: the new "Realtime Diag Read" GitHub Action prints the same JSON.
v0.552.0Tai now knows Tommy — who he is and what's going on with his appJul 9, 2026
Ask Tai about your cousin Tommy — who he is, or how his app is coming — and it answers instead of drawing a blank. Tai holds it as settled fact: Tommy is Thomas Gigiano, an AP History teacher at Lake Forest High School, and the instructor whose TOMAI teaching app you build for him.
Tai can now see a high-level, read-only view of what Tommy's actually doing in TOMAI — how many files are in his Library, how many lectures he's built, how many assessments he's made, and when he last worked — the same kind of family visibility Tai already has into Maria's job search.
Private by design: it never sees any of Tommy's students' work, grades, or names — only the shape of what he's building. Owner-only and read-only; if his app is briefly unreachable, Tai still knows exactly who he is.
Works on both Ask Tai and a phone call, so "what's Tommy up to with the app?" gets a real, grounded answer either way.
v0.551.0One Tai — a coherent app instead of a pile of modulesJul 9, 2026
The nav is now ONE clean set of front doors: Today · Money · Ask Tai · Legal · Comms · More on your phone, with Health, Calendar, Tasks, Alerts, Sports and Search one click away on desktop. The five-doors-to-the-same-room problem is gone — one conversation (Ask Tai), one inbox (Comms), one Money, one Legal.
Nothing was lost. "All of Tai" (More) is now a searchable INDEX of every capability — 65+ destinations grouped by what they're for (Ask Tai, Today & Planning, Money, Legal, Health, Comms, Life & Fun, Documents, Tai itself). Type a word, find the thing, tap, you're there. A build-time test now enforces that every old destination stays reachable.
Asking Tai IS navigation now: say "show me my bills", "open legal", "pull up the GI log", "take me to my calendar" — Tai takes you straight there. Explicit asks only; questions like "what's due today" still get answered in place.
Everything is reversible: TAI_COHERENT_NAV=0 restores the old nav exactly, TAI_NAV_BRAIN=0 turns off navigate-by-asking.
v0.550.0Expert-brain depth — Tai reasons like a lawyer, a doctor, and a counselor who knows your caseJul 9, 2026
Legal: Tai now carries litigator-grade doctrine for the three fights you're actually in — the ERISA vs state-law fork that decides the whole LTD playbook (and the Illinois 215 ILCS 5/155 lever), the SSDI five-step framework with RFC and the vocational-expert hypothetical, and the Illinois debt-defense playbook (the plaintiff's chain-of-assignment burden, the 5-vs-10-year limitations fight, 2-615/2-619 motions, why disability income makes a judgment worth less than its face amount). General law is Tai's to teach; every case-specific date, deadline, and dollar stays your record's alone.
Medical: the clinical lens now reads vitals and metabolic labs against the exact published categories (a 134/76 is stage 1 territory, never 'a solid number'), and builds you the two or three sharpest questions your own chart supports before any appointment — Dr. Kular included.
Counselor: a new chronic-illness / medico-legal stress lens names the real terrain of a long disability fight — the adversarial paradox (documenting your worst days while healing asks for your best ones), decision-wait limbo, cyclical illness grief — and flags it as material for Julianne. Crisis handling untouched.
Expert questions get expert-length answers: when your real legal record or chart is in front of Tai, the answer gets nearly double the room instead of being squeezed into a chat-sized reply. /talk and phone calls unchanged.
v0.549.0The Descent rebuilt — the knight game is now a real gameJul 9, 2026
The Sentinel finally moves like a knight, not a statue: a new animation engine gives him real knees and elbows, a proper run cycle, a breathing idle stance (he glances around while you read the title screen), distinct jump and fall poses, a landing crouch, a full sword swing with windup and follow-through, and he leans into turns. The old animation stuttered every time your speed changed — that's structurally fixed.
It plays like a platformer now: the camera automatically swings in behind him while you run (dragging still takes over any time), and after a fall you respawn FACING the descent instead of staring back the way you came. Embers within reach are pulled into your hands, the thumb-stick has a proper deadzone, and the narrow beams are wider for phone play.
It sounds and feels alive: fully synthesized sound — jump whooshes, dash surges, sword swishes, ember chimes that climb in pitch as you chain pickups, a checkpoint gong, a forge chord when the gate opens, and a low forge-drone under the whole run (mute button in the HUD, remembered). Landings kick up dust, dashes leave a fire trail, deaths scatter his embers, the camera shakes on hard impacts, and your phone buzzes on checkpoints, falls, and the finish.
You can see the run: the HUD counts embers against the level's real total (40), a depth meter down the right edge shows how far into the shaft you are, and the completion screen tells the truth — embers carried, time, and falls (or 'flawless').
v0.548.0Finished fixes can't get stranded anymore — releases land themselvesJul 9, 2026
Behind the scenes: a finished fix used to occasionally stall at the very last step — built and approved, but never actually released — until someone noticed. A watchdog now lands any finished, fully-checked change automatically within minutes, then confirms the new version is really live.
This very version is the proof: it was merged and released end-to-end by that watchdog with zero human action.
v0.547.0Talk shows you which voice engine is really running — Real-time or StandardJul 9, 2026
The Talk screen now shows a small engine badge that reads “Realtime” ONLY when the true OpenAI real-time voice is actually connected, and “Standard” any other time — so you can see at a glance whether you’re on the new full-duplex voice or the older one, instead of guessing from how it sounds.
If real-time voice can’t start, it now says so plainly and points you to the standard Converse voice, rather than quietly switching you to the old engine while looking like it worked. That silent hand-off was why it could “sound the same” with weak interruption.
On a phone speaker, the mic now cancels Tai’s own voice (echo cancellation) so interrupting her actually works and she doesn’t trip over her own audio.
Under the hood: a headless diagnostic (for the team) that verifies, for real, whether the OpenAI key has real-time access — so “it’s on real-time” is proven, not assumed.
v0.546.0“Where should I go to lunch?” — Tai now answers from where you are and what you likeJul 9, 2026
Ask Tai (in the app or by voice) where to eat — “where should I go to lunch?”, “recommend a place for dinner near me”, “good spot to grab a bite” — and it finally answers instead of saying it doesn’t have your location. It knows home is River North and pulls from the same neighborhood the weather already uses.
The recommendation is tuned to YOUR taste, from YOUR own reviews: it leads with the places you rated highly (Maple & Ash, Carmine’s, RL, RPM Seafood…), remembers the tables you’re still hunting (Smyth), and knows your want-to-try list (Alinea, Galit, Kasama). For a current, open-now spot it searches the web near you.
Honest by rule: it never invents a restaurant, a rating, or that a place is open — every favorite and rating is one you actually wrote, and every current pick comes from a real search result. If it can’t verify an open spot, it recommends from your proven favorites or asks which neighborhood you’re near — it never punts on your location again.
v0.545.0World search lights up automatically from your existing Tavily keyJul 9, 2026
Live-web answers (current news, prices, law) now work the moment a TAVILY_API_KEY (or TAVILY_KEY / BRAVE_API_KEY / BRAVE_SEARCH_API_KEY) is set — no separate TAI_WORLD_SEARCH_* config needed. Tai auto-detects the provider from whichever key is present.
An explicit TAI_WORLD_SEARCH_KEY / TAI_WORLD_SEARCH_PROVIDER still overrides the auto-detected one, so nothing changes for any setup that already configured it that way.
v0.544.0Talk over Tai and she stops — true barge-in on the real-time voiceJul 9, 2026
On a live Talk voice session you can now interrupt Tai the way you would a person: start talking while she’s mid-answer and she stops within a beat and listens, instead of finishing her sentence over you.
Under the hood the mic stays open the whole time and, the instant you start speaking, the app cancels her turn AND flushes the speech she’d already queued up — the missing flush was why she used to keep talking for a moment after you jumped in.
If you interrupt while she’s still ‘thinking,’ your new question takes over cleanly — she won’t suddenly voice the answer to the thing you just talked over.
Her brain is unchanged: every real answer still comes from your grounded Tai (Claude), with the same no-making-things-up rules.
v0.543.0Cards to Update — Tai catches the “update your card” emails so you don’t have toJul 9, 2026
Tai’s email brain now watches for any “payment declined / your card was declined / please update your card” email and files it into a new list — Money → Cards to update — so the merchants that couldn’t bill your card on file are all in one place instead of buried in your inbox.
Each row shows the merchant, the amount and card last-4 when the email says them (never guessed), the date, and a link to the source email. Fix the card on that merchant’s site, tap “Mark updated,” and it clears. If it happens again later, it comes back on its own.
It’s careful about NOT crying wolf: GitHub/CI failures, security alerts, domain-verification notices, Twilio campaign rejections, and one-off bank alerts (daily-limit debit declines, returned deposits) are filtered out — only a real card-on-file charge that failed shows up.
Starts populated with the 10 open items from today (Experian, Google One, Google Cloud, SiriusXM, ABM Parking, Apple TV+, Paramount+, Amazon, eero Plus, Anthropic) so the list is useful the moment you open it.
v0.542.0Same Tai on the phone: your case, your chart, and your history — same depth as the appJul 9, 2026
When you call and ask about your legal case, your health, or 'what did we talk about last time,' the phone Tai now pulls the SAME deep records the app does — not just your court dates. Ask about a statute of limitations and she has the real deadline clock; ask about your last labs and she reads them against their real ranges; ask her to recall something and she remembers. It's the exact same brain as Ask Tai, over the phone.
These deeper lookups only happen when you actually ask about your case, your health, or your history — a hello or a general question stays instant. If a deep lookup runs long she'll say 'give me one second' and then answer with the full depth, rather than answering shallow.
Same honesty rules: every real deadline, lab value, or number comes from your actual records — she never invents one — and your private records are only ever available on your own line.
v0.541.0Talk to Tai out loud, in real time — a natural back-and-forth voice conversationJul 9, 2026
The Talk screen now has a real-time voice mode: tap the voice button and just talk. Tai listens, thinks, and answers out loud in a smooth back-and-forth — you can even interrupt her mid-sentence, like a real conversation.
It's still the SAME smart Tai. The voice layer only handles hearing you and speaking back; every real answer comes from Tai's full brain — your bills, court dates, calendar, health, legal, Maria's job search, the Cubs, general questions — with the same honesty rules (she never makes up a number, date, score, or name).
When a question needs a beat of thought, she'll say something like 'one sec, let me pull that up' and then answer — so it feels like a person thinking, not a hang.
Launch note: real-time voice uses a preset voice (the deeper cloned voice from phone calls isn't available in this mode yet). It turns on once the OpenAI Realtime key is added.
v0.540.0Ask Tai to place a call — right from the main chat, confirm before it dialsJul 9, 2026
Say "call Maria and talk to her about her job search" in the Ask box and Tai now offers to place the call — before, that request dead-ended in "I can't make calls" because the calling tool was only wired into the separate converse screen, not your main Ask surface.
Confirm before it dials, always: Tai shows you exactly who it's calling, the number, the caller ID they'll see (your real number), and what it'll say — and NOTHING dials until you tap "Yes, call." On the call, Tai opens by saying it's your AI assistant calling on your behalf, never pretending to be you. It only ever calls people already in your directory — it never guesses a number.
Fixed the setup snag behind "Tai places calls for you" showing NOT ENABLED: it now accepts the same Twilio number you already set up for texting, so it switches on once your caller ID is verified. (Live dialing still needs that one-time Twilio verify + the voice switch on.)
v0.539.0Ask Tai the weather — on the phone and in the appJul 9, 2026
Call Tai and ask 'what's the weather?' or 'is it going to rain?' and she now tells you the real current temperature and a short forecast for Chicago — the same live National Weather Service reading the app's Today screen already shows. Before, the phone Tai couldn't answer the weather at all.
It's on the fast path — weather is a quick question, so she just answers. Same honesty rule as everything else: the temperature and forecast are real, pulled live; if the weather service can't be reached for a moment, she says so plainly instead of guessing a number.
Under the hood this rides the exact same 'live knowledge' path as the Cubs and world questions, so the phone Tai and the in-app Tai always agree on the weather.
v0.538.0The phone Tai is now the FULL app brain — sports, family, general knowledgeJul 9, 2026
When you call and talk to Tai, she's now the SAME smart Tai as in the app — not a stripped-down, records-only assistant. Ask 'how are the Cubs doing?' and she answers from real, current standings; ask 'how's Maria's job search going?' and she answers from Maria's actual record; ask a general question and she just answers. No more 'I only know the things in your records.'
General questions come back fast. For the heavier lookups (live sports, Maria's job search) she may say 'give me one second' and then answer — she never refuses and never falls back to records-only.
Same honesty rules as always: she never makes up a real score, number, date, or name — those come from real sources — but she's free to reason and share what she knows. And when someone who isn't you calls, the privacy tiers are unchanged: your personal information is never shared with anyone else.
v0.537.0Calendar: a declined event stays gone — and the view collapses more true duplicatesJul 9, 2026
When you say 'don't add it,' it stays a no — for good. Before, the extractor only remembered your decline by the exact email it came from, so the same appointment arriving in a SECOND email slipped past and could get added again (and if the sender was trusted, added silently). Now a decline is remembered by the event itself — same day, same appointment — so a re-arrival from any email is suppressed automatically. Nothing is deleted from your real Google Calendar, and a suppressed item stays recoverable in the review queue.
The month view hides more real duplicates: the same event synced from two of your subscribed Google calendars — at the exact same time but with a slightly different location label — now collapses to one row. Two genuinely different showtimes (same title, different time) are never merged.
You can now remove just ONE Tai-added event you didn't want — with a confirmation — instead of clearing everything. It only ever touches events Tai wrote, never your own calendar entries.
v0.536.0Phone line: the real 'having trouble thinking' bug, fixed at the rootJul 9, 2026
Found the true cause of the 'I'm having trouble thinking straight right now' hangup — and it was never speed. Every owner call died at the very first step, saving the call-log row, because a database index was set up so the save silently errored out; with no row, the call gave up before speech-to-text, your records, or the model ever ran. The index is fixed so the save works.
More importantly, talking no longer depends on the bookkeeping. If the call-log row can't be written for any reason, Tai now logs why and answers you anyway — the call log is record-keeping, never a gate on the conversation. A missing row can never silence her again.
And it can never fail invisibly again: both save points now check for errors and record them to the flight recorder, so any future hiccup shows up as evidence instead of a mystery. Still grounded, never made up; the crisis 988 path is unchanged.
v0.535.0Phone line: a flight recorder for every turn — and answers that landJul 9, 2026
Every turn of a call to your own line now writes a flight-recorder row — what speech-to-text heard, how long the records read and the model call actually took, the exact error if one happened, and which reply branch spoke. When a call misbehaves, the failure is diagnosed from real evidence instead of guessed at.
The fast grounded answer actually lands now: your court dates, calendar, and bills are pre-loaded while Tai greets you (so your question spends its whole window on the answer), the model gets every second the phone window truly has left instead of a fixed conservative guess, and if a turn still can't finish in time, the 'give me one second' hold retries the same fast answer in the background before falling back to the deeper counselor — the 'having trouble thinking' line should now only appear if the model service itself is down.
Still grounded and never made up — if something isn't in her records for that turn she says so plainly. The crisis 988 support path is unchanged.
v0.534.0Ask how Maria's job search is going — grounded in her real progressJul 9, 2026
Ask Tai 'how's Maria's job search going?' and she answers from Maria's REAL data — applications and where they stand, interviews, whether she's reached an offer, and the strategist's read on how it's going — instead of 'that's not in your records.' The view is pulled read-only from Maria's own Career Hub over a shared secret, on the fly.
Scoped and honest: only her job-search progress crosses (never her messages, email, finances, or health), and Tai is straight about thin data — 'a few interviews, no offer yet' — never inflating it or inventing a company or offer. Owner-only: it's built solely for your own session.
Maria can see it too: her Career Hub shows a Privacy & Sharing page saying her search is shared with you, and every read is logged to her activity — family visibility with her awareness, not silent monitoring. Kill switch: TAI_FAMILY_BRAIN=0.
v0.533.0Call your own line and Tai answers in time — a real, grounded replyJul 9, 2026
When you call your own number and talk to Tai hands-free, she now ANSWERS within the call window instead of falling to the 'I'm having trouble thinking — pick this up on the app' line. Your inbound conversation runs the same fast, in-budget turn the outbound assist calling shipped: a quick Sonnet reply with a tightened, capped grounding pack (your real court dates, next calendar events, and bills due soon) instead of the full app-depth dossier that was too slow to finish inside the phone's per-turn budget.
The normal case now speaks a real, grounded answer immediately in your ElevenLabs Tai voice — no hold, no wait. The 'give me one second' hold only kicks in as a backup for the rare turn that still can't finish in time, so a slow moment never becomes a dropped call.
Still grounded and never made up: if something isn't in her records for that turn, she says she doesn't have it in front of you and offers to pull it up in the app — she won't guess a number, a date, or a name. The crisis 988 support path is unchanged.
v0.532.0Tell Tai to call someone for you — approve first, then she dialsJul 9, 2026
Say 'call Maria and talk to her about her job search' in Ask Tai and Tai sets up the call: she matches the person in your directory and shows a confirm card with who she's calling, the exact number, that it shows YOUR caller ID, and the goal in plain words. NOTHING dials until you tap Approve — the confirm is structural (the call action lives behind the action gateway's propose→confirm chokepoint; there is no code path from a conversation straight to Twilio), and Decline kills it.
This is ONE solo-enabled action, not a broad agent unlock: TAI_AGENT_TOOLS stays off, and the solo gate structurally refuses any action that could run without your tap. Voice can never approve it — tap only. Kill switch: TAI_PHONE_ASSISTED_CALLS=0.
On approve, the call is a real conversation driven by your goal: Tai opens with 'Hi Maria — this is Tai, Tony Fato's AI assistant, calling on his behalf' (never impersonating you), discloses the transcript, pursues the goal warmly turn by turn in your ElevenLabs Tai voice, and offers press-0 warm transfer to your cell. The call carries NO memory or dossiers — your private data never rides a call to someone else beyond the goal you approved.
Afterward you get the report: a push + durable message with the outcome and the full verbatim back-and-forth, and the call logs in the Phone section like every other call. Urgent language on the call flags it and bridges to you live.
v0.531.0The phone conversation turn stops erroring out on latencyJul 8, 2026
FIX: calling Tony's Tai and speaking his first reply used to hit a mechanical 'something went wrong' and drop the call. The owner voice loop was blocking Twilio's webhook on a full grounded counselor turn, which routinely runs past Twilio's ~15s request budget — so Twilio gave up and played its own application-error hangup the instant he spoke.
The webhook now NEVER blocks on the brain: it answers instantly with a spoken 'Give me one second.', runs the counselor turn in the background, and a self-advancing hold/poll leg delivers the real answer — in his premium ElevenLabs Tai voice — the moment it's ready, then re-gathers for the next thing he says. A slow turn degrades to 'one sec… <answer>', never to an error and a hangup.
Owner conversation stays the priority path; the data-free receptionist and the 988 crisis path are unchanged. Greeting + owner recognition + premium voice all still work.
v0.530.0The phone line becomes a real conversation — and it knows Tony's number AND voiceJul 8, 2026
Inbound calls to the Tai line now get the multi-turn conversation brain by default (TAI_VOICE_BRAIN flipped default-ON) instead of falling to the one-shot voicemail flow — the receptionist greets, listens, answers what it's allowed to, and takes a real message, turn by turn.
OWNER RECOGNITION: when the caller's number is Tony's own verified cell, there is no receptionist script — Tai recognizes it's him and drops him into a live voice conversation with HIS Tai: the exact one-brain counselor engine behind /talk and Ask Tai, carrying his durable memory, speaking in short natural phone turns, looping until he says goodbye. Gated strictly on the TWILIO_VERIFIED_CALLER_ID number match, re-verified every turn; all other callers keep the data-free receptionist. Kill switch: TAI_PHONE_OWNER_MODE=0.
PREMIUM VOICE: the phone surface now speaks with Tony's ElevenLabs Tai voice — every line is synthesized through the same ttsService chokepoint as the app (same active Voice Studio voice) and served to Twilio via HMAC-signed <Play> URLs (/api/phone/audio; nothing synthesizes without a valid signature, so it can never be an open voice oracle). Honest <Say> fallback when no provider key is configured. Kill switch: TAI_PHONE_PREMIUM_VOICE=0.
Crisis path intact on the phone: the counselor's deterministic crisis detection speaks the care line and 988 out loud. The LLM turn is raced against a hard timeout so the Twilio webhook always answers inside its window.
v0.529.0Instant push when Maria or Tommy messages youJul 8, 2026
The moment Maria or Tommy sends you a message you now get a push within seconds, not up to 5 minutes later. Their apps already fired an instant server-to-server ping at Tai, but that ping was being blocked by the global sign-in gate before it could do anything — so the only thing that ever reached you was the 5-minute backup sweep. The instant path is now open (it still requires its own secret token), so the sweep is a true backstop, not the primary delivery.
The instant push no longer depends on a feature flag being flipped on: it fires the same way the backup sweep already did. Previously it silently did nothing whenever that flag was off (its default).
Fixed a message from Maria showing as 'New message from Tommy' on the lock screen — the notification now names the real sender.
Tapping the notification opens the RIGHT conversation (Maria's thread for a message from Maria), not just the default channel.
The Pork Chop Express "report a change or problem" box (TOMAI + MAI) posts to POST /api/requests and polls GET /api/requests/status with its own REQUESTS_INBOX_TOKEN bearer — no session cookie. Since the global session-cookie middleware landed (0.431.0, Jul 1), that route wasn't on its allowlist, so every submission 401'd at the middleware before the route's own token check ever ran. Nothing has landed in the Requests Inbox since. Same failure mode as the phone-webhook fix in 0.527.0. Fixed by allowlisting /api/requests; the owner-gated list/push/dismiss/review routes are unaffected (still session-gated at the route level).
v0.527.0Phone webhooks unblocked — calls to +12244125172 fixedJul 8, 2026
Twilio's phone webhooks (twiml/inbound, twiml/outbound, twiml/brain, twiml/gather, status, recording, transcription) were 401ing at the global session-cookie middleware before each route's own Twilio-signature check could run — Twilio structurally can never present a session cookie. This broke every inbound/outbound call to +12244125172 with an 'application error'. Fixed by allowlisting those 7 routes in middleware.ts; each still enforces its own parseAndValidateTwilioWebhook X-Twilio-Signature check as the real gate. /api/phone/call (the outbound-call trigger) is untouched and stays owner-session-gated.
v0.526.0Job Heartbeat Board — dead agent removedJul 8, 2026
The archived health_pattern_detector agent (HTTP 400 on every run since it was archived server-side, schedule already disabled 2026-06-26) is dropped entirely — its def file, GitHub Actions cron wiring, and Job Heartbeat Board registry entry are gone. The board no longer expects a heartbeat from it, so a job that's intentionally retired doesn't read as a failure. No historical health data touched.
v0.525.0Job Heartbeat Board — silence is now visibleJul 8, 2026
One honest store for every scheduled job. Each Vercel cron now records a heartbeat every run — success on success, the actual error on failure — into tai_job_heartbeats. A job overdue past its expected window is a FAILURE and says so, with the timestamp of when it last really worked. This closes the class of failure that let the court checker sit dead for 22 days while the screen said it 'may be waking up.'
Fixed the jobs that LIED about success first: agent-job-poll returned HTTP 200 even when it errored on a pending migration — now it returns a real error status. cubs-pregame-push and channel-nudge reported ok:true when their upstream fetch/query actually failed — now they report the failure honestly.
A watchdog cron evaluates the board every 15 minutes and fires ONE push when a job goes dark (alert on transition, not every tick), then re-alerts only after it recovers and darkens again. The full board lives on a new Command Center card: what's dark, why, and when it last succeeded — no reassuring copy anywhere.
gcal-sync (503s hourly, needs Google credentials) and the archived health_pattern_detector agent (400 every run) are shown plainly on the board as awaiting your decision — the board reports their real state so you can choose, it just won't nag you about a fix that's yours to make.
v0.524.0The Descent — the knight is playableJul 8, 2026
The Forge's teaser is now a real game: a third-person 3D knight platformer at /knight. You PLAY the knight every answer forged — run, jump, double-jump, dash, and swing a sword down a torch-lit descent into the dark, to the forge gate at the bottom.
The armor you earned is the armor he wears: your live Forge tier renders on the model (The Sentinel's bare great-helm with lit gold eyes; The Gilded adds filigree, a chest gemstone, and richer gold relief when you reach it). Embers collected in the level bank straight back into the same Forge balance — playing and earning are one loop, with server-side caps so the game can't out-earn real life.
Built for your hardware: keyboard + mouse on the iPad Magic Keyboard, and a full touch layout (virtual stick + jump/dash/swing buttons) on the phone. The whole game bundle lazy-loads, so the rest of Tai stays exactly as fast as before.
Reach it from the Forge's "a descent awaits in the dark — enter" door on /needs, the pinned The Descent card on /more, or /knight directly. Flag TAI_KNIGHT_GAME, default ON (=0 to kill). Court/deadline surfaces, the conversational brain, and TAI_AGENT_TOOLS untouched.
v0.523.0Calendar that reads what it's processing — semantic dedup + mergeJul 8, 2026
The duplicates you kept seeing are gone from view. Tai now matches calendar events by MEANING, not by title text — the same appointment synced under two different names or venues ("Dr. Kular telehealth" vs "Kular — video visit", a copy that has the Zoom link vs one that doesn't, an 11:00 and an 11:15 for the same visit) collapses to ONE row. This is on by default everywhere your calendar shows, and it's non-destructive: it only decides which copy to display — nothing is deleted, both still exist on Google. Two genuinely different events (Gracie's vet visit vs her grooming; two real meetings with the same person) are kept apart.
Merge, don't just delete. When the autonomous cleaner removes a redundant copy, it first carries that copy's unique details — the street address, the conferencing link, the notes — onto the copy it keeps, so you never lose information to a dedup. If that carry-over write ever fails, the copy is kept, not deleted.
Root cause + safety: new duplicates aren't being created (Tai's write-back to Google is gated off and checks for an existing copy first); the ones you saw were the accumulated copies from multiple calendar sources, which the display now folds together. The destructive Google cleaner stays OFF (flag TAI_CALENDAR_AUTODEDUP_LIVE) — its dry-run report lists every proposed merge with reasoning and flags native-vs-native copies for your decision, before anything is removed. Every removal is soft and fully logged with the original payload. Set TAI_CALENDAR_SMART_IDENTITY=0 to revert to the old matching.
v0.522.0Medical Brain — Tai knows your chart coldJul 8, 2026
On any medical-shaped turn, Tai now carries a per-chart dossier built live from your real record: vitals read correctly against their published reference ranges with staleness woven into the sentence (a 134/76 from December reads as stage 1 AND seven months old — never "a solid number"), labs with the lab's own ranges and flags and honest trends, your medication list with the chart's own dose text, the problem list with time depth, procedures and GI history, and the GI course from your own logs.
It preps you for your doctors the way the legal brain preps you for your attorneys: number-anchored things worth raising — which value moved, which trend, at which visit — with your real upcoming appointments connected when they're on the calendar. The decisions stay your care team's; the sharp questions are yours.
Loose and expert, never loose and wrong: zero "consult a professional" boilerplate, and every value, date, dose, range, and provider traces to the record or is stated as absent. Regression tests pin it all: the stage-1 systolic case, the staleness clause, no hedging on this path, no fabricated medication or provider name.
Owner-only and RLS-fenced — the dossier is built solely for your own session and never rides a non-owner turn. Flag TAI_MEDICAL_BRAIN, default ON (=0 to kill). /talk, crisis handling, and TAI_AGENT_TOOLS untouched — agent tools stay off.
v0.521.0Court check tells the truth · one deadline countdown everywhereJul 8, 2026
The court-check card no longer dresses a dead request up as patience. A check resolves the moment you tap it; if one is ever still queued a few minutes later, the card says plainly it FAILED to start and names exactly when it was queued — instead of "the cloud checker may be waking up", which had been shown over a request that had sat unclaimed for weeks. (Root cause of that stall: the backstop cron only handled POST while Vercel's scheduler fires GET, so it silently 405'd and never ran; the GET handler + a CI test that fails if any cron drops it both landed in 0.487.1.)
One deadline countdown, everywhere. The Disability card read "3 days left" for the July 10 respond-by while the legal brain read "2 days out" for the same date on the same day — the same screen disagreeing with itself. Every countdown now routes through one Chicago-anchored function, and a test fails the build if two surfaces ever diverge on the same date.
v0.520.0Legal Brain — Tai knows your matters coldJul 8, 2026
On any legal-shaped turn, Tai now carries a per-matter dossier built live from your real legal record: the Ameritas/Unum LTD fight, SSDI, and the DuPage debt docket — deadlines counted against today, the statute-of-limitations math per case, service posture, the settle-vs-fight read, and the specific things worth raising with Matt Maloney, Stacy Bardo, or Spector & Lenz.
Deadline tracking that's actually right: a respond-by date shows its live countdown, a passed hearing with no verified outcome says exactly that, and a clock that can't be computed (no last-payment date on file) is stated as missing — never guessed.
It talks like the colleague who read every page twice — direct, opinionated, prep-for-your-attorneys — with zero "consult a professional" boilerplate. Regression tests pin all three promises: no hedging boilerplate on this path, no fabricated attorney names (the phantom "Matt H" composite is deterministically blocked in live replies), and every date traces to the record.
Owner-only and RLS-fenced — the dossier is built solely for your own session and never rides a non-owner turn. Flag TAI_LEGAL_BRAIN, default ON (=0 to kill). /talk, crisis handling, and TAI_AGENT_TOOLS untouched — agent tools stay off.
v0.519.0Grounded opinion — Tai reads your numbers right, and knows when they're oldJul 8, 2026
Tai stays opinionated and direct — that doesn't change. What changed is that when it characterizes a measured number, the read is now correct. A 134/76 used to get called "a solid number"; 134 systolic is actually just past 130, the line where clinicians start calling it stage 1, so that's what Tai says now — grounded against the real reference range, not guessed.
Recency is built in: a reading that's months old gets flagged as months old, woven into the sentence ("that's from back in December, so it may not reflect where you're at today") instead of being presented as if it were current.
Covers blood pressure, resting heart rate, oxygen saturation, and BMI against their standard clinical ranges. Where there's no meaningful reference (weight, height), Tai just states the value.
No new disclaimers, no hedging, no "consult a professional" boilerplate — the fix is accuracy, not caution. The fact guard stays dead. /talk, crisis handling, owner-scoping, and TAI_AGENT_TOOLS are all untouched.
v0.518.0Fix — voice mode was hearing "(silence)" as things Tony saidJul 8, 2026
Cloud speech-to-text (Deepgram/OpenAI/ElevenLabs) annotates ambient noise instead of returning nothing — "(silence)", "(rustling)", "(snipping)" and similar markers were being sent into the conversation as if Tony had said them, polluting the thread and making Tai respond to nothing.
Fixed at the source: both the cloud and browser recognizers now strip any parenthetical/bracketed non-speech annotation before a transcript can become a turn. If nothing but annotations (or nothing at all) was heard, no turn is sent and Tai keeps listening. Real speech mixed with an annotation keeps only the speech.
TAI_AGENT_TOOLS untouched, stays off.
v0.517.0One brain, two surfaces — Ask Tai IS the counselor nowJul 8, 2026
Ask Tai answers with the exact /talk counselor engine — same system prompt, same Opus depth, same voice and warmth. The grounded data ladder still pulls the verified facts (real bills, court dates, calendar, documents — owner-scoped, never fabricated), but the counselor speaks them, thinking WITH you instead of reading a dashboard AT you.
UI cards, citations, and document links are unchanged — they ride along as enrichment on top of the conversational answer, not as the answer itself.
Canned refusals retired. When the data genuinely isn't there, Tai says so naturally mid-conversation — names the real fix (link the account, import the records) — and keeps talking. The stiff "I can't ground that in your data, so I won't guess" card survives only as a fail-safe when the model itself is unreachable.
No-fabrication is still deterministic, not a prompt promise: every composed answer passes the fact guard (every number/date/status must be traceable to the verified facts) and the provider-name guard; a tripped guard falls back to the verified grounded lines verbatim.
Crisis handling, owner-scoping/tenancy, and the TAI_ONE_BRAIN=0 kill switch are preserved. TAI_AGENT_TOOLS untouched, stays off.
v0.516.0The deep Cubs & Bears season engineJul 8, 2026
The Race: /sports now carries the full playoff picture — the NL Central ladder drawn as games-back bars, the league wild-card ladder with the in/out cutline, the six seeds as they stand today, and a derived what-it-takes read ("Hold the top wild card by 1.5 games") computed from the live standings feed, never guessed.
Up next, with context: the upcoming slate now shows how each opponent is actually playing — record, division spot, last ten, streak — plus the probable pitching matchup when it's posted. All live MLB standings/schedule data.
Roster & depth: the 40-man in collapsible groups with each player's real season line (ERA/record/K for arms, AVG/HR/RBI/OPS for bats), ordered by real playing time, with the injured list and ESPN beat notes woven in.
Momentum: live games (and finals) draw the game's real win-probability arc from MLB's own model — dots mark 8%+ swings — with the current Cubs win probability as the big number.
Tai's read (the desk column: pregame / postgame / daily) now sits on the main /sports board, not just The Desk.
Bears season engine on /sports/nfl: opener countdown (Week 1 at Carolina, Sep 13), the full published 2026 slate with venues and national TV, and the real roster in offense/defense/special-teams groups.
Everything is keyless public league feeds (MLB Stats API + ESPN) — real numbers or honestly absent, nothing invented. New flag TAI_SPORTS_ENGINE, default ON; set to 0 to revert to the previous boards instantly. TAI_AGENT_TOOLS untouched, stays off.
v0.515.2Hotfix — regular chat was refusing ordinary questionsJul 8, 2026
"What's my evening look like?" (and similar time-of-day phrasings) fell through every branch and got the generic "I can't ground that in your data" refusal, even though the calendar had the answer. Fixed: these now share the same whole-life DAY view as "what's my day look like" — the exact routing gap, not the fact guard.
The companion anti-fabrication guard (TAI_COMPANION_FACT_GUARD, shipped 0.515.0) now defaults OFF pending retuning, in case it's also over-firing on other conversational turns. The guard code and its eval harness are untouched — set TAI_COMPANION_FACT_GUARD=1 to opt back in.
TAI_AGENT_TOOLS untouched, stays off.
v0.515.1Home Flight Deck — a calmer, less crowded topJul 8, 2026
The home screen (Ask Tai) was stacking four scannable rows into its top third — clock, the today glance strip, the status chips, and a full row of quick-log tiles. It read as crowded, and the oversized clock overlapped the top-right controls.
The four quick-log tiles (Log BM, Log symptom, Mark bill paid, Add task) now tuck behind one compact "Quick log" pill. Tap it and the same tiles expand inline — nothing was removed and every action is still one tap away; the default view is just calmer.
The clock is right-sized so it no longer collides with the sound / converse / customize controls, and the knight leads the screen as the clear focal point.
Fixed a layout bug where the one-time gesture hint overlapped the quick-log row.
Purely a density and hierarchy pass — no feature changes, fully reversible. TAI_AGENT_TOOLS untouched, stays off.
v0.515.0Never invents a fact — anti-fabrication guard on every conversationJul 8, 2026
The conversational brain — /talk and regular chat's conversational turns (they're the same engine) — now has a deterministic anti-fabrication backstop, not just a prompt instruction. If a reply asserts a sensitive fact the grounded data doesn't actually contain — a dollar amount, a court or appointment date, a medication, a paid/approved/denied status — that sentence is dropped and Tai says plainly that it doesn't have the detail, instead of guessing.
A phantom provider name (the old "Matt Holdstein" class of error — a person who doesn't exist) voids the entire reply, never just one sentence.
Harmless conversational numbers ("try a 20-minute walk") pass untouched — the guard only examines sentences about money, legal, medical, and scheduling subjects, so the counselor stays warm.
Grounded data answers already had this protection (the re-voicer's fact guard + provider guard); this closes the last unguarded surface. One seam covers every caller: /talk, the Ask Tai thread, and the voice loop.
New end-to-end fabrication eval harness (lib/antifab): feeds the REAL companion and re-voicer pipelines a deliberately fabricating model and proves the invention never reaches the screen — so a future refactor that unwires any guard fails CI, not Tony.
Every section that used to be one outlet with a silent fallback (only tried a second source if the first came back thin) now blends multiple real sources concurrently: AI & LLM adds a Google News AI search alongside Hacker News; Technology now blends Ars Technica + TechCrunch + The Verge; Movies & TV blends Variety + Hollywood Reporter + IndieWire; Local/Chicago actually wires in NBC Chicago (previously documented but never fetched); Heavy Metal and Food & New Restaurants now genuinely combine both their sources instead of falling back.
New merge engine (lib/feed/sourceMerge.ts): dedupes the same story across outlets by link and by near-duplicate headline, then ranks everything by a recency-decay freshness score so the newest item leads regardless of which source it came from.
New personalization layer beyond the existing save/mute fetch-limit tuning: cards now surface a specific "Because you liked stories about X" note (with a sparkle icon) when an item matches a keyword pulled from headlines you've saved or asked for more of — not just a generic per-section blurb.
Section headers show "N sources" so the multi-source blend is visible, not just structural. Cards got a freshness badge ("New" for items under 3 hours old) and a nicer hover state.
Your 9 interests are unchanged: AI & LLM, Technology, Movies & TV, Food & New Restaurants, Local/Chicago, Martial Arts, Concerts, Heavy Metal, Cubs & Bears — this is a curation and sourcing upgrade, not a reset. Section identity (label/emoji/gradient) now lives in one place (lib/feed/topics.ts) instead of four hand-copied lists.
Concerts (Ticketmaster, key-gated) and Sports (live Cubs/Bears score adapters) are unchanged — no free second source exists for either. Agentic tools untouched, TAI_AGENT_TOOLS stays off.
v0.513.0Copy, retry, and edit in every conversationJul 7, 2026
Every reply now carries a quiet action strip: copy the reply, retry the question, or pull your last message back into the box to revise and re-send — on the Ask Tai thread, /talk, and /brain alike.
Same look, same order, same behavior on every chat surface — one conversation system, not three.
Agentic action tools untouched, still off.
v0.512.0Talk hands-free, everywhereJul 7, 2026
/talk now has the same hands-free conversation the Ask Tai screen has: tap Converse once and just talk — Tai listens, answers out loud, and opens the mic again, with clean turn-taking and instant barge-in when you start speaking.
Every reply in /talk and every answer in /brain has a Listen button — read-aloud on demand, not just live auto-speak.
/brain gains a dictation mic: speak your question instead of typing it.
No new voice engines — this is the shipped, hardened voice stack (premium voice when keyed, honest on-device fallback) orchestrated onto more screens. Crisis support untouched.
v0.511.0Conversation history — every chat, one tap awayJul 7, 2026
Every conversation is now saved: Ask Tai on the presence screen, the home ask sheet, the /brain console, and /talk all persist their transcripts server-side — nothing is lost when you navigate away or reload.
A floating History button on every screen opens the scrollback drawer: browse past conversations grouped by day, search across everything you've ever discussed, and tap any one to reopen and continue right where it left off — on the screen it started on.
Talk sessions keep their own switch: turning TAI_TALK_HISTORY off returns /talk to remembering only a gentle recap, exactly as before.
Agentic action tools untouched, still off.
v0.510.1Ask Tai and Talk, always on our strongest modelJul 7, 2026
General-knowledge answers and casual conversation now always run on Claude Opus, matching /talk and matching MAI and TOMAI — no lighter model steps in for a normal question.
Live voice replies keep the fast, low-latency model so spoken conversation still feels instant.
v0.510.0Shared channel: edit/unsend your own messages + Maria decodesJul 7, 2026
Migration 0120 adds sender-scoped edit and unsend to the shared comms channel: update/delete on messages, attachments, and uploads is allowed strictly for your OWN rows. TOMAI already had this power server-side; the pure-RLS path (Maria's app, and Tony in Tai) now matches — without any app holding a service key.
The channel control codec now recognizes the 'maria' role, so her reactions and Bat Signals decode as controls instead of degrading to visible text (and no longer masquerade as unread real messages).
The Gold Signal overlay, alert pill, and Bat Cave pip now derive the sender's name from the thread's counterpart instead of hardcoding Tommy — copy stays exactly the same for Tommy, and reads 'Maria' when it's her.
v0.509.0Gambling picks join the shared design systemJul 7, 2026
The NFL and Cubs handicap pick cards (Practice bet / paper-bet cards on the gambling lab pages) moved off their own hand-rolled chrome onto the same shared Card component every other module uses — same content, same practice-bet actions, denser padding to match their row-list feel.
Agentic action tools untouched, still off.
v0.508.0Bears card joins the shared design systemJul 7, 2026
The Bears summary card on /sports moved off its own hand-rolled chrome onto the same shared Card component every other module uses — same premium lamp-lit look, same rounded corners, still a tap-through to the full board with the team-color accent strip on top.
Cubs' storylines card was already on the shared Card, so /sports now reads as one consistent surface instead of two different card styles.
Agentic action tools untouched, still off.
v0.507.0Card design-system primitive learns 3 new opt-in tricksJul 7, 2026
components/ui/Card.tsx (the one shared card used app-wide) gained three additive, backward-compatible props: href (the whole card becomes a tap target), padding (denser row layouts), and accent (a thin top color bar). Every one of the ~150 existing cards renders byte-for-byte the same — nothing passes the new props yet.
First step in migrating the handful of hand-rolled per-module cards (sports, gambling, ameritas stragglers) onto this one primitive instead of each reinventing the same rounded-card look. Batches follow in separate PRs.
/talk's chat now uses the same bubble chrome as /presence's conversation thread instead of its own flatter look — the one visible change from last release's internal-only extraction. Revertable with a one-line flip if it doesn't land well.
/talk's voice-output toggle is now the same AutoSpeakToggle component TaiConverse already uses, instead of a hand-rolled button — same on/off state and speak logic underneath, just a shared control face.
Crisis detection, the agentic action tools, and everything under /tai (the separate tool-calling agent surface) are untouched.
v0.505.0Polish pass — one shared bubble under Presence and TalkJul 7, 2026
Internal only, nothing to see: Presence's conversation thread and Talk's chat now share one MessageBubble/TypingIndicator component instead of two separately hand-rolled copies of the same idea. Every class and pixel is byte-for-byte what was already there — this just relocates the markup so the next visual pass has one place to change instead of two.
Crisis detection, the agentic action tools, and everything under /tai (the separate tool-calling agent surface) are untouched.
v0.504.0Smart Feed — T's Room now ranks itself around your actual dayJul 7, 2026
T's Room (/feed) is now brain-ranked: a live Cubs game, an overdue bill, tonight's reservation, or a packed calendar reorders the whole room in real time instead of the same static section list every visit.
Five system modules join the interest sections as first-class feed cards: Needs your attention (the same ranked items /today compiles), Your schedule (today + tomorrow's real calendar), Gameday (only on a real game day), Dining radar (reservations + reviews owed), and Weather — each self-hides when it has nothing real to show.
Every position is explainable by construction: a score exists only as the sum of named signals with human sentences, and the new 'Why this order' panel shows the full table — urgency, time of day, your saved feedback taps, content freshness.
Quiet modules drop into a compact 'Also in your room' rail instead of padding the page; sections whose source errored sink to the bottom but stay honestly visible; anything you've already handled on /today stays suppressed here too.
'Brief me' now reads the room in ranked order — most relevant first. Kill-switch: TAI_SMART_FEED=0 restores the prior static layout instantly. Agentic tools untouched, still off.
v0.503.0Polish pass — Household in the nav, one less dead fileJul 7, 2026
The Household module (projects, vendors, maintenance, home docs) had zero nav entries anywhere — reachable only by typing the URL or from /more's search grid. It's now a real desktop-nav item, labeled "Household" (not "Home") so it never gets confused with the separate Home V2 landing page.
Removed TaiBox.tsx, a leftover component from the pre-"one face" chat architecture with zero live call sites — TaiLauncher has routed into Presence instead since June. No behavior change; nothing referenced it.
First of a short polish series tightening nav consistency and trimming sprawl now that the Hypothesis Ledger, cross-domain intelligence, Fight Command, and the deepened counselor have all landed. Agentic action tools untouched, still off.
New /home-feed preview: a clean card system where modules can be added, removed, and reordered without touching the page — the grid, the priority ordering, and the render loop all walk one registry (lib/homeFeed/registry.ts).
Ships with four real, live-data modules: Your day (the same ranked bills/legal/calendar/task feed /today compiles), Dining (upcoming reservations + review-owed nudges), Sports (the existing self-hiding Cubs game-day card), and Interests (a preview pulled from T's Room). Every module self-hides on a day it has nothing to show — no empty cards.
Ordering comes from a pluggable priority provider (lib/homeFeed/priorityProvider.ts) — a single documented seam the separate feed-brain ranking effort can register into later with zero changes to this framework, the modules, or the page.
Responsive by construction: one column on phone, up to three on desktop, with a staggered card entrance matching /today's existing rise-in animation. No new colors or CSS — built entirely from the app's existing tokens and card chrome.
Gated by TAI_HOME_FEED_FRAMEWORK, OFF by default (reachable now via ?preview=1) — purely additive, /today is untouched until Tony flips it. Agentic tools untouched, still off.
v0.501.0Sports — real injury reports + post-game recap for Cubs and BearsJul 7, 2026
New injury report on both the Cubs and Bears boards: real, current statuses (Questionable, IL, IR, etc.) straight from ESPN's injuries feed, filtered to your team, with the real beat-reporter note and how recent the report is. Never a fabricated status — the card simply doesn't show when there's nothing real to report.
New post-game recap card after a real final: the headline score, the pitching decision (W/L/Sv) or top stat leaders, and the scoring-play arc — assembled entirely from real structured MLB/NFL feed data, never AI-written prose.
The injury feed is a heavy, multi-megabyte league-wide payload, so it now polls on its own slow 15-minute cycle instead of riding along on the fast live-score poll — keeps the live game view snappy on your phone's data.
Agentic tools untouched, still off.
v0.500.0Sports Desk — Cubs & Bears intelligence, not scores in a boxJul 7, 2026
New /sports/brain page — The Desk: where each of your teams actually STANDS. Cubs get the full season situation (record, division race with games back, wild-card hold, streak, last ten, run differential), the NL wild-card race table, the real injured list off the 40-man roster, the front-office transaction wire, and derived storylines a beat writer would lead with.
Bears get honest phase awareness — the offseason IS the story until it isn't: live countdown to the season opener, the preseason slate, the opening stretch of opponents, last season's finish, and real ESPN headlines. In-season, the published injury report and division race take over automatically.
Tai's takes: a written pregame setup, postgame digest, or daily desk read for each team — sharp Chicago-fan voice, bottom line first. Grounded strictly in the live feed facts (the model may only re-voice verified numbers, never invent a stat); when the model is unavailable, a plain-facts template take ships instead — never an empty or fabricated card.
Every storyline is deterministic arithmetic on real MLB Stats API + ESPN data — the storylines section renders instantly server-side and cannot hallucinate. New brain API at /api/sports/brain (pulse) and /api/sports/brain/take (takes), both edge-cached to keep league APIs and model spend polite.
Reachable from a new card at the top of /sports. Gated by TAI_SPORTS_DESK, ON by default — set to 0 in Vercel to switch the page, the card, and the APIs off instantly. Read-only, keyless public feeds, no PII. Agent tools untouched, still off.
v0.499.0Feels faster — real fixes to load, scroll, and update behaviorJul 7, 2026
T's Room (/feed): the "refreshes hourly" cache wasn't actually caching — force-dynamic (needed for the sign-in check) was silently overriding every source fetch's revalidate hint, so all 9 external feeds (Hacker News, Reddit, RSS, Ticketmaster) ran live on every visit. Now genuinely cached for an hour via a data-cache layer that isn't subject to that override.
Sports: /sports showed a "loading the Cubs feed…" blink on every tap — the board was 100% client-fetched. Now server-prefetches the same data /today already does for the front-door Cubs card, so the full board (score, schedule, standings, roster moves) renders on first paint.
Hero image on /feed was marked lazy-load despite always being above the fold, delaying the page's largest paint for no reason — now loads eagerly.
The update-check and version badge each independently polled /version.json on every app resume — consolidated into one shared, deduped check.
Capped /today's staggered entrance animation so a long page settles in ~200ms instead of scaling up toward half a second.
Fixed the version badge showing a raw "nosha" instead of "—" when a build fails to stamp a real SHA (Settings already did this correctly; now both agree).
v0.498.0Interface polish pass — motion and chrome on the home feedJul 7, 2026
Fixed a real overflow bug: a long panel header (e.g. "Bills due — 2 need attention") could shove its "View all" link off the edge of the 320px desktop sidebar. Long labels now truncate gracefully with an ellipsis instead of clipping raw.
The desktop Bills card was the one sidebar card popping in with no entrance animation while every sibling card (Court, Nudges, Schedule) rose in with a stagger — it now matches.
Added a quiet hover lift + brass-glow ring and a settle-on-press to every premium card surface (.q-panel, .q-card — used across ~130 files app-wide) for pointer users; touch devices are untouched since taps have no hover phase. Respects prefers-reduced-motion.
Fixed a latent CSS landmine in a doc comment that could break the build under stricter parsing.
Visual/cosmetic only — no data, auth, or agentic-tool changes. TAI_AGENT_TOOLS stays off.
v0.497.1Mobile hardening — fixed a tap-stealing overlap on Ask TaiJul 7, 2026
The always-on version chip (bottom-left) was overlapping the "Hold to talk" button / no-mic hint on the Ask Tai screen on phones — its higher layer meant taps on the left portion of that control could silently open Version history instead. The console now sits with clear headroom above the chip.
Removed a second, redundant version readout that duplicated the version chip in the middle of the same screen (dead code from before the chip existed) — it read as a rendering glitch, not real content.
No functional or data changes — SW update flow, install banners, and footer version reporting were already solid and are unchanged.
v0.497.0Case Strategist — your active legal matters, prepped for your lawyersJul 7, 2026
New /strategist page (owner-only): a deep prep dossier for each active matter — the Ameritas LTD claim, the Unum LTD appeal, the SSDI decision watch, and the DuPage debt cases.
Each dossier lays out the strongest arguments with the evidence already on file, what's missing or weak (and what would close it), the full timeline with live deadline countdowns, the likely paths from here, and a numbered list of specific things to raise with each attorney.
Framed as preparation, not counsel: a non-removable banner states this is informational prep for conversations with your attorneys — not legal advice and not a substitute for them. Every dossier carries its source files and an honest as-of date; the DuPage section adds a live court-spine docket read with true observed-at stamps.
Read-only by construction: the page only reads. No actions, no drafts, no sends, no writes — the agent gateway and TAI_AGENT_TOOLS are untouched and stay off.
Reachable from a new card on /legal. Gated by TAI_CASE_STRATEGIST, ON by default — set to 0 in Vercel to switch the page and the /legal card off instantly.
Every ElevenLabs voice surface (Ask, Converse, Talk) speaks an answer one sentence at a time so first-audio lands fast — but each sentence used to be synthesized cold, with no idea a prior or following sentence existed, so pitch and pacing reset at every chunk boundary. Longer answers now carry the neighboring sentences' text (not audio) into each synthesis call as ElevenLabs' previous_text/next_text, so delivery reads as one continuous voice instead of stitched-together clips — same latency, smoother read.
Applies uniformly across the app, including the Talk counselor surface — no separate change was needed since all three surfaces already share the one TTS chokepoint (lib/voice/ttsService.ts).
Turn-taking audit: Converse's hands-free mic hand-off is event-driven (re-opens the instant Tai's audio actually finishes playing, not a fixed poll) and was already solid. Home Presence and Talk still wait for the full model answer before speaking — no SSE streaming there yet, unlike Converse's TaiBox path — noted as a larger follow-on, not touched this pass.
Also checked and left alone: Talk currently uses whichever cloud voice is active app-wide (no persona-specific "counselor" voice exists) — flag it if you want one locked to Talk regardless of your general pick.
Agentic tools untouched, still off.
v0.495.0Daily Brief — a clean, read-only executive summary of your dayJul 7, 2026
New /brief page: a same-day summary pulled ONLY from real Tai data — legal court dates and disability-claim deadlines due today (or overdue), today's GI/symptom log, bills due today (or overdue), and today's medical/therapy appointments.
"The one thing to know": a single computed headline picks the most urgent item across all four areas so you don't have to scan every section — ranked overdue-legal/overdue-bills first, then today's court/claim deadlines, then bills due today, then appointments. Reads "Nothing pressing today" on a genuinely clear day.
Surfaces and summarizes ONLY — no agentic tools, no drafts, no confirm/approve actions, and no writes of any kind (not even a cache table). It recomputes fresh every time you open it, the same way /today's cards do.
Distinct from two existing pieces it might get confused with: the compact Daily Flow card on /today (cron-cached, no health domain) and Weekly Recap at /recap (a week-window digest, not same-day).
Gated by TAI_DAILY_BRIEF_LIVE, off by default — set to 1 in Vercel to activate. Reachable from More once on.
v0.494.0Counselor case brain — she follows your whole case over timeJul 7, 2026
The Talk counselor now carries your case the way a clinician who has followed it for years would — not just what's on the chart, but how it's moving: your problem list with how long each condition has been documented, your medication timeline including recent documented changes, and per-test lab trends (only for tests that genuinely repeat — never a trend invented from a single value).
Your GI course rides in from your own symptom logs: the last 14 days vs the prior 14 vs the 90-day baseline — episodes, Bristol, severity, blood days, hours lost — plus TruLance adherence context. Ask how you've really been doing and the answer comes with dates and direction, not vibes.
Cross-domain patterns that cleared the Hypothesis Ledger's evidence bar fold in read-only, always framed as correlations in your own logged data to test — never causes, never diagnoses.
A 'worth raising with your doctors' layer: when a real signal is in the data (blood logged recently, a flagged lab also trending the wrong way across repeats, GI severity climbing vs the prior two weeks), she'll name it plainly and specifically — which number, which trend, which doctor — as something to bring to your real care team.
Read-only and informational by construction: it only reads, takes no action (agentic tools untouched and still off), states no new diagnosis, makes no medication calls, and crisis handling is unchanged. Flag TAI_COUNSELOR_CASE_BRAIN — on by default, set to 0 to switch the longitudinal view off instantly.
v0.493.0Fight Command — Tai as the command brain for your active fightsJul 7, 2026
Next-Move Command Deck: for each active fight (Ameritas, Unum, SSDI, DuPage debt) Tai now derives the single next move, its due date, owner (you / your attorney / waiting), and why — every element traced to a real field in the war room. Surfaces on /legal and /today.
Push alerts for the Ameritas Jul-10 deadline now carry the next-move hint at the 3/1/0-day milestones so the lock-screen notification tells you exactly what to do, not just the countdown.
Attorney reply drafting: a new 'attorney-reply' draft kind lets you generate a status-update email to Matt Maloney (DeBofsky/LTD) or Stacy Bardo (Atlas/debt), grounded in your real record and routed through the gateway for one-tap Gmail draft queuing.
Evidence packet assembler: GET /api/fights/packet/[matterKey] renders a PDF provenance index listing every document on file plus explicit GAP lines for expected-but-missing records. Severity scores included when present.
Fight insights engine: qualitative evidence bar for three Ameritas insights — severity documentation, bill-deadline collision, and library doc coverage. Below threshold shows as a gap, never a claim. All four P-blocks gated by TAI_FIGHT_COMMAND_P1/P2/P3/P4 (default on).
v0.492.0Hypothesis Ledger v2 — the engine learns what chance looks likeJul 7, 2026
The Hypothesis Ledger's evidence bar now includes a real null model: every pattern's match rate is compared against what pure chance would produce given how often you actually flare. A 90% match rate that chance would produce anyway can no longer read as a confirmed pattern — graduation now requires clearly beating the chance baseline (lift) AND a run strong enough that chance alone is unlikely to explain it.
Two new hypotheses on the watch-list: GI flares vs. court dates (the anticipatory few days before an appearance, drawn from your calendar + tracked legal deadlines) and GI flares vs. heavy calendar days (3+ commitments).
Each hypothesis now shows its timing: whether flares mostly land BEFORE the trigger (the lead-up being the hard part), after, or the same day — characterized only from 3+ matches, never less.
Every hypothesis carries a plain-language reading of its own numbers — what matched, what chance predicted, and the timing — always framed as a correlation in your own logged data, never a diagnosis or causal claim.
A second honest NO: with twice the data floor, matches that occur no more often than chance are marked 'not holding up' instead of being watched forever.
Strictly read-only observation — this analyzes rows you already have; it takes no actions. Migration 0119 (constraint widening only). Same flag: TAI_HYPOTHESIS_LEDGER.
v0.491.0Cross-person isolation — now enforced, not just testedJul 7, 2026
The privacy wall between Tony's, Tommy's, and Maria's data is now live in Tai's real memory paths — not just a set of passing tests. Every durable-memory read and write (recall, the forever-memory recall, fact save/void, and the cross-domain shared-brain lookup) checks the owner before it touches storage.
If a path ever tried to read or write another person's records, it now fails loudly with a tenant-isolation error instead of quietly returning or saving the wrong person's data. Regular signed-in use is unchanged — this only fences the behind-the-scenes service paths that bypass row-level security.
Ships behind a flag (TAI_TENANCY_GUARD, default ON; set to 0 to instantly revert). New regression tests fail the build if any memory path is ever changed to skip the check.
v0.490.0Agentic Tai — one-tap-approve actions on the Action GatewayJul 7, 2026
Tai can now propose 4 actions you tap once to approve: draft a verified-attorney reply (Gmail compose link, never auto-sends), pre-fill a GI symptom-log entry, propose a calendar move, or assemble a named evidence packet.
All 4 are T2_SENSITIVE — propose-only. A ConfirmActionCard shows the exact facts inline in chat; nothing executes until you tap Confirm (argsHash-bound). Decline is always a first-class option.
Gated by TAI_AGENT_TOOLS=t2 (set in Vercel to activate; =t0 kills it instantly). TAI_ACTIONS_AGENTIC baked on so tools are visible to the model.
13 new unit + red-team tests covering round-trip, grounding, drift, and undo-contract.
v0.489.0Hypothesis Ledger — patterns made honestJul 7, 2026
New /hypotheses watch-list: Tai now tracks 3 candidate patterns across your real data — GI flares against legal deadlines, bill due dates, and therapy sessions — as hypotheses with a real evidence bar, not guesses.
A pattern only shows up as confirmed once the data actually clears the bar (enough observations, a real match rate, enough time observed). Below that bar it just sits on the watch-list, never surfaced as a claim.
If a pattern gets tested and doesn't hold up, it says so plainly — an honest no, not silence. Each evidence item links to its real source row.
New migration 0118 (tai_hypotheses + tai_hypothesis_status_events). Off by default (TAI_HYPOTHESIS_LEDGER) — apply migration, then set flag to activate.
v0.488.0Counselor goes clinical-grade on your real chartJul 7, 2026
Talk's counselor now carries exam-depth medical reasoning on your actual documented GI picture — chronic gastritis, hiatal hernia, hyperplastic gastric polyps, the pancreatic rest from your EUS, and your adhesions/obstruction history — plus mechanism-level fluency on the meds you're actually on and clinician-style reading of your labs (value, flag, and trend; labs in the chart summary now carry their own dates).
Less reflexive hedging: established medicine is stated plainly, with caveats only where the evidence is genuinely uncertain.
The hard lines are unchanged: no new diagnoses, no start/stop/dose calls (that stays with Dr. Kaplan, Dr. Kular, and Julianne), crisis safety net untouched, and a plain 'call your doctor / 911' on true emergencies.
v0.487.1Bug fix: 12 Vercel cron jobs now fire correctlyJul 7, 2026
12 scheduled cron routes (push-alerts, gcal-sync, court-check, proactive-refresh, personalization-refresh, event-hub-watcher, collision-radar, legal-deadline-engine, legal-deadline-watch, daily-flow, detect-cancellations, dining-intel) were only handling POST — Vercel's scheduler fires GET, so they silently 405'd and never ran. All 12 now export GET alongside POST.
Regression test added: every cron path in vercel.json is asserted to export a GET handler, so this class of bug is caught at CI time going forward.
v0.487.0Proactive Tai — Tai reaches out firstJul 6, 2026
When something genuinely urgent comes up — an overdue bill, a court date tomorrow, a deadline due today — Tai now buzzes your phone with ONE push about the single most important thing, instead of one ping per item.
Same restraint as the /today heads-up card: quiet hours are honored, and a repeat about the same thing waits out its cooldown so you don't get re-nagged.
Ships dark behind a flag (TAI_PROACTIVE_REACHOUT, default off) — with it off, push behaves exactly as it does today.
Added 11 adversarial tenancy isolation tests to Tai's own test suite (lib/_core/tenancy.test.ts): tony-store refuses tommy/maria-stamped records, list() throws on foreign-key leakage under a prefix, assertSameTenant blocks realistic tai→tomai/tai→mai handoffs with minor-flag verification.
Confirmed tenancy is test-only scaffolding — createTenantScopedStore / assertSameTenant are not yet wired into any live Supabase-backed data path in Tai; isolation is structural in the core library.
All gates green: typecheck, build, and full 4039-test suite pass.
v0.485.0One brain, shared foundation — Tai's engine now powers all three appsJul 6, 2026
The machinery behind Tai's conversation, memory, live web knowledge, draft-then-approve actions, proactive radar, and voice is now a shared core that TOMAI (Tommy) and MAI (Maria) inherit with their own personas — Tai stays your counselor-grade assistant; nothing about how Tai talks to you changes.
Hard privacy line, enforced in code: the apps share the engine, never the data. Tony's, Tommy's, and Maria's records are structurally sealed from each other — a cross-person read fails loudly instead of leaking, and that's covered by dedicated leak tests.
Everything ships dark behind a flag (TAI_SHARED_CORE_PERSONA, default off). With it on, Tai's voice prompt is byte-for-byte identical — there's a test that locks that.
Confirmed and live: your sworn statement is signed (7/6/2026), and Tara Zeno's statement reads you two have been together since August 2022, about four years — only her signature line is left. Nothing else changed.
Fresh production deploy so your phone/PWA pulls the current version. If it still looks old, force-quit Tai and reopen, make sure you're signed in, or use Settings → Force refresh.
v0.483.0War Room — make sure the finals show on your phoneJul 6, 2026
Fresh deploy of the War Room so your phone/PWA pulls the current version — the five final documents in order: sworn statement, Nancy, Tara, EGD report, text-message evidence.
Added a short note under the documents header telling you how to force a refresh on mobile if the list ever looks out of date.
No document changed from the last version — Tara still reads August 2022 / about four years, only her signature left. If the phone still looks stale, force-quit Tai and reopen, or Settings → Force refresh.
v0.482.0Talk — deeper medical expertise, less hedgingJul 6, 2026
The counselor in /talk (and Ask Tai's same conversational brain) now brings real medical fluency to what's on your chart — explains what a documented condition or medication generally does, and talks through a lab result factually — instead of reflexively saying "I'm not a doctor."
Two hard lines stay exactly where they were: it will never tell you that you have a NEW condition that isn't already on your chart, and it will never tell you to start, stop, or change a medication or its dose — that's always your real doctor's call. It'll say so plainly, once, for something that actually reads as an emergency (chest pain, real trouble breathing, stroke signs, severe bleeding, a bad allergic reaction) — then drop it and stay with you, instead of a blanket "ask your doctor" on ordinary questions.
/talk itself now carries your real documented conditions, meds, and labs the same way regular chat already did — it was the one counselor surface that hadn't been grounded in your chart yet.
Same safety net underneath, untouched: crisis detection and the 988/911 resources, no claim of being a licensed clinician, no diagnosis of a new mental-health condition either.
v0.481.0War Room — new order and Tara's dates filled inJul 6, 2026
Reordered the five documents: sworn statement, Nancy, Tara, EGD Report & Pathology, then the text-message evidence.
Filled in Tara's statement: it now reads that you two have been together since August 2022, about four years — and her downloadable PDF was regenerated to match.
The Desktop "Ameritas — Final Documents" folder was updated with the new Tara PDF too.
Still owner-only, still just the final five. If they weren't showing on your phone before, force-quit and reopen Tai to pull this fresh version.
v0.480.0War Room — the exact final PDFs, wired inJul 6, 2026
The five War Room documents now download as your EXACT final files: your SIGNED sworn statement, Nancy's statement, Tara Zeno's personalized statement, Matt's reviewed 105-page text-message PDF, and the EGD packet.
Tap Download PDF (or Print) on any of them and you get the real file byte-for-byte — the one your attorney prepared — not a rebuilt copy. "View full statement" still shows the text inline.
A matching "Ameritas — Final Documents" folder with these same five files (numbered 1–5) is on your Desktop.
Still owner-only; older drafts and versions remain off the screen.
v0.479.0War Room — only the final documents, drafts cleared outJul 6, 2026
Your Ameritas War Room now shows only the current FINAL set, in order: your sworn statement, Nancy's statement, Tara's statement, the text-message evidence, and the EGD packet — so there's no risk of grabbing a stale draft.
The three statements are the complete, up-to-date text with a signature block ready to print and sign (Tara's is her real account — just one blank and a signature left).
The text-message evidence is now Matt's own reviewed final PDF (the version where he removed the work-product notes and the statement drafts). The older auto-generated report and the whole "evidence library" of past versions are no longer shown.
Nothing was deleted behind the scenes — the older files still exist; they're just off the War Room screen. Still owner-only.
v0.478.0War Room — two more documents added (nothing removed)Jul 6, 2026
Your Ameritas War Room now shows the EGD Report & Pathology packet (Northwest Endo, 6/19/2026) as its own document — the scope images, the findings letter, and the pathology report Ameritas and Matt asked for. View full and Download PDF open the real file (images intact) straight from your Library.
Tara's witness statement is here too, as a DRAFT — a corroborating declaration that mirrors Nancy's, with the spots for Tara's own details highlighted and the signature line still open. Print or download it as a .docx to fill in and sign.
Everything that was already there is untouched: your sworn statement, Nancy's statement, the text-message evidence report, and the full report library — nothing was archived, replaced, or removed. Still owner-only.
v0.477.0HealthEx connect corrected — the Share Link isn't a downloadJul 6, 2026
HealthEx doesn't offer a downloadable FHIR export from its app — its Share Link (Sharing → Shared Links → Copy link) only grants 30 days of view access, meant for a person or portal to open, not something Tai can safely fetch on its own. The Connect through HealthEx card now says so plainly instead of pointing you at an Export/Download button that doesn't exist.
The real path: connect HealthEx as a connector directly in Claude (Settings → Connectors), a real one-time sign-in separate from the Share Link, then have Claude save your FHIR record as a .json file and upload that here — same honest mappers, same owner-scoped clinical-record store as before.
Your HealthEx Share Link is sensitive — it hands 30 days of read access to ALL your records to whoever holds it. Tai will never ask you to paste it, and you shouldn't paste it anywhere.
No changes to what's already imported, to privacy, or to the no-diagnosis/crisis rails — this is a correction to the connect instructions only.
v0.476.0Tai now knows your real medical chart — as background, never as a diagnosisJul 6, 2026
The counselor no longer starts blind about your health. A compact summary of your OWN connected medical records — your documented conditions, the medications on your chart, and a few recent labs — is now folded into the same background she already carries about your people and your care team. When you bring up your GI illness, a medication, or how you're feeling physically, she already understands the backdrop instead of making you re-explain it.
It's strictly informational grounding. She uses it only to understand you — she never diagnoses, never interprets a lab value, never suggests starting or stopping a medication, and always points clinical questions back to your real doctors and to Julianne. The no-diagnosis rule and the crisis safety net are unchanged.
New: Connect through HealthEx. Export your unified chart from HealthEx (app.healthex.io) as a FHIR file and upload it — Tai reads your real conditions, meds, labs, allergies, immunizations and more into the same private, records-only store your Apple Health and MyChart imports already use.
Privacy is absolute: this clinical data is owner-locked to you (row-level security + an owner-only gate), never sent to any analytics, ad, or third-party service, and used only by the model for your own conversations. Reversible: it can be turned off instantly and the counselor behaves exactly as before.
v0.475.0Voice quality upgrade — smoother, and a deeper, sultrier default voiceJul 6, 2026
The premium voice sounded a bit choppy. Two causes, both fixed: the TTS model is now ElevenLabs' highest-quality eleven_multilingual_v2 (up from the turbo-tuned eleven_flash_v2_5), and a latency-optimization flag that was quietly trading away audio quality — for a speed benefit this route never actually used — is gone.
The default voice is now deeper and sultrier: 'Midnight,' a low, husky ElevenLabs female voice, replaces 'Dark Knight' as the default. Dark Knight and the other deep voices are still there in the picker if you want them back.
Chunk-to-chunk playback no longer has an audible seam between sentences — the next chunk's audio now buffers on a second audio element while the current one is still playing, instead of swapping the same element's source cold at every boundary.
Swap voices anytime with zero code changes: set ELEVENLABS_VOICE_ID to any ElevenLabs voice ID, or pick one in /settings/voice.
Voice input (speech-to-text) is untouched.
v0.474.0Ask Tai goes deep when it's heavy — not just when you say the magic wordsJul 6, 2026
When you bring something heavy to regular Ask Tai — 'I'm scared about the SSDI hearing,' 'the Ameritas denial is crushing me' — it now meets you the way the Talk screen does, instead of firing back a dry facts card. Before, naming a legal or medical word quietly shunted the message to the data lookup, which is built to state facts and NOT to feel with you. Now the emotional weight is read first, and a message that carries it reaches the same deep counselor.
A plain lookup still stays fast and factual. 'What's my court date,' 'how much is the Citi bill,' 'when is the Ameritas hearing' carry no emotional marker, so they answer straight from your records with no therapy detour — you get the fact, not a feeling.
On that deeper path Ask Tai now carries the same backdrop Talk does: your next session with Julianne, what you've talked through recently, and what's coming up on your calendar — so it already knows the shape of your week when you bring something up.
Only routing and context changed. The crisis-support safety net, the never-diagnose line, and the 'complements Julianne, never replaces her' stance are exactly as they were. Revertible instantly if needed (TAI_ASK_EMOTIONAL_ROUTING=0).
v0.473.0Talk counselor now understands ADHD — as an expert, not a diagnoserJul 5, 2026
The Talk counselor now carries a real, evidence-based understanding of adult ADHD, woven into the same person you already talk to — not a separate mode. It recognizes executive-function patterns in what you describe: task initiation stalls, time blindness, working-memory overload, overwhelm tipping into paralysis, hyperfocus, rejection-sensitivity — and reframes them through that lens instead of a 'you're just lazy / scattered' one.
It grounds the support in your actual load. When three DuPage filings are stacked and none will start, it can name that as task initiation under load — not a character flaw — and offer strategy that genuinely helps ADHD brains: externalize the task, shrink it until starting is easy, body-doubling, time-anchoring, picking the one next action when it's all too much.
Same hard safety lines: it offers expert ADHD support and strategy but never tells you that you 'have ADHD' — a clinical diagnosis stays with Julianne and your care team. It still never diagnoses any condition, never touches medication, always complements your care team, and the crisis-support safety net is byte-for-byte unchanged.
v0.472.0Talk goes deeper — and can look things up now, tooJul 5, 2026
The Talk counselor screen can now answer real-world questions instead of dodging them. Ask 'how are the Cubs doing this season?' in Talk and it pulls the actual record and standing — same live-knowledge ability regular chat already had, same 'cite it, never make it up' rule.
It listens deeper. On top of the CBT/ACT/motivational styles it already used, it now reads patterns the way an insight-oriented therapist would — noticing recurring themes, how you handle support under stress, the parts of you pulling in different directions, and real connections in your own history (a rough stretch landing right before a hearing or deadline). Insight, not just 'that sounds hard.'
It stops interrupting itself. No more reflexive 'I'm not a therapist / you should talk to a professional' mid-conversation — it stays with you and goes deep. The quiet 'I work alongside Julianne, never in place of her' note stays, once, where it belongs.
Unchanged and non-negotiable: it never diagnoses you with a condition, never touches medication or treatment, always complements Julianne and your care team, and the crisis-support safety net is exactly as it was.
v0.471.1Fix: 'how are the Cubs doing this season?' now gets the real record — no more dodgeJul 5, 2026
Live knowledge shipped in 0.471.0, but a natural question like 'how are the Cubs doing this season?' still dodged — Tai answered from old memory and said 'check MLB.com.' The reason: that phrasing slipped past every path that actually reaches for live info, and fell into the general-knowledge tier that has no live feed.
Now any current, real-world question routes to the live brain first: Cubs questions pull the real MLB record and standing, and other current questions ('how are the Bears doing this year', 'what's the latest on X') reach the live web path instead of guessing from memory.
When Tai has the live data in hand, it answers straight from it and cites the source — it will no longer tell you it 'doesn't have live standings' or send you to another site for something it just looked up.
Unchanged: greetings and personal questions never trigger a lookup, nothing is ever invented, health stays informational, and the Talk counselor screen is byte-for-byte the same.
v0.471.0Live knowledge: Tai can now answer ANY question — your life OR the whole worldJul 5, 2026
Ask Tai anything and it can actually answer now — not just your bills, court dates, and calendar, but the wider world too: how the Cubs are doing this week, the latest news, a current price, a general 'what is / who is' fact. Before, a question outside your own records got an honest 'I'd be making it up'; now Tai reaches out, finds a real source, and answers from it.
It's the SAME Tai — the warm one-brain that already knows your life. Only now, when a question needs current or general-world info, it quietly looks it up first and answers in its own voice, citing where the info came from.
The Cubs get a real feed: Cubs questions pull live from the official MLB stats — record, recent games, what's next — so 'how are the Cubs doing?' gets a straight, real answer.
Still never makes things up: every outside fact is retrieved and cited, never invented. Health questions stay informational and point you back to your care team — never a diagnosis. If it can't reach a source, it tells you plainly instead of guessing.
Cost-aware and reversible: it only reaches out when a question actually needs the outside world (a 'hey how's it going' never does), and it's all behind a flag (TAI_LIVE_KNOWLEDGE, default on) that instantly restores the old behavior. The Talk counselor screen is completely unchanged.
v0.470.0Conversation mode: Ask Tai is a real back-and-forth thread, not a one-shot cardJul 5, 2026
The main Ask Tai screen now holds a real conversation: your message and Tai's reply STACK as a scrollable thread — ask, it answers, you reply, it goes deeper — instead of one card that wiped out the last answer. It's the same turn-taking feel as the Talk counselor, right on your home deck.
Tai stays with the thread: it remembers what you just said across turns and follows the conversation instead of treating every message as a brand-new question.
Fixed the reply getting hidden behind the quick-action chips — the conversation text now sits clear above them and is always fully readable and scrollable.
Added a one-tap 'Counselor' button inside the conversation so you can slide into the deeper Talk space the moment it gets heavy — plus the always-visible 'Talk' entry already in the nav.
All behind a flag (TAI_ASK_THREAD, default on), instantly reversible to the old single-card view; the Talk screen and the answer engine are unchanged.
v0.469.0One brain: regular chat IS the Talk counselor — same person, all capabilitiesJul 5, 2026
Regular Tai chat is now the SAME person you talk to on Talk — same warmth, same depth, same knowledge of your life — on every turn, not a lighter bot for anything that isn't a data question.
It still pulls your real facts (your next court date, a bill, an appointment) — but now answers them in that same warm, life-aware voice instead of a colder 'data mode'. One person who both talks with you and reaches for a real fact when you need one.
Never invents anything: real data comes from your records, and if a fact isn't there it says so plainly, in voice.
Added a visible 'Talk' entry in the nav (bottom bar + desktop rail) so the counselor screen is finally one tap away.
Costs stay in check invisibly — a genuine conversation uses the top model, a one-word lookup can use a cheaper one — but you can never tell the difference; it's always the same Tai. All behind flags (default on), instantly reversible, and the Talk screen itself is completely unchanged.
v0.468.0Forever-memory: one persistent memory Tai carries across chat and TalkJul 5, 2026
Tai now has ONE lasting memory shared across regular chat and Talk — tell it something once (who your disability attorney is, a preference) and it's remembered, and surfaces later without you having to repeat yourself.
Recall works by meaning, not just matching words: "who's my disability attorney?" finds the fact even if you stored it in different words, blending closeness-in-meaning with how important and how recent the fact is.
Strict privacy boundary: your memory is walled off inside the database itself — it can never reach anyone else's app. Nothing is invented; every remembered fact came from something you actually said.
Kept cheap and reversible: a small capped set of facts is pulled per turn, the lookup is cached, and it all runs behind a flag (default on) you can flip off instantly.
v0.467.0Regular chat gets Talk-grade warmth: replies breathe, remember the thread, and know your lifeJul 5, 2026
Lifted the 200-token cap on casual/personal chat replies so a real thought isn't cut off mid-sentence — it's a ceiling, not a target, so a quick "how's it going" still gets a quick answer.
Chat now carries real conversation history (multi-turn) instead of forgetting every message — and rides prompt caching so the added context stays cheap.
Casual and personal turns now know the shape of your life the way Talk does — your care team, what's weighing on you, your anchors — instead of being fenced off from it (which is what made regular chat feel pleasant but empty). Still fact-fenced: no invented balances, dates, or case details, and it never dumps your data at you unprompted.
A conversational message is no longer flattened into an "N documents found" card; genuine bills/legal/health/etc. questions still ground on your real data.
All behind a flag (default on) so it's instantly reversible; the deeper Talk surface and cost posture (Opus only for deep turns) are unchanged.
v0.466.0Talk gets deeper: real therapeutic technique, voice, a calm presence, and cross-session insightJul 5, 2026
The Talk companion (a private space to talk things through, complementing Julianne Pedi LCSW — never replacing her) now draws explicitly on evidence-based technique: cognitive reframing, values + defusion, motivational interviewing, Socratic questioning, and optional structured journaling — offered lightly, never as a worksheet.
Strengthened the guardrail against amplifying rumination or self-criticism: reflection now pairs with gentle forward motion (a thread, a reframe, a next step) instead of only mirroring a feeling back, and a several-turn darkening pattern is gently named rather than followed deeper.
Wired real voice: spoken replies through the existing TTS chokepoint (an opt-in toggle), and voice input through the existing STT chokepoint — text-only until a speech key is configured, never a dead mic.
Added a calm embodied presence (the same one Tai identity, no new face) synced to listening / thinking / speaking, and a gentle cross-session line when a theme has genuinely recurred ("you've mentioned X in a few of our recent talks") — never a diagnosis, only his own words.
Talk is now one tap from the More hub instead of only a deep link from Health — same private, owner-only surface.
v0.465.0Fix: "What's in my room" was never reaching T's Room data at all — wrong route, not a timeoutJul 5, 2026
Real root cause (0.464.0's fix targeted the wrong path): the Presence/Home ask-card surfaces post to /api/ask, not /api/tai/converse — so `ts_room_lookup` (the tool 0.464.0 patched) was never being called for this question in the first place. /api/ask had no T's Room handler at all.
Worse, /api/ask's document-content detector (`detectContentIntent`) reads "what's in my room" as a document question — the same "what's in my ___" pattern as "what's in my personal statement" — so the query was silently misrouted into an irrelevant document search instead of an honest gap.
Fix: /api/ask now has a real T's Room handler, checked before the document-content branch, reusing the same feed assembler + section/item matcher `ts_room_lookup` uses (lib/feed/matcher.ts) and the same 12-second bounded timeout — one source of truth, no drift between the two surfaces.
v0.464.0Fix: "What's in my room" no longer returns the brain-failure fallbackJul 5, 2026
Root cause: the feed assembler had no per-source timeouts. A single slow or hung RSS/API source (HN item fetches, bjjee.com, Variety RSS, etc.) held Promise.allSettled hostage for the full Vercel 60s maxDuration — long enough to exhaust the converse turn budget and trigger the generic "couldn't reach my brain" error on every T's Room query.
Fix: an AbortController with an 8-second timeout is now injected into every fetch call across all 9 feed sources (including HN's 50 parallel item-detail fetches). Sources that don't respond within 8 s are aborted and treated as empty — the feed degrades gracefully to whatever loaded, and the tool returns that partial digest honestly instead of crashing the turn.
Belt+suspenders: ts_room_lookup itself also has a 12-second Promise.race cap — the tool can never block the converse turn indefinitely regardless of the feedImpl passed in.
v0.463.0Ask-Tai: fixed the send sound, added a Today strip, urgent alerts, and quick-log tilesJul 5, 2026
Fixed the grating send sound on the Ask-Tai presence screen — it was an undocumented synthesized "lightsaber ignition" effect (sawtooth + noise snap) that fired on your first message each session. Replaced with a subtle, quiet click (default) or a low cinematic tone; Settings → Display → Send Sound lets you pick Click / Tone / Off.
Added a Today glance strip across the top of the presence screen — next appointment, next bill due, and nearest legal deadline, one line each, tap to expand. Honest empty state when a domain has nothing coming up; built from the same priority engine /today uses.
Added a proactive alert banner that appears only for something genuinely urgent right now — a legal deadline within a few days, a bill due soon, Gracie's Vetmedin refill due, or a newly-triggered email watch (e.g. an insurance/legal letter). Dismissible; silent when nothing is actually urgent.
Added one-tap quick-log tiles — log a BM, log a symptom, mark the next bill paid, add a task — each calling the exact same server action/route its own full screen already uses, so nothing is a parallel write path.
v0.462.0Fixed 4 live-broken T's Room categories — Movies & TV, Martial Arts, Heavy Metal, Chicago DiningJul 4, 2026
Movies & TV, Martial Arts, and Heavy Metal all showed "Unable to load right now" -- root cause: Reddit's public .json endpoints return HTTP 403 for cloud/datacenter egress IPs (confirmed live from this box). Replaced with real RSS newsrooms: Variety + Hollywood Reporter (Movies & TV), BJJ Eastern Europe + a Google News search scoped to karate/taekwondo/judo and excluding UFC/MMA (Martial Arts, staying traditional-arts-only per your preference), and Blabbermouth + Metal Injection (Heavy Metal).
Chicago Dining showed "Nothing to show right now" -- root cause: Eater Chicago's feed migrated to Atom format (<entry>) at some point, but the parser only understood RSS 2.0 (<item>), so every fetch silently returned 0 items even though the HTTP request succeeded. Added an Atom-entry parser alongside the RSS one, and swapped the fallback source (Chicago Tribune's food RSS URL was confirmed dead -- it 301s to a 2008 static page) for a working Google News search.
Also fixed literal HTML-entity garbage (‘, ', &) that would have rendered in the new sources' non-CDATA-wrapped titles -- e.g. "‘The Pitt’" now renders as "'The Pitt'".
Verified live against the real network (not mocked): all four sources fetch real, current, non-fabricated items as of this fix. Fixed the assembler's Promise.allSettled destructuring already matched the fetch order correctly -- that flagged review concern was a false positive, re-verified here.
v0.461.0T's Room — personal feed rebuilt into a Tai-aware intelligence hubJul 4, 2026
Added a Technology section (Ars Technica/TechCrunch, distinct from AI/LLM) and reordered every category to priority: AI (featured), Technology, Movies & TV, Food & New Restaurants, Local/Chicago, Martial Arts, Concerts, Heavy Metal, Sports.
Tai-awareness: a new `ts_room_lookup` tool grounds the conversational brain in your real, current T's Room items. "What's in my room today" gets an honest digest; "tell me about that AI one" / "the concert" resolves to the actual item (never an invented one) and can hand off to web_search for deeper research with real sources.
Every item is now interactive: tap Ask Tai to research it inline, Save / More like this / Not interested persist to durable memory so the feed leans into what you engage with, and concert items get a propose-only "Add to calendar" (routes through the normal conversation, not a direct write).
"Brief me" now speaks through the same voice pipeline as the rest of Tai (your chosen premium voice when configured, browser voice as the floor) instead of a separate speech path.
v0.460.11Renamed the personal interests feed to T's Room + full QA sweepJul 4, 2026
The personal AI/Chicago/concerts/movies/martial-arts/heavy-metal/dining digest at /feed was titled "Today, for you" -- renamed its header and its /more nav-tile label to "T's Room" per your confirmed target. The unrelated /today urgency-ranked panel (bills/court/meds by deadline) was left untouched -- it happens to reuse the same old phrase internally but is a different screen.
Full functional QA sweep: typecheck clean, all four lint gates clean (tile/hex/bak/chokepoint), full test suite green (3921/3921), and a production build succeeded for all 156 routes with zero build errors. Every static route (125) returned HTTP 200 and every sampled dynamic route (28, using placeholder IDs) rendered a graceful not-found/empty state instead of a 500.
No broken routes, crashes, or dead links found this pass -- nothing needed fixing beyond the rename.
v0.460.10Fixed: converse agent falsely denied it could render a pie chart -- added a real PieChart componentJul 4, 2026
Live bug: "give me a pie graph of my illnesses" routed correctly to your real conditions, then replied "I can't generate visual graphs -- I'm text only" and suggested pasting the data into Google Sheets or ChatGPT's image generator. False -- Tai already has a generative-visual system; the agent just didn't know it could use it, and the catalog had no categorical/pie component at all.
Added `PieChart` (recharts donut) to the generative-UI catalog, backed by a new `condition_breakdown` source (your real curated conditions -- the same list the text answer already reads) and reusing the same task due-date-urgency buckets `BarChart` already renders, as slices instead of bars.
The converse system prompt now states plainly that it can render inline visuals and must never claim to be text-only or point you at an external tool; "pie"/"breakdown" phrasing now steers both the model tool-calling path and the deterministic ask ladder at the right categorical source instead of the wrong time-series default.
Regression-verified: bills still render BarChart, legal/pedi still render Timeline, calendar/dining unaffected, and genuine document lookups still use the Library.
v0.460.9Library-last-resort routing now covers every domain's bare phrasing, not just the exact bug reportJul 4, 2026
The previous fix (0.460.8) closed the exact reported bug ("chart of my legal cases") but the general rule still had gaps: bare "court cases" (no "my"/"legal"), bare "my health", "my money", and "my spending" matched no data domain and were still Library-hijackable.
Closed all four gaps by widening the domain classifier (legal now also matches "court cases"; health now also matches bare "my health"; bills/money now also matches bare "my money" and "my spending") and by adding the missing "trend" keyword to the explicit-visual-request detector (it was in the original spec but never implemented, so "health trend" fell through).
Regression-verified across the full matrix: legal, bills, calendar/appointments, tasks, health, and dining bare phrasings all now route to real data; genuine document-lookup asks ("find my lease pdf") still open the real Library.
v0.460.8Fixed: "chart of my legal cases" returned a document card instead of your real docketJul 4, 2026
"Show me a chart of my legal cases" was returning a Library "6 legal case documents — tap to open" card instead of your real case list + timeline. Root cause: a bare retrieval word ("show") combined with terms that happened to also appear in a document's TITLE ("legal", "case") was enough to trigger a document dump, even though you never asked for a file.
This is the same class of bug as an earlier bills-only fix — patched here as a GENERAL rule instead of another one-off phrasing patch: any question about a real data domain (bills, legal cases/court, calendar/appointments, health, tasks, dining), or any explicit chart/graph/timeline/trend/breakdown request, now always resolves from your real data first. Document search only answers a genuine document-lookup ask ("find my lease pdf", "open the settlement letter") — never as the primary answer to a data or chart question, in any domain.
Verified no regression: bills, appointments (incl. pedi), dining, tasks, and health chart/timeline requests still render their real visuals, and genuine document lookups still open your real Library.
v0.460.7Charts/timelines now built out across every domain, not just billsJul 4, 2026
"Timeline of my pedi appointments", "chart of my dining", and any calendar/appointment question that asked for a graphic used to return text only — those two branches never reached the mechanism that attaches a real chart, even though the chart-building pipeline itself was fine. They now render a real Timeline/CalendarStrip, filtered to the right person when you name one (e.g. Pedi).
The chart component picker generalized: a "timeline of X" ask now prefers an actual timeline for any domain shaped like one (calendar, dining, legal/court — not just bills), instead of a separate fix for each phrase.
Read-only; no write-actions. Every value still comes from your real records — nothing is invented.
v0.460.6Corrected a mislabeled family relationship in the People registryJul 4, 2026
The verified-people registry that resolves names like "pedi" for appointment lookups had Maria and Tracy's relationships swapped (labeled wife/daughter instead of daughter/ex-wife) — the exact fabrication this repo already caught and fixed elsewhere, but this one registry never got the correction. Corrected, and the durable-memory system now also knows these relationships (plus Tara, fiancée) so they resolve consistently everywhere Tai answers from memory.
Read-only; no write-actions.
v0.460.5Fixed: crowded bar-chart labels, and "pedi" appointments only searching todayJul 4, 2026
The bills BarChart's x-axis labels overlapped once there were 8+ bars. Labels now angle and truncate (the full payee/title still shows on hover) with enough bottom margin to stay readable.
"Chart of my appointments with pedi" and "when is my next pedi appointment" used to search only today's calendar and never resolved "pedi" to a real person — so it found nothing. Pedi now resolves to Julianne Pedi, your therapist, via the same verified people registry the People timeline already uses, and the lookup searches real upcoming dates plus a recent-past window so a recurring appointment is found honestly instead of reading as blank.
Read-only; no write-actions.
v0.460.4Charts now actually show on your home screen — not just a text cardJul 4, 2026
"Draw a chart of my bills" was building a real bar chart on the server (PR 1941/1942/1944), but the answer card on the surfaces you actually use — the home screen (/presence), the home-v2 inline ask, and the Tai chat box — only rendered the text lines and silently dropped the chart. All three now render the real visual.
Root cause: the chart was correct end-to-end on the server and reached the browser, but those cards had no chart renderer and the presence answer type stripped the chart field before it could display. The one surface that did render charts (the Today command bar) was never the default you land on.
Read-only rendering, real values only — a bill with no amount on file still shows as an honest gap, never a fabricated $0. No write-actions were enabled.
v0.460.3Real charts, not text lists — a true BarChart in the generative-UI catalogJul 4, 2026
"Draw a chart of my bills" was already pulling your real bill data (PR 1941/1942) but rendering it as a plain table — not an actual chart. There's now a real BarChart component: a bar per bill, amount + due date, and a bill with no amount on file shows as an honest gap, never a fabricated $0.
Chart/graph/timeline/breakdown requests now route to the right visual across more than bills — a bills bar chart, a legal-cases timeline, a tasks breakdown chart, a health trend chart, and a calendar strip — all built server-side from your real records, never a guess.
The generative-UI component catalog is now documented (docs/GENERATIVE_UI_CATALOG.md) with a clear pattern for adding the next chart type.
v0.460.2Fixed: "create a chart of my bills" tried to add a calendar event insteadJul 5, 2026
"Create a chart of my bills" (and "make", "draw", "build", "generate" variants) used to hit the create-event parser first and offer to schedule an event literally titled "chart of my bills." A chart/graph/plot/visualization/breakdown/table request now takes priority over calendar creation, so these route to your real bills chart — the same fix PR 1941 already made for "chart of all my bills."
Genuine scheduling still works exactly as before — "add dentist appointment tomorrow at 3pm" still creates the calendar event.
v0.460.1Fixed: asking for a bills chart no longer dumps your document LibraryJul 4, 2026
"Show me a chart of all of my bills", "graph my bills", and "show me all my bills" used to miss the bills-schedule detector (it only recognized a narrower set of phrasings) and fall through to a document-search fallback, returning a "N bills in your Library — tap to open" card instead of your real bill data. These phrasings — and any chart/graph/breakdown request for your bills — now route to your real, live bills.
When you explicitly ask for a chart, graph, or breakdown of your bills, Tai now renders an actual visual (payee, due date, amount, status — real values only, "amount not on file" where genuinely missing) instead of only replying in prose.
v0.460.0Tai can now search the web — with a real, cited sourceJul 4, 2026
New web_search tool for the /tai conversation agent: when a question is general or current-events knowledge that isn't in your records (a definition, current law, a price, research, "what's the latest on X"), Tai can now look it up on the open web instead of just punting or guessing. Reuses the same search-provider connection already wired for /api/ask (Tavily/Brave when a key is set, keyless Wikipedia otherwise), so it works day-one without new configuration.
Every web result is clearly labeled as coming from the web — never presented as one of your own facts — and always names the source URL you can check yourself. A question about your own bills, cases, health, calendar, tasks, or documents still always answers from your records first; web search only fires for general/outside knowledge.
Thread-history pagination now tie-breaks same-millisecond turns (e.g. a tool-call turn and the assistant's reply landing in the same request) on a real insertion-ordered sequence column instead of the turn's random id, so a fast back-to-back exchange can never page in the wrong order.
Conversation-history requests now default to a 100-turn page (was silently 500) and clamp any requested page size to 1-500 instead of falling back to 500 with no signal that an out-of-range value was ignored.
The memory page, thread switcher, and thread-resume flow now surface a visible error instead of silently failing — a load/auth error no longer looks identical to "nothing here yet", a failed thread switch no longer closes the drawer with no explanation, and a stale cached thread id is now cleared instead of being retried forever.
Fixed a silent cap: resuming a thread past 500 turns used to read only the oldest 500 turns and quietly drop everything after — the part of a long conversation you'd actually want back. Thread history now pages through in full.
Cross-device continuity: switching from phone to Mac used to start a brand-new conversation even though the server had your whole thread — the "current conversation" pointer now lives server-side, with a Conversations list so you can see and switch threads from any device.
Wired in episodic memory: Tai can now answer questions about your own past ("what happened around the Cayman trip") using the life-episode store that existed but was never connected to conversation.
New /tai/memory page: every durable fact Tai has learned about you, grouped and visible, with a Void action to correct anything wrong or stale — memory you can actually see and fix, not a black box.
v0.458.2Brain now sees all your legal cases, not just the active onesJul 4, 2026
Found and fixed two filter-level mismatches the last same-source audit missed. Legal: your /Legal screen shows every case (active and closed), but asking Tai about a case that had been dismissed or resolved would come back blank — because the conversation was reading an active-only list built for the daily queue. Tai now reads all cases, matching the screen. Tasks: the generated task card could include tasks you'd already finished; Tai now shows open tasks only, matching what you see in the Tasks screen's main view.
Upgraded the same-source test harness to catch filter-level mismatches going forward, not just table-name mismatches — the class of bug the bills fix revealed.
v0.458.1Tai now counts calendar dinners as upcoming dining plansJul 4, 2026
Fixed a mismatch left over from the last bills fix: your Dining screen shows dinners you have on your Google calendar (like "Dinner at Maple & Ash 7pm") right next to reservations you've saved, but asking Tai "any upcoming dinner reservations?" only looked at saved reservations — so a calendar-only dinner came back as "nothing on the list." Tai now folds in your calendar dining events the same way the screen does, de-duplicated so a dinner you've saved both places isn't counted twice.
v0.458.0"Show my bills" now shows the same bills as the Money screenJul 3, 2026
Fixed a real gap: your Money screen listed your bills, but asking Tai "show my bills" or "what do I pay each month" could come back "no bills on file." The conversation was reading an unpaid-only list built for the daily nudge queue, so once you'd paid this cycle's bills it went blank — even though the Money screen still showed them all. Tai now reads the exact same bills the Money screen does.
Aligned the generated bills graphic to that same source (it could previously include a bill you'd deleted or one outside your household), and re-checked legal, health, tasks, calendar, and dining for the same class of mismatch.
v0.457.6Connected every data screen to what Tai can talk aboutJul 3, 2026
Audited bills, legal, health/GI, dining, tasks, and calendar so Tai's conversation reads the exact same records as the matching screen — a calendar question could previously miss your Google-synced events in a generated graphic, and a dining review you'd just written in the app could come back as "no reviews" until the next content refresh. Both now read the same live data the screen shows.
Fixed leftover copy pointing you at a "Bills tab" that doesn't exist, and a citation that sent tasks questions to Today instead of the Tasks screen.
v0.457.4Tai answers bills and legal-case questions with real data, not a document cardJul 3, 2026
Fixed a live bug: a plain question like "show my next week's bills" or "my legal cases" was returning a Library "N documents" card instead of your actual bills or case status — two of the resolver's phrasing patterns were too narrow to recognize those real questions.
Tai's conversation now steers toward the real bills/legal/health/dining data tools first, and only falls back to document search when a question is genuinely about a file.
v0.457.3What's New catch-up + a guard so it can't happen againJul 3, 2026
This changelog had fallen behind the live app by 7 releases (last entry was 0.454.0 while the app was already on 0.457.2) — backfilled every missing entry below so /whats-new and the version badge match what's actually shipped.
Added a CI test that fails the build if the top changelog entry's version ever drifts from package.json again.
v0.457.2TaiPresence — Tai gets a faceJul 3, 2026
Tai now has one consistent presence across /tai: a persistent top bar that shows idle, thinking (with the tool she's currently using), and speaking states, built on the same knight mark you already know rather than a new avatar.
Speaking is synced to her real voice playback, not a guess — and a listening state is wired in for whenever a microphone lands on /tai.
Presentational only: it never reads data or takes actions, and the animation respects your phone's Reduce Motion setting.
v0.457.1Tai speaks in her own voice — everywhereJul 3, 2026
Whatever voice you picked in Voice Studio or the Dark Knight audition now actually plays, on every device — no longer a browser-only setting.
A new Play button on every /tai reply, a "speak replies aloud" toggle, and a Listen button on proactive alerts.
A cache and daily character budget keep costs in check; if ElevenLabs is unavailable it falls back to OpenAI, then your phone's built-in voice — never silence.
v0.457.0Tai can show you a picture, not just tell youJul 3, 2026
Mid-conversation, Tai can now drop a real graphic into the /tai thread — stat blocks, trend charts, timelines, comparison tables, progress rings, calendar strips — instead of only text.
Every value in these graphics comes straight from your real bills, court dates, deadlines, calendar, symptom logs, or tasks. Anything Tai can't find honestly renders "not recorded" instead of guessing, and every graphic carries a tappable source chip.
v0.456.0Action Gateway hardeningJul 3, 2026
Closed three gaps found in a security red-team pass: content Tai reads (documents, emails, records) can no longer trigger a write action inline — a confirm tap is now required first.
Instructions hidden inside things Tai reads are now flagged and blocked instead of being followed.
The 3-action-per-turn write limit is now enforced by the gateway itself, and Voice Studio + Weekly Recap now require the same strict owner check as everything else that can act.
Tai's action-taking tools stay OFF while this hardening lands — reads only until it's reviewed further.
v0.455.1Voice Studio v2 — deep customizationJul 3, 2026
Preview any candidate voice reading your own text instead of a canned line.
New generation controls (guidance, loudness, quality, batch size) plus "more like this, but ___" to iterate on a voice you like without starting over. Quick one-tap presets: gravelly dark hero, warm, newscaster, calm narrator.
Fine-tuning sliders (stability/similarity/style/speed) now save server-side per voice, so a tuned voice sounds the same everywhere Tai speaks, on any device.
v0.455.0Food/Content Brain is liveJul 3, 2026
New /dining/brain hub: upcoming reservations with recon notes, a review backlog ("reviews you owe"), and content-idea capture tied to your reviews.
Real data only — Tai never books a table or invents a restaurant, dish, rating, or idea.
v0.454.1Weekly RecapJul 3, 2026
New /recap: a 60-second summary pulled only from your real data — legal cases, bills, GI logs, therapy, dining, and tasks.
Four grounded sections (done this week, coming up next week, needs attention, deadlines approaching) — an empty section says so instead of inventing filler.
Past weeks are saved so you can look back.
v0.454.0Voice Studio — design Tai's voice from your own descriptionJul 3, 2026
New surface at Settings → Voice → "Voice Studio": type your own free-text voice requirements (e.g. "deeper, slower, older, more menacing, American, gravelly") plus optional gender/age/accent/intensity controls, then generate candidates — built on the same ElevenLabs Voice Design integration as the Dark Knight audition.
Play each candidate, tweak your description and regenerate as many times as you want — no starting over.
Save any candidate you like to your own voice library with a name you choose; play saved voices back anytime; delete ones you don't want.
"Make this Tai's voice" on any saved or fresh candidate wires it into the same voice-config seam the audition's pick already used. Your library and active pick are now saved server-side (owner-scoped to you, never exposed to TOMAI/MAI) instead of only living in this browser.
Flag TAI_VOICE_STUDIO, default ON. Requires ELEVENLABS_API_KEY; without it the studio honestly reports the key is missing instead of faking audio. Original designed voices only — never a clone or impersonation of a real person.
v0.453.0Dark Knight voice audition — design an original American voiceJul 3, 2026
New audition surface under Settings → Voice → "Design new Dark Knight voices": generates 3 ORIGINAL ElevenLabs-designed candidate voices — deep, gravelly, American, cinematic — none of them cloned or imitating any real actor.
Play each candidate, then choose one. Your pick is saved permanently to the voice library and becomes Tai's spoken voice everywhere, using the same voice-config seam the existing picker already uses.
Replaces the prior 'Dark Knight' default, which was ElevenLabs' pre-made British narrator voice — the new pick is built from scratch and always American.
Flag TAI_VOICE_AUDITION, default OFF. Requires ELEVENLABS_API_KEY; without it the audition page honestly reports the key is missing instead of faking audio.
Court dates and legal deadlines now get the strong triple-binding fact-check by default before they alert you — it verifies a date, a case, and its status all trace back to the same real record before speaking up.
A cron-state database table that had row-level security fully off is now locked down (it held no personal data, but the public key could read and tamper with it).
The build-time guard that scans release notes before they go out now catches more than just phone numbers — emails, SSNs, and secret-shaped strings are blocked too.
Token and password comparisons in the voice endpoint, the text-bridge webhook, and Epic sign-in now run in constant time, closing a timing side-channel.
v0.452.3Security fix: Library documents locked to your own sign-inJul 3, 2026
A database rule from an earlier release let the app's public key read AND delete any Library document that wasn't explicitly tagged sensitive — no login required. Closed: the public key now has zero access to your documents, only your signed-in session can touch your own rows, and any untagged document now defaults to private instead of public. Your own access to your Library is unchanged.
Added Framer Motion app-wide. A single global setting now makes every new animation automatically respect your phone's Reduce Motion setting — no separate toggle needed.
Money's "Your financial picture" numbers (cash, available credit, cards owed, bills this month, income) count up instead of just appearing. The Paid button on a bill row now has a real press feel.
The GI health trend's severity chart is now a real animated chart (Recharts) that draws itself in and shows an exact value on hover/tap — same real logged data as before, still an honest gap on any day with no entry. The trend stat pills (episodes, avg Bristol, hours lost, etc.) count up too.
The money ticker's price chart now draws its line in instead of popping in flat.
A critical Collision Radar alert now pulses gently so it reads as "needs you now" at a glance.
v0.452.0Voice Conversation Brain — the judgment behind Tai on a live callJul 3, 2026
Tai can now hold a real multi-turn conversation on both call directions: on an outbound call she stays on Tony's stated purpose and knows when to warm-transfer to him; on an answered forwarded call she greets, finds out who's calling and why, and takes an accurate message instead of dumping straight to voicemail.
Judgment built in: tone adapts to who's calling from Tony's real directory (family vs. attorneys' offices vs. vendors), disclosure is tiered — an unknown number gets NOTHING personal, court dates are spoken only to Tony's legal team's offices, and money/health facts are never spoken to anyone. Hard red line: no legal or medical advice on a call, ever — Tai declines and flags it for Tony.
Zero fabrication by construction: the brain is a deterministic engine — no LLM on the call path — and can only speak facts template-filled verbatim from real rows (court dates, calendar). Anything it doesn't know it says it doesn't know and defers to Tony. Caller messages are captured word-for-word, and every finished call lands in the durable message channel plus a push (urgent language = urgent flag).
Flag TAI_VOICE_BRAIN, default OFF — it rides the Voice MVP's Twilio plumbing (TAI_VOICE), so it stays dark until the Twilio activation steps are done. Flag off = the MVP one-shot flows are byte-for-byte unchanged.
v0.449.0Proactive Alert Engine — the right alert at the right momentJul 3, 2026
Tai now decides WHAT to surface and WHEN, instead of you having to check: every candidate alert across legal deadlines, bills, health appointments and tasks is scored by urgency, importance and time-sensitivity, and only what clears the bar interrupts you — a hearing pushes at useful lead time, a bill before autopay pulls, never 20 notifications at once.
Not overwhelming by design: quiet hours (9pm–7am Chicago) hold everything except critical items, at most 3 immediate pushes per run, and everything lower-priority bundles into ONE daily digest push. Tai learns from what you actually dismiss vs. act on — rules you keep dismissing ride lower (critical alerts are never quieted).
Nothing drops and nothing repeats: deliveries go out over push AND mirror into the durable dispatch message channel, the engine shares the push-alerts cooldown ledger so the same thing can never fire twice, and every alert it sends is recorded with a plain-English 'why now' that traces to the real source rows (see /api/alert-engine). Real data only — a candidate missing its source fields is dropped, never guessed. Flag TAI_ALERT_ENGINE, default ON.
v0.447.1Privacy fix: removed a phone number from public release notesJul 3, 2026
The 0.446.0 and 0.447.0 notes both printed your real phone number in plain text on the public, unauthenticated version endpoint. Fixed — both now say "your verified number" instead. Nothing else about either feature changed.
Added a build-time guard: a version/changelog note that contains a raw US phone-number pattern now fails the build, so this can't ship again silently.
v0.447.0Text Bridge — read and send real texts as Tony, no new numberJul 2, 2026
A BlueBubbles relay on Tony's Mac lets Tai read and send texts as Tony from his own verified number — no new number, no app for the person he's texting, no carrier registration.
Incoming texts (and anything sent straight from his phone) mirror into Comms → Messages in real time. A new Text Bridge card lets Tai draft a reply to any real conversation; Tony taps 'Approve & send' — Tai never sends anything on its own.
If the Mac is asleep or the relay is unreachable, an approved send shows 'Queued — will retry' instead of silently failing, and a background job retries every 10 minutes.
Off by default: the whole feature turns on only once BLUEBUBBLES_URL and BLUEBUBBLES_PASSWORD are both set in the deployment environment — see docs/TEXT_BRIDGE_SETUP.md for the one-time Mac setup.
v0.446.0Voice MVP — Tai can call for you, and catch your missed callsJul 2, 2026
New /phone "Have Tai place a call" panel: give it a number and a purpose and Tai calls on your behalf — the person sees your verified number, confirmed with Twilio, not a random robocaller number. Tai always says it's an AI assistant calling for you and offers to connect you live with one press.
Forward your missed calls to Tai's helper number (one-time *71 setup) and Tai answers, discloses the call is recorded, takes a message, and transcribes it — verbatim, never summarized or invented. You get a push notification plus a durable, readable record in your call log.
Flag-gated TAI_VOICE, default OFF — this isn't caution, it's a real dependency gate: the feature can't do anything until the Twilio account, verified caller ID, and helper number are provisioned. See the setup checklist inside "Tai places calls for you" on /phone.
Every call — placed or caught — is a real Twilio record in your own owner-locked call log; nothing here is ever a fabricated call, number, or transcript.
v0.445.0Apple Health import — fixed the upload error on real exportsJul 2, 2026
Fixed: uploading a real Apple Health export zip on /health/connect showed a cryptic "the string did not match the expected pattern" error and refused the file. Root cause: a full export is hundreds of MB, but Vercel caps upload size at 4.5MB — the file never reached Tai's server at all, and Safari's generic parse-error message stood in for an honest one.
Tai now checks the file size before uploading and tells you plainly to re-zip just the 'clinical-records' folder (usually a few MB) when the export is too big, instead of failing silently against a platform limit.
v0.444.0Apple Health import — your real AdventHealth record, no Epic approval waitJul 2, 2026
Connect through Apple Health (on /health/connect) is now a real upload: export 'All Health Data' from the iPhone Health app and hand Tai the .zip — it reads the real FHIR labs, medications, conditions, allergies, immunizations, procedures and visits straight out of it, the same way the live Epic connection does.
Nothing is invented: the import summary reports exactly what was found — records imported, resource types recognized but not yet mapped, and any files that weren't readable — never a guess. Re-uploading the same export just updates in place, never duplicates.
Strictly siloed to your own account: writes are fenced by row-level security to your own rows and to the Apple Health source only, so this can never touch an Epic-synced or MyChart-export record.
v0.443.0Collision Radar v2 — from spotting to actingJul 2, 2026
Every collision alert on Today now proposes concrete next moves: an autopay-at-risk alert offers 'Pay manually now' or 'Move the payment' (links straight to the real bill — Tai never moves money itself); a court-plus-bill day offers 'Pay it early' or 'Remind me after court'; a court-money overlap offers case prep and a day-before reminder.
Propose-and-confirm, never auto-execute: the only things Tai does in-app are reversible alert-status changes (resolve / snooze / dismiss), each behind a two-tap confirm. Every date and amount in a suggestion comes from the actual record — if a date isn't on record, the dependent option simply isn't offered.
New 'Handled it' action clears an alert you've dealt with — and it honestly comes back on the next scan if the radar still detects the underlying problem.
v0.440.0Anti-fabrication engine v2 — every surfaced fact must prove itselfJul 2, 2026
One shared validator now sits behind the domain brains: a fact (a hearing date, a lab value, a bill amount) only surfaces when it traces to a single real source record that names BOTH the thing and the value — so a real date can no longer get attached to the wrong case, and a swapped number, month, or invented status is rejected outright.
Absence answers are honest now: 'no hearing scheduled' is only said when every place a hearing could live was actually scanned recently (verified none). If a feed was stale or skipped, Tai says it can't confirm — it never passes off a blind spot as an all-clear.
An adversarial test suite (entity swaps, number swaps, date swaps, stale sources, missing sources) runs in CI with a zero-miss guarantee — a single fabricated claim slipping through fails the build.
v0.439.0What's New page is now flag-gatedJul 2, 2026
The /whats-new page and its links from More, Settings, and the version badge now sit behind a TAI_CHANGELOG_PAGE flag (default on) — no visible change today, but it can be switched off cleanly if it ever needs to come down.
v0.434.0Financial Brain — deposit-anchored cash-flow with honest unknownsJul 2, 2026
Money now has a Cash-flow brain card: what's committed before your next deposit (known amounts summed, unknown-amount bills listed separately — never absorbed as $0), a 4-week ledger with tight-week flags, and collision warnings (two big bills the same day, a bill due right before the deposit that covers it).
Autopay risk is evidence-graded: Tai only says a card declined when a real decline record exists. If you've said a card is dead, it shows as suspected with that basis; if there's no data, it says so and tells you how to make it knowable.
New append-only money-facts ledger: every amount traces to a source (statement, receipt, Plaid, or you) with a confidence grade; corrections supersede, nothing is silently overwritten.
v0.433.0What's New — the full version history pageJul 2, 2026
Added a bookmarkable /whats-new page listing every dated release with its note — the version badge popover and the Settings footer both link to it, so you're never limited to just the last few entries shown in the popover.
v0.431.0Closed a real data-exposure gapJul 2, 2026
Five API routes (alert counts, proactive intel, your ranked daily brief, personalization signals, dismissals) had no login check and would answer any caller on the internet. They now require your session, and a global gate on every API route enforces this app-wide as a backstop.
v0.430.0Collision Radar — Tai watches for conflicts across your accountsJul 1, 2026
A new proactive alert engine cross-checks your bills, court dates, and account balances every 4 hours and flags real collisions before they bite — an autopay that won't have funds, a court date landing the same day money is tight, a bill due the same day as a hearing. Surfaces as a card on Today.
v0.429.0The app now reliably updates itselfJul 1, 2026
Fixed a stale-cache bug where Tai could keep showing an old build even after a new version deployed. The app now checks for updates whenever you bring it back to the foreground, and the update banner shows the real release note for what's new.
v0.428.0Bat Cave entrance is 3x fasterJul 1, 2026
The cinematic entrance to the Bat Cave now takes 1.8 seconds instead of 5.8 — a tighter presence-helm reveal replaces the old long scene, with a new SVG crest and a trimmer header.
v0.427.0Calendar events get a real actions menuJul 1, 2026
Tapping a calendar event now offers 7 real actions — set a reminder, mark done, add or edit the location, manage attendees, set a color, set recurrence, and snooze. Location, reminders and color write through to Google Calendar for synced events; anything not fully wired yet says so honestly instead of pretending to work.
v0.426.0Ask Tai answers "when did I last see…"Jul 1, 2026
Ask "when did I last see Dr. Kaplan" or "my therapist" and Tai now finds your most recent PAST appointment from the real synced calendar — the mirror of the existing "when's my next appointment" answer. No match means an honest "I don't have that", never a guessed date.
v0.425.0Public SMS opt-in pageJul 1, 2026
Added a public /sms page showing the required text-message program disclosures (what you'll get, how to opt in, rates, how to stop) so Twilio's reviewers can verify the opt-in flow without logging in. Unblocks SMS alerts approval — no behavior change for you.
v0.424.0See who's accessed your Epic / MyChart dataJul 1, 2026
A new Access History panel on Health → Connect shows a timestamped log of every connect, sync, and disconnect of your Epic-linked health data — what was read and how many records, most recent first. Only real events are logged; nothing is backfilled or invented.
v0.423.0Your History timeline switched onJul 1, 2026
Flipped on the grounded /timeline view that had been built but never activated — it now shows your 5 DuPage debt cases, the SSDI hearing, the Ameritas claim, calendar events and bill payments, plus a People view surfacing Stacy Bardo, Justin Poh, Matt Maloney, Julianne Pedi, Maria, Tracy and Gracie as tappable relationship threads. Every entry links back to its source.
v0.422.0Ask Tai: "which bills got denied by a bad card?"Jul 1, 2026
Ask Tai that question in plain English and it now answers from real data — actual Plaid connection errors, verbatim decline notes on a bill, and which autopay bills a bad card would hit. No real decline data on file means Tai says so honestly instead of inventing one.
v0.421.0Calendar event panel, redoneJul 1, 2026
Tapping any event now opens a polished slide-up sheet with real actions — Edit, Remove, Duplicate for your own events; Reschedule, Cancel, Open in Google Calendar, Share, Ask Tai for synced ones. Canceling clears immediately in the app.
v0.420.0Your History learns who's whoJul 1, 2026
The History timeline's People filter — previously showing nothing despite 148 entries — is now populated. Every milestone is attributed to the real people involved (Stacy Bardo on the debt cases, Justin Poh and Matt Maloney on the disability claims, Julianne Pedi on therapy, Gracie on vet visits), each shown as a tappable person card with their own history.
v0.419.0Google Calendar cancel/move — the real bugJul 1, 2026
Canceling or moving an event synced from Google Calendar was silently failing (and moving would have created a duplicate) because Tai was mangling Google's event id before sending it back. Fixed — Google-sourced events now use their real id. (Cancel still needs a one-time Google write-permission re-grant from you before it can actually reach Google.)
v0.418.0Your History — a real timeline, not just chat memoryJul 1, 2026
The History view now pulls from your actual records — the debt docket, disability claim, calendar, and bill payments — instead of only what you've told Tai in conversation. Every entry links to where it came from; nothing appears unless it's real.
v0.417.0Home Flagship: tap the knight to talkJun 30, 2026
You can now tap the helmet on Home and talk to Tai right there — no navigating away. The weather chip opens a real forecast detail, routine autopay confirmations no longer clutter "Your day", and the whole deck got an ambient gold polish.
v0.416.0Choose Tai's voiceJun 30, 2026
New Settings → Voice picker with 4 voices (Dark Knight, Sentinel, Ironclad, on-device) and a preview button. Dark Knight is now the cinematic default.
v0.415.0Legal Workbench: every matter, one glanceJun 30, 2026
A new urgency-ranked overview at the top of the Legal Workbench shows all 5 DuPage debt cases plus Ameritas and SSDI — status, next hearing or deadline, attorney, and next action, each one sourced to the real record.
v0.414.0Today, for you — one ranked feedJun 30, 2026
A new unified feed on Today combines legal deadlines, bills, appointments and tasks into a single list ranked overdue → today → this week → upcoming, instead of scattered across separate cards.
v0.413.0The game announcer stopped going quietJun 30, 2026
Fixed the live baseball announcer reading two lines then falling silent — it was only speaking once per at-bat (roughly every 3 minutes). It now narrates every real pitch as it happens, with a live scoreboard alongside.
v0.412.0Bat Cave gets a cinematic entranceJun 30, 2026
Entering the Bat Cave now plays the same cinematic "lair" reveal used elsewhere in Comms — once per session, and it respects your "don't replay" choice.
Fixed real document titles showing up correctly, cleaned up source labels, and improved handling of garbled or low-signal questions so they route to a real answer instead of a dead end.
v0.410.0Comms Hub + Command Center, wired togetherJun 30, 2026
Cross-app activation — status board, presence, owner audit log, and seeded channels are live between Tai, TOMAI and the Command Center. (A same-day follow-up hardened the underlying migrations so they apply cleanly.)
v0.409.0One vault for everything you've uploadedJun 30, 2026
Added the canonical read path for the Unified Content Vault — a single place your documents, chunks and collections are searched from. Off by default while it's validated.
v0.408.0Live status for cloud-built workJun 30, 2026
Requests dispatched to the cloud "box" builder now report real status back through Tai instead of going dark until they're done.
v0.406.0Search finds your people, not just your dataJun 30, 2026
Global Search now finds your health care team, legal team, and vendors (like Jay Gonnam) by name — not just bills and documents.
v0.405.0Calendar stops double-counting the same appointmentJun 30, 2026
A canonical identity engine now recognizes when two calendar entries from different sources (email, Google) are really the same appointment, so conflicts and dedup are judged correctly.
v0.404.0Phone screen polish passJun 29, 2026
Bigger calendar tap targets, cleaner nav arrows and event rows, and tighter spacing across Legal, Money and More on your phone.
Fixed a scroll bug in the Bat Cave, extended "hide this card" to every card with a Settings restore option, and added a recurring dining-intel refresh job.
v0.402.0Fixed the announcer freezing on iPhoneJun 29, 2026
The live game announcer could get stuck mid-sentence on iOS. Speech now plays one line at a time in strict order so it can't deadlock.
v0.401.0Hide anything you don't want to seeJun 29, 2026
Court dates came off the Home screen (still on Legal). Say "stop showing me X" or long-press any card on Needs to hide that category — it stays hidden until you bring it back.
v0.400.0Bills glance is now priority-rankedJun 29, 2026
The "Your day" bills panel on Home now surfaces insurance and tax bills first and pushes overdue/urgent ones to the top — and it shows on your phone now, not just desktop. Also added your HOA (Associa Chicagoland) to the tracker and confirmed Transamerica at $896.88.
v0.399.0Bill reminders that actually fire on the real cycleJun 29, 2026
Recurring bills now re-remind every cycle instead of going silent after being marked paid once, with insurance/tax outranking routine reminders. Same-day follow-ups fixed a bypassed alert gate and a false "overdue" flag on cards with a future due date.
v0.398.0Bat Cave mobile fixes + duplicate-event cleanupJun 29, 2026
Removed a nested-scroll trap in the Bat Cave's message thread and added a jump-to-requests button; separately, a same-provider appointment synced from two sources (email + calendar) no longer shows twice or falsely flags as a conflict.
v0.397.0Requests → Builder, the full loopJun 29, 2026
Tommy's build requests now show "Tony's looking" the moment you open one, can be pushed to the Builder without leaving the Bat Cave, edited before they're sent, and report live status (building → built → shipped) back to him — all behind flags, off by default.
v0.396.0Fixed: no push when Tommy messagesJun 29, 2026
Root cause found — the notification cron had no authenticated GitHub Actions backup, so it silently never ran. Fixed, plus sharper "Tommy messaged you" pushes that deep-link straight into the Bat Cave thread, and a per-channel mute.
v0.395.0Push notifications open the right screen on iPhoneJun 29, 2026
Tapping a push notification wasn't reliably landing on the right content because iOS reopens the app at a frozen URL. Fixed generically for every alert type — a Pedi reminder now opens straight to your session prep, for example.
v0.391.0Google Calendar cleans up its own duplicatesJun 28, 2026
A new daily job finds and removes redundant duplicate copies of an appointment directly on your real Google Calendar — conservative by design (never touches events you created or shared ones), every deletion logged and reversible. Cleared 4 known leftover duplicates (Pedi, Gracie x2, Groom).
v0.390.0Calendar stopped showing the same appointment 2-3 timesJun 28, 2026
Root cause: small differences in how a location was written (street address vs. business name) tricked the dedup logic into treating one appointment as several. Fixed at both the write and display layers — proven on your real Pedi, Gracie and Groom appointments.
An email-scan bug was resurrecting calendar items you'd already dismissed. Fixed — once you reject or approve a suggestion, that decision now sticks for good.
v0.388.0Home V2: Calendar joins the bottom barJun 28, 2026
The bottom nav now reads Home · Ask Tai · Bat Cave · Calendar · More (Money moved to the all-areas dock, still one tap away). Court dates came off the day brief; a Cubs card shows only on game days with the real live score.
v0.387.0Fixed: back button led to the old HomeJun 28, 2026
The back/home button was returning to the retired Today screen instead of the new Home. Fixed so Home V2 is the one true root.
v0.386.0Home V2: down to 5 clean tabsJun 28, 2026
Thinned the bottom bar to Home · Ask Tai · Bat Cave · Money · More, gave Home a single headline (no duplicate title), and tuned the knight helmet's glow to match how urgent things are.
v0.385.0The gold knight helm, refinedJun 28, 2026
A polished-metal pass on the helmet mark — richer gold gradient, a cleaner crown, a steadier eye-glow, and smoother idle motion. Shows on both the Home and Needs screens.
v0.384.0Fixed: installed app skipped the new HomeJun 27, 2026
If you'd installed Tai to your Home Screen before Home V2 shipped, it kept opening your old screen because iOS remembers the URL from when you installed it. Fixed — it now forwards you to the new Home automatically, once per session.
v0.383.0A photoreal 3D knight helm (experimental)Jun 27, 2026
Built a WebGL/three.js version of the gold knight helmet — real metal reflections, glowing eyes, bloom — as an optional alternate to the existing 2D helmet. Off by default.
v0.382.0Home V2 becomes the default landingJun 27, 2026
The new consolidated command-center Home (three zones: You→Tai, Tai→You, Your day) is now where the app opens, once switched on — fully reversible back to the old Home. Today, Needs, and the Bat Cave are all still one tap away.
v0.381.0The Needs hub is now in your navJun 27, 2026
The "Tai needs you" command center is now reachable in normal navigation — a new Needs tab in the bottom bar (and a Tai Needs You entry at the top of the desktop sidebar). No more typing a preview link to reach it.
Stepping in shows the night-motif wall of what genuinely needs you — and when the wall is clear, the Forge takes over (embers + the knight) as your all-clear reward.
Your home screen is untouched: Today is still Today. Needs sits alongside it, not on top of it — and the whole thing is reversible from a single master switch.
v0.380.0A more ominous knightJun 27, 2026
Tai's knight-helmet mark got a darker, more cinematic look — forged, battle-worn metal with real depth, a hooded brow, and narrowed glowing eyes.
The eyes still light up as Tai listens and speaks; the whole helm carries a slow ambient glow.
The home-screen / desktop app icon and favicon were regenerated to match — delete and re-add Tai to your home screen to see the new icon.
v0.379.0The Bat Cave is liveJun 27, 2026
The Bat Cave is now a real, permanent destination — just tap Bat Cave in the bottom nav (it takes the Sports slot; Sports is still one tap away under More). No preview link needed anymore.
Opening it drops you into the full cinematic command center — layered darkness, the champagne searchlight beam, the crest, and your end-to-end sealed two-way line with Tommy in the glass console, with his build requests right alongside.
New messages from Tommy now light a subtle flashing pip on the Bat Cave tab instead of taking over your screen — you decide when to step in.
Still flag-gated and fully reversible: everything else — Today, Money, Ask Tai, Tasks — is exactly where it was.
v0.378.0Bat Cave preview — now viewable without signing inJun 27, 2026
Fixed: opening the Bat Cave preview link (/comms?preview=1) without being signed in showed a plain 'sign in' page instead of the cinematic look. The design preview now renders the full Nightfall Bat Cave — searchlight beam, crest, glass console — straight from the link, no login required.
Nothing else changed: this is still the off-by-default preview. Your everyday home, the bottom nav and the rest of the app are exactly as they were; signing in still gives you the real conversation with Tommy.
v0.377.0The Bat Cave goes cinematicJun 27, 2026
The Bat Cave is now a cinematic command center, not a chat page. Stepping in feels like descending into a high-end night bunker: layered darkness with real depth, a champagne searchlight beam from the crown, an ambient floor glow, atmospheric haze and a soft vignette — with a tasteful entrance reveal as it opens.
A refined bat-signal identity: the beam projects a classy crest at the top, tinted to whoever you're talking to. When a new message is waiting it pulses gently — in the cave, never a full-screen takeover.
Premium materials throughout: frosted glass contact chips that glow in each person's accent, the conversation set in an elevated 'secure channel' console frame, an elegant Requests-from-Tommy inbox, and a refined door to Tommy's app — all with refined serif/mono typography and tasteful, GPU-light motion.
Built on a reusable 'Nightfall' theme so future screens inherit the same premium look. Honors reduced-motion (everything still works, just calm), tuned for your phone, and still completely off until you flip it on — your everyday app is unchanged.
v0.376.0Bat Cave — your line to Tommy (preview)Jun 27, 2026
New: the Bat Cave — an immersive, night-motif command center for your two-way line with Tommy. It wraps the same private, end-to-end sealed channel you already have, adds a contacts picker (Tommy now; Maria and Tara scaffolded for later), and surfaces Tommy's build requests right alongside the conversation.
No more takeover: a new message from Tommy now lights a small flashing gold pip on the Bat Cave tab instead of throwing a full-screen overlay — you decide when to enter.
Requests from Tommy land in the cave; 'Push to Builder' only QUEUES a draft for your review — nothing ever auto-dispatches.
Off by default: the Bat Cave is flag-gated (TAI_BATCAVE_LIVE) with a no-login preview at /comms?preview=1. Until it's flipped on, your app is exactly as it was — same Communication page, same nav, same Sports tab.
Tai now reads your email and pulls out reservations, appointments, flights, and deadlines — they land in a new review queue at /calendar/review for one-tap approval. Nothing reaches your live calendar until you approve it, and it NEVER touches your Google Calendar.
No duplicates: an extracted event is suppressed if it already exists in Google Calendar (authoritative), was already extracted, or arrived twice (e.g. by both email and OpenTable) — matched by title + time (±15 min) + place.
No silent double-booking: events that overlap something already on your calendar are flagged 'double-booked' and held for you to resolve, with a same-day heads-up.
Accuracy first: extraction is Claude-local and every event must quote its venue and date from the actual email — anything that doesn't is dropped (no invented events).
Revived cancellation detection (the missed-OpenTable-cancel gap): now runs every 30 min on a private scheduled job and scans 72 hours, auto-dropping cancelled reservations and the matching email events.
v0.363.1Face ID registration fixJun 25, 2026
Fixed Face ID registration failing with 'Registration failed' on iOS PWA — root cause was @simplewebauthn/server v13 defaulting requireUserVerification=true while the registration options use userVerification='preferred'. Now correctly passes requireUserVerification:false to match.
Multi-origin: registration and login now accept both heytai.app and the Vercel deployment URL so passkeys work on any live surface without reconfiguring the RP.
Error detail: registration and login failures now include the actual exception message in the response for faster remote diagnosis.
v0.361.0Main reconcile — superset of liveJun 25, 2026
Reconciled main to a strict superset of production: Ameritas War Room v6–v9 (two-sided replies, Download-PDF, pdfkit serverless fix, adversarial scrub) and Brain 10x Phase 1/4 cross-domain reasoning are now on main, byte-identical to the live build.
Un-stranded Brain 10x Phase 2 — corrections that TEACH: when you correct a fact, Tai rewrites the answer next time instead of footnoting it (fact overrides + migration 0085).
No behavior change to the Ameritas evidence report — bubbles, toggle, full-report PDF, and the privacy scrub are unchanged from the live 0.360.0 line.
v0.350.1Ameritas V4 + security fixJun 24, 2026
Ameritas War Room: iMessage-style bubbles — other person gray/left, Tony blue/right, rounded bubble tails, day separators.
Nancy Piazza witness statement card — corroborating declaration mapped to the four Ameritas requests with bracketed blanks for Nancy to complete.
Security: /api/reports/generate now requires owner authentication (previously unauthenticated — served SSDI, Ameritas, and attorney data to any caller).
v0.322.0Ameritas War Room — cleaned report, tidier roomJun 23, 2026
The War Room now opens straight to the cleaned, print-ready evidence report front and center — readable like a document you'd hand an attorney, with no message-count statistics.
Decluttered the room: removed the old AI “next actions”, “before we send” checklist, and “draft the rebuttal” panels so it shows the facts and evidence only — nothing telling you what to do.
Earlier reports are tucked into a collapsible “Evidence library”, and the older raw report is archived so the current one is unmistakable.
v0.319.0Tai quotes the right bill datesJun 23, 2026
Anti-hallucination sweep: when you ask Tai about bills, it now gives the real next due date instead of an old, drifted one — so it no longer says a recurring bill was “due last month” or “weeks overdue” when it's actually due in a few days.
Same fix flows through the home suggestions (“Pay ComEd · due Jun 28”) and the “how much will I have after bills” math, which was undercounting bills it mis-read as already past.
v0.318.0No more false “overdue bill” spamJun 23, 2026
Fixed a notification bug: the twice-daily past-due-bill re-nudge was treating every recurring bill's drifted stored date as overdue, so it could ping you with “all your bills are overdue” every day. It now only nudges for bills genuinely late on the current month's cycle.
Behind the scenes, dead/expired notification subscriptions are now retired consistently across every alert path, so pushes don't waste retries on phones that unsubscribed.
v0.317.0Home “Bills due” shows the right datesJun 23, 2026
Fixed the Bills-due panel on your home screen: it was reading each recurring bill's stored date literally, so a monthly bill could show as weeks “overdue” when it's actually due in a few days. It now uses the real next due date (and flags a bill that's genuinely late this month) — matching the Money screen.
v0.316.0Document answers cite only what they usedJun 23, 2026
When you ask Tai about your documents, it answers by quoting the real passage and naming the source — and now the list of cited source documents only shows the ones that actually grounded the answer. Before, a weak, off-topic match could slip into the sources list; that can't happen anymore.
v0.315.0Voice doesn't talk over itselfJun 23, 2026
Tightened the hands-free conversation timing for the dark-knight voice: because he speaks slowly and deliberately, the safety timer that re-opens the mic was being set too short for long answers — it could start listening while he was still talking. Now it's matched to his real cadence, so back-and-forth stays clean.
v0.314.0Restaurant Intel shows up on the dayJun 23, 2026
On a day you have a dinner reservation, Tai now nudges you with a notification — tap it and your Restaurant Intel dossier opens (your reviews, must-orders, who to ask for) so you're not scrambling to look it up.
Your review template, the reservation tracker, and the dossier itself were already there — this is what was missing: it surfacing automatically on the day, not only when you remember to ask.
v0.313.0Bill reminders that actually fireJun 23, 2026
Fixed a real gap: bill due-date reminders are now cycle-aware. Recurring monthly bills whose stored date had drifted into the past used to be skipped by the reminder check — now every bill reminds on its real next due date, across a 3-day window, plus a nudge when one's already late this month.
Marking a bill paid or unpaid was already solid (journaled, undoable, double-tap-safe) — unchanged.
v0.312.0Gracie's meds show upJun 23, 2026
Gracie's care page now shows her real meds (Vetmedin, Credelio, Dasuquin, Librela and her allergy shots), her vet, diet and license — pulled from your pet record — instead of a blank screen.
It's honest about refills: until the pet tracker is set up, it won't invent a stale "ran out" date or nag you with one. Set up tracking and "mark refilled" + reminders go live.
v0.311.0Court dates count down on the caseJun 23, 2026
Open any debt case and the next court date is now front and center with a live countdown — it turns gold weeks out, amber as it nears, and red in the final week or if a date has already slipped past and needs a docket re-check. One tap drops it onto your calendar.
Each case's Documents section is always visible now and shows what's linked to it, with a clear way into the documents area to add or re-file one.
v0.310.0Legal & Health fill the big screenJun 23, 2026
On a desktop or tablet, the Legal and Health boards now lay out in two columns so they fill the wide screen instead of sitting in a narrow strip down the middle.
The lead matter (your Ameritas priority) and the section banners still run full-width across the top, and everything stays in the same priority order. On a phone it's exactly as before — one clean column.
v0.309.0Cleaner phone cornersJun 23, 2026
The version chip in the corner no longer hides behind the gold Tai button — on phones it sits at the bottom-left, fully readable, and the feedback flag tucks neatly above the Tai button instead of overlapping it.
Swept every screen at phone width: nothing runs off the edge or gets cut off.
v0.308.0Manage MAI from the Command CenterJun 23, 2026
Command Center → Access & Users now has a live “Manage users ↗” button for MAI (Career Hub), next to TOMAI — tap it to set or reset MAI passwords and add or remove access.
It opens MAI's own owner console; you sign in there once and stay signed in. Nothing sensitive is shared between apps — Tai just links you across.
v0.307.0War Room reports read like a real documentJun 23, 2026
Ameritas War Room reports now render as a clean, professional document — proper headings, bold, lists and tables — instead of raw markdown text with #, * and | symbols showing through.
Opening or downloading a report gives you a print-ready page: tap “Print / Save as PDF” to keep a clean copy. (Plain text is still available with ?format=txt.)
The message-count privacy scrub runs on every report surface, so no text-volume figure ever reaches the page. The facts, quotes and dates are unchanged.
v0.306.0Notification test is clearerJun 23, 2026
Settings → Notifications: the “Send test notification” button now tells you plainly when a device isn’t registered yet (with a one-tap re-enable), instead of showing a confusing error.
Push itself is already on — once you’ve installed Tai to your Home Screen and tapped Enable, bill, court and refill alerts come through.
v0.305.0The dark knight — deeper voice, watchful presenceJun 23, 2026
Tai's voice is deeper and more deliberate now — a stoic, commanding read instead of a brighter conversational one.
The knight on the home deck feels more present: a stronger resting glow, a slower and more patient idle, and eyes that stay lit and watchful even when Tai is quiet.
v0.304.0Desktop uses the whole screenJun 23, 2026
On a computer, pages now fill the wide screen instead of sitting in a narrow strip with empty space on the right — the content canvas widens to use the room at 1280, 1440 and 1680.
The dashboards that already lay out in columns (Today, Money, Dining) now spread across the full width; the phone layout is unchanged.
v0.303.0Sign in with email + passwordJun 23, 2026
You can now sign in with just your email and a password — type it once and stay signed in for a long time, on this device and the installed app.
Set or reset your password under Settings → Sign-in & password. Leave the email blank to set your own.
The one-time email code and Face ID still work as backups if you ever need them.
v0.302.0One mark everywhere — the knightJun 23, 2026
Tai's brand mark is now the gold knight helmet in every spot it appears — the menu wordmark, the “Ask Tai” tab (phone and desktop), and the “Add to Home Screen” prompt all match the knight you see at the center of the home deck.
A couple of places were still showing the old sparkle/letter mark; those are gone. The app icons, favicon and home-screen icon were already the knight.
On a computer, the home (Ask Tai) screen no longer tucks its left side — the back button, sign-in, the first quick-action chip and the message box — behind the left menu. The whole deck now sits cleanly to the right of the menu.
The left menu and the page content share one width setting, so they line up exactly and can't drift apart again.
On narrower laptop screens the menu slims down a little so it doesn't crowd your content. Everything fits — no more cut-off edges or sideways scrolling.
v0.300.0Your day, at a glance — on your phoneJun 22, 2026
Bills due and your next court hearing now show up right under the top of the Today screen on your phone — before, those at-a-glance panels only appeared on the desktop layout.
Tap a bill to open it, or your case to see the docket — the same one-tap shortcuts the desktop already had.
Still only real data: if no bills are due or no court date is set, the panel simply doesn't appear — nothing invented.
v0.299.0Sharper answers when you talk to Tai by nameJun 22, 2026
Saying “hey Tai, how’s it going?” (or “Tai, what’s up?”) now gets a warm, natural reply — before, addressing Tai by name could slip past the greeting and land on the wrong kind of answer.
Common casual spellings (“hows it going”, “whats up”) are understood too.
Real questions still go straight to your data — “Tai, is the ComEd bill paid?” pulls the real status, never a guess.
Added a wide answer-quality test net so the right question keeps reaching the right place — and Tai still says “I don’t have that” instead of inventing an answer when it has nothing to stand on.
v0.298.0Super search — one box, everythingJun 22, 2026
A search box now sits at the top of the desktop menu — type a few words and Tai searches across every area at once: bills, court & legal, calendar, meds, tasks, documents, dining, memory and health.
Press ⌘K (Mac) or Ctrl+K (Windows) from anywhere to jump straight into search. Hit “/” to do the same when you’re not typing in a box.
Results are now grouped by category with clear section headers (most relevant category first) so you can scan them fast instead of reading one long list.
Nothing is ever made up — if there’s no match, it says so plainly.
v0.297.0Desktop menu: easier to read at a glanceJun 22, 2026
On a computer, the left menu now has bigger, clearer text, brighter section labels (Daily, Money & Legal, Health, Workspace, Explore), and roomier spacing — so every module is easier to scan and tap.
On your phone, nothing changed.
v0.296.0Google Calendar errors show a clean message, not raw textJun 22, 2026
If moving or canceling a Google Calendar event fails, Tai now shows a friendly retry message instead of passing through raw technical text from Google's servers.
No Google sign-in button exists in Tai — calendar sync uses a pre-authorized token Tony already granted. This just cleans up what you'd see on a failure.
v0.295.0Premium desktop sidebar — every area one click awayJun 22, 2026
On a computer, the left menu is now a full directory: brand mark up top, Ask Tai + Today, then grouped links to Calendar, Tasks, Alerts, Money & Bills, Court & Legal, Ameritas War Room, Health, Documents, Communication, Command Center, Sports, Search and More — with Settings pinned at the bottom.
Every module is reachable in a single click instead of digging through “More”.
Easier to read: bigger, brighter text, clear section labels, roomier spacing, and an obvious gold highlight on the page you’re on.
The menu scrolls on its own so nothing ever gets cut off, and the home presence deck, cards and gestures are untouched.
On your phone, nothing changed — the bottom tab bar is exactly as it was.
v0.294.0Home gestures: long-press to remove a chipJun 22, 2026
On the home deck: one tap on a chip hears it, two taps open its module, and a long-press now removes that chip from your home — with a one-tap “Undo” if you didn’t mean to.
Removing a chip sticks (it stays gone, the same as telling Tai “stop showing me that”) and is reachable on phone and on desktop.
Fixed the Court quick-action so it opens your Legal page instead of a missing page.