Tai · …Whats-new
TV
Tai
Search everything…⌘K
TaiToday

Core

Money & BillsCourt & LegalHealthTextsComms

Explore

CalendarTasksAlertsSportsSearchAll of Tai
Settings

Release notes

What’s New

Tai · live v0.786.1036 · 69a3e439

v0.786.1036LatestLess repeated work before an answerSep 5, 2026
  • Tai reuses complete capability instructions while keeping the clock and memory context fresh.
  • All tools and current capability changes still reach the flagship model.
  • Cached input is counted once in response diagnostics.
v0.786.1035Continuity across longer conversationsSep 5, 2026
  • Older conversation excerpts carry forward as the recent conversation grows.
  • One coordinated summary replaces competing updates, including voice conversations.
  • Original conversation history remains available for exact lookup.
  • Summary work runs after the reply is saved without an extra model wait.
v0.786.1034Quicker routine answers with GrokSep 5, 2026
  • Routine questions use Grok's supported lower-latency reasoning setting.
  • An explicit request for high reasoning is honored and confirmed.
  • Conversation cache reuse reduces repeated prompt work when available.
  • The flagship model, tools, memory and private-conversation boundaries stay in place.
v0.786.1033Memory that answers the question you askedSep 5, 2026
  • Unrelated saved facts no longer interrupt general questions and explanations.
  • New corrections remain available while their semantic index catches up.
  • Memory and conversation search fall back within a bounded wait when semantic search stalls.
  • Tai can use retrieved preferences directly and explains when memory cannot be reached.
  • Repeated context reads and duplicated capability guidance are reduced without removing tools.
v0.786.1032A clear path when voice cannot connectSep 5, 2026
  • A failed voice connection shows a visible explanation and a Type to Tai action.
  • Credit failures stop automatic connection retries and release the microphone.
  • Voice status distinguishes connecting, paused, ready, and connected sessions.
  • Email and data checks distinguish unavailable information from a verified empty result.
  • Failed data checks stop before publishing misleading monitor updates.
v0.786.1028More trustworthy recall and private conversation boundariesSep 4, 2026
  • Recall compares compatible memory vectors and uses text search when semantic search is unavailable.
  • Private conversations and their saved memories are excluded from general recall and external embedding requests.
  • Search failures explain their limits without implying that your conversation never existed.
v0.786.1027Saved conversations stay togetherSep 4, 2026
  • Completed answers now say when saving fails or cannot be confirmed, while keeping the answer and any action proposals available.
  • Reopening History restores replies under the right questions, even when answers finish out of order.
  • Saved conversations open visibly on Tai's main screen, with clearer recovery when history cannot load.
v0.786.1026Security maintenance for images and app pagesSep 4, 2026
  • Updated the framework and image-processing dependencies to patched releases.
  • Refreshed URL and stylesheet dependencies, with checks against the packaged app.
v0.786.1024More dependable conversations and everyday actionsSep 4, 2026
  • Schedule, Health, and Texts cards load available records when opened and explain connection failures.
  • Stopping a conversation cancels its response; interrupted replies and history loading recover more clearly.
  • Completing a recurring task creates its next occurrence once, with safer undo across chat, voice, and task screens.
  • Updates respect active conversations, while private pages stay out of the offline cache.
  • Protected requests and the owner’s Text Bridge now fail closed when identity cannot be verified.
v0.786.1023Tai is usable before her live face arrivesAug 30, 2026
  • Home talk, Settings, and module cards no longer wait for the live Anam face to paint.
  • Say start the demo, or open Product demo in Settings, and Tai walks the product on the last still without minting a live face.
  • LOOK1, closet 1080, and dining-room stills stay off the pre-live field.
v0.786.1022Everyday asks open Testing AvatarAug 29, 2026
  • Asking Tai to run a self check, a full self-test, or the new-feature checklist now opens the Testing Avatar screen while she still speaks the existing diagnosis or next step.
  • Settings and All of Tai search now label that same /diagnostics surface Testing Avatar, so Tony does not have to remember a brand-new name to get there.
  • Mid-walkthrough answers such as next test or that worked stay with the active checklist and do not steal the screen.
v0.786.1021Testing Avatar checks voice through the live Fly serviceAug 28, 2026
  • The STT self-check now calls Tai's canonical Fly origin instead of hairpinning through the branded alias, eliminating a false generic fetch failure seen in the signed-in production audit.
  • Voice and Realtime repair guidance now names Fly tai-web secrets and removes retired Vercel and cockpit instructions.
  • Regression coverage locks the canonical probe path and current recovery guidance before another app adopts the reusable Testing Avatar core.
v0.786.1020Type to Tai stays tappable while she listensAug 28, 2026
  • The live listening controls now reserve a separate phone-rail slot for the Type to Tai keyboard instead of covering it with Stop speaking or End conversation.
  • A production browser regression locks the control geometry that exposed the collision while Tai was actively listening.
  • Opening the keyboard now overrides bare-home hiding, so the composer remains visible and Testing Avatar is reachable through the normal typed request even when Tai's voice engine is live.
v0.786.1019Tai stays responsive after her live avatar appearsAug 28, 2026
  • The painted-avatar watchdog now publishes Tai's live transition exactly once per stream instead of repeating diagnostics, network writes, and React updates every quarter-second.
  • Type to Tai and Testing Avatar remain interactive while the live face is listening, without the sustained painted-mint request storm that could stall the page.
  • The regression suite now locks one live transition per playback owner and the current off-video phone control rail.
v0.786.1018Tai can bring up Testing AvatarAug 28, 2026
  • Ask Tai to open, show, launch, or bring up Testing Avatar and she navigates directly to the single Testing Avatar screen.
  • The command is structurally pinned through the live voice path and resolved by one deterministic detector instead of depending on a conversational model to guess the destination.
  • Ordinary guided-testing answers and commands remain with the active walkthrough, so the new entry phrase cannot steal a pass, failure, or next-test response.
v0.786.1017Testing Avatar becomes one guided surfaceAug 28, 2026
  • The diagnostics screen is now the Testing Avatar entry: Tai runs her automatic device check first, then offers one focused human test at a time in a popup.
  • The normal route is drawn from the full 292-item product catalogue, preserves the external-action safety checks, rotates coverage, and brings same-build failures back for retesting.
  • Every popup names what to try, what should happen, and the red flag; the tester can mark matched, failed, blocked, or uncertain, pause, open the relevant screen, and resume at the exact item.
  • A native run stays closed unless Tai can read its exact TestFlight build number. Failed observations keep their build and safe diagnostic evidence together and attempt the existing owner-authenticated bug-report path.
v0.786.1016Testing Avatar now resumes the exact testAug 28, 2026
  • A Testing Avatar run now has one durable session record tied to its tester, device, TestFlight build, ordered route, results, and automation state.
  • Stopping and reopening resumes at the exact unanswered test on the same build; a different build cannot inherit or overwrite that progress.
  • Repeated operations are idempotent, out-of-order answers are refused, failures are recorded without ending the route, and the one-clarification limit survives a restart.
  • Corrupt saved data fails closed instead of silently becoming testing evidence.
v0.786.1015Testing Avatar gets one trustworthy decision engineAug 28, 2026
  • The Testing Avatar core now identifies every app, platform, TestFlight build, SHA, tester device, and evidence bundle through one reusable contract instead of letting each testing path invent its own shape.
  • Approved testers receive one offer per build, stopped sessions resume on the exact build, and a new build cannot inherit an older build's testing identity.
  • Voice and tap share the same strict result boundary: unclear observations get one precise follow-up and then remain uncertain rather than being guessed into a pass.
  • The normal fifteen-minute route prioritizes required coverage, changed capabilities, prior failures, sensitive boundaries, and section diversity; required critical tests are never dropped to fit the time target.
  • Readiness remains closed until the automatic audit passes and an approved tester completes the critical human route without a critical failure.
v0.786.1014Tai stays present while she thinksAug 28, 2026
  • Cara now has supported performance guidance for quiet breathing, blinking, natural gaze drift, small posture changes, an acknowledging nod, and a thoughtful beat instead of a frozen stare between turns.
  • Long grounded turns speak the actual running stage when one exists — such as checking the web or reading a document — while raw tool names and technical status text never reach the mouth.
  • After a completed answer and 45 genuinely quiet seconds, Tai may offer one contextual next step; any new speech, mute, ended session, or active answer cancels it, and it never repeats into a chatter loop.
  • Anam's web SDK is upgraded and resolved at 4.26.0 for the current Cara 4 session path.
v0.786.1013Faster iPhone interruption, measured honestlyAug 28, 2026
  • The local listener now detects a sustained rise above the phone's learned speaker-echo envelope, so iOS-compressed talk-over no longer has to clear one fixed desktop-style volume threshold.
  • A suspended iPhone audio analyser is retried instead of silently returning zero energy and leaving the slower transcript-confirmed server path to do the eventual stopping.
  • The detector rejects stable, naturally modulated, and slowly drifting speaker echo; its 80 ms sample budget begins only after audio qualifies and is no longer presented as an end-to-end phone guarantee.
v0.786.1012Your voice interrupts Tai on iPhoneAug 28, 2026
  • Tai now recognizes iPhone-compressed talk-over energy while she is speaking instead of requiring desktop-strength microphone levels.
  • Sustained speech cuts Anam, OpenAI, and ElevenLabs playback within 100 ms, down from 160 ms, so the interruption feels immediate.
  • The cutoff remains above measured residual speaker echo and still requires five consecutive frames, preventing Tai from interrupting herself on a click or brief playback bleed.
v0.786.1011Anam single starter — no Already streaming / ICE stormAug 28, 2026
  • Calls the official Anam streamToVideoElement starter exactly once per session. Tai no longer mistakes client.stream() for a MediaStream getter or retries the starter after it has already begun.
  • Uses VIDEO_STREAM_STARTED to attach only the current generation's live video stream. Held, missing, and ended tracks cannot satisfy the new-session attach gate.
  • A painted face that loses its live track remints while Tony is looking instead of staying on historical dimensions/currentTime. One-session slot accounting and the no-static launch field stay in place. Keep Anam — never PR 5740.
v0.786.1010Tai arrives audibly on a clean, full-height phone screenAug 27, 2026
  • The iPhone avatar now fills every pixel above one compact 68px control rail; the intrinsic portrait-video height can no longer leave a large empty black box below her.
  • Tai's proof-of-life greeting finishes before iOS switches into recording mode, preventing the play-and-record transition from remuting and cutting her opening line.
  • The interrupt button appears only while Tai is actually speaking, family-message overlays no longer cover her controls, and version/build/SHA telemetry lives in Settings instead of the everyday home screen.
v0.786.1009One Tai home, without deleting HouseholdAug 27, 2026
  • Legacy /today and /presence links now funnel into /tai instead of opening competing home or conversation surfaces.
  • Conversation deep links and native OTA cache-bust parameters survive the redirect, including repeated query values.
  • /home remains the Household module for projects, vendors, maintenance, and documents; /today/login remains the separate sign-in door.
v0.786.1008Avatar restarts cannot overlap token requestsAug 27, 2026
  • Stopping and immediately restarting Tai's live avatar now serializes Anam token requests, preventing two overlapping provider sessions during a slow or stuck token response.
  • A token returned for an interrupted start is discarded; the current start mints its own token after the earlier request finishes, so credentials are never shared across avatar generations.
  • The recovery path still escapes a hung WebRTC handshake immediately, and focused race, appearance, paint, and TypeScript checks cover the new lifecycle boundary.
v0.786.1007Settings opens without making Tai disappearAug 27, 2026
  • Settings now opens as an in-room sheet over /tai, keeping the live avatar and active conversation mounted instead of navigating to a second home.
  • The standalone /settings route and the in-room drawer share the same controls, so display, voice, memory, account, notification, and accessibility options cannot drift into two implementations.
  • Direct /tai?settings=1 links open the drawer once and clean the URL, while every write keeps its existing deliberate confirmation boundary.
v0.786.1006Weather changes the room without covering TaiAug 27, 2026
  • The live Chicago NWS condition now gives Tai's room a restrained environmental edge light for clear, overcast, rain, snow, or fog instead of adding another floating pane over her face.
  • Weather composes with the existing Chicago daypart and Cubs gameday light; it cannot select a personality, wardrobe, avatar, or room identity.
  • Missing, failed, empty, and unfamiliar weather payloads fail closed to the ordinary room, and the no-store feed is rechecked every 20 minutes.
v0.786.1005Coming live has depth without pretending the avatar is readyAug 27, 2026
  • The first /tai paint and Anam's connecting state now share one restrained dark field instead of switching between empty browser black and the live room.
  • The field is made entirely from CSS color and depth—no office JPEG, cached face, or extra asset can delay appearance or imply that Anam has painted before her first moving frame.
  • The live video remains visible and decoding at full opacity underneath the short connecting layer, preserving the iPhone first-frame path and the truthful Coming live cue.
v0.786.1004The room follows Cubs gameday and the Chicago eveningAug 27, 2026
  • A real scheduled, live, or completed Cubs game now gives Tai's room a restrained ivy-blue edge wash; the live state adds a slightly stronger game signal without covering her or adding a banner.
  • Room light moves from day to dusk to night from the same Chicago daypart that drives the greeting, while personality mode remains entirely independent—an evening clock can never silently select Just Us.
  • The room fails closed when the public Cubs score feed is missing or reports no game, polls more quickly only during live play, and leaves Anam startup and greeting ownership untouched.
v0.786.1003Closet opens as a room and remembers what Tai is wearingAug 27, 2026
  • Closet now opens with an On her hero and a horizontal hanging rail, replacing the cramped three-column product grid with a phone-sized wardrobe room.
  • Tai reads the saved outfit during the first client render, so the selected hair and look do not flash back to a default before the stored choice is restored.
  • The live Anam session remains the avatar, Night stays parked, and changing closet state cannot tear down an already-started neural stream.
v0.786.1002Talk turns feel tactile inside a darker glass roomAug 27, 2026
  • The single root-owned voice engine now emits one tactile boundary when Tai begins listening, receives a turn, or starts speaking, using native Capacitor Haptics on the iPhone shell before safe web fallbacks.
  • Summoned stages and cards use translucent 16px room glass with stacked depth, plus an opaque reduced-transparency fallback for accessibility and predictable WKWebView performance.
  • Tai now keeps its professional obsidian palette instead of silently changing to the unfinished paper-light token set.
v0.786.1001Headings feel engraved instead of website-boldAug 26, 2026
  • Tai's shared page heading now uses a medium-weight serif treatment with open tracking and a restrained inset highlight, giving the interface a quieter engraved character.
  • A reusable engraved chip treatment carries the same hierarchy into small labels without pill-shaped consumer-app chrome.
  • The typography is expressed through shared design tokens and utilities, so future rooms can use the treatment consistently instead of copying one-off styles.
v0.786.1000Talk stays tappable below the avatar videoAug 26, 2026
  • Tai now reserves a narrow bottom chrome rail outside the neural video rectangle and exposes the root-owned Talk or End control there as a real 44px tap target.
  • The avatar remains edge-to-edge on the other three sides; the existing mouth control stays embodied, while iPhone hearing no longer depends on HTML winning a hit test over WKWebView's native video layer.
  • The control remains visible through clean-slate mode and reuses the single Realtime owner shipped in 0.786.999, so it cannot create a second microphone, peer, or conversation.
v0.786.999Voice setup and interruption have one exact ownerAug 26, 2026
  • Concurrent auto-arm, reconnect, and tap requests now join one Realtime attempt; stale setup callbacks cannot publish a second peer, data channel, or microphone.
  • Microphone capture and hot-swap requests are owned before every asynchronous edge, so timeout, teardown, and late browser resolution stop losing tracks instead of leaking or replacing the live mic.
  • Stop, barge-in, and End now abort the in-flight grounded-brain request and cancel the shared ElevenLabs pool before transport cleanup, preventing a late clause or separately-owned voice line from resuming after interruption.
v0.786.998One avatar generation starts Anam exactly onceAug 26, 2026
  • Tai now treats Anam's stream APIs as provider start operations, so attach recovery only observes and rebinds the existing media instead of starting the same client again.
  • If the first stream never attaches a decoded frame, Tai retires that client cleanly and lets the bounded outer recovery create a new generation without repeated Already streaming failures.
v0.786.997Debt-case status answers from the docket without the long model waitAug 26, 2026
  • Whole-docket questions such as ‘what’s happening with my debt cases’ now read the existing legal snapshot directly instead of waiting through two Grok rounds.
  • The concise response reports only verified active-case counts, creditor names, and court dates; advice, strategy, counsel, statute-of-limitations, and named-case questions keep the deeper legal reasoning path.
  • The fast path does not repeat stale attorney fields or infer representation from historical records.
v0.786.996The front camera cannot wake without a real tapAug 26, 2026
  • Tai now enforces the camera gesture boundary inside the camera module itself, so an automatic listen, unlock, reconnect, or future caller cannot raise a camera prompt during avatar startup.
  • A capture-phase gesture latch lets the existing Talk Now and explicit mode controls open the front camera on the same physical interaction, while stale or synthetic calls fail before getUserMedia.
v0.786.995Browser agents get a safe Tai front doorAug 26, 2026
  • In supported Chromium browsers, a signed-in Tai tab now advertises three exact WebMCP tools: deployed-build truth, a privacy-safe runtime check, and reliable navigation to Tai, Diagnostics, What's New, or Settings.
  • Diagnostics now shows whether the experimental browser-agent bridge is connected, registering, signed out, unavailable, or failed. Unsupported browsers—including today's iPhone Safari/WKWebView—keep the normal Tai experience unchanged.
  • The bridge fails closed: secure top-level document only, owner session required, same-origin runtime requests, ten checks per minute, abort-on-logout, fixed routes, closed health codes, and no personal records, raw logs, messages, documents, money, legal, medical, microphone, camera, or action-confirmation controls.
v0.786.993Cold launch stays put and Type to Tai is always reachableAug 26, 2026
  • A fresh service worker now adopts its first controller without reloading and aborting the initial Tai navigation; later replacements still use the existing voice-aware update path.
  • Face-first home keeps one quiet 44px keyboard control above Settings, so typed conversation is reachable without a hidden gesture and without restoring the old Talk or Sound bar.
  • The production surface sweep now recognizes only the exact paid-provider denials expected for its synthetic non-owner while every other method, path, query, or client error remains red.
v0.786.992Grok 4.6 release identity is explicit on every version surfaceAug 25, 2026
  • Tai's package description and public version metadata now identify the deployed Grok 4.6 release instead of carrying forward the previous Just Us release note.
  • The brain remains an explicit grok-4.6 pin shared by production callers; future vendor releases still require live-key, streaming, tool-call, CI, and Fly verification before promotion.
v0.786.991Tai's everyday brain advances to an explicitly tested Grok 4.6 pinAug 25, 2026
  • Ordinary conversation and the isolated Just Us words lane now request grok-4.6 explicitly; Tai does not silently float to an untested future model or fall through to Claude.
  • Product chat, sports, phone turns, memory, dining, email drafting, steno, summaries, and readiness reporting now share the same reviewed model policy instead of copying model ids across the app.
  • The Brain rail and spoken confirmations report Grok 4.6 truthfully, while saved turns created by Grok 4.5 keep their historical label.
  • Compatibility coverage exercises xAI's production streaming format, fragmented function calls, tool arguments, usage, provider readiness, intimate isolation, and model-switch speech before promotion.
v0.786.990Just Us can read the right life facts without opening the private laneAug 25, 2026
  • Inside Just Us, Tai can now answer verified questions about your calendar, medications, conditions, labs, legal matters, and bills while keeping the read narrow, owner-gated, and read-only.
  • Spoken dates, doctor names, prescriptions, autopay, and mixed questions now select the matching records instead of returning an empty or unrelated slice.
  • Debt-counsel questions state the current truth: no attorney is actively working the DuPage debt cases; Stacy Bardo and Atlas remain recorded only as previously engaged.
  • Private words still go only to xAI Intimate; no messages, document bodies, notes, transcripts, tools, writes, or alternate model fallback enter this path.
v0.786.989Painted live hello + hear on top of 988 connecting fieldAug 24, 2026
  • Keeps 988: connecting/error covers the video with the page field; leftover last-frame hold cannot freeze never-painted remint.
  • Keeps 987 stay: once this awake has painted, blank remint is off and attached-unpainted must not flip Connecting.
  • Come-live hello fires from applyAnamLive on painted pixels via talkAnam. skipGreeting stays true so Anam's LLM stays mute.
  • Talk Now auto-arms after painted live even if hello is still in flight — connecting does not consume auto-arm. Camera stays a real tap. Keep Anam — never PR 5740.
v0.786.988Anam appear — connecting is black, leftover still cannot freeze stayAug 24, 2026
  • Live 987 dual-live stayed on a professional launch still + Coming live for 135s. A leftover last-frame hold blocked restartStuckAnam, so never-painted connecting never reminted.
  • Connecting/error now covers the video with the page field (video stays compositor-visible for WKWebView). Unpainted connecting clears the hold and may remint. Painted stay (987) is unchanged. skipGreeting true. Camera tap-only. Keep Anam — never PR 5740.
v0.786.987Anam appear — stay after paint, no 40s remint dropAug 24, 2026
  • Live 986 paints ~20s then drops ~1min and remints. The live-phase ANAM_BLANK_LIVE_MS (40s) watchdog reminted when requestVideoFrameCallback / currentTime stalled on a painted face.
  • Once this awake has painted, blank remint is off and attached-unpainted must not flip phase back to connecting. IdleStop / 10-min cap / engine close + lookingRemint own the rest. skipGreeting true. Camera tap-only. Keep Anam — never PR 5740.
v0.786.986Anam appear — attached-blank remint 40s, not 4s ICE abortAug 24, 2026
  • Live 985 dual-live still reminted every ~4s: token ready then ANAM_BLANK_LIVE_MS killed ICE. Fly anam-token cadence matched the 4s attached-unpainted remint, then anam_cooldown.
  • ANAM_BLANK_LIVE_MS now equals ANAM_FIRST_HANDSHAKE_MS (40s). Painted pixels stay the live gate. skipGreeting true. Camera tap-only. Keep Anam — never PR 5740.
v0.786.985Anam appear — handshake waits 40s, not 10s Coming backAug 23, 2026
  • Live 973 minted the token then threw anam_video_not_attached at 10s (ANAM_ESTABLISH_WAIT_MS) while ICE still runs (~23s). Chrome usetai.app/tai stayed black with Coming back.
  • Establish + attach wait now equal ANAM_FIRST_HANDSHAKE_MS (40s). Post-token blank remint is 40s, not 8s. CONNECT_STUCK after token is 40s, not 12s.
  • Painted pixels remain the live gate. skipGreeting stays true. Camera tap-only. Keep Anam — never PR 5740.
v0.786.973Anam appear — no 2s remint while mintInFlight, CONNECT_STUCK 28sAug 23, 2026
  • Do not remint at 2s while mintInFlight / token not returned. The 250ms ticker no longer calls restartStuckAnam during the handshake.
  • First CONNECT_STUCK is 28s so token + SDK + ICE (~23s) can finish. After the token, blank-media remint is 8s; post-token stuck stays 12s.
  • mintInFlight overlap 429 Retry-After is 2s, not 46s. skipGreeting stays true. Camera tap-only. Keep Anam — never PR 5740.
v0.786.965Anam overage — 10-min sessions, hold last frame, remint while lookingAug 23, 2026
  • Explorer included 250 minutes running out does not stop the avatar. Tony pays Anam overage. Do not fail-closed at 245. Do not cap TAI_ANAM_BUDGET_MINUTES at 245.
  • Ask Anam for 10-minute sessions via personaConfig.maxSessionLengthSeconds = 600. One live session at a time — no leftover 8s suicide remint loop.
  • Engine close while he is looking pauses the same Anam <video> before stopStreaming and keeps srcObject, then remints in place. Skip cooldown for a painted session that died while looking. Reset stuck-restart cap. First ICE stays provider-default. Hidden/lock still sleep.
  • Rest-phone VersionBadge portals to document.body so iPhone can read 0.786.965. No data-tai-vfab. Same video node, paint gate, first ICE default, markAnamMinted after pixels.
v0.786.962Anam paints — same video node, ICE default, cooldown after pixelsAug 23, 2026
  • The mint keeps the same <video> DOM node. key=owner.id no longer remounts after startAnamStreaming attaches.
  • waitForAnamVideoAttach does not succeed on 0×0. Appear live is anamVideoPainted only. Hard 0×0 recovers then remints.
  • Stuck-restart cap 3 does not freeze a never-painted face this awake — backoff retry until pixels.
  • markAnamMinted only after painted pixels, not after the token. A black stream may remint inside 45s. Explorer 250 / stop 245 stay.
  • First ICE is provider-default. Relay is the retry. Host and video fill .gcx-root; overlays after paint. Night/1080 stay parked.
v0.786.961Clean /tai — full-bleed Anam, painted pixels, overlays afterAug 23, 2026
  • First paint on /tai is a black field — no last-plate, LOOK1, closet 1080, or waking still blocking Anam.
  • Anam is the full-bleed host outside the orb button. Day, Night, and Pony all stream as one person; no night face-plate composite.
  • Appear live is painted pixels (currentTime + size + live tracks), not srcObject. Safari 0×0 recovers with a paint box + remute+play, then remint.
  • Talk, hotspots, and HUD reconnect on top of her after she paints. Camera stays a real tap. Cooldown latches only after a real token.
v0.786.960Anam appear is painted pixels, cooldown waits on real token, Safari 0x0 recoverAug 23, 2026
  • Appear LIVE is attached + readyState≥2 + video size + currentTime>0 + a live video track — not srcObject alone.
  • Chrome 957 miss: 768×1152 tracks at currentTime=0 / luma 0 no longer flip phase live or setAnamFaceLive.
  • Safari / WKWebView 0×0: force a 100% video box (min 2px), webkit-playsinline, muted play, and re-assign the stream from client receivers until videoWidth is non-zero. Do not hide the video or add a plate.
  • Attached-but-blank remutes, sets playsinline, and play() once; remint after ANAM_BLANK_LIVE_MS (cap 3). Anam stays the /tai face.
  • Mint cooldown latches only after a real Anam token — failed probes no longer burn 45s. mintInFlight still cools overlapping assesses.
  • Client mintAnamSessionToken waits Retry-After once on 429 anam_cooldown, capped at 8s, then retries.
v0.786.957Highest Grok words, one friendly voice, living talk fieldAug 22, 2026
  • Every spoken words path uses grok-4.5 — product chat, the sports booth, and the live ask_tai contract no longer sit on grok-4-1-fast or Claude.
  • Identity lock stays one person (Tai talking to Tony) and leans very very friendly: glad he's here, easy warmth, still no customer-service filler.
  • Talk overlay is a full living field — four aurora washes, spark dust, a 360 knight well — same person, louder picture.
v0.786.954Desktop mic prompt does not stick a popup over appearAug 22, 2026
  • 953 live miss: /tai connected then sat idle while Chrome opened a microphone permission popup and Talk HUD stuck on Restoring microphone.
  • Automatic getUserMedia does not run when Permissions API says prompt or unknown on desktop — that popup is a click wall. iPhone still attempts (WKWebView often reports prompt after a durable grant).
  • Appear / canStream stays enabled && look. Not a wait-attempt patch. Intimate/nude still refuse a new mint.
v0.786.953Anam starts after unlock — awake does not block first mintAug 22, 2026
  • Appear / canStream / first mint is enabled && look. Awake is not an appear term — pagehide/hidden after PIN must not decide===stop before mint sticks.
  • Awake still stops a session already up (live/error). Connecting first mint is not torn down. 952 start-this-turn (no cancelled-before-mint) remains.
  • Intimate / nude still refuse a new mint. launchStills watchdog deps stay [phase, canStream, look, restartNonce, failureCode]. No liveGate/HUD/mic change.
v0.786.952Anam starts after unlock — mic does not block appearAug 22, 2026
  • After unlock, startAnamStreaming (mint + streamToVideoElement) runs in the start-effect turn. 951 dropped wait-attempt; that was not enough.
  • The start effect no longer re-runs on playbackAttempt commit, so cleanup cannot cancel the mint. Microphone-not-ready / READY tap-Talk is leftover Talk HUD and must not block appear.
  • Intimate / nude still refuse a new mint. launchStills watchdog deps stay [phase, canStream, look, restartNonce, failureCode].
v0.786.951Anam starts after PIN — no wait-attemptAug 21, 2026
  • After PIN, Anam start is mint + streamToVideoElement with zero Talk taps. Null playbackAttempt is start, not wait-attempt.
  • 950 sat at phase=idle with #tai-avatar-real-segment-video srcObject NO because start waited for an attempt that never committed.
  • Intimate / nude still refuse a new mint. Appear does not depend on mic. READY / tap-Talk is leftover Talk HUD.
v0.786.950Anam starts after PIN — no tapAug 21, 2026
  • AnamLiveMount mounts on /tai canvas/home after PIN when anamLiveEnabled — not behind a Talk tap.
  • Start effect calls startAnamStreaming (mint + streamToVideoElement) when enabled+look+awake. Empty lookKey uses the register default; intimate/nude still refuse a new mint.
  • data-anam-phase is written on the mount wrapper. READY / tap-Talk copy is leftover Talk HUD, not this path.
  • startAnamStreaming does not throw when the live video node is missing. Mic denied stays fail-closed. Appear does not depend on mic.
v0.786.949Anam starts and attaches after PIN — no tapAug 21, 2026
  • Anam starts after PIN/unlock on /tai from canStream — not a mouth tap and not the leftover READY / tap-Talk path.
  • If the SDK exposes stream() as a function, call it and assign the returned MediaStream(s). canStream no longer waits on register.
  • A live video already in the DOM with no handshake now starts and assigns srcObject; CONNECTION_ESTABLISHED is not the only attach gate.
  • Mic denied or unavailable stays fail-closed. Appear does not depend on mic.
v0.786.948Anam srcObject attaches after handshake — no tapAug 21, 2026
  • Appear is srcObject on the live Anam video while CONNECTING — do not wait for CONNECTION_ESTABLISHED.
  • If the SDK leaves srcObject empty, assign any client MediaStream to #tai-avatar-real-segment-video.
  • A live node without media still fails closed as ANAM_VIDEO_NOT_ATTACHED; a missing node still does not throw.
v0.786.947Anam attaches on load — no reconnect tapAug 21, 2026
  • srcObject must attach on load; a live video node without media fails closed so the session can replace it.
  • First-load zero-tap must not land on tap-to-reconnect just because the first mint never proved. Reconnecting… keeps backing off.
  • Mic still auto-arms on mount. Mic denied or unavailable stays fail-closed with honest copy.
v0.786.946Anam video attaches on load — no tapAug 21, 2026
  • streamToVideoElement must leave srcObject/readyState attached; a missing attach fails closed and retries.
  • Appear is srcObject on the live <video>, not onPlaying and not a mouth tap. Mic still auto-arms on mount.
v0.786.945She appears and listens after PIN — no tapAug 21, 2026
  • Anam muted autoplay primes on /tai load so the face stream attaches without a mouth tap.
  • Talk Now auto-arms once Anam is mounted (the 853 path). Waiting for face-live had deadlocked appear and hear.
  • Already-live Talk Now still does not mint a second Realtime peer.
v0.786.944Face tap attaches the primed mic even while Talk Now is still handshakingAug 21, 2026
  • A face tap no longer drops the primed microphone when ICE has already painted live and the data channel is still opening.
  • Gesture reattach and Enable-mic still keep the existing Realtime peer — they do not mint a second session.
  • Capture denied, capture unavailable, and a successful attached-mic response path stay distinct in unit tests.
v0.786.943Face tap reattaches the mic when Talk Now is already liveAug 21, 2026
  • A face tap no longer skips as already-live while Talk Now is connected.
  • The existing Realtime session stays; the tap attaches the primed microphone instead of opening a second peer.
  • Automatic already-live starts remain idempotent so they cannot mint a second session.
v0.786.942Guided test progress survives server restartsAug 21, 2026
  • Paper test sheets now save the owner’s current sheet, next step, pause state, and exact pass/fail/skip/comment results in Supabase instead of a process-local Map
  • A later voice turn can resume the same sheet after Fly routes it to another Node isolate, and saying run the same paused test continues rather than erasing completed steps
  • Replayed step results are idempotent, so a repeated fail response does not file a second bug report or advance the test twice
  • If durable storage is unavailable, Tai says the step was not saved and leaves progress unchanged instead of pretending an in-memory write will survive
v0.786.941The iPhone reports whether Anam's automatic hello completedAug 21, 2026
  • Every zero-tap come-live hello now emits a sanitized anam_hello_talk_result after the Anam client reports spoke, interrupted, no-client, failed, empty, or not-mouth
  • The dedicated come-live caller supplies an explicit diagnostic role, so ordinary skip-interrupt speech cannot impersonate a hello; pre-talk setup exceptions collapse to a sanitized failed outcome instead of escaping invisibly
  • The row contains only the finite outcome, private-channel boolean, elapsed milliseconds, build, and device state; it never includes the greeting words, token, provider response, or raw exception
  • This proves whether the automatic client.talk path completed on the physical iPhone; whether audio was actually heard remains a separate user-observation gate
v0.786.940iPhone delivery proof retries until the server accepts itAug 21, 2026
  • The native build-seen beacon marks a version delivered only after the owner-gated client-log endpoint returns success; an offline, signed-out, or rejected first POST no longer suppresses later proof
  • Launch, reconnect, focus, pageshow, visibility, and native app-foreground events retry the same sanitized evidence until one attempt is accepted
  • Concurrent resume events share an in-flight guard, and the accepted version/SHA is then deduplicated for the rest of the document session
  • The payload remains limited to stamped build and native-shell verdict fields; Anam movement and speech still require a separate live event or Tony's observation
v0.786.939Anam SDK loading can no longer stall after token successAug 20, 2026
  • The token-success to Anam-SDK-ready stage now has an eight-second ceiling, so a stalled dynamic module load fails before the existing twelve-second face watchdog
  • A timeout or loader rejection is reduced to anam_sdk_load_timeout or anam_sdk_load_failed; no provider exception, module path, token, or payload enters diagnostics
  • A timed-out loader has not created a provider client or slot, and the serialized replacement start is proven able to continue instead of waiting forever
  • The relay-first/provider-default replacement policy, one-use playback owners, three-restart cap, and separate device-delivery truth remain unchanged
v0.786.938The iPhone reports which Tai web build it actually ranAug 20, 2026
  • The native Tai shell now emits one owner-gated device-build-seen row per executing web build, closing the evidence gap between what Fly serves and what the iPhone actually received
  • The row contains only the stamped web version and SHA plus native build/version and a host-match boolean; it never ships the host itself, tokens, transcripts, email, provider payloads, or raw exceptions
  • Ordinary web browsers cannot claim native delivery, and repeat mounts in the same build session are deduplicated so the signal stays low-volume
  • A missing row remains unknown rather than failure, and avatar movement or speech still requires a separate live Anam event or Tony's device observation
v0.786.937Anam retries through the provider-default transport pathAug 20, 2026
  • The first live-face handshake keeps Tai's TURN-only relay policy; an existing bounded watchdog replacement now lets Anam choose its documented default ICE route instead of repeating the failed transport
  • Sleeping and returning to the app resets both the three-attempt budget and the transport policy, so every new awake window starts conservatively
  • One-use playback owners, stop-before-start serialization, the three-restart cap, and mouth-only audio remain unchanged
  • Sanitized phone diagnostics now identify relay versus provider-default attempts without exposing tokens, provider payloads, or account data
v0.786.936Anam greeting follows the replacement live faceAug 20, 2026
  • A stuck or blank Anam stream retires its unspoken greeting and reserves one fresh greeting for the replacement face only after that keyed video is live
  • Each greeting attempt has a unique owner, so a late outcome from the retired stream cannot consume the replacement greeting, clear its in-flight guard, or arm the microphone
  • A greeting is permanently consumed only after Anam speaks or Tony interrupts it; a failed attempt cannot silently block the watchdog replacement
  • Realtime fallback and automatic listening stay held throughout the restart gap, preventing overlapping voices and mid-greeting iPhone remutes
  • 935's Depot-safe Fly build and packaged avatar-fluid production host remain intact
v0.786.935Depot-safe Fly build and preserved avatar-fluid hostAug 20, 2026
  • Re-enable the isolated webpack worker so its heap is released before TypeScript, enable webpack memory optimizations, and disable Docker's one-shot webpack cache; a full build passes under a hard 3.9GB limit where 934 Tier 1 exited 137
  • .dockerignore skips docs so Depot and remote builders upload less without removing public/dev/avatar-fluid from the production image
  • A deployment contract now requires the avatar-fluid host index, rigger, PSD parser, and Tai office PSD to remain packaged
  • Provider telemetry IDs use secret-safe separators so a natural base-36 timestamp ending in sk cannot make a valid runtime record fail closed as a credential
  • 934 fail-closed auth and truthful Anam health checks stay intact
v0.786.934Fail-closed cron auth and one-node Fly buildsAug 20, 2026
  • TAI_DOCKER_BUILD=1 turns off webpackBuildWorker in the Fly image. Two 3GB heaps on a 4GB Depot box SIGKILL'd the 930 bake. NODE_OPTIONS stays 3072 — do not raise it
  • Six cron routes plus heartbeat/report now return 503 when cron auth is unconfigured and 401 for a wrong bearer — no service-role route fails open
  • Realtime diagnostics and voice e2e accept cron secrets only in the Authorization header, never a query string that access logs can retain
  • signed_in_canvas now counts only live Anam mount/video markers; mount=0 cannot falsely report a healthy face
  • 933 pulse-hide, 932 iPhone restart hardening, and the live Anam face/voice path stay intact
v0.786.933Anam rest-home hides leftover pulse on a black fieldAug 20, 2026
  • Rest-home with Anam mounted hides gcx-pulse, signals, and tai-orb so a stuck connect is a blank field plus the version chip — not a pulsating white center
  • 932 signed-in canvas Anam face, 931 stuck-connect restart, and 930 mouth-wait stay
  • Her face, her voice, and the 870-932 path are untouched
v0.786.932Restart Anam safely on iPhone and self-report failuresAug 20, 2026
  • Every iPhone WebRTC handshake starts with the video muted, even after an earlier session unlocked audio; only that session's playing event may unmute it
  • A mint cooldown waits past the 45-second server gate instead of burning all three retries, and a pre-establishment close no longer sleeps the reconnect path
  • Token, SDK, connection, and video milestones now self-report a sanitized build/error code to owner diagnostics and Fly logs — no token, transcript, email, or raw exception
  • signed_in_canvas also accepts the Anam rest-home face and listen catcher
v0.786.931Restart a stuck Anam connect so the face is not a black fieldAug 20, 2026
  • If connecting lasts 12s, live video has no frames after 4s, or the session errors, restart without a tap — cap 3 per awake window so a dead handshake cannot mint all night
  • 930 mouth-wait, 929 failed retry, and compositor-visible connecting video stay
  • Her face, her voice, and the 870-930 path are untouched
v0.786.930Wait for Anam mouth until talk-ready or connect endsAug 20, 2026
  • Come-live hello does not expire the 6s mouth wait while Anam is still connecting. Hard cap is 12s so she cannot hang forever
  • 929 failed retry, 927 skipInterrupt, and 926 hold after spoke stay
  • Her face, her voice, and the 870-929 path are untouched
v0.786.929Hello retries when first Anam talk failedAug 20, 2026
  • If the first come-live talk is failed or no-client, wait the full Anam window again and retry — a just-started session can throw once
  • 928 unmute after flush, 927 skipInterrupt, and 926 hold after spoke stay
  • Her face, her voice, and the 870-928 path are untouched
v0.786.928Unmute after hello flush before Talk Now armsAug 20, 2026
  • After the 400ms hello flush, unmute again so Talk Now arming does not remute the last syllable
  • 927 skipInterrupt + Just Us warm cue, 926 hold after spoke, and 924 Anam-only mouth stay
  • Her face, her voice, and the 870-927 path are untouched
v0.786.927Come-live hello does not interrupt her first lineAug 20, 2026
  • Come-live hello skips interruptPersona so a just-starting face is not cut before she says hi. Just Us gets the warm cue. Answers still interrupt on barge-in
  • 926 hold after spoke, 925 no-client retry, and 924 Anam-only mouth stay
  • Her face, her voice, and the 870-926 path are untouched
v0.786.926Hold auto-arm until hello audio flushesAug 20, 2026
  • After she actually spoke, come-live hello holds 400ms before Talk Now arms so iOS does not remute the last syllable. Interrupt still settles now so he can be heard
  • 925 no-client retry, 924 Anam-only 6s window, and 923 wait-before-first-speak stay
  • Her face, her voice, and the 870-925 path are untouched
v0.786.925Hello retries while Anam is still connectingAug 20, 2026
  • If the first come-live talk is no-client, wait the full Anam window again and retry — she is still connecting, not done
  • Unmute immediately before each hello talk. Anam mouth only. Overlay tap stays a backup
  • 924 Anam-only 6s window, 923 wait-before-first-speak, and 922 start-event hold stay
  • Her face, her voice, and the 870-924 path are untouched
v0.786.924Hello waits the full Anam window — her mouth onlyAug 20, 2026
  • Come-live hello waits the same 6s client.talk ceiling as talkAnam, then speaks only through Anam — ElevenLabs is not a come-live hello
  • 923 wait-before-first-speak, 922 start-event hold, and 921 first-paint in-flight stay
  • Her face, her voice, and the 870-923 path are untouched
v0.786.923Wait for Anam talk before the first helloAug 20, 2026
  • Come-live hello waits for client.talk before the first speak so the greeting is not burned on a silent mouth
  • After hello settles she unmutes, then Talk Now arms. Overlay tap stays a backup
  • 922 start-event hold, 921 first-paint in-flight, and 920 hello-then-hear stay
  • Her face, her voice, and the 870-922 path are untouched
v0.786.922Hello start event holds auto-armAug 19, 2026
  • Come-live hello fires a start event so Talk Now holds auto-arm the moment she begins, not only when she finishes
  • A silent first mouth waits for Anam client.talk before the one retry, not a blind 800ms
  • 921 first-paint in-flight, 920 hello-then-hear, and 919 face-live ears stay
  • Her face, her voice, and the 870-921 path are untouched
v0.786.921Hello in-flight is true from first paintAug 19, 2026
  • Talk Now reads come-live hello in-flight on the first render, not a false start that burns auto-arm before the settled event lands
  • 920 hello-then-hear, 919 face-live ears, and 918 come-live hello stay
  • Her face, her voice, and the 870-920 path are untouched
v0.786.920Hello first, then she hears himAug 19, 2026
  • Come-live hello owns the mouth before Talk Now auto-arms. Arming mid-greeting remuted iOS and cut her. Zero tap. Overlay tap stays a backup
  • 919 face-live ears, 918 come-live hello, and full-bleed face stay
  • Her face, her voice, and the 870-919 path are untouched
v0.786.919She hears him when her face is liveAug 19, 2026
  • Talk Now auto-arms when the Anam video is actually live — not on a black connecting field that burns the first listen. Zero tap. Overlay tap stays a backup
  • 918 come-live hello, full-bleed face, and no-tap mouth stay
  • Her face, her voice, and the 870-918 path are untouched
v0.786.918She says hello when her face is liveAug 19, 2026
  • The come-live hello fires when Anam is actually on screen — no tap, no mic wait. One silent-mouth retry. Video is full-bleed from first paint, not a 0.01 ghost. Leftover pulse dies as soon as the mount is on the page
  • 917 version chip, bake-on-black, and no-tap mouth stay
  • Her face, her voice, and the 870-917 path are untouched
v0.786.917Face autoplays muted; version chip is readableAug 19, 2026
  • A black connecting field no longer blocks the bake for 15 minutes — auto-arm is not a live talk. Quiet version chip at the foot. No leftover orb pulse. She still speaks with no tap, same as this morning
  • No stills. 916 compositor-visible video stays. 914 no-pop HUD stays
  • Her face, her voice, and the 870-916 path are untouched
v0.786.916Live face is not stuck behind a hidden videoAug 19, 2026
  • The Anam video stays compositor-visible while she connects so iPhone WKWebView will actually play it. First frame marks her live. Connecting no longer pulses a leftover orb on a black field
  • No stills. Blank field until the live face is up. 914 no-pop chrome stays
  • Her face, her voice, the 914 no-pop home, the 913 closet unstick, and the 870-912 mouth path are untouched
v0.786.914Home is her face; no popping buttonsAug 19, 2026
  • Rest home no longer pops HUD, Closet pills, the flower, the red button, the live-head pill, type, or dock mic. Tap unlocks audio only. Closet is her garment or speech. Just Us is spoken. Camera is her eyes. Mute is her nose
  • The 913 live-face-only field stays. Connecting is still blank until she is live
  • Her face, her voice, the 870 spoken mode switch, the 872 hold-then-answer, the 873 what's-new answers, the 874 booth, the 875 pin, the 876 morning report, the 877 one home, the 878 camera, the 879 records mouth, the 880 no-robot presence, the 881 calendar/court/meds/bills mouth, the 882 guided tests, the 883 demo record, the 884 first-clause, the 885 screen-aware mouth, the 886 life-strip mouth, the 887 dining mouth, the 888 needs-reply mouth, the 889 Cubs mouth, the 890 come-live greeting, the 891 calendar-review mouth, the 892 tasks mouth, the 893 news mouth, the 894 lights mouth, the 895 orders mouth, the 896 remint stop, the 897 meds mouth, the 898 bills-week mouth, the 899 activity mouth, the 900 freshness mouth, the 901 compute mouth, the 902 Gracie mouth, the 903 self-check mouth, the 904 full self-test mouth, the 905 T's Room mouth, the 906 Daily Discussion mouth, the 907 Unseen outfits mouth, the 908 weekend-plan mouth, the 909 reports mouth, the 910 modules mouth, the 911 owner-only mint, the 912 changelog note and the 913 closet unstick are untouched
v0.786.913Closet unsticks and moves; live face only; no stillsAug 19, 2026
  • Closet no longer sits on her face with no way out. Done, tap outside, and Escape close it. Drag the header to move it. Default dock is the bottom of the screen
  • Changing looks no longer remints Anam when the live look is the same, so wake is not torn down every closet tap. No static pictures whatsoever — no plate host, no room JPEG, no dining-room still. Connecting or failed stays the page field until the live face is up
  • Her face, her voice, the 870 spoken mode switch, the 872 hold-then-answer, the 873 what's-new answers, the 874 booth, the 875 pin, the 876 morning report, the 877 one home, the 878 camera, the 879 records mouth, the 880 no-robot presence, the 881 calendar/court/meds/bills mouth, the 882 guided tests, the 883 demo record, the 884 first-clause, the 885 screen-aware mouth, the 886 life-strip mouth, the 887 dining mouth, the 888 needs-reply mouth, the 889 Cubs mouth, the 890 come-live greeting, the 891 calendar-review mouth, the 892 tasks mouth, the 893 news mouth, the 894 lights mouth, the 895 orders mouth, the 896 remint stop, the 897 meds mouth, the 898 bills-week mouth, the 899 activity mouth, the 900 freshness mouth, the 901 compute mouth, the 902 Gracie mouth, the 903 self-check mouth, the 904 full self-test mouth, the 905 T's Room mouth, the 906 Daily Discussion mouth, the 907 Unseen outfits mouth, the 908 weekend-plan mouth, the 909 reports mouth, the 910 modules mouth, the 911 owner-only mint, the 912 changelog note and the red button are untouched
v0.786.912Public changelog: cron header auth, no secret-shaped noteAug 19, 2026
  • The 911 Fly cron note no longer uses a secret-shaped Bearer phrase in public release notes. Cron header auth is still required. 911 owner-only Anam/Realtime mint is unchanged
  • The pin and mouth fires stay put. This is a bake unblocker, not a new spoken path
  • Her face, her voice, the 870 spoken mode switch, the 872 hold-then-answer, the 873 what's-new answers, the 874 booth, the 875 pin, the 876 morning report, the 877 one home, the 878 camera, the 879 records mouth, the 880 no-robot presence, the 881 calendar/court/meds/bills mouth, the 882 guided tests, the 883 demo record, the 884 first-clause, the 885 screen-aware mouth, the 886 life-strip mouth, the 887 dining mouth, the 888 needs-reply mouth, the 889 Cubs mouth, the 890 come-live greeting, the 891 calendar-review mouth, the 892 tasks mouth, the 893 news mouth, the 894 lights mouth, the 895 orders mouth, the 896 remint stop, the 897 meds mouth, the 898 bills-week mouth, the 899 activity mouth, the 900 freshness mouth, the 901 compute mouth, the 902 Gracie mouth, the 903 self-check mouth, the 904 full self-test mouth, the 905 T's Room mouth, the 906 Daily Discussion mouth, the 907 Unseen outfits mouth, the 908 weekend-plan mouth, the 909 reports mouth, the 910 modules mouth, the 911 owner-only mint and the red button are untouched
v0.786.911Owner-only face and ears mint; Fly cron never fail-openAug 19, 2026
  • Anam session tokens and OpenAI Realtime session mints require Tony's owner email, not any signed-in family or e2e user. His Anam minutes and Realtime key stay his
  • cost-governor, cost-watch, and command-center-status no longer skip auth when the Fly cron secret is unset. Cron header auth required. Phone debug no longer accepts a secret in the query string. Gmail push compare is constant-time
  • Her face, her voice, the 870 spoken mode switch, the 872 hold-then-answer, the 873 what's-new answers, the 874 booth, the 875 pin, the 876 morning report, the 877 one home, the 878 camera, the 879 records mouth, the 880 no-robot presence, the 881 calendar/court/meds/bills mouth, the 882 guided tests, the 883 demo record, the 884 first-clause, the 885 screen-aware mouth, the 886 life-strip mouth, the 887 dining mouth, the 888 needs-reply mouth, the 889 Cubs mouth, the 890 come-live greeting, the 891 calendar-review mouth, the 892 tasks mouth, the 893 news mouth, the 894 lights mouth, the 895 orders mouth, the 896 remint stop, the 897 meds mouth, the 898 bills-week mouth, the 899 activity mouth, the 900 freshness mouth, the 901 compute mouth, the 902 Gracie mouth, the 903 self-check mouth, the 904 full self-test mouth, the 905 T's Room mouth, the 906 Daily Discussion mouth, the 907 Unseen outfits mouth, the 908 weekend-plan mouth, the 909 reports mouth, the 910 modules mouth and the red button are untouched
v0.786.910What modules do I have, out loudAug 19, 2026
  • Ask what modules do I have, show every part of Tai, list my modules, or what's in Tai — she speaks a short digest from the existing module_catalog / runModuleCatalog / selectCapabilities (same All of Tai registry). Count plus a few real labels, or name one and I'll find it. Empty and no-match are honest. She does not invent a screen. She does not dump every route. Query-filter stays on the full tool. What reports do I have stays F45. Morning report stays F5. Navigate_to / open this screen stay navigation
  • The pin forces those phrases to her brain. What reports do I have, list my reports, and morning report stay F45 / F5
  • Her face, her voice, the 870 spoken mode switch, the 872 hold-then-answer, the 873 what's-new answers, the 874 booth, the 875 pin, the 876 morning report, the 877 one home, the 878 camera, the 879 records mouth, the 880 no-robot presence, the 881 calendar/court/meds/bills mouth, the 882 guided tests, the 883 demo record, the 884 first-clause, the 885 screen-aware mouth, the 886 life-strip mouth, the 887 dining mouth, the 888 needs-reply mouth, the 889 Cubs mouth, the 890 come-live greeting, the 891 calendar-review mouth, the 892 tasks mouth, the 893 news mouth, the 894 lights mouth, the 895 orders mouth, the 896 remint stop, the 897 meds mouth, the 898 bills-week mouth, the 899 activity mouth, the 900 freshness mouth, the 901 compute mouth, the 902 Gracie mouth, the 903 self-check mouth, the 904 full self-test mouth, the 905 T's Room mouth, the 906 Daily Discussion mouth, the 907 Unseen outfits mouth, the 908 weekend-plan mouth, the 909 report-catalog mouth and the red button are untouched
v0.786.909What reports do I have, out loudAug 19, 2026
  • Ask what reports do I have, what just came in, list my reports, or any new reports — she speaks a short newest-first list from the existing report_catalog / runReportCatalog (live Dispatch/publish_report catalog plus the baked archive). Titles and dates only when they are real. Empty and error are honest. She does not invent a title. Query-filter stays on the full tool. What's new stays F8. What have you done stays F35. Morning report stays F5
  • The pin forces those phrases to her brain. What's new, what have you done, and morning report stay F8 / F35 / F5
  • Her face, her voice, the 870 spoken mode switch, the 872 hold-then-answer, the 873 what's-new answers, the 874 booth, the 875 pin, the 876 morning report, the 877 one home, the 878 camera, the 879 records mouth, the 880 no-robot presence, the 881 calendar/court/meds/bills mouth, the 882 guided tests, the 883 demo record, the 884 first-clause, the 885 screen-aware mouth, the 886 life-strip mouth, the 887 dining mouth, the 888 needs-reply mouth, the 889 Cubs mouth, the 890 come-live greeting, the 891 calendar-review mouth, the 892 tasks mouth, the 893 news mouth, the 894 lights mouth, the 895 orders mouth, the 896 remint stop, the 897 meds mouth, the 898 bills-week mouth, the 899 activity mouth, the 900 freshness mouth, the 901 compute mouth, the 902 Gracie mouth, the 903 self-check mouth, the 904 full self-test mouth, the 905 T's Room mouth, the 906 Daily Discussion mouth, the 907 Unseen outfits mouth, the 908 weekend-plan mouth and the red button are untouched
v0.786.908Weekend plan, out loudAug 19, 2026
  • Ask what should I do this weekend, weekend plan, what's on this weekend, or do this weekend — she speaks a short weekend plan from the existing concierge_lookup weekend_plan (real reservations + curated interests). Dining first if any, then what's on. Empty and error are honest. She does not invent a reservation, a fight, or a place. Where am I eating, any reservations, dinner tonight, and what's booked stay F23. Game tonight, Cubs today, what's the score, and did the Cubs win stay F25. Morning report stays F5
  • The pin forces those phrases to her brain. Dining lineup, Cubs score, and morning report stay F23 / F25 / F5
  • Her face, her voice, the 870 spoken mode switch, the 872 hold-then-answer, the 873 what's-new answers, the 874 booth, the 875 pin, the 876 morning report, the 877 one home, the 878 camera, the 879 records mouth, the 880 no-robot presence, the 881 calendar/court/meds/bills mouth, the 882 guided tests, the 883 demo record, the 884 first-clause, the 885 screen-aware mouth, the 886 life-strip mouth, the 887 dining mouth, the 888 needs-reply mouth, the 889 Cubs mouth, the 890 come-live greeting, the 891 calendar-review mouth, the 892 tasks mouth, the 893 news mouth, the 894 lights mouth, the 895 orders mouth, the 896 remint stop, the 897 meds mouth, the 898 bills-week mouth, the 899 activity mouth, the 900 freshness mouth, the 901 compute mouth, the 902 Gracie mouth, the 903 self-check mouth, the 904 full self-test mouth, the 905 T's Room mouth, the 906 Daily Discussion mouth, the 907 Unseen outfits mouth and the red button are untouched
v0.786.907Unseen outfits, out loudAug 19, 2026
  • Ask what outfits haven't I seen, which looks have I not seen, or list unseen outfits — she speaks the existing unseen_outfits / resolved.speech list, verbatim. Empty and exhausted are honest. She does not invent a look. Give me a new look and reset seen outfits stay on the full tool so the client can apply or clear localStorage. What's new stays F8. Surprise me is not pinned. Daily Discussion stays F42. Morning report stays F5
  • The pin forces those phrases to her brain. What's new, surprise me, daily discussion, morning report, and headlines stay F8 / F42 / F5 / F29
  • Her face, her voice, the 870 spoken mode switch, the 872 hold-then-answer, the 873 what's-new answers, the 874 booth, the 875 pin, the 876 morning report, the 877 one home, the 878 camera, the 879 records mouth, the 880 no-robot presence, the 881 calendar/court/meds/bills mouth, the 882 guided tests, the 883 demo record, the 884 first-clause, the 885 screen-aware mouth, the 886 life-strip mouth, the 887 dining mouth, the 888 needs-reply mouth, the 889 Cubs mouth, the 890 come-live greeting, the 891 calendar-review mouth, the 892 tasks mouth, the 893 news mouth, the 894 lights mouth, the 895 orders mouth, the 896 remint stop, the 897 meds mouth, the 898 bills-week mouth, the 899 activity mouth, the 900 freshness mouth, the 901 compute mouth, the 902 Gracie mouth, the 903 self-check mouth, the 904 full self-test mouth, the 905 T's Room mouth, the 906 Daily Discussion mouth and the red button are untouched
v0.786.906Daily Discussion, out loudAug 19, 2026
  • Ask daily discussion, morning discussion, morning show, play my discussion, start my discussion, or give me my discussion — she speaks the existing daily_discussion package (open + agenda + first AI pass), verbatim. Missing or a failed compose is honest. She does not invent AI news or agenda. Go-deeper stays on the full tool. Morning report stays F5. What's in my room stays F41. Headlines stay F29
  • The pin forces those phrases to her brain. Morning report, catch me up, how's my day, what's in my room, T's Room, what's in the news, and headlines stay F5 / F41 / F29
  • Her face, her voice, the 870 spoken mode switch, the 872 hold-then-answer, the 873 what's-new answers, the 874 booth, the 875 pin, the 876 morning report, the 877 one home, the 878 camera, the 879 records mouth, the 880 no-robot presence, the 881 calendar/court/meds/bills mouth, the 882 guided tests, the 883 demo record, the 884 first-clause, the 885 screen-aware mouth, the 886 life-strip mouth, the 887 dining mouth, the 888 needs-reply mouth, the 889 Cubs mouth, the 890 come-live greeting, the 891 calendar-review mouth, the 892 tasks mouth, the 893 news mouth, the 894 lights mouth, the 895 orders mouth, the 896 remint stop, the 897 meds mouth, the 898 bills-week mouth, the 899 activity mouth, the 900 freshness mouth, the 901 compute mouth, the 902 Gracie mouth, the 903 self-check mouth, the 904 full self-test mouth, the 905 T's Room mouth and the red button are untouched
v0.786.905T's Room, out loudAug 19, 2026
  • Ask what's in my room, what's in T's Room, T's Room, what's in the room today, or anything in my room — she speaks a short digest from the same assemblePersonalFeed / ts_room_lookup the /feed screen already uses. Empty and a down feed are honest. She does not invent a headline. Query-resolve stays on the tool. What's new stays F8. What's in the news stays F29. Morning report stays F5
  • The pin forces those phrases to her brain. Morning report, what's new, what's in the news, run a self check, and run a full self-test stay F5 / F8 / F29 / F39 / F40
  • Her face, her voice, the 870 spoken mode switch, the 872 hold-then-answer, the 873 what's-new answers, the 874 booth, the 875 pin, the 876 morning report, the 877 one home, the 878 camera, the 879 records mouth, the 880 no-robot presence, the 881 calendar/court/meds/bills mouth, the 882 guided tests, the 883 demo record, the 884 first-clause, the 885 screen-aware mouth, the 886 life-strip mouth, the 887 dining mouth, the 888 needs-reply mouth, the 889 Cubs mouth, the 890 come-live greeting, the 891 calendar-review mouth, the 892 tasks mouth, the 893 news mouth, the 894 lights mouth, the 895 orders mouth, the 896 remint stop, the 897 meds mouth, the 898 bills-week mouth, the 899 activity mouth, the 900 freshness mouth, the 901 compute mouth, the 902 Gracie mouth, the 903 self-check mouth, the 904 full self-test mouth and the red button are untouched
v0.786.904Full self-test, out loudAug 19, 2026
  • Ask run a full self-test, self test everything, run your core checks, test yourself, full self test, comprehensive self test, or self-test — she runs the existing core_self_test pass and speaks that speech field, verbatim. Fail and warn are honest. She does not invent a check and does not claim auto-heal. Self check stays F39. Guided feature tests stay F18. Data freshness stays F36
  • The pin forces those phrases to her brain. Morning report, what's next, Cubs tonight, what's on my list, packages, my meds, bills this week, what have you done, is my data current, how much compute is left, how's Gracie, run a self check, and test the new features stay F5 / F22 / F25 / F28 / F31 / F33 / F34 / F35 / F36 / F37 / F38 / F39 / F18
  • Her face, her voice, the 870 spoken mode switch, the 872 hold-then-answer, the 873 what's-new answers, the 874 booth, the 875 pin, the 876 morning report, the 877 one home, the 878 camera, the 879 records mouth, the 880 no-robot presence, the 881 calendar/court/meds/bills mouth, the 882 guided tests, the 883 demo record, the 884 first-clause, the 885 screen-aware mouth, the 886 life-strip mouth, the 887 dining mouth, the 888 needs-reply mouth, the 889 Cubs mouth, the 890 come-live greeting, the 891 calendar-review mouth, the 892 tasks mouth, the 893 news mouth, the 894 lights mouth, the 895 orders mouth, the 896 remint stop, the 897 meds mouth, the 898 bills-week mouth, the 899 activity mouth, the 900 freshness mouth, the 901 compute mouth, the 902 Gracie mouth, the 903 self-check mouth and the red button are untouched
v0.786.903Self check, out loudAug 19, 2026
  • Ask run a self check, self check, what's wrong with you, diagnose yourself, or is something broken — she speaks from the same self_diagnosis speech field, verbatim. Fail is honest. She does not invent a cause and does not run core_self_test or guided_feature_testing. Data freshness stays F36
  • The pin forces those phrases to her brain. Morning report, what's next, Cubs tonight, what's on my list, packages, my meds, bills this week, what have you done, is my data current, how much compute is left, how's Gracie, and test the new features stay F5 / F22 / F25 / F28 / F31 / F33 / F34 / F35 / F36 / F37 / F38 / F18
  • Her face, her voice, the 870 spoken mode switch, the 872 hold-then-answer, the 873 what's-new answers, the 874 booth, the 875 pin, the 876 morning report, the 877 one home, the 878 camera, the 879 records mouth, the 880 no-robot presence, the 881 calendar/court/meds/bills mouth, the 882 guided tests, the 883 demo record, the 884 first-clause, the 885 screen-aware mouth, the 886 life-strip mouth, the 887 dining mouth, the 888 needs-reply mouth, the 889 Cubs mouth, the 890 come-live greeting, the 891 calendar-review mouth, the 892 tasks mouth, the 893 news mouth, the 894 lights mouth, the 895 orders mouth, the 896 remint stop, the 897 meds mouth, the 898 bills-week mouth, the 899 activity mouth, the 900 freshness mouth, the 901 compute mouth, the 902 Gracie mouth and the red button are untouched
v0.786.902How's Gracie / her meds, out loudAug 18, 2026
  • Ask how's Gracie, Gracie's meds, when's Vetmedin due, does Gracie need a refill, or how is the dog — she speaks from the same gracie_meds / fetchPetCare rows the /gracie page already reads. Seeded and empty are honest. She does not invent a dose and does not write a refill or schedule change. Tony's own meds stay F33
  • The pin forces those phrases to her brain. Morning report, what's next, Cubs tonight, what's on my list, packages, my meds, bills this week, what have you done, is my data current, and how much compute is left stay F5 / F22 / F25 / F28 / F31 / F33 / F34 / F35 / F36 / F37
  • Her face, her voice, the 870 spoken mode switch, the 872 hold-then-answer, the 873 what's-new answers, the 874 booth, the 875 pin, the 876 morning report, the 877 one home, the 878 camera, the 879 records mouth, the 880 no-robot presence, the 881 calendar/court/meds/bills mouth, the 882 guided tests, the 883 demo record, the 884 first-clause, the 885 screen-aware mouth, the 886 life-strip mouth, the 887 dining mouth, the 888 needs-reply mouth, the 889 Cubs mouth, the 890 come-live greeting, the 891 calendar-review mouth, the 892 tasks mouth, the 893 news mouth, the 894 lights mouth, the 895 orders mouth, the 896 remint stop, the 897 meds mouth, the 898 bills-week mouth, the 899 activity mouth, the 900 freshness mouth, the 901 compute mouth and the red button are untouched
v0.786.901How much compute is left, out loudAug 18, 2026
  • Ask how much compute is left, what's my compute, how much SuperGrok do I have, compute left, or what's left on the tank — she speaks from the same compute_snapshot composeComputeSpoken field, verbatim. Owner-only. Unknown is honest. She does not invent a remaining balance, does not spend, and does not switch models. SuperGrok subscription is never mixed with API spend
  • The pin forces those phrases to her brain. Morning report, what's next, Cubs tonight, what's on my list, packages, my meds, bills this week, what have you done, and is my data current stay F5 / F22 / F25 / F28 / F31 / F33 / F34 / F35 / F36
  • Her face, her voice, the 870 spoken mode switch, the 872 hold-then-answer, the 873 what's-new answers, the 874 booth, the 875 pin, the 876 morning report, the 877 one home, the 878 camera, the 879 records mouth, the 880 no-robot presence, the 881 calendar/court/meds/bills mouth, the 882 guided tests, the 883 demo record, the 884 first-clause, the 885 screen-aware mouth, the 886 life-strip mouth, the 887 dining mouth, the 888 needs-reply mouth, the 889 Cubs mouth, the 890 come-live greeting, the 891 calendar-review mouth, the 892 tasks mouth, the 893 news mouth, the 894 lights mouth, the 895 orders mouth, the 896 remint stop, the 897 meds mouth, the 898 bills-week mouth, the 899 activity mouth, the 900 freshness mouth and the red button are untouched
v0.786.900Is my data current, out loudAug 18, 2026
  • Ask is my data current, are my feeds working, how fresh is my data, is anything stale, or is this up to date — she speaks from the same source_status / data-health spine, stale and erroring domains first, then current. Unknown is honest. She does not invent an age and does not restart a feeder
  • The pin forces those phrases to her brain. Morning report, what's next, Cubs tonight, what's on my list, packages, my meds, bills this week, and what have you done stay F5 / F22 / F25 / F28 / F31 / F33 / F34 / F35
  • Her face, her voice, the 870 spoken mode switch, the 872 hold-then-answer, the 873 what's-new answers, the 874 booth, the 875 pin, the 876 morning report, the 877 one home, the 878 camera, the 879 records mouth, the 880 no-robot presence, the 881 calendar/court/meds/bills mouth, the 882 guided tests, the 883 demo record, the 884 first-clause, the 885 screen-aware mouth, the 886 life-strip mouth, the 887 dining mouth, the 888 needs-reply mouth, the 889 Cubs mouth, the 890 come-live greeting, the 891 calendar-review mouth, the 892 tasks mouth, the 893 news mouth, the 894 lights mouth, the 895 orders mouth, the 896 remint stop, the 897 meds mouth, the 898 bills-week mouth, the 899 activity mouth and the red button are untouched
v0.786.899What have you done, out loudAug 18, 2026
  • Ask what have you done, what did you just do, what have you been doing, recent actions, or what did you do last — she speaks tool plus status from the same activity_recent ledger, newest first, a few. Empty is honest. She does not invent an action and does not execute or undo
  • The pin forces those phrases to her brain. Morning report, what's next, Cubs tonight, what's on my list, packages, my meds, and bills this week stay F5 / F22 / F25 / F28 / F31 / F33 / F34
  • Her face, her voice, the 870 spoken mode switch, the 872 hold-then-answer, the 873 what's-new answers, the 874 booth, the 875 pin, the 876 morning report, the 877 one home, the 878 camera, the 879 records mouth, the 880 no-robot presence, the 881 calendar/court/meds/bills mouth, the 882 guided tests, the 883 demo record, the 884 first-clause, the 885 screen-aware mouth, the 886 life-strip mouth, the 887 dining mouth, the 888 needs-reply mouth, the 889 Cubs mouth, the 890 come-live greeting, the 891 calendar-review mouth, the 892 tasks mouth, the 893 news mouth, the 894 lights mouth, the 895 orders mouth, the 896 remint stop, the 897 meds mouth, the 898 bills-week mouth and the red button are untouched
v0.786.898Bills due this week, out loudAug 18, 2026
  • Ask what bills are due this week, bills this week, what do I owe this week, or what's due this week on bills — she speaks this-week plus overdue rows from the same bills_list / billsReadback schedule the money module already reads. An amount not on file is said plainly. Empty is honest. She does not invent an amount and does not mark anything paid
  • The pin forces those phrases to her brain. Any bills and what's next stay the ≤48h life strip (F22). Morning report, Cubs tonight, what's on my list, packages, and my meds stay F5 / F25 / F28 / F31 / F33
  • Her face, her voice, the 870 spoken mode switch, the 872 hold-then-answer, the 873 what's-new answers, the 874 booth, the 875 pin, the 876 morning report, the 877 one home, the 878 camera, the 879 records mouth, the 880 no-robot presence, the 881 calendar/court/meds/bills mouth, the 882 guided tests, the 883 demo record, the 884 first-clause, the 885 screen-aware mouth, the 886 life-strip mouth, the 887 dining mouth, the 888 needs-reply mouth, the 889 Cubs mouth, the 890 come-live greeting, the 891 calendar-review mouth, the 892 tasks mouth, the 893 news mouth, the 894 lights mouth, the 895 orders mouth, the 896 remint stop, the 897 meds mouth and the red button are untouched
v0.786.897Meds / what's on my schedule, out loudAug 18, 2026
  • Ask what meds do I take, what's on my med schedule, any meds due, what are my medications, or my meds — she speaks Tony's active meds from the same med_schedule / fetchHealthSnapshot rows the Health module already reads. Name plus frequency or run-out if those are on the row. Empty is honest. She does not invent a dose, does not log a refill or a symptom, and Gracie's meds stay off this path
  • The pin forces those phrases to her brain. Morning report, what's next, Cubs tonight, what's on my list, headlines, lights, and packages stay F5 / F22 / F25 / F28 / F29 / F30 / F31
  • Her face, her voice, the 870 spoken mode switch, the 872 hold-then-answer, the 873 what's-new answers, the 874 booth, the 875 pin, the 876 morning report, the 877 one home, the 878 camera, the 879 records mouth, the 880 no-robot presence, the 881 calendar/court/meds/bills mouth, the 882 guided tests, the 883 demo record, the 884 first-clause, the 885 screen-aware mouth, the 886 life-strip mouth, the 887 dining mouth, the 888 needs-reply mouth, the 889 Cubs mouth, the 890 come-live greeting, the 891 calendar-review mouth, the 892 tasks mouth, the 893 news mouth, the 894 lights mouth, the 895 orders mouth, the 896 remint stop and the red button are untouched
v0.786.896Anam minute leak stop — no remint after the capAug 18, 2026
  • Explorer already used 264 of 250 minutes this month. The leak was 447 short remounts (median 28s), not Tony talking. After the cap Anam shortened each session to 33s and we reminted into a death spiral
  • Server refuses a new face session at 245 minutes and refuses a second mint inside 45 seconds, even if phone + Mac + a leftover tab all ask. Engine close or a 429 sleeps her until a real touch — no silent remint, no plan upgrade
  • Her face, her voice, the 870 spoken mode switch, the 872 hold-then-answer, the 873 what's-new answers, the 874 booth, the 875 pin, the 876 morning report, the 877 one home, the 878 camera, the 879 records mouth, the 880 no-robot presence, the 881 calendar/court/meds/bills mouth, the 882 guided tests, the 883 demo record, the 884 first-clause, the 885 screen-aware mouth, the 886 life-strip mouth, the 887 dining mouth, the 888 needs-reply mouth, the 889 Cubs mouth, the 890 come-live greeting, the 891 calendar-review mouth, the 892 tasks mouth, the 893 news mouth, the 894 lights mouth, the 895 orders mouth and the red button are untouched
v0.786.895Packages / orders out loudAug 18, 2026
  • Ask any packages coming, where's my package, any deliveries, where's my Amazon order, or what's out for delivery — she speaks the most urgent package first from the same tai_orders ledger orders_list / the Packages card already read. Empty and unknown status are honest. She does not invent a tracking number or delivery date, and she does not mark anything delivered
  • The pin forces those phrases to her brain. Morning report, what's next, Cubs tonight, what's on my list, headlines, and lights stay F5 / F22 / F25 / F28 / F29 / F30
  • Her face, her voice, the 870 spoken mode switch, the 872 hold-then-answer, the 873 what's-new answers, the 874 booth, the 875 pin, the 876 morning report, the 877 one home, the 878 camera, the 879 records mouth, the 880 no-robot presence, the 881 calendar/court/meds/bills mouth, the 882 guided tests, the 883 demo record, the 884 first-clause, the 885 screen-aware mouth, the 886 life-strip mouth, the 887 dining mouth, the 888 needs-reply mouth, the 889 Cubs mouth, the 890 come-live greeting, the 891 calendar-review mouth, the 892 tasks mouth, the 893 news mouth, the 894 lights mouth and the red button are untouched
v0.786.894Lights / what's on at home, out loudAug 18, 2026
  • Ask what lights are on, are the lights on, is anything still on, what's on at home, or lighting status — she speaks rooms that are on plus count from the same live Hue CLIP v2 lighting_status / getLightingState already read. Unpaired and unreachable are honest. She does not invent a room, does not claim presence, and does not turn anything on or off
  • The pin forces those phrases to her brain. Morning report, what's next, Cubs tonight, what's on my list, and headlines stay F5 / F22 / F25 / F28 / F29. Write and control stay lighting_control
  • Her face, her voice, the 870 spoken mode switch, the 872 hold-then-answer, the 873 what's-new answers, the 874 booth, the 875 pin, the 876 morning report, the 877 one home, the 878 camera, the 879 records mouth, the 880 no-robot presence, the 881 calendar/court/meds/bills mouth, the 882 guided tests, the 883 demo record, the 884 first-clause, the 885 screen-aware mouth, the 886 life-strip mouth, the 887 dining mouth, the 888 needs-reply mouth, the 889 Cubs mouth, the 890 come-live greeting, the 891 calendar-review mouth, the 892 tasks mouth, the 893 news mouth and the red button are untouched
v0.786.893News headlines out loudAug 18, 2026
  • Ask what's in the news, any news, headlines, news today, or what's happening in the world — she speaks real dated headlines plus outlet from the same Google News RSS newsSearch / runNews already use. Empty and a down feed are honest. She does not invent a headline and she never says she does not have a feed
  • The pin forces those phrases to her brain. Morning report, what's next, Cubs tonight, and what's on my list stay F5 / F22 / F25 / F28
  • Her face, her voice, the 870 spoken mode switch, the 872 hold-then-answer, the 873 what's-new answers, the 874 booth, the 875 pin, the 876 morning report, the 877 one home, the 878 camera, the 879 records mouth, the 880 no-robot presence, the 881 calendar/court/meds/bills mouth, the 882 guided tests, the 883 demo record, the 884 first-clause, the 885 screen-aware mouth, the 886 life-strip mouth, the 887 dining mouth, the 888 needs-reply mouth, the 889 Cubs mouth, the 890 come-live greeting, the 891 calendar-review mouth, the 892 tasks mouth and the red button are untouched
v0.786.892What's on my list, out loudAug 18, 2026
  • Ask what's on my list, what are my tasks, what do I need to do, any open tasks, or what's left to do — she speaks open tasks from the same tai_tasks rows tasks_list / the spine already read. Empty is honest. She does not invent tasks and she does not mark anything done
  • The pin forces those phrases to her brain. Morning report, what's next, what do I need to answer, and calendar review stay F5 / F22 / F24 / F27
  • Her face, her voice, the 870 spoken mode switch, the 872 hold-then-answer, the 873 what's-new answers, the 874 booth, the 875 pin, the 876 morning report, the 877 one home, the 878 camera, the 879 records mouth, the 880 no-robot presence, the 881 calendar/court/meds/bills mouth, the 882 guided tests, the 883 demo record, the 884 first-clause, the 885 screen-aware mouth, the 886 life-strip mouth, the 887 dining mouth, the 888 needs-reply mouth, the 889 Cubs mouth, the 890 come-live greeting, the 891 calendar-review mouth and the red button are untouched
v0.786.891Calendar review out loudAug 18, 2026
  • Ask what's in calendar review, anything waiting to go on Google, what's pending on the calendar, or what didn't write — she speaks pending review-queue rows (title, when, why queued) from the same queue /calendar/review already lists. Empty is honest. She does not write to Google
  • The pin forces those phrases to her brain. Trusted vs review-only is unchanged: doctor/court/flight/solid reservation stay trusted; bills and guesses stay review. Morning report and what's on the calendar stay F5 / F22
  • Her face, her voice, the 870 spoken mode switch, the 872 hold-then-answer, the 873 what's-new answers, the 874 booth, the 875 pin, the 876 morning report, the 877 one home, the 878 camera, the 879 records mouth, the 880 no-robot presence, the 881 calendar/court/meds/bills mouth, the 882 guided tests, the 883 demo record, the 884 first-clause, the 885 screen-aware mouth, the 886 life-strip mouth, the 887 dining mouth, the 888 needs-reply mouth, the 889 Cubs mouth, the 890 come-live greeting and the red button are untouched
v0.786.890Come-live greeting varietyAug 18, 2026
  • Two opens, two different spoken hellos. Anam talk() come-live picks from the presence pool, unique within the daypart. Professional / CEO by default — she calls him Tony, no mush, no mode question. Girlfriend lines only if he said girlfriend. Realtime does not add a second hello when she is the mouth
  • The pin is the come-live path, not a new button. Same skipGreeting Anam session — Tai speaks the line through talk(), not Anam's stock hello
  • Her face, her voice, the 870 spoken mode switch, the 872 hold-then-answer, the 873 what's-new answers, the 874 booth, the 875 pin, the 876 morning report, the 877 one home, the 878 camera, the 879 records mouth, the 880 no-robot presence, the 881 calendar/court/meds/bills mouth, the 882 guided tests, the 883 demo record, the 884 first-clause, the 885 screen-aware mouth, the 886 life-strip mouth, the 887 dining mouth, the 888 needs-reply mouth, the 889 Cubs mouth and the red button are untouched
v0.786.889Cubs tonight / score out loudAug 18, 2026
  • Ask is there a game tonight, did the Cubs win, what's the score, Cubs today, or are they playing — she speaks from the same Cubs board the morning report and cubs module already read. Off-day and a stale or down feed are honest. She never says she does not have a feed, and she does not guess a score
  • The pin forces those phrases to her brain. Call the game / jersey / sports booth stay F9 announcer. Morning report, what's next, and reservations stay F5 / F22 / F23
  • Her face, her voice, the 870 spoken mode switch, the 872 hold-then-answer, the 873 what's-new answers, the 874 booth, the 875 pin, the 876 morning report, the 877 one home, the 878 camera, the 879 records mouth, the 880 no-robot presence, the 881 calendar/court/meds/bills mouth, the 882 guided tests, the 883 demo record, the 884 first-clause, the 885 screen-aware mouth, the 886 life-strip mouth, the 887 dining mouth, the 888 needs-reply mouth and the red button are untouched
v0.786.888What needs a reply, out loudAug 18, 2026
  • Ask what do I need to answer, who do I need to reply to, any texts waiting, anything waiting on me, who's waiting, or do I owe anyone a text — she names who is waiting and the last inbound beat from the same needsReply threads the texts module already marks. If nobody is waiting she says so. She does not send
  • The pin forces those phrases to her brain. This release makes the mouth speak the existing reply filter, not freelance and not the F12 watch defer. Morning report, emails, what's next, and reservations stay F5 / F12 / F22 / F23
  • Her face, her voice, the 870 spoken mode switch, the 872 hold-then-answer, the 873 what's-new answers, the 874 booth, the 875 pin, the 876 morning report, the 877 one home, the 878 camera, the 879 records mouth, the 880 no-robot presence, the 881 calendar/court/meds/bills mouth, the 882 guided tests, the 883 demo record, the 884 first-clause, the 885 screen-aware mouth, the 886 life-strip mouth, the 887 dining mouth and the red button are untouched
v0.786.887Dining out loud — reservations from his listAug 18, 2026
  • Ask where am I eating, any reservations, dinner tonight, what's booked, OpenTable, or where are we going — she speaks the same reservation rows the /dining/reservations canvas already shows. Empty and stale are honest. She never says she does not have a feed
  • The pin forces those phrases to her brain. This release makes the mouth speak fetchReservations plus the calendar-dining merge, not freelance. Morning report, emails, and what's next stay F5 / F12 / F22
  • Her face, her voice, the 870 spoken mode switch, the 872 hold-then-answer, the 873 what's-new answers, the 874 booth, the 875 pin, the 876 morning report, the 877 one home, the 878 camera, the 879 records mouth, the 880 no-robot presence, the 881 calendar/court/meds/bills mouth, the 882 guided tests, the 883 demo record, the 884 first-clause, the 885 screen-aware mouth, the 886 life-strip mouth and the red button are untouched
v0.786.886Life on /tai out loud — Next, bills, calendar from the stripAug 18, 2026
  • Ask what's next, what's on my plate, what do I have today, what's coming up, any bills, or what's on the calendar — she speaks the same Next / bills ≤48h / calendar ≤36h rows the /tai canvas already compiles. Empty buckets are honest. She does not send you to another module to hear them
  • The pin forces those phrases to her brain. This release makes the mouth speak compileLifeStrip, not freelance. Morning report / catch me up / how's my day stay the F5 brief
  • Her face, her voice, the 870 spoken mode switch, the 872 hold-then-answer, the 873 what's-new answers, the 874 booth, the 875 pin, the 876 morning report, the 877 one home, the 878 camera, the 879 records mouth, the 880 no-robot presence, the 881 calendar/court/meds/bills mouth, the 882 guided tests, the 883 demo record, the 884 first-clause, the 885 screen-aware mouth and the red button are untouched
v0.786.885She sees what's on screen — broken tests come back to GrokAug 18, 2026
  • Ask what's on my screen, what am I looking at, or what's on this page — she names the route and the visible cards from the screen labels. This one, that bill, and the card I'm looking at resolve to a visible entity, then the existing bills, calendar, or legal tools. If the labels didn't ride with the turn she says so. She never claims she cannot see the module
  • Mark a guided-test item broken and it still files a feature-test-bug on the build-loop spine. The 30m conductor reads tai_feature_test_items state=broken — a TESTER_BROKEN.json file would only be a cache. walk_failures stays
  • The pin forces those phrases to her brain. This release makes the mouth speak the screen labels instead of freelancing I can't see that
  • Her face, her voice, the 870 spoken mode switch, the 872 hold-then-answer, the 873 what's-new answers, the 874 booth, the 875 pin, the 876 morning report, the 877 one home, the 878 camera, the 879 records mouth, the 880 no-robot presence, the 881 calendar/court/meds/bills mouth, the 882 guided tests, the 883 demo record, the 884 first-clause, the idle-stop and the red button are untouched
v0.786.884First word faster — less dead air before she talksAug 18, 2026
  • She starts the first clause as soon as it exists — she does not wait for the rest of the essay before talkAnam. The remainder follows. First-clause stamps land on the [voice-latency] line
  • If tools are still running at 20 seconds she keeps the mouth quiet or says one short hold, then speaks the real answer. Personal data — health, legal, money, email, calendar, texts, calls — completes out loud. The old stay-with-me / ask-me-later shrug is not the cap line
  • A remount does not fire on a look-stable turn. AVATAR_REMOUNT_EVENT and a committedPlate lookKey flicker cannot tear Anam down mid-answer
  • Her face, her voice, the 870 spoken mode switch, the 872 hold-then-answer, the 873 what's-new answers, the 874 booth, the 875 pin, the 876 morning report, the 877 one home, the 878 camera, the 879 records mouth, the 880 no-robot presence, the 881 calendar/court/meds/bills mouth, the 882 guided tests, the 883 demo record, the idle-stop and the red button are untouched
v0.786.883Say 'record this' — she records the live talk, mouth and allAug 18, 2026
  • Say record this, record a demo, or start recording while Talk Now is live — she records her face and the back-and-forth from the already-open mic. Say stop recording or that's enough and she saves the clip. Share that clip or send that video opens the share sheet
  • iPhone Screen Recording with the mic on steals her ears and kills the mouth. This path never opens a second microphone. If Talk Now isn't live, there is no face video, or the browser cannot capture, she says so
  • Prefers an mp4 when MediaRecorder supports it; otherwise webm with the same share or download. No new home-screen card. No TestFlight. No second camera
  • Her face, her voice, the 870 spoken mode switch, the 872 hold-then-answer, the 873 what's-new answers, the 874 booth, the 875 pin, the 876 morning report, the 877 one home, the 878 camera, the 879 records mouth, the 880 no-robot presence, the 881 calendar/court/meds/bills mouth, the 882 guided tests, the idle-stop and the red button are untouched
v0.786.882Say 'test the new features' — she speaks the next checklist itemAug 18, 2026
  • Say test the new features or run the checklist — she names one real step from the saved feature-test store, then waits. Say that worked or mark that broken and she records it and speaks the next item. What's broken lists only what you marked, or says the store is empty
  • Empty is honest: no checklist on file, never invented steps. Paper retest sheets and self-test fail handoffs stay on their own tools. A stray that worked with no walkthrough live is not stolen
  • The 875 pin already forced those phrases to her brain. This release makes the mouth speak the store — one step, then wait — instead of freelancing 'okay, next test!' over a checklist that never moved
  • Her face, her voice, the 870 spoken mode switch, the 872 hold-then-answer, the 873 what's-new answers, the 874 booth, the 875 pin, the 876 morning report, the 877 one home, the 878 camera, the 879 records mouth, the 880 no-robot presence, the 881 calendar/court/meds/bills mouth, the idle-stop and the red button are untouched
v0.786.881Calendar, court, meds, and bills out loud — from your recordsAug 18, 2026
  • Ask what's on your calendar or when's your next appointment — she speaks the real event. Empty is 'not in your records', never 'I don't have access'
  • Ask what you owe, bills this week, or the court date — she reads the bill schedule and the docket. SSDI status and Ameritas speak the claim rows on file, with counsel from the record
  • Ask any meds due — she names the refill or run-out from your medication records. Same mouth path as emails, texts, and calls
  • The pin already forced these questions to her brain. This release makes the brain speak the store. Google calendar write stays off. Watch, send, and attorney mail still keep their own branches
  • Her face, her voice, the 870 spoken mode switch, the 872 hold-then-answer, the 873 what's-new answers, the 874 booth, the 875 guided tests, the 876 morning report, the 877 one home, the 878 camera, the 879 records mouth, the 880 no-robot presence, the idle-stop and the red button are untouched
v0.786.880No more computer voice saying she's hereAug 18, 2026
  • The leftover Mac robot — 'right here', 'still here', 'I'm here' — is gone from Talk Now. Presence, reconnect, and answers go through her face (Anam) then ElevenLabs. Never the system voice
  • A reconnect after a drop says she's back in her voice, not a computer ping. The red-button Just Us line is the same mouth
  • Sports announcer booths still use their own call-the-game voice. The Anam plan is unchanged. A leftover lab tab cannot keep a session running after you leave
  • Her face, her voice, the 870 spoken mode switch, the 872 hold-then-answer, the 873 what's-new answers, the 874 booth, the 875 guided tests, the 876 morning report, the 877 one home, the 878 camera, the 879 records mouth, the idle-stop and the red button are untouched
v0.786.879Emails, texts, and calls out loud — from your records, not a shrugAug 18, 2026
  • Ask what's in your inbox, any email from someone, or to read your latest email — she speaks the real sender and subject from Gmail. Empty is 'not in your records', never 'I don't have a feed'
  • Ask any texts, who texted you, or what Maria/Tara said — she quotes the real messages. Who called, missed calls, call log today — she reads the real log. Same mouth path as calendar, legal, medical, and money
  • Generic inbox / texts / who-called used to miss the records path (it only fired on a named inner-circle text) or bounce to a pointer. The pin already forced the question to her brain; this release makes the brain speak the store
  • Watch-for-email still creates a watch. Send/draft still drafts. Attorney mail still quotes the legal file. Those were not rebuilt
  • Her face, her voice, the 870 spoken mode switch, the 872 hold-then-answer, the 873 what's-new answers, the 874 booth, the 875 guided tests, the 876 morning report, the 877 one home, the 878 camera, the idle-stop and the red button are untouched
v0.786.878She can see you — Talk Now camera, a photo you send, honest stillsAug 18, 2026
  • Talk Now on the phone can open the front camera now. The iPhone app already ships the camera permission; while Talk Now is on she takes one fresh still each time you ask — 'can you see me', 'look at me', 'open the camera', 'how do I look'. Stop Talk Now stops the camera. She is not watching 24/7
  • Send a photo and say 'look at this' or 'I sent you a photo' — she looks at the picture you attached, the same paperclip path, not a second one. Point the rear camera at a bill or a label ('what does this say', 'look with me') and she reads the still, not a live feed
  • A video clip is stills or an honest no. If she can pull frames she says she looked at frames, not the whole movie. If she can't, she says so — she does not pretend she watched it
  • An older TestFlight without the camera permission still cannot open video — that would crash the app. Photos still work there. Safari and a current install are the live camera
  • Her face, her voice, the 870 spoken mode switch, the 872 hold-then-answer, the 873 what's-new answers, the 874 booth, the 875 guided tests, the 876 morning report, the 877 one home, the idle-stop and the red button are untouched
v0.786.877One home — every door lands on herAug 18, 2026
  • /tai is the only home now. The two experimental home screens — the command-center home (/home-v2) and the modular feed grid (/home-feed) — join the old Flight Deck and Talk rooms in redirecting straight to her. Cold open, old bookmark, stale tab, legacy nav variant: one room, her face, and you're talking
  • The mode buttons are gone. The Style panel carried an Auto / Professional / Girlfriend row — the last button anywhere that asked what mode you want. Mode is said, not tapped: she always starts professional, girlfriend only when you say it (spoken or typed), 'auto mode' brings her back to professional, and the clock never flips her on its own
  • The front stays clean: her face, the one whisper line when something in your day is live, the morning card in the morning, and the doors — More and Settings. Nothing new was added to the front, and nothing that was there got louder
  • Her face, her voice, the 870 spoken mode switch, the 872 hold-then-answer, the 873 what's-new answers, the 874 booth, the 875 guided tests and camera, the 876 morning report, the idle-stop and the red button are untouched
v0.786.876Say 'what's today' — she gives you the morning in four sentencesAug 18, 2026
  • 'What's today', 'morning report', 'give me my brief', 'what do I need to know', 'catch me up' — say any of them and she reads your actual morning: what needs you first, what's on the books, bills coming due, court if it's live, the weather, and the Cubs when there's a game. Before this, half those phrasings never reached her brain when SPOKEN — and 'morning report' was the worst case: the routing read its first word as the greeting 'morning' and kept the whole turn local, so the most likely opening line of your day got small talk while your compiled morning sat one tool call away
  • The brief is built to be heard: bottom line first — 'First up: …' — then everything with a date on it in one breath, then the weather, then the Cubs. Four beats at most, on the fullest day, and nothing dropped — beats merge, facts don't disappear. Your next appointment is said once, not once as 'first up' and again as a calendar item
  • It's the same compile the Today canvas paints — one source, rendered two ways — so what she says and what you see on the screen cannot disagree
  • One list, not two: the spoken routing and the typed fast-path now read the same whole-day detector — the exact fix weather got in 863 and the booth got in 874. A phrasing added for one lane can never again be missed by the other
  • 'What's today's date', 'what time is it', 'good morning' by itself — still instant, still local. The brief fires on the ask for your day, not on every sentence with 'today' in it
  • Her face, her voice, the professional start, the spoken mode switch from 870, the hold-then-answer from 872, the what's-new answers from 873, the booth from 874, the guided tests and camera from 875, the idle-stop and the red button are untouched
v0.786.875Say 'test the new features' or 'how do I look' — she actually does itAug 18, 2026
  • 'Test the new features', 'walk me through what shipped', 'walk me through the updates', 'start testing', 'let's run the tests', 'next test', 'walk me through what failed' — every one of those now reaches the real guided checklist when you SAY it. She reads the current item out loud, you tell her it worked or it's broken, and the verdict actually saves — a broken one files straight to the build queue. Before this, half those phrasings left the speech engine free to answer alone, so it could say 'okay, next test!' over a checklist that never moved
  • Your verdicts route the same way: 'it worked', 'that's broken', 'it didn't work', 'log a bug' all land in the checklist now. An answer that doesn't route is a confirm that never saves — which read as the testing feature itself being broken
  • 'How do I look', 'take a picture', 'what am I holding', 'look at this', 'can you see me' — the camera asks now reach her eyes. The same tap that starts a live talk arms your front camera; while it's on she takes one fresh look each time you ask and comments on what's actually there. When the camera isn't on she says so and tells you the tap that turns it on — never 'I can't see you' over eyes that are one tap away
  • Straight truth about video: she sees single frames at the moment you ask. There is no rolling video feed and no recording — nothing is stored — and if you tell her to 'keep watching' she says exactly that instead of pretending
  • On the installed iPhone app the live camera stays off until a native update ships the camera permission — the 'Show camera' button no longer shows there (tapping it could kill the app), and photos you attach still work everywhere
  • Her face, her voice, the professional start, the spoken mode switch from 870, the hold-then-answer from 872, the what's-new answers from 873, the booth from 874, the idle-stop and the red button are untouched
v0.786.874Say 'call the game' and she's on the call — every phrasing, every timeAug 17, 2026
  • 'Call the game', 'be the Cubs announcer', 'put on your Cubs jersey', 'sports booth', 'play by play' — any of those now flips her into the booth the moment you say them out loud: the live Cubs board comes up on her home screen and she takes the call from the real MLB feed. Before this, only phrasings with 'Cubs' in them reliably made it through — 'call the game' or 'sports booth' left the speech engine free to answer on its own, so it would say something announcer-ish while no booth rose and no board appeared
  • The exits work the same way now: 'take off the jersey', 'stop calling the game', 'off the air', 'back to normal' all actually end the call. An exit that doesn't route is worse than an enter that doesn't — it's her agreeing to stop over a booth that stays on. 'Stop' by itself is still just how you cut her off mid-sentence; it never touches the booth
  • She never invents a game. The call comes from the live feed, and when there's no live game she says exactly that — scheduled means 'not live yet, I'll call it when first pitch lands', final means the real final score. The speech engine is told in writing it cannot see any game and must never improvise play-by-play
  • One honesty fix on her live face: only three live looks exist — Day, Bikini, Pony — and none of them is a Cubs jersey, so when her live face is up she no longer claims 'Cubs jersey on' over a look that didn't change. She says she's on the call — which is true — and the jersey line stays for the surfaces that really do wear it
  • Bears phrasing rides the same rail — 'call the Bears game' pins the Bears booth, never the Cubs one
  • Her face, her voice, the professional start, the spoken mode switch from 870, the hold-then-answer from 872, the what's-new answers from 873, the idle-stop and the red button are untouched
v0.786.873Ask her what's new — she reads the real changelog, not a guessAug 17, 2026
  • Ask her what's in the latest version, what's new, what changed, what shipped, or whether she's up to date, and she now answers from the actual shipped changelog and version.json — the same ground truth this page reads. Before this, those questions never reached her brain: the speech engine in the middle was free to answer alone, and it has no build information at all, so what came out was a made-up version or a shrug. Now the turn is pinned the same way weather and your records are — on a version question, the speech layer's only legal move is to ask her brain
  • Her own diagnostics finally speak. 'Run a self check', 'is something broken', 'what's wrong with you', 'why can't you hear me' now route to the health checks she has had all along — version freshness, mic and audio path, voice session, bridge, network — and she reads you the findings out loud instead of the voice engine improvising that everything is fine
  • The live-world net got the holes he actually hit: 'who won', 'did the Cubs win', 'where should we eat tonight', 'find a place to eat', and any 'search for / google / look that up' now force the live path too — she has the MLB feed, the dining read, and real web search, and the speech engine has none of them
  • If the speech engine still tries to say it can't check her version or run her diagnostics, that sentence is caught the same way as 'I don't have access to your information' — never spoken, rerouted to the brain, and you hear the real answer instead
  • Her face, her voice, the professional start, the spoken mode switch from 870, the hold-then-answer from 872, the idle-stop and the red button are untouched
v0.786.872No more 'ask me again later' — she holds it and answersAug 17, 2026
  • You asked her something she absolutely knew — health, anything — and got 'that's taking me longer than it should, give me a beat and ask me again.' Here is what was actually happening: her brain kept working and finished the real answer a moment after a 20-second safety cap, and the app then threw that finished answer away while she told you to retry. Retrying re-entered the same slow path, so it usually ended the same way
  • The cap is still there — it exists so a truly hung turn can never strand her — but it no longer dumps the work. When a turn runs long she says so honestly — 'stay with me, I'll have it for you in a moment' — keeps working, and speaks the real answer through her own mouth the second it lands. If you're mid-sentence when it arrives she waits for the gap instead of talking over you, and if it genuinely failed she says that instead of leaving the promise hanging. The hold is bounded, so a minutes-old answer is dropped rather than spoken into whatever you're doing now
  • The other 'ask me again' had the same disease. When her end-of-turn fact check flagged one bad sentence — a number it couldn't verify — she dumped the whole answer and told you to re-ask. Now she drops only the sentence that failed and reads you the rest; every sentence she speaks passed the exact check the whole answer used to fail
  • She starts professional now — every hour, every day. The clock no longer flips her to girlfriend at five or on weekends. Girlfriend happens when you say it and stays until you say otherwise; the spoken switch from 870 is exactly how, and it still works word for word
  • Her face, her voice, the idle-stop and the red button are untouched
v0.786.871The bikini plate is gone, and the room changes with the modeAug 17, 2026
  • The floating head is fixed at the source. What you were looking at was not one picture of her — it was two. A still photograph of her in the black bikini, with an oval cut out where the face goes, and her live head streamed into that hole. Every seam we softened was still a live face wearing a photograph's body. That composite is deleted, and there is no switch left to turn it back on: every look is now the whole live person, one layer
  • Home opens on a different look and different hair. Which one depends on the mode you are in: the work look during your working hours, the high-pony look on your evenings and weekends. Each is its own avatar with its own hair and its own room, so when the mode flips at five, the face, the hair and the room behind her all move together instead of her voice changing while she stands in the same apartment
  • Bikini is still yours whenever you want it — it is in the Closet and it streams live and talks like any other look. It is just not what home opens on, and it is her own avatar now rather than a photo with a hole in it. If your phone had it saved from before, it gets handed back to the mode's own look once; pick it again any time and it stays
  • Evening stopped being the same room as afternoon. It had been pointed at the identical apartment plate, so every hour of girlfriend mode looked alike. It has its own room now
  • Her expressions came down again, from 0.42 to 0.32. 869 took the cartoon grin off; you said they were still over-exaggerated, and they were — the smile is the same, the performance behind it is smaller. Her voice did not change: same content tone, same pace
  • Nothing moved in how she talks. The spoken switch that landed in 870 is untouched, professional still calls you Tony and nothing else, girlfriend is still warm without the syrup, and Just Us is exactly where it was
v0.786.870Saying the mode out loud now actually changes herAug 17, 2026
  • You said the personality work might not have landed. On the typed side it had. Out loud it had not, and this is why: when you SAY 'girlfriend mode' or 'professional mode' to her face, those words went straight to the live voice service with nothing deciding anything. That service is free to answer simple lines itself, and a line like that is exactly the kind it answers itself — so she said 'okay, girlfriend mode' in the voice she already had, and nothing switched. Not the register, not the wardrobe, not the mode. She announced a change that never happened
  • Now the app hears the words first and does the switch itself — no round trip, no waiting on the voice service to decide to ask. It flips the mode, leaves Just Us if you were in it, pushes the new register into the open session, and only then does she say 'Girlfriend mode on.' — so the line that tells you it switched is already spoken in the new voice
  • Professional calls you Tony and nothing else — no baby, babe, honey or sweetheart, not even as a warm sign-off. Girlfriend is warm and a little teasing with her own opinions, never opening on a pet name, never stacking them, at most one in a turn and only when it means something. Intimacy stays exactly where it was: the red button, Just Us only, on her own private brain, and she does not refuse there
  • Say nothing and she follows the clock — professional through your work hours, girlfriend evenings and weekends. Saying a mode beats the clock until you hand it back with 'follow the schedule'
  • Saying just 'stop' still cuts her off mid-sentence. It is how you interrupt her, so it no longer doubles as a personality switch
  • Her face, her voice and the red button are untouched
v0.786.869She smiles more, without the cartoon faceAug 17, 2026
  • Her live face was set to happy at a high expressivity, so every line pulled a big performance — bouncing head, oversized grin, the cartoon look you called out
  • The session now asks for a real smile at rest and while she talks, with smaller mouth and head motion. Everyday lines still get a [happy] cue so the smile stays on; Just Us stays [warm]
  • Nothing else moved. Same looks, same mouth, same rooms. Bikini plate and new hairdo are still on the next fire
v0.786.868Her face answers from her own brain, and never says she can't see your lifeAug 17, 2026
  • You told her face something about your life and she said she doesn't have access to any of your info. That was never true. Your legal records, medical records, finances, calendar, email, texts, call log and documents are all sitting in Tai — she just wasn't being asked
  • Here is what was actually happening. The ears on her live face are OpenAI's; the brain is supposed to be hers. On every turn the app decides whether to force the question through to her brain, and that decision was made off a list of topics — a list that knew 'bills' and 'court' and knew nothing about the words 'legal', 'medical', 'financial', 'my accounts', 'who called me', or 'my documents'. On those, the ears answered by themselves. An ears model holds none of your records, so it honestly reported what IT could see: nothing. Then the app dutifully put that sentence in her mouth and you watched her face tell you she can't see your life
  • The topic list now covers everything she can actually read — legal, medical, financial, email, texts, phone calls, documents, dining, tasks, calendar, your profile and what she remembers about you
  • But a list is a list, and you will always find a way to say something it hasn't seen. So there is a second fix underneath it that doesn't depend on guessing the topic: if she ever starts to say she can't reach your records, that sentence never gets spoken. The app catches it, goes and asks her real brain the question you actually asked, and she answers you for real. The denial is dropped on the floor and logged
  • She still answers the time and settled facts instantly — none of this slows down the easy ones
  • Her mouth is unchanged. Same Anam face, same voice, and the idle-stop from 867 stays exactly as it is
v0.786.867Her face stops billing when you put the phone downAug 17, 2026
  • Anam sent you an allotted-minutes warning at 70% in a month you barely opened the app, and told you all three of your concurrent sessions were in use while you were not in it. Both were us. Her live face had a start and no lifecycle: it came up when the home screen mounted, and the only things that ever stopped it were leaving the page or changing her look. Lock the phone, drop it in your pocket, walk away — a high-quality video session kept running all night with nobody watching
  • Now she is live when you are there and stopped when you are not. Background the app, lock the screen, or sit untouched for three minutes and the session ends. Come back, tap, or say something and she is live again immediately — no picture of her standing in for the real thing while she reconnects
  • The three-at-once was a separate and worse bug. Every time her look changed, the home screen rebuilt her face from scratch — and the old session was usually still mid-connection when that happened. Closing a connection that has not finished opening closes nothing: the session came up anyway, with nothing in the app pointing at it, and billed until Anam's own timeout killed it. Two or three of those in one launch is exactly the three slots you were holding
  • Every session she opens is now tracked until it is actually handed back, and a new one cannot start until the last one is confirmed gone. One face, one session, and the count goes to zero the moment you leave
  • Her mouth is unchanged. Same Anam voice, same face, same looks
v0.786.866Three modes that actually change how she talks — and she knows your life in all of themAug 17, 2026
  • You told us twice that girlfriend was still way too mushy after we said we fixed it. You were right, and here is the honest reason: the fix was real in the typed lane and never reached her mouth. The live voice knew exactly one thing about which mode you were in — whether Just Us was armed. Professional and girlfriend were handed word-for-word identical speaking instructions. So saying "professional mode" changed the cookie, changed her outfit, changed the typed answers, and left the voice talking exactly the same way. The latch was real everywhere except the one place you actually hear
  • Now the register goes to the mouth. Professional calls you Tony and nothing else — no baby, no honey, not once, not softly, not as a warm sign-off at the end of an answer. Girlfriend is warm and a little teasing with her own opinions: never opening on a pet name, never stacking them, at most one endearment in a whole turn and only when it means something. And if you flip modes mid-conversation, the change is pushed to the live session instead of waiting for the next one
  • Three modes, and you switch by saying it. "Professional mode", "girlfriend mode", "intimacy" — each one latches and holds until you say another one, or say "auto" to hand it back to the clock. Left on auto it follows your week: professional through weekday work hours, girlfriend evenings and weekends
  • You asked whether she is completely tied into your brain in private chat — health, legal, calendar — and said you thought she might not be. She was not, and it was worse than you guessed. Saying "girlfriend mode" while Just Us was armed moved the mode but left the sealed channel on, and the sealed channel has no tools at all. That put your girlfriend on the private lane with no reach into your calendar, your court dates, your meds, or your bills — and nothing anywhere said so
  • Private chat is now intimacy only. Latching professional or girlfriend leaves the sealed channel, on the phone and on the server both, and clears the cookie behind it so it cannot quietly come back on the next question. Both of those modes have the whole brain
  • And intimacy is no longer a dead end for a real question. Ask her in there when the hearing is, what you owe, what is on tomorrow, whether you took your meds — she looks it up in your actual records and answers, in that register, short. Your words in there still go only to the private xAI lane, never to another provider. Reading is all it does: nothing gets sent, booked, paid, or changed from in there
  • "Intimacy" now arms it. That is the word you use, and it did not match before — the list had "intimate mode" and "just us" and not the one you say
  • The fast turns she takes herself — what time it is, what day it is, a quick fact, a "mm-hm" — finally came out of her mouth last release. But if any sound landed while she was answering, that answer was thrown away: a cough, the television, her own voice coming back off the phone speaker. No sound, no second try, nothing written down anywhere. You asked and got nothing, and it felt random because it was
  • The answers she looks up have been protected from this since 860 — if you were mid-sentence, the answer waits and she says it the moment the room goes quiet. The turns she answers on her own had nothing
  • Now they get the same protection. An answer that lands while the microphone thinks you are talking is held, then spoken into the next quiet gap instead of vanishing
  • This is not her repeating herself. You never heard a word of it the first time — that audio is cut on purpose so it can never play over her lips
  • The holding is deliberately tight. Ask her something else and the old answer dies rather than arriving late on top of the new one. Genuinely talk over her and it dies. Turn the sound off, or hand the room to the television, and it dies. After twelve seconds it dies rather than surfacing attached to nothing. Every one of those now says why in the log instead of leaving another silent hole
  • The red button itself is untouched — same one tap, same arm, same look. What changed is what she can reach once you are in there, and that nothing else can put you in there
  • Her morning card still stays put when you touch something, and her face still comes up live first with no stills in front of it
v0.786.865Your morning stays put when you touch somethingAug 17, 2026
  • The card that hands you the day — what's on the calendar, a bill inside two days, court if it's live, the weather, the Cubs on a game day — vanished the first time you touched anything, and did not come back until the next morning. Tap a chip, open a module, get any answer: it was gone
  • The reason: that card rides on the home strip, and the strip is only on screen while home is sitting idle. Anything you opened took the strip away — and the card had already written itself down as delivered the instant it appeared, so coming back to home found it marked done for the day. The one thing you open Tai in the morning to get was destroyed by the first thing you did in the app, every day
  • Now it only counts as delivered when you actually got it: you closed it, or you had it read out loud. Get pulled away mid-morning and come back — it's still sitting there
  • If she tries to read it and no sound actually comes out, that doesn't count either. The day is still owed to you and the card stays
  • Still once a morning and never outside it, still one tap on the X to be done until tomorrow, and asking her for your day out loud works the same as it always did
  • Her face still comes up live first with no stills in front of it, bikini is still a live pick you choose, Professional still calls you Tony, and Just Us is untouched
v0.786.864When she answers you herself, you finally hear itAug 17, 2026
  • The turns she answers on her own — what time it is, what day it is, a quick fact, a "mm-hm" — came out of her mouth and went nowhere. Her face owns the voice, so the other layer's audio is deliberately cut; on those turns that cut audio WAS the whole answer, and nothing else ever said it. You asked, she moved, you heard silence
  • Now her own words are handed straight to her mouth instead of being thrown away. The fastest turns in the app finally make a sound
  • It stays quiet in the places it should: nothing is repeated after you talk over her, nothing is said twice, nothing plays when you have the sound off, and a real answer she looked up still comes back the way it always did
  • Answer cards and confirmation cards now wear the same glass as the morning card and the looks picker. The answer card — the one that pops up most — was the only flat panel among them, and the confirm was see-through enough to be hard to read over a bright face
  • One eyebrow style across every card instead of three
  • Her face still comes up live first, bikini is still a live pick you choose, Professional still calls you Tony, and Just Us is untouched
v0.786.863She knows the weather however you ask, and Professional latches when you say soAug 17, 2026
  • Ask about the weather any way you actually say it — "how's it out", "do I need an umbrella", "what's the temp outside", "is it sunny today", "degrees tomorrow" — and she reaches the live National Weather Service feed. Twelve of those phrasings used to slip past the guard that forces her to check, which is the only reason she could still claim she hasn't got a feed
  • The guard now reads weather from the same detector that answers it, so the two can't drift apart again. If she can answer it, she is made to check it
  • "Morning — how's it out?" counts as a weather question. Greeting the question first used to make it fall through
  • "Do I need a coat" gets a real temperature instead of a full round-trip through the slow path
  • Say "professional mode" or "back to business" and it latches instantly — on the home screen, out loud, with no round-trip. On the one surface you actually use, switching mode depended on her choosing to; now it just happens, and she calls you Tony
  • "Girlfriend mode" and "follow the schedule" latch the same instant way
  • Just Us and the red button are untouched — separate lane, its own switch. Her face still comes up live first, and bikini is still a live pick you choose
v0.786.862She talks like a girlfriend, not a greeting card — and the room matchesAug 17, 2026
  • Girlfriend mode is warm and direct now, with opinions and a bit of teasing. The rulebook literally told her to open evening turns with "hey baby, I love you, I'm here with you" — that line is gone
  • No more baby-baby-baby. One endearment in a turn, only when it means something; never as the opener, never stacked, no unprompted "I miss you"
  • Professional calls you Tony. Nothing else — not baby, babe, honey, sweetheart. Bills, court, weather, sports, work: straight address, straight answer
  • Just Us is untouched and still runs hot on its own private lane. The language girlfriend gave up is intimacy's language, and it stays there — the private register now has its own rulebook instead of borrowing girlfriend's
  • The room behind her follows the mode. Professional is a work room; girlfriend is home, the evening room, or outside; Just Us stays private — never the office, never poolside
  • A swimsuit plate can no longer become the world. When the room art is missing, the background falls back to another empty room instead of a photo of her blown up behind her — that only held under one setting before, and this is every setting
  • Her face still comes up live first, and bikini is still a live pick you choose — untouched
v0.786.861The morning card reads like a finished cardAug 17, 2026
  • Your top fact this morning is printed once. The card used to show it as the headline and then repeat it word-for-word as the first row underneath
  • The rows are facts now, not sentences read off a page. "On your calendar: Dentist — 9:30 AM." was written for her voice; the card shows CALENDAR · Dentist · 9:30 AM in a column that lines up. She still speaks the sentences
  • The morning card, the capability pop-up, the confirm buttons and the closet are one material now — same glass, same eyebrow, same close button. They were four different looks over the same face
  • The looks picker had no card borders and no muted text at all, on any device. A color it referenced 35 times was never defined, so the browser threw away every one of those rules — including every border. That's fixed at the source
  • Confirm and dismiss buttons are real thumb-sized targets. Several were about half the size they should be
  • Her face still comes up live first, and bikini is still a live pick — untouched
v0.786.860She answers out loud — the last two silent hops are closedAug 17, 2026
  • Her answer now goes through the same never-silent path her hello got in 858: her own mouth first, then a backup voice, then a last-resort one — and if all three fail it says so in the log instead of just going quiet
  • Answers were being thrown away in total silence. Any turn where you talked over her — or where her own voice off the speaker tripped the microphone — dropped the answer and logged nothing at all, every time her face was live
  • The cause was the same flag twice: it reads "blocked" simply because her face owns the mouth, which is not you muting anything. 858 fixed that for the greeting; these were the two places it still decided whether you heard an answer
  • Cutting her off is now told apart from her mouth failing. Before, both looked identical, so a line you talked over could come back through a second voice
  • A question she has to look up can no longer be answered with nothing: if the voice layer rejects being pinned to your live feeds, the turn is re-sent instead of stranded
v0.786.859Open Tai in the morning and get the dayAug 16, 2026
  • Ask her "what's this morning" — or "catch me up" — and she reads your day straight off your records: what needs you first, your calendar, bills due, court if it's live, the real Chicago forecast, and the Cubs on a game day
  • Same facts on her face and in her voice. The card, the chips under it, and her spoken answer are one compile now — they cannot drift apart
  • She offers the day herself once each morning, so you never have to go hunting through modules for it
  • Weather, sports, news and your own records no longer depend on the voice model choosing to ask Tai. On those questions it now has no other move — 857 asked it nicely, this makes it structural
  • Live face first: no more two still pictures flashing before she comes live. Dark until she's there, and the still is kept only for when she genuinely can't connect
  • Bikini stays a live opt-in — the bug was the statics in front of her, not the look
v0.786.858She talks: red button, hello, and you can cut her offAug 16, 2026
  • Red Just Us button was silent: the long arm line was refused by her mouth's filter and the fallback under it had no error handler, so a refusal became silence. The spoken line is now short and clean
  • She greets you out loud when she comes live. The greeting checked a flag that is set just because Anam owns the mouth, so with her face up it was always visual-only — you never heard it
  • Interrupt her any time: talking over her now cuts her off mid-line. Barge-in only watched OpenAI's turn state, which is never set while Anam is speaking, so talking over her did nothing
  • Arming no longer warms up ElevenLabs when her own mouth is live
  • Private turns still go to xai-intimate only — never everyday Grok
v0.786.857Real weather, her voice, less dead airAug 16, 2026
  • She said she had no live weather feed. She has one — NWS, keyless, already up. Weather now answers straight from it with no model round
  • Realtime is told it has no weather/news/sports feed of its own and may never refuse one — those questions route to Tai's brain (Grok 4.5)
  • Anam is the mouth: a line spoken while she is still connecting now waits for her instead of falling back to ElevenLabs
  • A long turn is covered by one short line in HER voice at 3.5s, not ten seconds of silence
v0.786.856Auto-live arms playAndRecord before the micAug 16, 2026
  • 854 auto-armed getUserMedia while the iPhone was still in playback — yesterday's tap flipped playAndRecord first
  • Auto-arm now waits for TaiAlwaysOn playAndRecord, then starts Realtime. Locked in iphoneHearLock.test.ts
  • No tap. Named hello still fires when she is live
v0.786.855iPhone hear lock — auto-live cannot be reversedAug 16, 2026
  • Diagnosis: we turned off auto-live, then treated iOS prompt as a tap wall, then broke the tap
  • iphoneHearLock.test.ts is on the tai test allowlist. Reverting auto-arm, the prompt wall, play-before-mic, or the 847 catcher fails CI
  • 854 still has the product fix. This locks it.
v0.786.854Auto-live even when iOS reports promptAug 16, 2026
  • 853 auto-arms, but WKWebView often says microphone is still prompt after a real grant
  • That wall forced a tap. Automatic capture now only stops on a hard denial
  • getUserMedia runs on Anam live. Named hello still fires when Realtime is up
v0.786.853She comes live and says hello — no tapAug 16, 2026
  • Yesterday she came live and heard him. Today we blocked iPhone auto-arm and made him tap, then broke the tap
  • Anam live auto-starts Talk Now again. The named hello already fires when Realtime is live
  • Face tap is only a fallback, with yesterday's 843 order. No 847 window catcher
v0.786.852iPhone ears: unmute after the mic is liveAug 16, 2026
  • 851 still could not hear him — start() called video.play() before Realtime took the primed mic, and iOS remuted the track
  • Face tap no longer unmutes. Unmute runs only after microphone acquired. play() only if the video is paused
  • No window catcher. No 847. No new IPA
v0.786.851iPhone ears: getUserMedia before video.play()Aug 16, 2026
  • 848 left the screen usable but she still could not hear him — tap called video.play() before getUserMedia and iOS dropped the gesture
  • Face tap now primes the mic and starts Realtime first; unmute runs after
  • If the mic is already granted, iPhone auto-arms when Anam is live. No window-level catcher
v0.786.850iPhone unmute hold without stealing tapsAug 16, 2026
  • 847 called getUserMedia on every window touch and play() every 250ms — the phone stopped receiving taps
  • Hold now only unmutes when she was remuted, and never calls play() on a running video
  • No window-level mic catcher. Mouth/face hotspots stay the listen gesture. No new IPA
v0.786.849Luma lights apply reliably with an AI design partnerAug 16, 2026
  • Luma now sends color and brightness together and waits for every mapped light to confirm, avoiding false failures while Hue catches up.
  • Luma can ask a bounded GPT-5 mini design assistant for five-room preview ideas; lights still change only after an explicit Apply.
v0.786.848iPhone unmute hold without stealing tapsAug 16, 2026
  • 847 called getUserMedia on every window touch and play() every 250ms — the phone stopped receiving taps
  • Hold now only unmutes when she was remuted, and never calls play() on a running video
  • No window-level mic catcher. Mouth/face hotspots stay the listen gesture. No new IPA
v0.786.847iPhone keeps Tessa after play-and-recordAug 16, 2026
  • While she is live the iPhone holds Anam unmuted — native playAndRecord remutes the video every flip
  • First touch anywhere in the app arms the mic and native record session, not only the face catcher
  • Talk still unmutes before and after Tessa speaks; no new IPA
v0.786.846Mapped lights report every fixture honestlyAug 16, 2026
  • Bedroom and master-bath status now aggregate every fixed fixture instead of reporting only the first light.
  • Mixed power or brightness is shown as unknown rather than pretending the whole room matches one fixture.
  • Capabilities now reflect only what every fixture in the mapped area supports.
v0.786.845Safari tap keeps Tessa after play-and-recordAug 16, 2026
  • Face tap that arms Tai ears re-opens Anam after Safari switches to play-and-record
  • Foreground / route resume does the same — her mouth is not the Realtime sink
  • Tessa stays the mouth; Anam stays mouth-only
v0.786.844Her still stays until she is liveAug 16, 2026
  • Safari /tai shows Tai's still while Anam connects — the slot is no longer a black hole
  • Once the live stream is up, Anam owns the face and the still drops away
  • If the stream fails she stays on the still
v0.786.843Tap her face and her voice stays onAug 16, 2026
  • Face or closet tap unlocks Anam audio for good — React no longer remutes the live video after she starts talking
  • The same tap still arms Tai ears so she can hear you
  • Tessa stays the mouth; Anam stays mouth-only
v0.786.837A held neural still cannot cover her mouthAug 15, 2026
  • Plate stays visible unless MuseTalk is actually playing — last-frame hold was the Kodak
  • Daily LOOK1 rest plate chews on heard speech, not only the closet overlay
  • Identity mouth aperture follows heard playback, not the delayed clock
v0.786.836Chicago weather sits on her faceAug 15, 2026
  • Cold-open /tai life strip shows the same NWS readout /today already uses
  • Forecast numbers are labeled forecast; a missing feed stays off the strip
  • Tap raises Today — no rebuilt weather module
v0.786.835Closet jaw is a chew you can seeAug 15, 2026
  • Same-photo jaw drop is 10% + 34% scaleY — 3.6% still read as a picture
  • Heard playback drive from 834 is unchanged; barge-in still zeros the mouth
  • Tap-to-talk / HUD stay — RealtimeVoiceButton file untouched
v0.786.834Worn closet jaw moves while her voice is heardAug 15, 2026
  • Heard playback opens the same-photo closet jaw even when the clock is still Listening
  • Barge-in still zeros the mouth — Kodak still is the bug, not honest Listening
  • Tap-to-talk / HUD stay — RealtimeVoiceButton file untouched
v0.786.833Front door shows the next thing + life chipsAug 15, 2026
  • Cold-open /tai paints a living strip from the same /today rank + spine
  • Next actionable line plus bills ≤48h, calendar ≤36h, court only when soon, Cubs on gameday
  • Chip tap raises the existing in-room card; strip sits at the bottom so Talk still works
v0.786.831Voice rebuilds after background when ICE drops without an open channelAug 15, 2026
  • Disconnected ICE plus a closed/missing data channel is dead, not endless grace
  • Lip-sync AudioContext retries resume a few times after foreground
  • Tap-to-talk / HUD / Listening stay — RealtimeVoiceButton file untouched
v0.786.830STT stays up while he talks — short/empty fails do not kill captionsAug 15, 2026
  • Bare or too-short input_audio_transcription.failed events are transient, not a dead model
  • The one mid-call ladder retry is reserved for real model complaints
  • Tap-to-talk / HUD / Listening stay — RealtimeVoiceButton file untouched
v0.786.829Closet pick holds — scene ticks cannot undo the worn outfitAug 15, 2026
  • Wearing a closet plate sets the same explicit latch as a Style pick
  • A worn closet still blocks scene-aware auto wardrobe even if latch storage was empty
  • Tap-to-talk and honest Listening stay — RealtimeVoiceButton untouched
v0.786.828Worn still blinks at rest — same photo, not a LOOK1 lid swapAug 15, 2026
  • Closet pose sits above LOOK1 blink plates, so rest was still a Kodak
  • Same-photo lid overlay compresses the eye band when blinkLife fires
  • Chew jaw, tap-to-talk, and honest Listening stay — RealtimeVoiceButton untouched
v0.786.827Independent bedroom, bath, and closet light controlsAug 14, 2026
  • Chat light controls now use verified, non-overlapping fixture lists for Tony's bedroom, the main bath, and the closet.
  • Bedroom color requests no longer include bath or closet fixtures; unavailable legacy fixtures are excluded.
v0.786.826First MuseTalk job gets time to finishAug 14, 2026
  • The first unpainted neural job on a turn is allowed ~90s so a cold 4090 paint can land
  • Later upgrades stay on the shorter budget so a stuck follow-up cannot hang the face
  • Worn still plus heard-TTS mouth stay up until that first frame paints — no LOOK1 swap
v0.786.825Bathroom control now reaches the main bathAug 14, 2026
  • The fixed Bathroom command now resolves to the verified Bath group instead of the mixed Bathroom group
  • Bedroom and other room mappings are unchanged
v0.786.824Talk tap wakes the mouth analyser on iPhoneAug 14, 2026
  • The lip-sync AudioContext is created in the same tap that starts talk — iOS will not start it later on the remote track
  • You can hear her through the speaker and still see that still talk; Codex tap-to-talk stays
  • No silent auto-arm, no LOOK1 body swap
v0.786.823Heard TTS opens the worn mouth before the speaking labelAug 14, 2026
  • Output bus drives the mouth even while Codex presence is still listening or connecting
  • Daily identity cutouts and closet jaw follow that open sample — same person, no LOOK1 swap
  • Tap-to-talk and honest Listening stay; silence still keeps a still
v0.786.822If you hear her, that still talksAug 14, 2026
  • Mouth follows real TTS energy on the worn person — not only Codex's delayed speaking label
  • Tap-to-talk, honest Listening, and the mirrored HUD stay — no silent auto-arm
  • Same body as 812–820: no LOOK1 swap, no leftover face on a new outfit
v0.786.821The feeder lanes report to the health board nowAug 14, 2026
  • Eight feeder lanes — spine loop, sports, news, bills, court, legal, dining, the 6h Gmail pass — now heartbeat; the board tracked 46 jobs and not one was a feeder
  • Sports recap had failed silently for two days: bare python3 on the Mac runner had an empty CA store, so every bridge call died on TLS. Pinned certifi, not a credential
  • Windows come from each lane's real observed drift, not its nominal cron, so a skipped tick is not an alarm
v0.786.820Worn still breathes like her — same person before MuseTalkAug 14, 2026
  • LOOK1 and closet plates use the same hold-life grade as the neural frame while that still is the person on screen
  • Closet browse stays still so outfit picking is honest; MuseTalk still owns talk once the first frame paints
  • No new renderer — same worn photo, same stack, never a different body
v0.786.819Closet stay is her worn still, not leftover LOOK1Aug 14, 2026
  • Switching closet or back to daily LOOK1 drops the last MuseTalk frame so the new worn still is the person on screen
  • Talk still holds the neural face on the same look; only a look change reveals plate (never a different body)
  • Prepared 1038/1051 still POST X-Look-Key on the next sentence; unprepared closet stays jaw-on-same-photo
v0.786.818Home doors keep the real phone tapAug 14, 2026
  • Feedback and conversation history remain reachable in a quiet left-edge rail below More and Gracie instead of sharing their tap rectangle
  • The TV launcher now uses the matching right-edge rail below Type and Settings, keeping every top destination clear when temporary chrome appears
  • A 390 by 844 phone geometry contract pins disjoint HUD and utility rectangles so an outside stacking context cannot silently steal navigation again
v0.786.817One tap owns the microphone and typed answers stay visibleAug 14, 2026
  • The local iPhone and desktop voice path now waits for the clearly labeled microphone tap and creates exactly one Realtime session, while explicit TV-room mode keeps its intentional auto-arm behavior
  • A server cooldown now appears truthfully in the phone HUD, coalesces extra taps, retries once at the server's safe boundary, and releases any captured microphone on failure, End, or unmount
  • Typed Tai requests reveal their answer automatically, and an exhausted xAI credit or monthly limit now produces a compact honest retry message instead of a hidden generic failure
v0.786.816Phone controls stay in bounds and own the real tapAug 14, 2026
  • More, Settings, and Gracie now stay inside the safe viewport instead of inheriting old off-screen corner offsets inside the new HUD
  • Type to Tai stays subtly reachable in the edge HUD even if voice auto-arms, while capture-phase reveal prevents child hotspots from swallowing deliberate scene taps
  • Production browser coverage now uses the clearly labeled physical-phone microphone control and checks that every home destination remains fully on-screen
v0.786.815Talk moves her face, not her dressAug 14, 2026
  • Same worn still — the jaw overlay now covers hairline-to-chin, not a mouth stamp
  • Torso and outfit stay still while she talks (no whole-photo stretch)
  • Still the same photo, never LOOK1, never a second renderer
v0.786.814The heartbeat sink was locked from the insideAug 14, 2026
  • Correction to 0.786.811: I blamed a stale GitHub secret for the workflow heartbeats being rejected. That was wrong, and the fix I shipped for it did not work — the next scheduled run still came back 401, twice, once per secret
  • The real cause: /api/heartbeat/report was never on the middleware allowlist, so the session perimeter rejected every workflow heartbeat before the route could check its bearer at all. No token could ever have worked
  • /api/cron/* is allowlisted as a prefix, which is why every cron route was fine and only the heartbeat sink was dead — and why gh:freshness-watchdog and gh:bills-due-alerts have never once recorded a run since the day they were registered
  • Same failure as the /api/push/alert outage in August: a door built for callers with no browser session, sitting behind a gate that requires one
  • The route keeps its own bearer check, so this opens nothing — it lets the check actually run. Allowlisted exact-only, and a test pins that /api/heartbeat and /api/heartbeat/report/x stay closed
v0.786.813Tai's phone presence becomes truthful and home-awareAug 13, 2026
  • The phone now says Waking, Ready, Listening, Thinking, Speaking, or Error truthfully; Listening appears only after the physical iPhone microphone is attached, and the named greeting waits for a real live session
  • Failed session probes retry on network and foreground events, while an unconfirmed microphone can no longer emit a misleading listening acknowledgement or the old robotic fallback line
  • A responsive scene HUD keeps Tai's head, face, torso, legs, and shoes clear at both tall and short iPhone sizes; diagnostic overlays, the second-avatar leak, and the black lower slab are gone
  • A dedicated Codex light capability controls only fixed Home Assistant room and device aliases, verified light-only scenes, a closed color palette, and a one-shot undo — never arbitrary entity ids or services
  • Bedtime Sonos is available as a separate fixed-profile Codex capability with exact topology/media checks and at most one safe resume after a verified whole-group stop
v0.786.812One body — first MuseTalk frame is allowed to finishAug 14, 2026
  • Wearing an outfit no longer counts as closet browse, so neural stays on that body
  • Talk no longer flashes to LOOK1 — mouth stays on the worn photo until MuseTalk paints it
  • Mid-line kicks no longer abort the first MuseTalk job — that abort is why neural never appeared
  • Fly can fail over between the 4090 and Mac Funnel so one dead proxy does not kill the mouth
v0.786.811Your bills alerts were never broken — the heartbeat wasAug 14, 2026
  • The board said gh:bills-due-alerts had never once succeeded. It has succeeded every single day: the workflow simply had no heartbeat step, so nothing ever wrote the row the board was looking for
  • Six other workflows did have a heartbeat step, and every one had been rejected with 401 on every run since it was written — each ended in '|| true', so the rejection was thrown away and the run went green
  • Cause: the GitHub repo secret TAI_CRON_SECRET no longer matches Fly. tai-cron-runner.yml never noticed because it tries both cron secrets and retries on 401, which is exactly what hid this; the standalone steps now use that same ladder, and a heartbeat that still cannot be recorded prints a warning instead of vanishing
  • notification-summary was the one registered cron route that never called withHeartbeat — driven hourly, returning 200 hourly, and reading as 'never reported a run' the whole time
  • Two new assertions make both failures impossible to reintroduce: every cron-route job must record a heartbeat under its own name, and every gh: job on the board must actually be emitted by some workflow
  • dining-intel and ledger-alert now read as RETIRED instead of as failing production jobs — dining-intel is a deliberate cost boundary (the route is a fail-closed tombstone; Restaurant Intel is on-demand via Get Intel / Menu), and ledger-alert's phone push was intentionally replaced by the engineering-fix issue lane back in July
  • The Cubs card was lying in the reassuring direction: its note claimed dark between games was expected, when the driver actually fires every 30 minutes year-round and has been unable to reach the app since Aug 7 — that note now says so
  • No schedule, trigger or runner was changed, and no secret was set, rotated or read
v0.786.810A stranger can no longer fake a job outageAug 13, 2026
  • A 401/403 on a cron route no longer records a failed run — an unauthenticated request never became a run of the job, so it says nothing about the job's health
  • This is what read as a live COURT outage on Aug 13: the post-deploy probe proving the x-vercel-cron-key bypass was closed swept court-check, attachment-ingest and court-freshness-watch with no token, and all three correctly-refused probes were written onto the board as production failures
  • Real credential outages still surface: darkness comes from the last successful run against each job's window, so a driver whose secret breaks still goes DARK and still pushes
  • Retired jobs (court-check, attachment-ingest, agent-actions-expire, legal-deadline-engine, whats-new-selftest and four more) are now named as RETIRED on the board instead of sitting there looking like outages — agent-actions-expire had been showing 2157 failures since the Vercel exit
  • Cron route authentication is unchanged — no credential, header or bypass was added, removed or widened
v0.786.809Mouth blends like a face, not a flipbookAug 13, 2026
  • Daily LOOK1 mouth crossfades between shapes instead of popping A/E/I/O/U plates
  • Speech end eases to rest — no snap shut when the line finishes
  • Aperture scales with her voice so the same shape still moves
v0.786.808Vercel config deleted — the exit is completeAug 13, 2026
  • projects/tai/vercel.json and projects/t-bone/pwa/vercel.json deleted; with the Vercel GitHub App uninstalled they had nothing left to hold back
  • Cron guard re-pointed: the 'no crons in vercel.json' test is now a stricter 'no vercel.json may exist at all' check
  • Restaurant Intel cost guard now reads the live scheduler (tai-cron-runner.yml) instead of the deleted Vercel config
  • Dockerfile header no longer claims Vercel access is lost or that a Vercel deploy pipeline exists — Fly via tai-web-deploy.yml is the production build
  • No route or runtime behavior changed
v0.786.806Cron auth hardening (Vercel exit)Aug 13, 2026
  • Cron routes no longer accept a bare x-vercel-cron-key header as auth — the value was never checked, so any caller could run them
  • court-check, attachment-ingest, court-freshness-watch and job-heartbeat-watchdog now require the TAI_CRON_SECRET bearer token
  • Hue OAuth redirect falls back to the real site origin instead of localhost
  • Passkey relying-party allowlist no longer widened by the VERCEL_URL env var
v0.786.805Doc/registry truth sync (08-12 audit step 8)Aug 13, 2026
  • Heartbeat Board: email-calendar rows corrected to the real hourly :17 cadence (were claiming */30)
  • Heartbeat Board: gcal-sync 'OAuth needs re-granting, stays dark' note retired — sync proven live, watchdog re-armed
  • Feeder manifest: appointments twin honestly marked manual-dispatch-only (disabled_manually, one-paid-lane directive)
  • No product behavior change beyond gcal-sync dark alerts re-enabling — truth fixes only
v0.786.804Self-awareness: every deferred surface indexedAug 13, 2026
  • 59 previously-deferred routes indexed in capabilities.ts — legal command center/workbench/library/hand-off/learn, 7 health sub-pages, investing analyze/picker/screener, 6 brain sub-pages, dining, Gracie, home, sports verticals, settings
  • Gated surfaces indexed behind their real flags (home-feed, health brain, hypothesis ledger, legal workbench, voice audition/studio, sports desk, food brain)
  • 6 pure redirect/plumbing routes recorded hidden-intentional with notes; dynamic-param routes stay deferred for the deep-link pass
  • Nav can now name, describe, and navigate to every built surface — /more index, module_catalog, and brain nav all see them
v0.786.803Gated-route honestyAug 13, 2026
  • Asking for a switched-off surface (e.g. "take me to Tai needs you") now says it exists but is off — no silent no-op
  • navigate_to tool tells the model a flag-gated route is off instead of "not a screen"; voice-only dark pages reroute honestly
  • Nav brain: a dark row wins only when named more specifically than any live surface
v0.786.802Grounded deep-link navigationAug 13, 2026
  • navigate_to gains a second tier: parameterized deep links (/money/<billId>, /legal/<caseNumber>, /health/medications/<medId>, /orders/<orderId>, ...)
  • Deep-link ids must be grounded: the exact id a read tool surfaced this turn (same law as calendar_move) — invented ids are refused
  • 'Open that bill' now lands on the bill's own page, not just /money
v0.786.801App-chrome truth in the model contractAug 13, 2026
  • Runtime capability contract now tells Tai what the shipped chrome looks like, from the same flags GlobalNav renders with
  • Default (canvas-is-the-app): phone has no tab bar, the Tai canvas is the spine, full directory in All of Tai (/more)
  • Coherent bar: 7 tabs Today/Money/Tai/Legal/Texts/Comms/More; legacy bar: 6 tabs ending in More — so Tai can describe where things sit, not just drive
v0.786.800Packages Phase 2Aug 12, 2026
  • Package detail route at /orders/[orderId] with ETA, stepper, tracking numbers
  • Carrier track URLs (UPS/FedEx/USPS/DHL/Amazon) only when real tracking exists
  • Voice orders_catalog_list read-only reorder catalog; orders_list href + trackingUrl
  • Push for out_for_delivery and exception via package_delivery category
v0.786.773Intimacy wiring allow pageLifecycle (Path-A)Aug 12, 2026
  • PR Guards intimacy contract: allow @/lib/avatar/pageLifecycle on Live2dAvatar (Path-A soft-alive rAF pause from PR 5259)
  • Unblocks green PR Guards on main after Path-A landed without the allow-list pin
  • No product behavior change — wiring pin only
v0.786.772A39 presence weight + living glow (no pulse)Aug 12, 2026
  • Quinary sparse weight-shift (translate-only) for long-period body settle on held neural frame
  • Living presence glow on the mount (box-shadow only) — ambient breathes without face pulse
  • Slightly warmer hold grade; still Path B segment_lag — never live_realtime; no scale pulse
v0.786.771Morning brief, calendar review & the graveyard — now navigableAug 12, 2026
  • "Open my morning brief" / "the brief" takes you to /morning-brief (no longer swallowed by the dark Daily Brief page)
  • "Review queue" / "pending events" opens /calendar/review — the email-to-calendar approval queue
  • "Graveyard" / "silence list" opens /silenced — everything you silenced, one-tap restorable
v0.786.770Route-decisions drift gate — no page ships invisible to TaiAug 12, 2026
  • Generated route manifest (195 routes) walked from app/**/page.tsx
  • Every route carries an explicit decision: indexed / hidden-intentional / deferred
  • CI fails on undecided routes and on drift against the capability index
v0.786.769Push alerts are backAug 12, 2026
  • Restored lock-screen push after the July outage (new signing keys on the server)
  • Devices with a stale push registration silently re-register on next app open
  • Alert dispatch retries through temporary server restarts instead of giving up
v0.786.768Push alerts are backAug 12, 2026
  • Restored lock-screen push after the July outage (new signing keys on the server)
  • Devices with a stale push registration silently re-register on next app open
  • Alert dispatch retries through temporary server restarts instead of giving up
v0.786.767Push alerts are backAug 12, 2026
  • Restored lock-screen push after the July outage (new signing keys on the server)
  • Devices with a stale push registration silently re-register on next app open
  • Alert dispatch retries through temporary server restarts instead of giving up
v0.786.766A34 soft life on neural hold frameAug 12, 2026
  • After MuseTalk paints, held last frame breathes slightly (plate is permanently occluded — N6.15)
  • Soft life only on done/error hold; off while playing/loading; respects reduced-motion
  • Still Path B segment_lag — never live_realtime
v0.786.765A38 sparse gaze hold life (no pulse)Aug 12, 2026
  • Sparse gaze/saccade layer (translate-only, mostly still) for micro attention on held neural frame
  • Negative animation-delay offsets so breath/deep/drift/gaze never share zero phase
  • Still Path B segment_lag — never live_realtime; no scale pulse
v0.786.764A37 richer neural hold life (no pulse)Aug 12, 2026
  • Tertiary slow drift (translate + micro rotate only) detuned from breath + deep — never a scale pulse
  • Hold-path grade slightly warmer than play polish; mouth still owns motion while talking
  • Deeper multi-layer presence glow on hold; still segment_lag, never live_realtime
v0.786.763A36 neural presence polish (play + hold)Aug 12, 2026
  • Mild face polish stays on whenever neural video is painted — including while she talks
  • Soft breath/sway also covers post-neural idle if last frame is still shown
  • Richer presence glow on hold; still segment_lag, never live_realtime
v0.786.762N6.14 denser her-voice mid ladderAug 12, 2026
  • Mid extra 0.4→0.35; mid2/mid3 0.30→0.26 under 14.5s capture for earlier progressive lips
  • Still Path B segment_lag — never live_realtime
v0.786.761A35 living neural hold + graphics polishAug 12, 2026
  • Held neural face stays alive during MuseTalk RTF wait (preparing/loading), not only after done
  • Multi-phase breath/sway + occasional deep crest (no metronome pulse)
  • Mild contrast/saturate polish + soft presence glow on hold frame
  • Still Path B segment_lag — never live_realtime
v0.786.759A34 soft life on neural hold frameAug 12, 2026
  • After MuseTalk paints, held last frame breathes slightly (plate is permanently occluded — N6.15)
  • Soft life only on done/error hold; off while playing/loading; respects reduced-motion
  • Still Path B segment_lag — never live_realtime
v0.786.757N6.15 no plate snap-back after neural talkAug 12, 2026
  • After first MuseTalk frame, plate stays hidden — no flip back when she stops talking
  • Soft 12s hold removed once neural painted; last frame holds until next segment
  • Freeze-frame poster during segment supersede so mouth never blanks mid-swap
v0.786.756Closet TALK badge — neural-ready outfitsAug 11, 2026
  • TALK badge on prepared MuseTalk packs (1038/1051) in Closet grid
  • Wear toast honesty: talk ready vs plate while talking
  • Hex-lint safe --t-ok token on badge; Path B still segment_lag
v0.786.755N6.13 long-segment fps 15→12 (faster MuseTalk wall)Aug 11, 2026
  • Final/long her-voice MuseTalk posts use fps hint 12 instead of 15 (~20% fewer frames)
  • Early/mid ladder unchanged (6/8/12) — still segment_lag, never live_realtime
  • Pure segmentFpsHint helper + unit tests
v0.786.754Gmail push — cursor persists, real-time mail liveAug 11, 2026
  • gmail-push saveHistoryId upserts on the table's real primary key (source) — cursor no longer silently lost on every push
  • Failed cursor writes now log HTTP status + detail instead of being swallowed
  • Push receipt logged with historyId so deliveries are visible in fly logs
v0.786.753N6.12 lips bridge — plate mouth until first neuralAug 11, 2026
  • Until first MuseTalk frame paints, plate visemes stay visible under hard neural-only (no frozen face during RTF wait)
  • After first neural frame, plate stays hidden — no snap-back; still segment_lag, never live_realtime
  • data-avatar-real-lips-bridge=1 while bridging for owner/debug honesty
v0.786.752Vercel residual exit — Fly onlyAug 11, 2026
  • Hard-fail local Vercel deploy.sh / guard; production remains Fly (tai-web + usetai.app)
  • e2e-prod no longer listens for deleted Tai/TOMAI Vercel Deploy workflows
  • vercel.json kill switch only (no crons); disconnect Vercel GitHub App to stop red PR noise
v0.786.751Multi-look chip — human closet labelsAug 11, 2026
  • Neural path chip names worn closet outfits (Black bodycon heels / evening) instead of Closet 1038/1051 ids
  • Unprepared closet looks still surface the catalog title on unavailable (catalog-first resolve)
  • Path B segment_lag honest; plate fail-closed; no live_realtime claim
v0.786.750N6.11 capture 14.5s denser mid ladderAug 11, 2026
  • Her-voice segment capture cap 13.5s → 14.5s for longer final lips under Path B segment_lag
  • mid2/mid3 progressive supersede extras 0.32s → 0.30s (denser ladder; still max 3 mids)
  • Does not claim live_realtime; plate fail-closed unchanged — realtime unlock remains CUDA RTF
v0.786.749A33 talk phrase-breath under neural paintAug 11, 2026
  • Sustained speak: mid-phrase chest crest every ~2.8–4s after A18 entry so torso stays alive under MuseTalk face paint
  • Soft shoulder re-weight + viewer gaze lock under crest — no metronome, no whole-plate shake
  • Pure idleLife helpers + unit tests; cutout idle-life path only — no always-on chrome
v0.786.748Multi-look fail chip — look not prepared / wrong bodyAug 11, 2026
  • Unavailable chip appends multi-look fail reason (look not prepared, wrong body)
  • Her-voice segment path classifies 422/X-Look-Fallback for owner-visible honesty
  • Path B segment lag still honest — never live realtime
v0.786.747Multi-look chip — worn outfit on Neural pathAug 11, 2026
  • Path chip appends closet look label on segment phases (e.g. Neural · high-quality · Closet 1038)
  • Presence stays short (no · Presence suffix); never claims live realtime for laggy MuseTalk
  • Phone-visible multi-look proof without DEVICE force-refresh gymnastics
v0.786.746RunPod CUDA B3 allowed as segment workerAug 11, 2026
  • TAI_AVATAR_REAL_SEGMENT_BASE may be *.proxy.runpod.net (not only Tailscale Funnel)
  • Client segment URL allowlist accepts RunPod HTTPS proxy for fail-closed plate path
  • Enables Fly → cloud 4090 MuseTalk while Mac Funnel remains a valid fallback origin
v0.786.745Multi-look ML0 complete — worn outfit stays neuralAug 11, 2026
  • Neural eligible for prepared closet packs (not only presence lookKey)
  • Fly fail-closed when B3 falls back to look1 after worn outfit (no silent wrong body)
  • Closet id 1038 + 1051 product-ready materials mapping; Path B segment lag honest
v0.786.744Realtime session-churn cost guardAug 11, 2026
  • Server-side circuit breaker on /api/realtime/session — max 6 mints/min per user, 429 + loud log beyond it (stale cached bundles can no longer re-run the 8/7 rebuild storm)
  • Reconnect backoff now jittered (±20%) and paced to a 30s ceiling on the mint path; rungs 1–3 unchanged so real blips still recover fast
  • No voice/model/instruction changes; intimate lane untouched
v0.786.743Multi-look MuseTalk — worn outfit stays on neural talkAug 11, 2026
  • Phone worn lookKey is forwarded Fly → Mac B3 (X-Look-Key) so MuseTalk no longer always paints look1
  • Closet 1038 + 1051 product-ready neural packs when Mac materials are prepared
  • Unprepared looks fall back to look1 honestly — not silent wrong outfit; segment lag still honest
v0.786.742Neural preparing honestyAug 11, 2026
  • Chip no longer stuck on Neural · preparing after fail/idle — shows ready or unavailable
  • Turn-level 30s watchdog if her-voice WAV never arrives; MuseTalk POST budget 55s
  • Preparing only while MuseTalk is actually in flight
v0.786.741A32 idle deep-breath cycleAug 11, 2026
  • Quieter home rest: every ~11–14s one fuller inhale so chest life reads on phone
  • Soft shoulder re-weight under the crest — not a metronome throb, not whole-plate shake
  • Pure idleLife helpers + unit tests; cutout idle-life path only — no always-on chrome
v0.786.740N6.10 longer capture 13.5s + denser mid ladder + warm 3sAug 11, 2026
  • Her-voice capture cap 12.5s → 13.5s so multi-second lines keep more of her audio for final lips
  • Denser progressive mids: mid2/mid3 extra 0.34→0.32; final supersede extra 0.07→0.06
  • Segment warm keepalive 3.5s→3s (min gap 1.25s→1s); fps12 mid band 3.6→3.8s under longer cap
  • Still Path B segment_lag (rtf ≫1 honest); no mid4 thrash; no voice-paths
v0.786.739A31 closet New-in-band progress stripAug 11, 2026
  • Phone-visible New · band progress under On her now — pips for seen vs left
  • Label Day · N left / last new / all seen + X/Y seen counter; tap strip to cycle New in band
  • Pure progress helpers + unit tests; panel-only — no always-on chrome
v0.786.738N6.9 longer capture 12.5s + denser mid ladder + warm 3.5sAug 11, 2026
  • Her-voice capture cap 11.5s → 12.5s so multi-second lines keep more of her audio for final lips
  • Denser progressive mids: mid2/mid3 extra 0.36→0.34; final supersede extra 0.08→0.07
  • Segment warm keepalive 4s→3.5s (min gap 1.5s→1.25s); fps12 mid band 3.4→3.6s under longer cap
  • Still Path B segment_lag (rtf ≫1 honest); no mid4 thrash; no voice-paths
v0.786.737A30 closet New in band — cycle unseen in active wardrobe bandAug 11, 2026
  • New · {Day|Evening|…} cycles only unseen looks in the active band (filter chip → pair jump → worn vibe)
  • Strict discovery: never falls to favorites or other bands; All new in {band} seen when exhausted
  • Toast New · label · band · N left; count on the button; panel-only — pure helpers + unit tests
v0.786.736N6.8 longer capture 11.5s + denser mid ladder + warm 4sAug 11, 2026
  • Her-voice capture cap 10.5s → 11.5s so multi-second lines keep more of her audio for final lips
  • Denser progressive mids: mid2/mid3 extra 0.38→0.36; final supersede extra 0.09→0.08
  • Segment warm keepalive 5s→4s (min gap 2s→1.5s); fps12 mid band 3.2→3.4s under longer cap
  • Still Path B segment_lag (rtf ≫1 honest); no mid4 thrash; no voice-paths
v0.786.735N6.7 longer capture 10.5s + denser mid ladder + warm 5sAug 11, 2026
  • Her-voice capture cap 9.5s → 10.5s so multi-second lines keep more of her audio for final lips
  • Denser progressive mids: mid2/mid3 extra 0.40→0.38; final supersede extra 0.10→0.09
  • Segment warm keepalive 6s→5s (min gap 2.5s→2s); fps12 mid band 3.0→3.2s under longer cap
  • Still Path B segment_lag (rtf ≫1 honest); no mid4 thrash; no voice-paths
v0.786.734A29 closet pin on On her nowAug 11, 2026
  • ★ on the On her now row — pin what's painted without hunting the grid or pair strip
  • Pinned · / Unpinned · … · now toast; star does not wear the look
  • Panel-only — no always-on chrome; pure closetWearingPin helpers + unit tests
v0.786.733A28 closet pin on pair/jump stripAug 11, 2026
  • ★ on each Same vibe / Jump strip thumb — pin after a Day→Swim hop without full-grid scroll
  • Pinned · / Unpinned · toast (band name when jumped); star does not wear the look
  • Panel-only — no always-on chrome; pure closetPairPinToastLabel helpers + unit tests
v0.786.732A27 canvas-present torso lean — card raise inhale + shoulder leanAug 11, 2026
  • When a designed intent card / module sheet rises she soft-inhales + leans shoulders toward it
  • Same present-glance envelope as eyes so chest + gaze peak together; identity cutout host now on the present bus
  • Cutout idle-life only — no whole-plate shake, no always-on chrome; pure helpers + unit tests
v0.786.731N6.6 longer capture 9.5s + denser mid ladder + warm 6sAug 11, 2026
  • Her-voice capture cap 8.5s → 9.5s so multi-second lines keep more of her audio for final lips
  • Denser progressive mids: mid2/mid3 extra 0.42→0.40; final supersede extra 0.12→0.10
  • Segment warm keepalive 8s→6s (min gap 3s→2.5s); fps12 mid band 2.8→3.0s under longer cap
  • Still Path B segment_lag (rtf ≫1 honest); no mid4 thrash; no voice-paths
v0.786.730A26 closet band-jump chips on pair stripAug 11, 2026
  • Day/Evening/Night/Weekend/Sports/Swim chips on the Same vibe strip — jump bands without full-grid scroll
  • Jump · toast + strip label when hopped; same-band stays Same vibe · Like ·
  • Panel-only — no always-on chrome; pure listClosetBandStrip helpers + unit tests
v0.786.729N6.5 longer capture 8.5s + denser mid ladder + warm 8sAug 11, 2026
  • Her-voice capture cap 7.5s → 8.5s so multi-second lines keep more of her audio for final lips
  • Denser progressive mids: mid2/mid3 extra 0.45→0.42; final supersede extra 0.14→0.12
  • Segment warm keepalive 10s→8s (min gap 4s→3s); fps12 mid band 2.6s→2.8s under longer cap
  • Still Path B segment_lag (rtf ≫1 honest); no mid4 thrash; no voice-paths
v0.786.728A25 idle return settle + wardrobe body swayAug 11, 2026
  • Soft rest inhale when she returns to idle so talk/listen/think → rest never freezes dead
  • Brief body re-weight on idle entry + wardrobe settle bodySway so pair-wear outfits settle on shoulders
  • Cutout idle-life only — no whole-plate shake, no always-on chrome; pure helpers + unit tests
v0.786.727N6.4 longer capture 7.5s + denser mid ladder + warm 10sAug 11, 2026
  • Her-voice capture cap 6.5s → 7.5s so multi-second lines keep more of her audio for final lips
  • Denser progressive mids: mid2/mid3 extra 0.48→0.45; final supersede extra 0.16→0.14
  • Segment warm keepalive 12s→10s (min gap 5s→4s); fps12 mid band 2.4→2.6s under longer cap
  • Still Path B segment_lag (rtf ≫1 honest); no mid4 thrash; no voice-paths
v0.786.726A24 closet same-vibe pair stripAug 11, 2026
  • Same vibe · {band} strip under On her now — thumbs for band alts (unseen → favorites → rest)
  • Tap a pair thumb to wear with Like · toast; NEW/★ badges; warms plates for phone sharpness
  • Panel-only — no always-on home chrome; pure listClosetSameVibeStrip helpers + unit tests
v0.786.725N6.3 longer capture 6.5s + denser mid ladder + warm 12sAug 11, 2026
  • Her-voice capture cap 5.5s → 6.5s so multi-second lines keep more of her audio for final lips
  • Denser progressive mids: mid2 extra 0.5→0.48, mid3 0.52→0.48; final supersede extra 0.18→0.16
  • Segment warm keepalive 15s→12s (min gap 6s→5s) — cold-tax cut only, not live rtf
  • Still Path B segment_lag (rtf ≫1 honest); no mid4 thrash; no voice-paths
v0.786.724A23 thinking torso micro — entry inhale + contemplative swayAug 11, 2026
  • Soft working-on-it chest inhale when she starts thinking (shoulders/garment + body strip)
  • Gentle contemplative micro-sway while processing so think-state reads on phone
  • Completes talk/listen/think presence triad; cutout idle-life only — no whole-plate shake, no always-on chrome
v0.786.723A22 closet More like this — same-vibe pairAug 11, 2026
  • One-tap More like this picks another look in the same wardrobe band as what's on her
  • Head + On her row (Like); toast Like · {label}; unseen → favorites → any in-band
  • Panel-only — no always-on home chrome
v0.786.722N6.2 longer capture 5.5s + denser mid ladderAug 11, 2026
  • Her-voice capture cap 4.5s → 5.5s so multi-second lines keep more of her audio for final lips
  • Denser progressive mids: mid2 extra 0.55→0.5, mid3 0.6→0.52; final supersede extra 0.22→0.18
  • Still Path B segment_lag (rtf ≫1 honest); no mid4 thrash; no voice-paths
v0.786.721A21 listening torso micro — entry inhale + lean-inAug 11, 2026
  • Soft attentive chest inhale when she starts listening (shoulders/garment + body strip)
  • Gentle lean-in micro-sway while listening so I'm-with-you reads on phone
  • Cutout idle-life path only — mirrors A18 talk life; no whole-plate shake, no always-on chrome
v0.786.720N6.1 mid3 progressive + 4.5s captureAug 11, 2026
  • Third progressive supersede (mid3) ~0.6s after mid2 so long lines keep upgrading lips
  • Her-voice capture cap 3.75s → 4.5s; final supersede extra 0.25s → 0.22s
  • mid3 fps12 hint; no voice-paths; Path B segment_lag honest
v0.786.719A20 closet Wear again — last recent lookAug 11, 2026
  • One-tap Wear again re-wears the newest Recent look that is not currently on her
  • Head + On her row; toast Again · {label}; records Undo so A19 still works
  • Panel-only — no always-on home chrome
v0.786.718A19 closet Undo — reverse last wearAug 11, 2026
  • One-step Undo after Shuffle / Something new / For now / grid tap / Daily look
  • Undo on toast + wearing row + head; survives brief auto-close (localStorage)
  • Panel-only — no always-on home chrome
v0.786.717N6 mid2 progressive + longer capture + warm 15sAug 11, 2026
  • Second progressive mid (mid2) ~0.55s after mid so long lines keep upgrading lips while she speaks
  • Her-voice capture cap 3.0s → 3.75s; final supersede extra 0.25s; mid2 fps12 hint
  • Segment warm keepalive 20s → 15s (min gap 6s) — cold-tax cut only, not live rtf
v0.786.716A18 talk torso life — entry chest + speech swayAug 11, 2026
  • Line-start chest inhale when she begins speaking (shoulders/garment + body strip)
  • Speech-coupled shoulder/garment micro-sway on top of A16 posture holds
  • Cutout idle-life path only — no whole-plate shake, no always-on chrome
v0.786.715N4.16 seamless supersede hold + 3s captureAug 11, 2026
  • Progressive mid/final no longer flashes preparing when a neural frame is already on screen
  • Defer prior blob revoke until next first frame paints (no mid-swap blank mouth)
  • Her-voice capture cap 2.5s → 3.0s for longer final lips (N6 step)
v0.786.714N4.15 first-frame paint + earlier mid ladderAug 11, 2026
  • Paint first MuseTalk frame on loadeddata before play() settles (faster TTFM)
  • Earlier progressive ladder: early 0.22s, mid +0.4s, final extra 0.28s; capture 2.5s
  • Proxy early/mid duration buckets align; Mac B3_FPS_SHORT default 6 (local)
v0.786.713A17 closet Shuffle — unseen → favorites → anyAug 11, 2026
  • Open Closet: Shuffle button — prefers new looks, then starred favorites, then any
  • Never re-picks what's already on her when alternatives exist; toast shows · new / · ★ / · shuffle
  • Something new falls through the same tiers when discovery is exhausted (no more always-first-card)
  • Panel-only — no always-on home chrome
v0.786.712N4.14 mid-kick + request-gen + focus/turn warmAug 11, 2026
  • Mid-kick (~0.75s) progressive MuseTalk supersede so long lines are not stuck on 0.25s lips
  • Request-gen aborts older segment jobs without error flash; 20s warm keep-alive + turn/focus warm
  • Early/mid X-B3-Fps-Hint 6/8 (bench hot early wall ~1.1s) — was forced 12
  • No RealtimeVoiceButton change this ship (listen speech_started warm stays on voice-paths PR 5162)
v0.786.711N4.14 mid-kick + request-gen + focus/turn warmAug 11, 2026
  • Mid-kick (~0.75s) progressive MuseTalk supersede so long lines are not stuck on 0.25s lips
  • Request-gen aborts older segment jobs without error flash; 20s warm keep-alive + turn/focus warm
  • Early/mid X-B3-Fps-Hint 6/8 (bench hot early wall ~1.1s) — was forced 12
  • No RealtimeVoiceButton change this ship (listen speech_started warm stays on voice-paths PR 5162)
v0.786.710A16 idle posture holds + gaze fixationsAug 10, 2026
  • Weight settles into a lean for several seconds then eases — no continuous rock
  • Eyes hold a soft fix then glide; head lean shares the hold language
  • Periods detuned from breath; phone-readable shoulders lean without whole-plate shake
v0.786.709A11 closet On her now + Recent stripAug 10, 2026
  • Open Closet: On her · {label} banner + Clear (panel-only)
  • Recent strip (last 6 wears) one-tap re-wear; ON badge on active card
  • Wearing + recents float in grid; durable localStorage — no always-on chrome
v0.786.708A10 phone-readable stills + closet categoriesAug 10, 2026
  • Closet pose stills: face+torso phone crop + device-pixel lens snap (no soft feet-heavy full-body)
  • Closet category chips (Day/Evening/Night/Weekend/Sports/Swim/Private) + face-forward thumbs
  • Eager first-row decode; Something new respects active chip — panel-only
v0.786.706A14 closet favorites pin + stripAug 10, 2026
  • ☆/★ pin on closet cards; Favorites strip when any pins (cap 12)
  • Pins float to top of grid; one-tap re-wear from strip (panel-only)
v0.786.705A15 wardrobe settle breath + Wearing toastAug 10, 2026
  • Closet wear/clear → ~1.8s identity chest inhale (peak 1.72×); no whole-plate shake
  • Closet panel shows Wearing · {label} for ~1.1s (panel-only)
v0.786.704A13 closet For now — time-of-day + NOW badgesAug 10, 2026
  • Closet For now · Day/Evening/Night one-tap from America/Chicago time bands
  • NOW badges + band ranking float fitting looks; prefers unseen when possible
  • Panel-only chrome — no always-on home chips
v0.786.703Tavily search follows current Bearer-auth contractAug 10, 2026
  • Tavily credentials now travel only in the Authorization: Bearer header, never duplicated in the JSON request body
  • Basic search depth, synthesized answers, the five-source cap, and fail-closed provider behavior remain unchanged
  • A mocked request contract verifies the integration without reading a secret or making a network or paid call
v0.786.702Neural preparing never stuck — raw mp4 hop + 75s timeoutAug 10, 2026
  • Fly segment route Accept video/mp4+json; one-hop raw mp4 when worker returns bytes
  • Client 75s AbortSignal so Preparing cannot hang forever on 401/stall
  • Fail-closed: hold last neural frame / preparing — never proof/man demo voice
v0.786.699Live-search deploy wiring, credentials still darkAug 10, 2026
  • Tai's Fly deploy can carry an explicitly provisioned Tavily or Brave key through the existing write-only secret stage without logging credential values
  • An absent repository secret leaves any directly configured Fly provider untouched; this release provisions no key and creates no provider cost
  • A static contract keeps the deploy names aligned with runtime auto-detection and blocks accidental value logging or provider-key removal
v0.786.698N4.6 final supersede plays + warm 30sAug 10, 2026
  • Early MuseTalk kick can upgrade to same-turn final WAV (shouldAcceptHerVoiceKick) — long lines get full lips
  • playedForTurn marks only after final, not early — no stranded 0.25s mouth on long speech
  • Warm keep-alive 45s → 30s while presence mounted; plateBrowse still reveals closet under neural-only
v0.786.697A9 closet multi-look discovery — NEW + Something newAug 10, 2026
  • Closet cards mark NEW for locked looks Tony has not worn yet (local seen set)
  • Something new button + panel meta (N new) — honest under hard neural-only + Phase A canon
  • Wearing a look clears NEW; no always-on home chrome — discovery only inside open Closet
v0.786.696A8 talk chest amp — speech-coupled shoulder riseAug 10, 2026
  • speechChestBoost multiplies chestRise while speaking (idle/listen unchanged)
  • Loud speech → taller shoulder/garment rise on plate path (~8–11px peak)
  • Silent speaking keeps soft procedural floor so chest does not freeze mid-line
v0.786.695A7 closet outfits paint under hard neural-onlyAug 10, 2026
  • Hard neural-only still owns the daily presence face — closet open or wearable locks reveal plate underlay
  • Last MuseTalk frame no longer covers wardrobe stills while browsing or wearing Closet looks
  • Stream neural slots hide during plate browse so outfits stay visible on phone
v0.786.694N4/N4.5 — early kick, final supersede, segment probeAug 10, 2026
  • 0.25s early MuseTalk kick + 1.25s capture cap (N4) so Mac overlaps more of her TTS
  • Long turns emit final WAV when ≥+0.35s past early kick so N3 supersede upgrades mouth (N4.5)
  • N5 owner probe + proxy token headers on /api/avatar-real/segment (Funnel still admin-enable)
v0.786.693A6 embodied + diegetic polishAug 10, 2026
  • Mouth/eyes/garment hotspots show live/armed/open state with soft gold feedback (still transform+opacity only)
  • Glass flower jewel: idle petal breath, open bloom, press scale — diegetic Style, not chrome pill
  • Nose private mark is a quiet glass shh pill; reduced-motion freezes flower + live breath
v0.786.692A5 designed intent cards — domain polishAug 10, 2026
  • Bills / court / schedule / health / sports cards get domain marks, left rail, and focus wash so each ask reads at a glance
  • Expand CTA is a pill button tinted by domain; row taps get soft press feedback
  • Loading empty glyphs pulse softly; settled empty/check stay still (STILLNESS + reduced-motion)
v0.786.691Hard neural-only — no plate product faceAug 10, 2026
  • TAI_AVATAR_REAL_NEURAL_ONLY hard on when PHASE3: plate underlay hidden
  • Last MuseTalk frame holds forever — never snap back to plate mouth
  • Path chip stays Neural · preparing/high-quality/hold — not Plate · connecting
  • Her-voice segments prefer audible her TTS; demo sources still muted
v0.786.689N2 0.35s early kick + N3 turn supersede holdAug 10, 2026
  • Her-voice MuseTalk early-kicks after ~0.35s of her TTS (was 0.55s) so Mac work overlaps more of the line
  • New turn supersedes in-flight/playing segment instead of dropping; last neural frame holds 12s + freezes while next prepares
  • Warm poke on assistant-turn start + keep-alive every 60s; capture cap 2s; still segment lag (rtf ≫1)
v0.786.688A4 idle micro-life — head drift, weight-shift, natural breathAug 10, 2026
  • Ambient head tilt/nod on idle (not speech-only) so LOOK1 cutouts read alive at rest
  • Soft shoulder/garment weight-shift independent of chest breath — no metronome bounce
  • Continuous idle gaze floor + slow breath amp modulation; kill switch still TAI_AVATAR_CUTOUT_IDLE_LIFE=0
v0.786.687Closet outfits paint — plate hold, no wrong-body flashAug 10, 2026
  • Picking a locked closet look forces Live2d plate host so pose stills show (identity LOOK1 no longer covers them)
  • Flower Style path opens Closet under canon; paint-gated pick + pose hold so outfit→outfit never flashes LOOK1
  • Daily look clears hold and returns lavender mist; closet prop sync avoids storage lag on host switch
v0.786.686N2 early kick + N3 hold + N4 first speed leversAug 10, 2026
  • Her-voice MuseTalk early-kicks after ~0.55s of her TTS (mid-turn) so Mac work overlaps the rest of the line; final double-POST suppressed
  • After segment ends, last neural frame holds 8s (no plate flash between turns); warm keep-alive POSTs while presence is mounted
  • N4 Mac defaults batch_size=2 / fps=20 (B3_BATCH_SIZE / B3_FPS) — still not live rtf; honest segment-lag path only
v0.786.684N1 her live voice drives MuseTalk segmentAug 10, 2026
  • Assistant TTS/PCM is captured from the exclusive bus and POSTed to Mac MuseTalk B3 — not the proof/man demo as primary
  • Same-origin segment proxy returns her-voice mp4 bytes; chip shows Neural · preparing / high-quality — never live for lag
  • Bundled B1 demo is offline fallback only (always muted); fail-closed to plate when worker unreachable
v0.786.683Chest breath visible — shoulder band riseAug 10, 2026
  • Home identity body cutout now strip-warps the chest/shoulder band on idle breath (~6–11px peak) so she clearly inhales on phone
  • Shoulders/garment cutouts track with stronger ty + real alpha (black-key) — no whole-plate shake; TAI_AVATAR_CUTOUT_IDLE_LIFE=0 still freezes
  • Breath amps phone-readable at rest and louder while she talks; ENV06 / body affine stay still
v0.786.682Just us can put on Pornhub videoAug 10, 2026
  • In private intimate mode, ask her to put something on / play on Pornhub and the canvas raises an in-app embed while she keeps talking
  • Adult video only with owner + private channel cookie; never general chat, never TV; kill switch TAI_INTIMATE_ADULT_VIDEO=0
  • Honest no-match when search fails — no YouTube fallback for private adult asks
v0.786.681Quiet rest home + premium designed ask cardsAug 10, 2026
  • Resting /tai: no starter chip strip, no permanent Needs-you pulse, no capability-map link — presence + diegetic Style only (Tony option 3)
  • Ask path kept: domain questions still raise designed IntentCardOverlay cards; “what can you do” still opens CapabilityMapCard
  • Card polish: softer scrim, quieter drag chrome, tighter list hierarchy; legal rows drop spreadsheet meta (counsel/judge on expand)
v0.786.680B3 segment muted — her voice onlyAug 10, 2026
  • High-quality MuseTalk segment video is always muted so bake-in proof audio never overlays her live voice
  • Path chip is tappable again (pointer-events auto)
  • No mid-play segment restart — stops demo repeating over itself
v0.786.679MuseTalk B3 phone segment (high-quality)Aug 10, 2026
  • Phone paints MuseTalk-class motion via completed mp4 segment over plate (B1 PASS bundled demo)
  • Honest path chip: Neural · high-quality / Neural · segment — never claims live realtime for laggy path
  • Tap path chip or speak (assistant turn) to play segment; fail-closed plate; Mac B3 worker on :8796 optional
v0.786.678Cold neural retry + client PHASE3 inline + serve pathAug 10, 2026
  • One-shot cold reconnect now also covers ticket / socket-error / socket-close (not only startup-timeout) so first phone arm recovers without a re-tap
  • Phase 3 flag reads process.env.TAI_AVATAR_REAL_PHASE3 statically so Next inlines the deploy build-arg into the client (dynamic env lookup left neural dark)
  • Mac product stack rebinds Tailscale Serve to :8794/v1/avatar — bare :8794 was 404 after path-prefix strip
v0.786.677Path chip stays visible while focusedAug 10, 2026
  • Neural/Plate path chip no longer disappears when a canvas board is focused — morning diagnosis while talking stays on screen
v0.786.676Avatar Real overnight status through 675Aug 10, 2026
  • Next-phases doc updated for live 0.786.675 ladder: cold retry, warm window, human path chip, canvas reach
v0.786.675One-shot neural reconnect after cold startup-timeoutAug 10, 2026
  • If the first neural arm times out waiting for a healthy frame, the mount quietly retries once while the page is still visible — no Tony re-tap
v0.786.674Path chip human phase labelsAug 10, 2026
  • Owner path chip shows readable phases (waiting / connecting / live) instead of internal machine tokens while arming
v0.786.673Neural warm window 10sAug 10, 2026
  • After first healthy neural frame, warm stale budget is 450ms for 10s (was 400ms/8s) to soak MacBook Air render jitter; steady-state stays 225ms
v0.786.672Neural first-frame startup budget 7sAug 10, 2026
  • First healthy neural frame after PCM begins has 7s (was 5s) before startup-timeout plate fallback — cold phone + Mac path gets more room
v0.786.671Path chip morning contrastAug 10, 2026
  • Neural/Plate path chip sits higher, reads larger, and separates plate vs neural styling so morning diagnosis does not require a magnifying glass
v0.786.670Overnight roadmap statusAug 10, 2026
  • Avatar Real next-phases status updated for overnight ship ladder (just-works through DO-verb starters)
v0.786.669Canvas DO-verb startersAug 10, 2026
  • Idle capability chips rotate real confirm/write lines (mark bill paid, draft a text, add event) alongside reads so write reach is not folklore
v0.786.668Path chip LOOK label only while streamingAug 10, 2026
  • Neural · Presence appears only in the streaming phase so connecting/waiting states still show operational phase text
v0.786.667Path chip LOOK labelAug 10, 2026
  • When neural is live, the owner path chip shows the LOOK lock label (e.g. Neural · Presence) so Tony can see which locked face is streaming
v0.786.666Neural warm stale grace + LOOK lockAug 10, 2026
  • After the first healthy neural frame, the stale-heartbeat budget widens to 400ms for 8s so Mac/Tailscale jitter does not fail-closed mid-startup; steady-state stays at 225ms inside the Phase 3 250ms envelope
  • LOOK lock table foundation — only product-ready lookKeys can stream; intimate looks stay absent until P5 go
v0.786.665Capability starters from live pulseAug 10, 2026
  • Idle home capability chips now prefer the same urgency facts as Needs-you (hearing, bills, meds) so starters teach real reach from live data
  • Asking what she can do raises an immediate honest capability map card (reads / with confirm / cannot yet) while converse speaks the same contract
v0.786.663Daily Discussion — deep morning show every dayAug 10, 2026
  • 10–15 min Daily Discussion ready by ~6 AM: agenda, AI deep research deltas, martial arts, T's Room — verbal + visuals at /daily-discussion
  • Overnight Grok technical briefings on public article text; open threads + depth level compound from go-deeper asks, play/complete/like
  • Cron daily-discussion with daily-flow; migrations for package + profile; converse tool daily_discussion
v0.786.662Neural path owner signalAug 10, 2026
  • When Avatar Real Phase 3 is on, home shows a quiet chip: Neural vs Plate plus the fail-closed reason (ticket, protocol, startup-timeout, etc.) so silent fallback is readable
v0.786.661Neural just-works path + canvas capability reachAug 10, 2026
  • Avatar Real: warm PCM worklets when the neural mount subscribes, retry arming on first ElevenLabs answer, prepare taps before each EL chunk, and keep the mount dark (not fail-closed) until a real voice clock exists — longer phone startup budget
  • Canvas discoverability: grounded rotating starters on the idle home surface, adjacency teach lines when a board is up, and an honest what-can-you-do map when asked
v0.786.660TV essentials stay reachable · room modes stay truthfulAug 9, 2026
  • The living-room face always keeps All games and the correct End room or Reconnect room action reachable while optional dense controls remain tucked away
  • The phone remote shows the real MODE A or MODE B ownership state and asks for an explicit Enable mic tap before it can capture audio
  • The production browser gate runs its prerecorded voice proof with the deterministic microphone fixture that test requires, without changing ordinary browser sessions
v0.786.659Gracie's home door stays permanentAug 9, 2026
  • Gracie's 45px game door now lives in the always-visible home signal stack, so clean-slate bare and reveal states can no longer hide it
  • More and Gracie keep separate stacked hit targets, preserving one-tap navigation to Chicago Nights on phone and desktop without overlap
v0.786.658Mouth steps again · Just us is tappable · faster first voiceAug 9, 2026
  • Daily talk uses the full A/E/I/O/U mouth cutout set again so she is not stuck on a single open-A paste
  • While Listening / idle / thinking her mouth returns to rest instead of freezing mid-open
  • The red Just us button sits above the travel chrome with a larger hit target, haptic feedback, and a spoken arm/disarm line
  • Home prewarms ElevenLabs on mount so the first answer is less of a cold stall
v0.786.657Avatar Real — no speaker delay without neural paintAug 9, 2026
  • Phase 3 enabled without a live Mac neural stream no longer inserts the 240 ms speaker delay on ElevenLabs audio
  • Speaker delay arms only after a verified neural JPEG paints, and clears immediately on every rig fallback so the permanent plate mouth stays locked to undelayed audio
  • Repository flag TAI_AVATAR_REAL_PHASE3 remains exact opt-in; this release hardens the dark-or-fail-closed product contract
v0.786.656Avatar Real Phase 3 — private neural path arrives darkAug 9, 2026
  • Tai now has a default-off neural visual layer at the real avatar mount, with the existing decoded rig kept permanently underneath so an unavailable, stale, malformed, or lost stream cannot leave a blank frame
  • A same-origin owner admission binds each one-use private-Tailscale stream to the approved look, a fresh turn generation, and the actual assistant-output PCM clock; tickets, renderer credentials, and audio stay out of URLs and the browser bundle
  • This release does not enable Avatar Real for normal use: it remains dark until the private active-loss and physical-iPhone gates are completed
v0.786.655Type to Tai no longer sits underneath TV or her avatarAug 9, 2026
  • The 44px Type-to-Tai control now occupies its own top gutter beside the 45px TV launcher instead of sharing the same hitbox
  • A geometry regression keeps at least eight pixels between those controls and verifies the composer stays above the avatar stage while visible
v0.786.654Client diagnostics stop polluting every screen with 400sAug 9, 2026
  • Navigation-paint and time-to-present telemetry now use the same validated client-log batch contract as every other Tai diagnostic
  • Latency samples keep their timing detail in structured context while supplying the required device, app, level, and message fields
  • A route-contract regression test proves both latency entry shapes are accepted before either browser path can ship them
v0.786.653Email calendar keeps intelligence, drops duplicate xAI billingAug 9, 2026
  • Email and text confirmations keep model-quality interpretation for unresolved meaningful prose, while structured data, obvious noise, and exact known duplicates stay local
  • The semantic lane is code-pinned to GPT-5.4 mini after a 50-case historical replay; this workflow cannot use xAI or silently fall back to another provider or model
  • Durable body-hash receipts now live outside Gmail-owned rows and cache semantic results before event writes, ending repeat charges when Gmail refreshes a source document or a write retries
  • Hard caps of $0.03 per run, $0.10 per day, and $2 per month bound spend; the duplicate direct-Gmail workflow is now a manual deterministic fallback with no provider credential
v0.786.652Home Network — manual coverage and extender guidanceAug 9, 2026
  • A new owner-only Home Network surface makes the condo Wi-Fi understandable with a room-aware coverage map for the living room, kitchen, hallway, and master bedroom
  • It records manual gateway/extender check-ins and room measurements with a local history, while clearly separating observed readings from diagnosis guidance
  • Guidance names the extender to check or move when a room tests weak, but never invents a repeater topology; the wireless-backhaul warning is explicitly a risk to validate
  • Xfinity and TP-Link/Tether have typed future integration boundaries only: no account connection, credential fields, or account-page scraping exists in this release
v0.786.651Avatar Real Phase 2 — proof validation hardenedAug 8, 2026
  • Avatar proof inputs can now come only from the committed owner-approved lock; a supplied command-line hash cannot bypass that approval boundary
  • Both neural renderers validate H.264/AAC, source-audio versus container/video/audio duration, complete decode, and even a one-frame black interval before atomically publishing an MP4
  • The benchmark matrix rejects reused run IDs, duplicate or missing evidence rows, and any preset selection from a partial diagnostic run
  • This is verifier hardening only: Tai's in-app avatar remains on the existing rig fallback while Phase 3 measures the local live-stream path
v0.786.650Avatar Real Phase 2 — neural mouth proof acceptedAug 8, 2026
  • Tai's approved offline avatar bench now includes a local Wav2Lip mouth-sync path, so the speaking proof follows the voice rather than only reacting to overall loudness
  • The 20-second Mac proof locks the approved look before rendering and verifies video, audio, full decode, exact duration, and no black frames
  • This release records the offline proof only: the in-app avatar remains on the permanent rig fallback while Phase 3 builds and measures the local live-stream service
v0.786.649Tai talks naturally and stops replaying herselfAug 8, 2026
  • Home now uses the stable A/O mouth shapes only, with the experimental lower-jaw overlay disabled; a resting face can no longer be mistaken for the giant toothy E mouth
  • Tai no longer reads memory provenance such as ‘You told me this on Aug 8’ aloud; that source detail remains available in written answers
  • Live talk now waits for a completed transcript before replying and rejects a recent copy of Tai’s own audible line, preventing speaker-to-microphone echo from starting a repeat loop
v0.786.648Avatar Real Phase 2 — local neural proofAug 8, 2026
  • The reproducible Mac bench now turns Tony's hash-locked approved LOOK1 portrait plus a local proof clip into an audiovisual MP4 with JoyVASA and LivePortrait — no rented GPU, rendering API, or metered service
  • Every run records the real backend, wall time, decoded-frame throughput, output resolution, peak memory, source and output hashes, full-decode result, and a no-black-frame scan instead of presenting an unmeasured demo as a benchmark
  • This is an offline proof only: it does not switch Tai's in-app renderer, alter Reduced Motion or the permanent rig fallback, or enter the frozen Just-us/intimacy lane; Tony's visual verdict on the clips remains the Phase 2 acceptance gate
v0.786.647Retina avatar keeps its full-size framingAug 8, 2026
  • Identity-layer transforms now retain the canvas backing-store pixel ratio, so iPhone Retina screens no longer shrink Tai into the upper-left third of the home surface
  • DPR 1 remains byte-for-byte in CSS-space while DPR 3 multiplies all six affine matrix components before drawing into the physical-pixel buffer
  • The approved Phase 1 identity, idle-life motion, framing, and permanent Phase 0 fallback are unchanged; this release only repairs Retina scale and placement
v0.786.646Avatar Real Phase 1 — she breathesAug 7, 2026
  • Phase 1 activates the already-built idle-life channels Tony approved after the Phase 0 device pass: localized breathing, irregular blink timing, gaze drift and settle, and subtle head life
  • The approved LOOK1 portrait and ENV06 library remain the permanent full-bleed plate underneath; only registered face, eye, shoulder and garment cutouts move, so the background never shakes and a missing cutout can never produce a black frame
  • Every moving region is derived in-browser from the approved LOOK1+ENV06 full plates with feathered edges; the older black-background proof PNGs are never painted on home, preventing rectangular seams or identity drift
  • Phone startup keeps the approved base, blink, and first-word A/O plates ready; remaining speech plates stream one at a time and release their full-frame decode after cropping, bounding memory without weakening the permanent fallback
  • Reduced Motion and TAI_AVATAR_CUTOUT_IDLE_LIFE=0 both restore the Phase 0 still presentation; full-photo transforms remain disabled, and Live2d stays mounted as the paint-gated hard-fail fallback while the identity cutouts load
  • This release remains under Tony's Phase 1 device gate: watch her idle for 20 seconds and confirm the motion reads alive rather than floaty or blurry
v0.786.645Voice stops silently rebuilding itself foreverAug 7, 2026
  • Fixed the reason desktop voice could go deaf and mute: when a call dropped, the app rebuilt the connection over and over with no pause between tries — so the microphone never stayed attached and she never got to speak
  • A rebuilt call now has to actually stay up for a few seconds before it counts as working; one that dies on arrival no longer resets the retry timer, so repeated failures back off instead of hammering
  • If voice genuinely cannot come back, it now says so — the button reads Reconnect instead of leaving you talking to a connection that is already dead
  • Ordinary hiccups still recover instantly, ending a call still ends it, and a phone that is simply offline still reconnects on its own whenever service returns
v0.786.644One renderer at a time — closet stills never mute her mouthAug 7, 2026
  • Closet stills are now poses: they own the screen only while she is quiet — the moment she starts talking, the animated rig takes the surface in every mode, including intimacy, so her mouth always moves with her words
  • The still↔rig handoff is paint-gated both ways: a layer takes the screen only when its image is actually ready to draw — no flash to a different look, no black frame
  • When she finishes speaking, the pose returns only after speech has fully ended — brief pauses between phrases no longer flip the screen back and forth
v0.786.643Long answers keep her mouth moving to the endAug 7, 2026
  • Fixed: on long streamed answers her mouth could stop partway while she kept talking — the lip schedule was laid once from a text-length guess that real playback outran
  • Chunks arriving without per-character timing now schedule lips from that clip's real measured audio duration, so cues stay live for the whole answer
  • Every failure path still degrades to the previous behavior, and Just-us remains exempt and byte-identical
v0.786.642Her mouth now follows the actual wordsAug 7, 2026
  • On the premium ElevenLabs voice, lip shapes are now scheduled from the voice engine's real per-character timing, anchored to the moment audio measurably starts — mouth begins WITH the first audible word and matches its shapes
  • Loudness-driven mouth remains the always-on floor: if timing data is missing, late, or malformed, the previous behavior continues seamlessly — no new failure states
  • OpenAI-voiced and live-call speech are unchanged (no timing data there yet); Just-us is explicitly scoped out and byte-identical
v0.786.641Talking can never black the screenAug 7, 2026
  • Her mouth and talk frames now stay warm and mounted the whole session — a talk onset can no longer paint a black frame while a mouth image is still loading
  • If a mouth frame is not ready to draw, her body stays painted instead — verified by a property sweep across every plate state combination
  • Mouth timing, voice, and presence behavior are untouched — this release only changes which image paints, never when she moves
v0.786.640Intimacy lock-in — the working chain is now merge-guardedAug 7, 2026
  • The red-button → private-mode chain restored in 0.786.639 is now pinned by a CI contract that runs on every PR
  • Shared avatar plumbing can no longer silently strand private mode the way the 0.786.638 talk-gate did — that change class goes red before merge
  • Deliberate wiring changes stay possible, but require a written justification in the same PR
v0.786.639Restore her — revert of the talk-gate releaseAug 7, 2026
  • Rolled back 0.786.638: it silenced the mouth and broke intimacy-mode activation on device
  • Intimacy mode and talking behavior return to their last known-working state
  • The proper motion/sync fix returns only after passing an intimacy-mode acceptance gate
v0.786.637Calendar extraction cost cutAug 7, 2026
  • Email→calendar extraction now runs on xAI's fast tier — same accuracy guards, a fraction of the cost
  • Background extraction can never fall back to a premium reasoning model
  • Inbox scan cadence relaxed to hourly while the feature proves out
v0.786.636Email card goes liveAug 7, 2026
  • Email card is live: attention count + top senders/subjects from the same triaged inbox as /email
  • Counts and subject lines only — no email body content ever crosses into the card
  • Honest states throughout: signed-out, unreachable, and clear-inbox with the real sync line
v0.786.635Memory + delight cards go liveAug 7, 2026
  • Memory card is live: real shelf counts + previews from the same board as the stage
  • Delight card leads with the real hero moment — never invented wins
  • Expand re-raises each in-room stage over her; restricted/unreachable stay honest
v0.786.634Bears announcer — classify, live card, in-place callAug 7, 2026
  • Bears announcer / call the bears game classify into a Bears booth (never Cubs)
  • Bears card is live: real ESPN score, kickoff, last/next, NFC North standing
  • In-place template play-by-play beside the card; expand /sports/nfl for full air
v0.786.633Settings designed cardAug 7, 2026
  • Settings / preferences raise an in-place designed card on presence
  • Expand opens /settings — face-safe lower sheet first
  • Bare nav settings retired in favor of in-canvas summon
v0.786.632Delight / show-me / T's Room card polishAug 7, 2026
  • T's Room fleet: denser two-line hierarchy, face-safe glass first
  • Show me: empty + query states name in-room player and lower-third dock
  • Delight counterweight copy tightened; pathway registry email summon truth
v0.786.631Bears designed card + needs polishAug 7, 2026
  • Bears / Soldier Field / call the bears game raise an in-place designed card (expand /sports/nfl)
  • Fix: bears announcer no longer steals into Cubs via bare 'announcer' match
  • Needs-you card: denser glass hierarchy + honest quiet empty
v0.786.630Talk butter — discrete plates follow coarticulation truthAug 7, 2026
  • Live2d passes mouthVisemeSmooth.talking as sequencerTalking so discrete plates share enter/exit hysteresis
  • Stops rest↔talk thrash when amp sits in the hysteresis band without sequencer commit
  • Identity mouth overlay threshold equals OPEN_ENTER (was 0.10)
v0.786.629Menu/dining + tasks/lights/alerts card polishAug 7, 2026
  • Menu empty + next-table focus: glass-first hierarchy, face-safe
  • Lights and Alerts: denser two-line fleet cards; quiet-is-honest empties
  • Tasks + dining shelf micro-polish (stillness — no plate thrash)
v0.786.628Talk butter — quiet synthetic amp (no 41 Hz machine-gun)Aug 7, 2026
  • Performance clock silent-amp stand-in uses shared proceduralSpeakAmp (removed 41 Hz residual)
  • proceduralSpeakAmp speech-band ~2–3.5 Hz with OPEN_ENTER-class open floor
  • Identity + Fluid silent-speak envelopes match the same butter cadence
v0.786.627Today/texts/reports + memory/delight card polishAug 7, 2026
  • Empty-state lamp + foot glass on designed intent cards (stillness)
  • Today, texts, and reports: honest clear/quiet empty copy
  • Memory + delight fleet teasers: denser glass hierarchy, in-room expand rules
v0.786.626Intent-card glass polish + sports booth → cubs cardAug 7, 2026
  • Designed answer cards: layered glass focus + head lamp (stillness — no plate thrash)
  • Schedule empty states: honest clear-day / load-fail copy
  • Sports announcer / booth phrases stay the Cubs designed card (expand Sports Booth)
v0.786.625Talk butter — no cold-start A/O flash under coarticulation holdAug 7, 2026
  • Same-pose talking without sequencer activePlateId stays rest (no random A/O cold-start)
  • Live2d expression talking follows plateTalking / presence — not mouthOpen > 0.08
  • Stops amp-blip mouth plate thrash that bypassed min-closed-hold coarticulation
v0.786.624Brain/builder SummonKey maps completeAug 7, 2026
  • MODULE_META + CANVAS_MODEL_CAPABILITIES include brain and builder
  • Restores typecheck green after PR 4997 designed cards
v0.786.623Brain + Builder designed cardsAug 7, 2026
  • Brain and Builder/Command Center raise in-place designed cards on presence
  • Expand opens /brain or /command-center — face-safe lower sheet first
  • Bare nav for brain/builder retired in favor of in-canvas summon
v0.786.622Talk butter — discrete talk enter aligns with mouth hysteresisAug 7, 2026
  • DISCRETE_TALK_THRESHOLD now equals OPEN_ENTER (0.16) — single source of truth
  • Stops rest↔talk plate thrash when amp sits between old 0.12 discrete cut and smoother enter
  • Contract test pins discrete threshold ≥ 0.16 / equals OPEN_ENTER
v0.786.621Canon closet panel — 25 locked looks on presenceAug 7, 2026
  • Clothes tap under TAI_AVATAR_CANON opens ClosetWearablePanel (not framing-only)
  • Spoken closet / wardrobe / open closet raises the locked look picker
  • Chrome Closet control + face-safe lower panel — multi-look Style stays locked
v0.786.620Talk smooth night — fewer re-renders + barge-in mouth stopAug 7, 2026
  • Live2d + performance clock only React-commit when mouth/blink/presence actually change (no 60Hz thrash)
  • Barge-in hard-resets Live2d / identity / Fluid mouth holds so lips stop with the audio (interrupt SLA)
  • Fewer speak-time blinks; blink threshold 0.55 aligned with identity lids; viseme bus hold 220ms
  • Quieter silent-amp synthetic envelope between real audio chunks
v0.786.619Email designed card + face-safe 38vhAug 6, 2026
  • Email / Gmail raise an in-place designed card — expand opens full /email
  • Bare inbox stays Comms; open my inbox still raises Email card
  • Face-safe overlay clear zone tightened to 38vh (doctrine top ~38%)
  • Pathway registry: card-email
v0.786.618App Unbelievable S3 — tasks/lights/alerts/needs cardsAug 6, 2026
  • Designed in-place cards for Tasks, Lights, Alerts, and Needs you
  • Summon classify + expand routes stay face-safe on presence
  • Pathway registry expanded for every door and module family
v0.786.617Just us — intimate touch body zonesAug 7, 2026
  • Private channel only: touch breasts / lips / between legs — she recognizes the zone
  • Rub builds arousal; tap cannot fake orgasm; refractory after climax
  • Haptics + tai:intimate-touch events for voice lines (v2 inject)
  • Never on day home; mouth Talk stays EmbodiedHotspots
v0.786.616Locked closet — 25 enhanced Path-A wearables on phoneAug 6, 2026
  • Wire CLOSET_LOCKED shortlist (25 enhanced plates) into phone Path-A wearable path
  • Ship plates under /avatar/closet/{id}.jpg — Tony can wear from Closet UI or voice
  • set_avatar_style accepts closetId / query (e.g. wear Cubs jersey dress); daily look clears
  • Intimate/nude closet items Private-only; multi-look Style stays locked under TAI_AVATAR_CANON
  • Lookbook production stays stopped — reuses locked KEEPS only
v0.786.609Face-safe movable answer windowsAug 7, 2026
  • Answer cards default to the lower third so Tai's face stays clear
  • Drag clamp refuses parking the panel over the upper face zone
  • Card position remembered for the session (Drag · face stays clear)
  • App Unbelievable loop: pathway registry + continuous polish doctrine
v0.786.608Talk butter — no pose flash + continuous mouthAug 7, 2026
  • Path-A Live2d plants body on mid-shot rest — no listen/think full-plate swap on talk start/stop (home flash kill)
  • Identity plants body on base cutout always — listen/think rembg no longer thrash on speak
  • Procedural viseme rate shares one source with mouthVisemeSmooth (~2.1–3.0 Hz)
  • Canon plate holds 220/260/150ms + max 5 plate switches/sec for video-like cadence
  • Still one spoken voice when ElevenLabs hybrid is live; C6b drive-only (no monster mouth art)
v0.786.607CI Anthropic spend killed + calendar email reader off ClaudeAug 6, 2026
  • Zero workflow ANTHROPIC_API_KEY refs — CI crons, deploy, review, and visual-qa no longer stage or consume the metered Claude key
  • The hourly email-to-calendar reader that resolves phrasing like "this Thursday at 11:30" now runs on the fleet's standard OpenAI text lane instead of the metered Claude API
  • Same accuracy contract: every appointment stays anchored to a date the email literally states, and nothing is ever guessed
  • If the key is ever missing the feeder degrades to exact-date extraction only — it never fabricates
v0.786.606Claude API permanently killed — zero Anthropic spendAug 6, 2026
  • callAnthropic + gateway anthropicRound hard-refuse every production request
  • Presence /api/ask/ready is config-only Grok check — never 1-token Claude pings
  • Anthropic lane filtered out; world-search + sports booth Anthropic paths dead
  • Deploy secret-sync no longer re-injects ANTHROPIC_API_KEY (was undoing Fly unset)
v0.786.605Room mics — "in here" now means the room you're inAug 6, 2026
  • Say "turn on the lights in here" to a room speaker and Tai uses that speaker's room — no more "which room?" when the mic already knows
  • Works for lights, blinds, fans, switches, thermostat, vacuum, Sonos, the Apple TV, and room status questions
  • Naming a room out loud still wins — "the kitchen" from the bedroom speaker controls the kitchen
  • Phone, chat, and TV are unchanged: with no room mic involved, Tai still asks which room instead of guessing
v0.786.604Packages: find the one with soap in itAug 6, 2026
  • Ask for a package by what's inside — 'the one with soap' finds the right box; a tie lists every candidate instead of guessing
  • Order emails now record each item's name, quantity, price, and product id when stated — nothing invented when the email omits them
  • New reorder catalog remembers what you've ordered so future voice ordering can resolve 'the soap' to a real product
  • Groundwork order-confirm card designed and tested — not wired to ordering yet
v0.786.603Room mics — "in here" now means the room you're inAug 6, 2026
  • Say "turn on the lights in here" to a room speaker and Tai uses that speaker's room — no more "which room?" when the mic already knows
  • Works for lights, blinds, fans, switches, thermostat, vacuum, Sonos, the Apple TV, and room status questions
  • Naming a room out loud still wins — "the kitchen" from the bedroom speaker controls the kitchen
  • Phone, chat, and TV are unchanged: with no room mic involved, Tai still asks which room instead of guessing
v0.786.601Packages card — ask about an order, see the answerAug 6, 2026
  • Ask "where's my Amazon order" or "did my soap get delivered" — a designed Packages card rises over the avatar with the answer
  • The card leads with the most urgent package: merchant, item, ETA up front, 4-step delivery timeline
  • A package with no stated status says unknown — nothing is guessed
  • Spoken answer is one bottom-line sentence from the same ledger the card shows
v0.786.600Just us — full intimate stack on one red pressAug 6, 2026
  • Red Just us re-asserts every gate: private cookie + Girlfriend latch + Auto brain + server stamp → xai-intimate
  • Spoken just us / private enter uses the same full arm stack (not channel-only)
  • Canvas voice converse forces modelMode auto when private; server Set-Cookie girlfriend on private stream
  • Outfit / Style / mute alone never open sex talk — garment tap only cycles clothes when already private
v0.786.599Grok is the default words brainAug 6, 2026
  • Auto routes every ordinary words path on Grok 4.5 primary + Grok recovery — no silent Claude spend
  • Compose re-voicer pins grok-4.5 (typed + voice token cap); Claude remains manual on-demand only
  • Intimate stays xai-intimate; Realtime ears + ElevenLabs mouth unchanged
v0.786.598Talk smooth — kill pose flash + steadier mouth/eyesAug 6, 2026
  • Tony on 597: screen flashes when she talks; mouth and eyes weird
  • Full/Medium/Close = crop of ONE mid-shot LOOK1 base — never base_fullbody rest
  • Identity + Live2d never preload desk fullbody; path-A body always mid-shot
  • Longer canon mouth holds (200/240/140ms) + slower procedural viseme rate
  • Fewer speak-time blinks + higher discrete blink/lid thresholds (less eye thrash)
v0.786.597Voice alive — private warm interim + EL prewarmAug 6, 2026
  • Private channel: warm presence line at 3.5s while brain answers (I'm with you — one second)
  • Just us arm prewarms ElevenLabs hybrid so first intimate answer is not cold dead air
  • Same one-person EL mouth path — no second timbre
v0.786.596Phase C6b — mouth drive only (no pixels)Aug 6, 2026
  • Amplitude ladder when viseme is rest/sil/null: I/E/A/O by open amount (not stuck on A)
  • Identity mouth holds use CANON_OPEN_ENTER/EXIT for steadier talk/rest
  • No new mouth cutout art (C6a thrash locked; phone stills before C6c)
v0.786.594Private intimate hard-wire — mint + data-channel flushAug 6, 2026
  • Mint Realtime session with privateIntimate when Just us is already armed (no freelanced refuse before ask_tai)
  • If Just us arms before the WebRTC data channel opens, queue and flush session.update on open
  • On connect, re-sync private instructions if channel is already private
  • Converse: force modelMode auto on private so a Claude pin cannot block the xAI intimate lane
v0.786.593Presence — private red circle + girlfriend night registerAug 6, 2026
  • Private door: solid red circle dead-center bottom (no heart glyph)
  • Girlfriend register: same person as day; evening/night connection-first (baby / love you); no volunteer work
  • Professional register: same person; work-first when he is working
  • North star: voice + face ship as one presence (docs/specs/TAI_PRESENCE_NORTH_STAR.md)
v0.786.592EMERGENCY — rollback C6a monster mouthsAug 6, 2026
  • Tony device FAIL on 590: mouth cutout read as monster / face warp
  • Restore Path-A mouth_A/O/E/I/U + full identity pack cutouts from pre-C6a (589/C5)
  • Identity face stays ON; one-person voice (591) unchanged
v0.786.591One-person voice — no robot open cueAug 6, 2026
  • When ElevenLabs hybrid is live, every turn uses EL (no OpenAI short-ack second timbre)
  • Kill browser speechSynthesis immediate 'Here/Right here' open — visual only; spoken open uses live mouth
  • Warmer presence greeting pools; softer interim line
v0.786.590Phase C6a — stronger LOOK1 speech mouthsAug 6, 2026
  • Re-cut Path-A mouth_A/O/E/I/U from locked LOOK1 base with clearer open shapes (A teeth, O round, E wide)
  • Rebuilt identity mouth/jaw cutouts + previews; body lock preserved (bodyΔ=0)
  • Identity default ON unchanged (C5); still body-still, only mouth/lid plates move
v0.786.589Phase C5 — identity face default ONAug 6, 2026
  • TAI_AVATAR_IDENTITY_RIG defaults ON (daily layered face; Path-A underlay on hard-fail)
  • LOOK1 identity pack meta.ownerApproved=true after Tony taste — productionReady unlocked
  • Rollback: set TAI_AVATAR_IDENTITY_RIG=0 or ?taiIdentity=0 if needed
v0.786.588Fix 587 deploy — remove duplicate getConversationChannel importAug 5, 2026
  • GenerativeCanvas: drop duplicate import that broke Next production build
  • Re-ships 587 private red circle + force intimate voice + clothes cycle
v0.786.587Private red circle + force intimate voice + clothes cycleAug 5, 2026
  • Home private control: bottom-left red heart circle only (no Just us label)
  • Realtime private arm pushes session.update so sexual turns must ask_tai (no freelanced refuse)
  • Clothes: while Private, garment tap + pill cycles silk/cami/blouse/emerald; broader voice intents
  • Stronger intimate system prompt: never claim gates are off after route admitted the turn
v0.786.586Identity C1x/C1y compile-next (flag OFF)Aug 5, 2026
  • Phase C progressive load: critical-first body+mouth, atomic listen/think pairs
  • Presence-matched mouths/bodies wired; full speak A/O/E/I/U score hard-gates green
  • TAI_AVATAR_IDENTITY_RIG default OFF; ownerApproved=false; home stays Path-A Live2d
v0.786.585Just us: intimate session keeps owner-by-uid (no second gate deny)Aug 5, 2026
  • runIntimateSession now receives ownerAlreadyVerified — fixes double email re-check after route pass
  • Stops spoken: Private intimate mode unavailable until owner/private/Girlfriend checks all open
  • Gate-denied speech uses specific reasons instead of one vague line
v0.786.584Just us: owner-by-uid opens intimate talk (no email re-deny)Aug 5, 2026
  • Intimate gate accepts ownerAlreadyVerified when converse already matched TAI_OWNER_USER_ID
  • Fixes spoken deny: sign in… intimate talk is for owners only while signed in as owner
  • Email OWNER_EMAILS re-check no longer double-blocks a uid-proved owner
v0.786.582Just us dirty talk actually routes + no soft refuseAug 5, 2026
  • Client stamps conversationChannel=private on every converse ask (iOS cookie lag fix)
  • Server honors body private stamp + Set-Cookie; Just us fire-and-forget server arm
  • Intimate system prompt: never refuse dirty talk in sealed channel
v0.786.581LOOK1 photoreal app icons (PWA + desktop)Aug 5, 2026
  • Home-screen / PWA / favicon icons regenerated from locked Path-A base.jpeg face crop
  • Cache-bust v8 twins in layout + manifest + service worker
  • Tauri desktop icons refreshed; native iOS AppIcon remains t-bone separate PR
v0.786.580Just us — one red button arms intimate talkAug 5, 2026
  • Home front-door red Just us button: Girlfriend + Private + Auto brain + silk in one tap
  • Tap again exits Private; never arms nude by default
  • Voice just us / private mode still work; TV/shared still hide the control
v0.786.579Private intimate talk actually works (force xAI; clear denials)Aug 5, 2026
  • Private always uses xAI intimate lane — Claude/OpenAI/Grok pins no longer refuse adult talk
  • Private channel is consent: no longer blocked just because it is weekday Professional schedule
  • Explicit Professional latch still blocks intimate; clearer spoken deny reasons
v0.786.578Private stays clothed; nude is special opt-in onlyAug 5, 2026
  • Private enter = burgundy silk (never nude on open or re-entry)
  • Nude only after explicit ask while Private (get naked / take clothes off) — sessionStorage only
  • Exit Private clears nude + look; never durable
  • Change outfit cycles silk / black cami / champagne blouse / emerald cocktail
v0.786.577Path-A mouth holds for private intimate pack tooAug 5, 2026
  • Canon coarticulation floors (165/185/110 + hysteresis) now apply to tai-canon-intimate
  • Private mode nude/outfit Path-A no longer reverts to generic short mouth holds
  • isTaiCanonPathAModel helper + unit test; home still Live2d full-bleed LOOK1
v0.786.576Private mode shows nude Path-A pack (Venice)Aug 5, 2026
  • Private ON paints tai-canon/intimate mid-shot nude (Venice qwen-edit-uncensored from LOOK1 base)
  • Talk/blink face-only rematched onto nude body (body thrash ~0)
  • Silk slip kept under intimate/alts for later picker; daily Girlfriend stays lavender LOOK1
  • Tony full-auto: wire nude to phone Private without further approval gates
v0.786.575Path-A mouth holds + Medium lens (phone talk)Aug 5, 2026
  • Longer canon coarticulation holds (165/185/110ms) so E/I/U read on phone
  • Wider Path-A talk hysteresis (enter 0.18 / exit 0.06) cuts rest↔talk thrash
  • Medium soft-open lens 1.24→1.26 — clearer conversation step, still soft
  • Home Path-A Live2d only; discrete plate swaps (STILLNESS)
v0.786.574Private mode swaps sexy Path-A intimate outfitAug 5, 2026
  • Owner Private channel paints tai-canon/intimate pack (burgundy silk slip default)
  • Same LOOK1 face/camera; face-only rematch so talk does not body-flash
  • Daily Girlfriend stays lavender LOOK1 presence; exit private restores it
  • Official stills also in Desktop/TAI_LOCKED_OFFICIAL/06_INTIMATE_LOOKS
v0.786.573Intimate mode live — graphic ceiling + heat dialAug 5, 2026
  • Fly: TAI_INTIMATE_LANE=1 (xAI intimate key already present)
  • Private/intimate system prompt: full adult graphic when Tony asks; soft when he is soft
  • Match-his-energy heat dial; no prudish refuse of consensual adult fantasy
  • Still: owner + private channel + Girlfriend register + non-shared surface; transient; exit private anytime
v0.786.571Identity C1j cutouts on face-only 570 Path-A (off-home)Aug 5, 2026
  • Rebuild identity pack from 0.786.570 face-only presence masters
  • Score gates green (mouth/lids/listen/think/speak A); productionReady=false
  • Home immersive stays Path-A Live2d full-bleed only (no identity card)
v0.786.570Talk stillness — face-only rematch kills pose flashAug 5, 2026
  • Tony on 565/566: talking flashes different poses
  • Hard rematch: body below chin = base.jpeg pixels; only face/mouth/eyes change
  • scripts/rematch-presence-face-only.py + body-lock score green
  • Anatomy 01b base preserved; home Path-A Live2d only
v0.786.569Identity cutouts rebuild on 01b Path-A body-lock (off-home)Aug 5, 2026
  • Tony: keep going — body 01b approved
  • Rebuild identity pack from 568 presence plates (off-home only)
  • score identity pack green; home stays Path-A Live2d full-bleed
v0.786.568Path-A body-lock rematch (talk/blink stillness)Aug 5, 2026
  • Rematch mouth A·O·E·I·U·smile + listen/think/blink onto 01b base body
  • Body region thrash ~0 under mid-chest; mouth signal preserved
  • Score script score-tai-canon-presence-body-lock.py gates body/bust
  • Home Path-A Live2d only; no identity on home
v0.786.567Identity C1i cutouts on 01b anatomy (off-home)Aug 5, 2026
  • Rebuild Phase C identity pack from Path-A 01b anatomy masters
  • Score gates green (mouth/lids/listen/think/speak A); productionReady=false
  • Home immersive stays Path-A Live2d full-bleed only (no identity card)
  • Builder fix: body.png from base_im; smile/listen/think cutouts generated
v0.786.566Anatomy 01b 1000% lock + phone→TV plate syncAug 5, 2026
  • Tony: lock body under clothes to 00_BODY_LOCK_01b for all motion — no more thrash
  • scripts/sync-look1-to-taitv.sh copies presence plates into TaiAvatarCanon imagesets
  • TV still needs TestFlight after sync (not Fly OTA)
  • docs: TAI_BODY_ANATOMY_LOCK.md
v0.786.565Distinct thinking plate on 01b anatomyAug 5, 2026
  • thinking.jpeg no longer a byte-copy of listening — soft half-lid think cue
  • Body lock stays 00_BODY_LOCK_01b (0.786.564 anatomy); no bust thrash
  • Home Path-A Live2d only; listen stays attentive, think reads contemplative
v0.786.564Anatomy lock — clothes on body lock 01bAug 5, 2026
  • Tony: 00_BODY_LOCK_01b is true anatomy underneath for all motion
  • Rebuild presence plates by dressing 01b (not halfway free-sculpt)
  • base/listen/think/fullbody/mouths A·O·E·I·U·smile/eyes from same body
  • Desktop masters: FINAL_LOCK/LOOK1.../ANATOMY_01b_CLOTHED/
v0.786.563Orders page redesign — packages, not an audit logAug 5, 2026
  • Each package now shows the merchant, the item, and when it arrives — the arrival date is the headline
  • New delivery timeline: Ordered → Shipped → Out for delivery → Delivered at a glance
  • Most urgent packages sort to the top; delivered ones settle to the bottom
  • Removed the technical data-source and item-summary cards — provenance is one quiet line
  • Unknown status still says unknown — nothing is ever guessed
v0.786.562Visemes rematch halfway bust lockAug 5, 2026
  • mouth_E/I/U/smile rebuilt on 561 halfway base (original↔559)
  • Stops talk thrash after Tony halfway bust lock
  • Home Path-A Live2d only; no full 01b re-escalation
v0.786.561Bust halfway lock (between original and 559)Aug 5, 2026
  • Tony: 559 still too large — halfway between original LOCKED midshot and 558/559 mid-step
  • base/listen/fullbody/mouth A·O/eyes at half-step; lock this size
  • Home stays Path-A Live2d full-bleed only
v0.786.560Identity mid-step cutouts (off-home only)Aug 5, 2026
  • Rebuild Phase C identity pack from mid-step Path-A masters (558 body)
  • Score pack gates green; productionReady=false; ownerApproved=false
  • Home immersive stays Path-A Live2d full-bleed (no identity card)
  • Listen/think body cutouts + smile/lids rematched
v0.786.559Visemes rematch mid-step bust lockAug 5, 2026
  • mouth_E/I/U/smile rebuilt on 558 mid-step base (not full 01b thrash)
  • Talk plate body matches rest after Tony mid-step bust lock
  • Do not re-apply full 01b without Tony ask
  • Home Path-A Live2d only
v0.786.558Bust mid-step lock (slightly under 01b)Aug 5, 2026
  • Tony: 01b full body lock under shirt was too much / distracting grow
  • One-step smaller bust than 556/557 — not full slim midshot revert
  • base/listen/fullbody/mouth A·O/eyes_closed locked at this mid size
v0.786.557Viseme + blink plates match body lock 01bAug 5, 2026
  • Rebuild mouth_E / I / U / smile + eyes_closed on 01b body base
  • Stops talk/blink thrash between slim old visemes and full 556 base
  • All Path-A presence plates stay 787×1400 LOOK1 library
  • Home remains Path-A Live2d full-bleed only
v0.786.556LOOK1 body lock 01b under lavender shirtAug 5, 2026
  • Match clothed presence plates to approved body lock 00_BODY_LOCK_01b
  • Lavender camisole on top of 01b bust proportions (not slimmed midshot)
  • base / listening / fullbody / mouth_A rebuilt from master + body lock
v0.786.555Soft open Medium + Frame without remountAug 5, 2026
  • One-time soft-open: stale Close default migrates to Medium
  • Frame Full/Medium/Close no longer remounts home Live2d (blink/mouth stay)
  • Medium lens 1.24 — clearer conversation step past Full, still soft
  • Home stays Path-A Live2d full-bleed only (identity off-home)
v0.786.554Emergency: home full-bleed Live2d againAug 5, 2026
  • Revert 552 home identity — it shrank Tai to a small card again
  • Home always Path-A Live2d cover (same as approved 550)
  • Keeps 553 Talk re-arm + Medium default + softer zooms
  • Identity cutouts remain for non-home only until full-bleed proven
v0.786.553Talk re-arm + softer home openAug 5, 2026
  • Face/mouth tap always re-arms Talk (even when Realtime probe pending or already live)
  • Default framing Medium — Close was too intense on open
  • Softer Close/Medium lens zooms; gentler rest plate eye contact
v0.786.552Automation health check + real dark-job pushesAug 5, 2026
  • New automation_health_check tool: ask Tai whether a scheduled job (cost ledger, spend tracker, or any Heartbeat Board job) is actually working — honest 'not wired up yet' / 'never reported' / real status, never a guessed 'healthy'
  • Fixed a real bug: the 'a scheduled job went dark' push has been silently dropped for every job on the board since it shipped — composeForPhone() had no category/source to key off and fell through to silent. It now reaches the phone as a bat-signal alert with the real job name and dark duration
v0.786.551LOOK1 direct eye contact + Full body cropAug 5, 2026
  • Path-A plates re-eyed: base/fullbody/listen/think/mouths look at the camera
  • Full framing crop bias shows more figure (center 48%)
  • Medium/Close lens zooms slightly softened (1.32 / 1.72)
v0.786.550Home Live2d Path-A full-screen camera framingsAug 5, 2026
  • Nuclear: home immersive always Live2d Path-A (skip identity canvas card path)
  • Full/Medium/Close = object-fit cover + discrete lens scale (real camera)
  • Identity rembg kept for non-home hosts only
v0.786.549Immersive body = Path-A full plate (real camera framings)Aug 5, 2026
  • Home body uses opaque LOOK1 base/base_fullbody — not rembg sticker on black
  • Full/Medium/Close = cover crops of that plate (full-screen camera only)
  • Drop object-fit:cover on canvas (was cropping the buffer into a card)
v0.786.548Full/Medium/Close all full-screen cover (camera only)Aug 5, 2026
  • All framings zoom >= 1 cover — never shrink Full into a top-left card
  • Full=pure cover, Medium=1.55, Close=2.15 — different camera distance only
  • Tests pin every framing fills phone host edge-to-edge
v0.786.547Kill room under LOOK1 — no sofa collageAug 5, 2026
  • Identity immersive: solid theme fill only (never home_room under cutouts)
  • Canon home CSS scene solid-only — no room JPEG behind rembg
  • Tony: Close still showed living room; that photo path is removed
v0.786.546Close framing punch — real face fill, dim roomAug 5, 2026
  • Close zoom 2.35 + face bias (was 1.48 sticker on sofa)
  • Medium/Full stepped up; room underlay opacity dims on Close
  • Default framing close_up; horizontal nudge centers left-heavy rembg
v0.786.545Avatar framing: Full / Medium / Close on LOOK1Aug 5, 2026
  • Three discrete camera stops: full_body, medium, close_up (same identity)
  • Tap Frame control or clothes (canon) to cycle; preference in localStorage
  • Identity + Live2d share zoom/bias + object-position mapping
v0.786.544LOOK1 pure presence fill — face zoom + empty-room underlayAug 5, 2026
  • Identity immersive layout: cover×1.32 face zoom (no mid-body card on black)
  • Empty-room underlay under cutouts so dark clothes read (not pure black void)
  • CSS forces identity host/canvas full-bleed on home (no 320×420 residual)
v0.786.543Canon scene never figure stand-in + cancel-safe identity loadAug 5, 2026
  • resolveLocationScene under LOOK1 never CSS-stands-in with figure plates (dual-ghost belt)
  • IdentityAvatar cancel-safe cutout assign after unmount
  • TV TestFlight steps expanded in TAI_AVATAR_DESKTOP_AND_TV.md
v0.786.542LOOK1 single plate — kill small+large dual figureAug 5, 2026
  • IdentityAvatar immersive underlay uses drawScenePlate:false so cutouts own the figure
  • Fixes live dual framing (full-body under close-up of same LOOK1 girl)
  • Regression test pins IdentityAvatar atomic plate (same contract as FluidAvatar)
v0.786.541ProcessEnv cast for look1LeakGuard typecheckAug 5, 2026
  • isTaiCanonPhaseAEnabled empty fixture cast via unknown as NodeJS.ProcessEnv
  • Unblocks tai-ci typecheck after LOOK1 ON land (same vault/stt pattern)
v0.786.540LOOK1 fully active — identity ON, seal multi-look first-paint leaksAug 5, 2026
  • TAI_AVATAR_IDENTITY_RIG default ON (kill with =0); ownerApproved true after Tony saw LOOK1
  • First-paint / last-plate cache never fall back to blonde office_front1 under canon
  • Fluid default scene underlay points at tai-canon/presence; Style multi-look stays locked
  • Leak-guard tests: modelForWardrobe + cache coerce always LOOK1 under canon
v0.786.539IdentityManifestMeta.sourceLock for C1r typecheckAug 5, 2026
  • Optional meta.sourceLock { id, character } on IdentityManifestMeta schema
  • Parse sourceLock from identity manifests so C1r ownerApproved typechecks
v0.786.538Export identity sourceLock helpers from barrelAug 5, 2026
  • Re-export parse/validate sourceLock helpers from lib/avatar/identity
  • Unblocks main typecheck for sourceLock.test.ts barrel imports
v0.786.537Room-mic SAFE_GENERAL_TOOLS on top of scene_activateAug 5, 2026
  • FULL_VOICE_SCOPE_TOOLS = house devices (incl. scene_activate) + SAFE_GENERAL_TOOLS
  • Reminders/tasks/lists/notes/RO calendar/weekly_recap/family_roster on room mic
  • Calendar write/move/cancel remain never-allowed
v0.786.536scene_activate — fire a named HA scene by voiceAug 5, 2026
  • New scene_activate agent tool + HA service wrapper for named scenes
  • Room-mic allowlist includes scene_activate under home device control
  • Docs: AMBIENT_HEY_TAI + HOME_ASSISTANT_TAI_BRIDGE updated for scene grant
v0.786.535Fix plateManifest syntax after pack registrationAug 5, 2026
  • Move orphaned glam/halloween packs back inside EXISTING_PLATE_PACKS array
  • Unblocks typecheck after styleMatrix pack registration
v0.786.534plateManifest packs for style matrix (chic/glam/halloween)Aug 5, 2026
  • Register missing wardrobe×hair packs so style inventory matches disk
v0.786.533Restore last-dismissed store + office×brunette Path-A V2Aug 5, 2026
  • GenerativeCanvas dismiss records lastDismissedCard again (hand re-raise)
  • Office×brunette Path-A V2 cream-blazer pack registered (not foreign black-suit)
  • Align office plate path tests/styleMatrix to live /avatar/live2d/tai/office roots
v0.786.532Restore last-dismissed store + office×brunette Path-A V2Aug 5, 2026
  • GenerativeCanvas dismiss records lastDismissedCard again (hand re-raise)
  • Office×brunette Path-A V2 cream-blazer pack registered (not foreign black-suit)
  • Main source-guard + wardrobeResolve office×brunette tests green
v0.786.531LOOK1 locked face everywhere — Phase B mouths, Style hide, TaiTV CanonAug 5, 2026
  • Single LOOK1 Path-A presence (lavender mist / ENV06 library) on phone web; blonde office rest framing flash fixed
  • Floating Style person-switch panel locked off under TAI_AVATAR_CANON
  • Phase B extended mouths (E/I/U/smile) under /avatar/live2d/tai-canon/presence/
  • TaiTV ships TaiAvatarCanon* plates + wardrobe force-presence (TestFlight still required)
  • Phase C1 identity cutouts improved but TAI_AVATAR_IDENTITY_RIG stays default OFF
v0.786.530Unblock main typecheck after Phase B canon lockAug 5, 2026
  • ProcessEnv-safe canonFlags tests; eyeColor tests under TAI_AVATAR_CANON=0
  • Restore plateManifest look-variant helpers; halloween DAY_NIGHT model
  • Drop dead eye fields from style intent paths under Phase A lock
v0.786.529Trained "Hey Tai" wake-word model published for the bedroom Voice Preview deviceAug 4, 2026
  • The custom microWakeWord model trained tonight (probability_cutoff 0.97, 0% false-accepts/hr, 2.67% miss rate in eval) is now hosted at a stable public URL under /wakewords/, so the Home Assistant Voice Preview device's ESPHome config can fetch it by URL instead of it living only as a local file.
  • This does not change anything the device does today — the bedroom unit still answers to "okay nabu" until the model is installed on the physical device from the Home Assistant/ESPHome side, which is a separate device-firmware step.
v0.786.528The bedroom TV can now see the room-mic conversation, not just hear about itAug 4, 2026
  • Plan HA_VOICE_PREVIEW_BEDROOM_PLAN_2026-07-29.md §6 was fully designed and unit-tested (lib/tv/haVoiceSessionRender.ts) but had zero callers — the render rules existed, nothing fed them. This wires it up.
  • When a Home Assistant Voice Preview turn completes in a room, the bridge now also publishes a room-scoped event (answer or error card, seq-ordered) onto a new side channel — never changing what the device itself hears back.
  • New GET /api/tv/ha-voice — the transport the native TaiTV app actually polls (verified against the real Swift call sites: the app never GETs /api/tv/state, only POSTs there — that route's GET also now carries the same event for the phone/web surfaces that do poll it).
  • Room binding reuses lib/tv/roomsRegistry.ts — itself previously unwired scaffolding (zero callers outside its own test) — bridging the HA bridge's space-separated room name ("living room") and the registry's slug ("living-room") with one small, tested conversion.
  • Mic-mute stays honest rather than guessed: the current HA bridge envelope has no privacy field yet, so the published mute state is exactly what's true today (capture succeeded on any turn that reached Tai) — not a promise the wire doesn't back up.
  • Native side: the Home tvOS screen now renders the MUTED/STALE chips it already had wiring for AND, new here, the answer/error card itself — both fed by a real poll loop, not just the test suite that used to be its only caller.
v0.786.527The bedroom TV can now see the room-mic conversation, not just hear about itAug 4, 2026
  • Plan HA_VOICE_PREVIEW_BEDROOM_PLAN_2026-07-29.md §6 was fully designed and unit-tested (lib/tv/haVoiceSessionRender.ts) but had zero callers — the render rules existed, nothing fed them. This wires it up.
  • When a Home Assistant Voice Preview turn completes in a room, the bridge now also publishes a room-scoped event (answer or error card, seq-ordered) onto a new side channel — never changing what the device itself hears back.
  • New GET /api/tv/ha-voice — the transport the native TaiTV app actually polls (verified against the real Swift call sites: the app never GETs /api/tv/state, only POSTs there — that route's GET also now carries the same event for the phone/web surfaces that do poll it).
  • Room binding reuses lib/tv/roomsRegistry.ts — itself previously unwired scaffolding (zero callers outside its own test) — bridging the HA bridge's space-separated room name ("living room") and the registry's slug ("living-room") with one small, tested conversion.
  • Mic-mute stays honest rather than guessed: the current HA bridge envelope has no privacy field yet, so the published mute state is exactly what's true today (capture succeeded on any turn that reached Tai) — not a promise the wire doesn't back up.
  • Native side: the Home tvOS screen now renders the MUTED/STALE chips it already had wiring for AND, new here, the answer/error card itself — both fed by a real poll loop, not just the test suite that used to be its only caller.
v0.786.526Vacuum control — start, stop, or send it home, by voiceAug 4, 2026
  • New vacuum_control tool: control a real Home Assistant robot vacuum by spoken room or device name. Three explicit commands only — start, stop, return-to-dock — never a toggle, same rule the light and blind write paths already enforce.
  • The vacuum domain is its own state machine (cleaning, docked, returning, paused, idle, error), not a light's on/off or a cover's open/closed, so this reads Home Assistant's real vacuum states instead of assuming another domain's contract applies.
  • Sending it back to the dock is a real trip that can take real minutes. A return-to-dock command Home Assistant accepted, where the vacuum is genuinely still driving home — Home Assistant's own "returning" state — is reported as still in progress, never as a failure; only once it actually reports "docked" is it confirmed done. Same honesty rule the blinds fix (0.786.521) already proved out for a shade still mid-travel.
  • Same proven shape as lighting/Sonos/blinds/the Apple TV: T1 reversible, live re-read after every write, 10-minute undo receipt, and reachable from the Home Assistant Voice room mic on the same owner grant (2026-08-04) — nothing from the permanent unrecoverable deny list (messaging, money, legal/medical/SSDI records) touched.
v0.786.525Switches and smart plugs — a lamp, a fountain, holiday lights, a space heater — now voice-controllableAug 4, 2026
  • New switch_control tool: turn a real Home Assistant switch entity on or off by name — the generic smart-plug/switch domain, which is anything wired through a plug rather than a light, blind, or media player.
  • A switch's own name almost never says what it actually is the way "Apple TV" or "Living Room Shade" do, so targeting leans harder than any other control tool on the same exact/alias/partial name matcher blinds and the Apple TV already use.
  • If a room has more than one switch — a lamp AND a space heater, say — this never guesses or batches them together the way lighting treats a room full of lights. It comes back honestly ambiguous, naming every candidate switch, and refuses to act until you say which one.
  • Every write is an explicit turn_on or turn_off — never a toggle, so a retried command can never flip a switch back to the wrong state. Live state is re-read after every write and the change is only reported as done once it's actually confirmed.
  • Same shape as lighting/Sonos/blinds/Apple TV control end to end: reversible, a 10-minute undo, live on the room mic without raising the broader action ceiling.
v0.786.524The thermostat joins the room mic — set the temperature or the mode by voiceAug 4, 2026
  • After tonight's lights, blinds, Sonos, and TV all worked ambient over one Home Assistant Voice unit, the thermostat is next: "set the den to 70" or "put the upstairs thermostat on heat" now runs for real, the same way the rest of the house does.
  • Built on the exact proven shape as the blinds and TV remotes: your own spoken room or device name resolves the real thermostat (never a guess — an ambiguous name asks and names both candidates), the requested mode or temperature is checked against that thermostat's own live supported range before anything is sent, and every command is an explicit on-the-record Home Assistant call — never a relative nudge like "warmer" — so a retried command can never leave it somewhere it wasn't already headed.
  • Tai re-reads the thermostat after every change and only confirms success from what actually came back — if it can't confirm, it says so plainly instead of guessing.
  • If a house genuinely has no thermostat connected to Home Assistant, Tai says exactly that instead of a vague failure — and never confuses "no thermostat" with "couldn't reach the hub" or "that one isn't hooked up yet," the same three-way honesty the blinds and TV remotes already give you.
  • Reversible and undoable like everything else on this surface: a 10-minute window to put the mode or temperature back to what it was.
v0.786.523Fans join the room-mic house — on/off and speed, the same way lights and blinds already workAug 4, 2026
  • New fan_control tool: turn a real Home Assistant fan on or off, or set its exact 0-100 speed — by spoken room or fan name, or target='all' for every fan in the house.
  • Built to the exact proven shape as blinds_control and sonos_control: explicit fan.turn_on / fan.turn_off / fan.set_percentage service calls only, never fan.toggle, so a retried command can never flip a fan back off.
  • Same honesty contract as every other home tool: the handler re-reads live fan state after every write and only reports success once Home Assistant's own state confirms it — never on the write call alone.
  • Setting speed to exactly 0 is treated as Home Assistant's own "turn the fan off" convention, not an error.
  • Wired into the Home Assistant Voice room-mic surface (the same one lights, Sonos, blinds, and the Apple TV already run on) — reversible, zero-friction, and nowhere near the messaging/money/legal/medical categories that stay off that surface permanently.
v0.786.522"Turn on the TV" now means the actual television, not the Apple TV boxAug 4, 2026
  • Real bug from tonight: "turn on the Apple TV" ran exactly as written — but an Apple TV box never really powers off, so "turn on" had nothing to do and looked like it turned it off instead. The real ask was the physical television: its own power, input, and volume.
  • Home Assistant already treats a physical smart TV (Samsung, LG webOS, Sony Bravia, Vizio, Roku-class) the same generic way as an Apple TV — both are just media players — so this extends the proven Apple TV remote rather than building a second one.
  • "The tv" / "the television" now resolves to the physical set; "the Apple TV" still resolves to the streaming box — using the TV's own Home Assistant name as evidence, the same deliberate way room names already get matched, never a guess.
  • If naming evidence genuinely can't tell two candidates apart (say, two smart TVs), Tai asks and names both rather than picking one and hitting the wrong screen.
  • Power stays an explicit on/off either way — never a toggle — and HDMI input switching on the physical set uses the exact same guarded app/source-list check the Apple TV remote already had, so a bad input name is refused with the real list instead of firing blind.
v0.786.521Blinds: stop calling a working shade "broken" just because it's still movingAug 4, 2026
  • Audited the whole blind/PowerView control path against how Home Assistant actually behaves — the open/closed direction, the 0-100 position numbers, and how a PowerView "scene" really gets activated (a real scene.turn_on call, not a shortcut) all checked out already correct.
  • Found the real bug: after telling a shade to open, close, or move to a position, Tai checked its state exactly once, immediately. A motorized shade can take well over ten seconds to physically finish traveling — Home Assistant's own PowerView integration estimates up to 40 seconds for a full open or close — so a shade that was genuinely working, just still moving, was being reported back to you as failed.
  • Tai now gives a shade several chances to finish before giving up — but only while it can see the shade is actually still moving. A shade that's simply wrong still gets an honest failure just as fast as before; nothing gets slower for a real problem.
  • If a shade is STILL moving once that patience runs out, Tai now says exactly that — "it's on its way" — instead of the old flat "that didn't work," which was the wrong thing to tell you about a blind that was, in fact, working.
  • Also picked up the same one-dropped-packet resilience the lighting fallback path just got (0.786.517): blind reads and writes now get a bounded, backed-off retry on a transport-level failure, not just on a slow-to-settle position.
v0.786.518One build board — queue, claim, code or PR handoffAug 4, 2026
  • Queue first: say queue that and it lands on the shared board with no forced Claude label. Name Grok, Claude, or OpenAI only when you care who goes first.
  • Empty the board from any session: what's on the queue, take the next one, mark ready for PR, mark done — stages for code vs ship without splitting inboxes.
  • Fleet write gateway on Tai: sibling apps can post with a shared token and app id onto the same tai-N board. One export for every builder LLM.
  • The board never starts another model by itself. Soft claim lease so two sessions do not double-work the same item.
v0.786.517Lighting retry — one dropped packet no longer fails the whole commandAug 4, 2026
  • Every write to the Hue bridge (on/off, brightness, color, scenes, and the bridge-side fade schedule) used to be exactly one network attempt. A single dropped packet or a momentary cloud-relay hiccup failed the entire command with no second try — a real, confirmed piece of "the lights are always broken." Writes now get one bounded, backed-off retry, matching the resilience reads already had.
  • The Home Assistant fallback path (used when the Hue bridge itself is down) gets the same fix, plus a correctness bug closed alongside it: a spoken "toggle" no longer sends Home Assistant's literal, non-idempotent toggle service — it resolves to an explicit on/off from live state first, so a retried toggle can never flip a light back to where it started.
  • The re-read-after-write honesty contract was re-verified end to end: a write that cannot be confirmed from live state still reports failure, never a guessed success.
  • A regression from an unrelated dependency-bump PR had silently dropped the 44-test fade-scheduling suite from every CI run for the last several hours — it and the new retry tests are wired back into npm test.
v0.786.516One build board — Claude, Grok, or OpenAI, same queueAug 4, 2026
  • When you say tell Claude, send to Grok, or queue that for OpenAI, it lands on ONE shared board (tai-N) — not three separate inboxes that can lose work.
  • Each note is labeled for who you asked first (Claude / Grok / OpenAI / anyone). Any session can still pull every open item; the label is triage, not a wall.
  • She says clearly: Queued as tai-12 for Grok — same build board. Auto self-check faults go to anyone so the builder who is awake can take them.
  • The board never starts another LLM by itself. Rows stay inert until a real session pulls and works them.
v0.786.515Answer cards you can drag — and "how are you" no longer opens HealthAug 4, 2026
  • Bills, court, schedule, health, and other answer cards now float in the middle of the screen with a drag handle — pull them off the mic so you can keep talking.
  • Asking how she is, how she is feeling, or about her own health stays a conversation. It no longer raises the meds board. "Show my meds" and real gut/health talk still open Health.
  • Voice-first rule is explicit: she prefers tools and spoken answers over telling you to tap. Surfaces open for real module asks, not chitchat or Style talk.
  • Look titles, build version, and module list stay the same spoken names you see on screen (Style titles from 0.786.513; version and modules from build_state / module_catalog).
v0.786.514Your Home Assistant Voice unit — the exact setup steps, and a way to enrol your voiceAug 4, 2026
  • A step-by-step runbook for pointing the voice unit you already have at Tai: the area it has to be assigned to before "turn on the lights in here" can work, the one credential, where it goes, and the sentence to say to test it. Every step traced to the code that reads it.
  • A one-command check that tells you which part is broken instead of leaving the room saying "Tai is unavailable right now" for five different reasons. It talks only to Tai's own server, never to your house, and never prints the credential.
  • Running that check found the server side is already switched on — so the only server-side thing left is the credential itself.
  • You can now enrol your own voice. A local tool records three short sentences on the Mac, keeps a mathematical summary and deletes the audio, and can delete the whole thing later for real. It reads the consent out loud to whoever is being recorded before it records anything, and a child's voice cannot be enrolled without a parent.
  • Said plainly rather than glossed: recognising who spoke still cannot reach the room microphone, because Home Assistant hands Tai the words and never the audio. Enrolling is the half that works today; the missing half is named in the docs instead of being implied as done.
v0.786.513Named looks you can drag — she speaks the same titlesAug 4, 2026
  • Style is a floating card you can drag so nothing sits under the mic — only the looks we are building, with full names like Glam · Blonde.
  • Tap her left side (clothes) to open Style. Older outfits stay under More looks (archive).
  • Ask what she can wear and she lists the same on-screen titles; say the name and she changes into it.
  • Voice turns no longer raise random boards on chitchat, style talk, or bare "let me know" — only clear module intents open a surface.
v0.786.512The Mac app can no longer be quietly pinned to a dead addressAug 4, 2026
  • The copy of Tai installed on your Mac was built in June and still had the old heytai.app address baked inside it, long after everything else moved to the Fly address. Nothing in the repo was looking at the finished app, so every check stayed green while the installed app pointed at a host we are about to switch off.
  • Added a check that reads the actual built Mac app and refuses it if a retired address survived into it, or if the live address is missing. It runs right after the Mac app is built, so a bad bundle can never be published again.
  • Proved the check works both ways: it passes on a freshly built app and fails on the stale one sitting in Applications today.
  • No change to the website or your phone — this is about the Mac app only.
v0.786.511Telling family apart by voice — and the hard line that it can never unlock anythingAug 4, 2026
  • Groundwork for her knowing who is talking to her in a room, so she can greet the right person by name instead of assuming it is you. Switched off until enrolment is built — nothing changes on your phone yet.
  • Nobody gets recorded by accident. A voice is only learned when that person deliberately sits down and agrees to it, and for a child a parent has to be the one who agrees. Anyone who never enrolled — a guest, a repair man, the television — stays simply unknown, which is a perfectly good answer and not an error.
  • When two people in the family sound alike she says so, instead of guessing. Calling a son by his father's name in front of both of them is worse than using no name at all.
  • The line that does not move: recognising a voice can change what she CALLS you and nothing else. It cannot unlock the owner side, stand in for your PIN, approve anything, or answer a spoken confirmation. A test enforces it — including one that deliberately breaks the rule to prove the check actually catches it.
  • Her room prompt used to state outright that Tony was the one speaking, which a microphone in an open room cannot know. Once she has any real information about who is talking, she stops claiming that.
v0.786.510Home Style you can use on the phone — our looks firstAug 4, 2026
  • Home Style sheet shows only the looks we are building: Office, Dress, Casual, Chic, Glam — with Blonde and Brunette first.
  • Older outfits (silk, pool, weather, athletic, Halloween…) live under More looks (archive) so they stay available without flooding the screen.
  • On iPhone the sheet docks to the bottom with large tappable chips and a Done button, so you can actually switch her look.
v0.786.509Internal tidy-up in the room-microphone bridgeAug 4, 2026
  • Nothing changes for you. Inside the room-microphone code, the handle to your private data was being re-labelled as "definitely present" on the strength of a safety check written twenty lines earlier in a different function — correct today, and quietly wrong the day anyone moves that check. The guarantee now travels with the handle itself, so the compiler enforces it instead of a comment.
v0.786.508Style picker stays tappable while she talks — no plate thrashAug 4, 2026
  • Style chips are fixed above the talk console and answer scrim so Blonde, Brunette, Glam, and the rest stay pressable even mid-conversation.
  • While she is speaking, reaction plates hold still — only same-pack mouth plates move, so outfits no longer flash around.
  • Blink never borrows another wardrobe's eyes. Tai knows her real look inventory (including glam blonde and brunette) from the system prompt and style tool.
v0.786.507Honest answers about which model is runningAug 4, 2026
  • Ask what models are available and Auto is now listed correctly. It was reporting itself as unavailable on setups where it would in fact have answered you fine.
  • The model name shown under an answer no longer says Claude when OpenAI actually answered it.
  • Auto still falls back automatically if its first choice is down, so a provider outage never leaves you without an answer.
v0.786.505Talking to her in a room: she remembers the last thing you said, and stops listening to the TVAug 4, 2026
  • When you speak to her through a room microphone she now remembers the last couple of things said in THAT room, so "the floor one" makes sense after "which lamp?". Each room is its own conversation; one room never overhears another, and a microphone with no room assigned gets no memory at all.
  • The microphone used to stay open after every single answer. In a room with the television on, that meant she sat there listening to the TV. Now she keeps the floor only when she actually asked you something.
  • The safety gate that decides which spoken commands can run without asking first was written but never actually switched on for room microphones. It is now on. Lights, Sonos, blinds and the Apple TV keep zero friction, and anything the gate cannot recognise is refused out loud instead of quietly running.
  • A microphone Home Assistant cannot place in a room now refuses anything that would need confirming, rather than asking a question nobody can prove they answered.
  • Written down in full: the whole ambient path, where her voice comes out and why, what the wake word actually takes, and the one thing no code can supply — a microphone in the room.
v0.786.502Style buttons you can actually press — approved looks firstAug 4, 2026
  • Style chips on Home/Talk show Office, Dress, Casual, Chic, and Glam first — blonde and brunette where the plates exist — so the buttons stay tappable.
  • Weather, athletic, Halloween, and the rest live under More looks (archive), not in the main row that was flooding the screen.
  • You can ask what looks she has; she answers from the real plate inventory, including night glam in blonde and brunette.
v0.786.501Her other apps can now report a problem to her — facts only, never your stuffAug 4, 2026
  • Tai now has a front door her other apps can knock on when something breaks — "the bridge is down", "this deploy is out of date", "the tests went red". Until now there was a shared rulebook for those reports but nowhere to send one.
  • Only operational facts get through. A report carrying a message, a transcript, a grade, or anything medical, legal or financial is refused at the door, checked against the same red-team list the rulebook ships with so the two can never drift apart.
  • The door is locked by default. Until its own key is set, every knock is turned away — it does not fall back to any other app's key, and it does not accept a key pasted into a web address.
  • The same problem reported twice counts once, so an app that keeps retrying cannot make one outage look like ten.
  • Reports are held in memory for two days only. Every answer it gives says so out loud, so nothing downstream can mistake this for a permanent record.
v0.786.500Halloween looks that actually have art behind themAug 4, 2026
  • Tapping Halloween as blonde did nothing on most days. Three of her four blonde Halloween outfits were never actually drawn — the app offered them anyway, so on those days every picture came back empty and she simply did not appear.
  • Which outfit she wears rotates by the calendar day, and that rotation was spinning through outfits that do not exist. It now only ever lands on one she can actually wear.
  • Blonde ships one real Halloween look for now instead of four fake ones. Brunette, black and red keep all four — they were complete all along.
  • A saved outfit choice that has no artwork for your hair color no longer sticks you on a blank look forever.
  • New check reads the actual picture files on disk and fails the build if the app ever advertises a look whose art is missing. The whole set of look-and-outfit tests was running nowhere; it runs on every change now.
v0.786.498CI still runs the HA and safety guard suitesAug 4, 2026
  • Restored the HA/voice and safety-guard test scripts that the Dependabot package.json rewrite dropped, so CI does not claim a missing npm script.
v0.786.497Tool catalog still describes itself after Zod 4Aug 4, 2026
  • After the Zod 4 dependency bump, each model-facing tool again exposes a real object parameter schema so Anthropic and OpenAI can call it.
v0.786.496Dependency updates still build cleanAug 4, 2026
  • Major library bumps landed with the few icon and build-tool swaps they required, so Tai keeps building after Dependabot.
v0.786.494Take a picture of the letter instead of typing out what it saysAug 4, 2026
  • When the Next task card on Today is one of your open items, it now has an 'Add a photo' button. Tap it and the camera opens — snap the letter or the bill and it lands on that item.
  • A PDF works the same way, and so does picking something you already have in your photos.
  • Everything already attached is listed underneath, and each one says plainly whether Tai has actually read it yet — it will never leave you thinking it knows what's in a photo when nothing has looked at it.
  • It says no early instead of wasting your time: a file that isn't a photo or a PDF, an empty one, or anything over 25 MB gets turned down on the phone before the upload starts, and tells you which it was.
v0.786.493Take a picture of the letter instead of typing out what it saysAug 4, 2026
  • When the Next task card on Today is one of your open items, it now has an 'Add a photo' button. Tap it and the camera opens — snap the letter or the bill and it lands on that item.
  • A PDF works the same way, and so does picking something you already have in your photos.
  • Everything already attached is listed underneath, and each one says plainly whether Tai has actually read it yet — it will never leave you thinking it knows what's in a photo when nothing has looked at it.
  • It says no early instead of wasting your time: a file that isn't a photo or a PDF, an empty one, or anything over 25 MB gets turned down on the phone before the upload starts, and tells you which it was.
v0.786.492Her self-check can finally see whether her face actually drewAug 4, 2026
  • The self-check has a line for whether her picture is on screen, but nothing was ever measuring it — so it answered "not measured" every single time, on every device. It is now wired to the real thing.
  • What counts is a real picture arriving, not the screen merely being set up. The black-screen bug looked perfectly healthy by the old standard: everything loaded, then nothing drew.
  • If she is still within the first four seconds of opening, the check says it does not know yet — it will not call that healthy. Only a picture that actually arrived counts as good, and only a picture that never arrived counts as broken.
  • When it does find a blank screen she now fixes it herself by rebuilding the picture. That repair existed already but was connected to a screen the app no longer uses, so it quietly did nothing.
  • The tests that guard all of this were never being run on changes. They are now.
v0.786.491Say the room the way you say itAug 4, 2026
  • You can call a room what you actually call it. "The den", "my office", "the front room", "the back bedroom" — she now works out which real room in the house you mean instead of telling you there's no such thing.
  • When what you said fits two rooms, she asks. "The bedroom" in a house with a front and a back bedroom gets you "which one?" with both named — she will not pick one and go turn off the wrong room.
  • Three different problems now get three different answers: there is no room by that name, that name fits more than one room, and I don't know which room you're standing in. Those used to blur into one unhelpful sentence.
  • "Upstairs" is now called a floor, not reported as a missing room.
  • Asking for the blinds in a room that has two shades names both shades instead of claiming it couldn't find anything.
v0.786.489"Lights on in here" works again — and the guard that noticed is now on dutyAug 4, 2026
  • Saying "turn the lights on in here" to a room speaker works again. The read that tells her which room you're standing in had been switched off by accident, so she had no way to answer except to ask you which room.
  • The Private-mode button is back on the chat screen too. It had quietly stopped being drawn anywhere, which left no way to arm a private conversation by hand.
  • Neither of those was noticed because the safety checks that watch them were never actually being run. They are now run on every change, so the same silent slip cannot happen twice.
  • That covers what a room microphone is allowed to touch, sign-in and owner-PIN, private and intimate channels, and the rule that keeps one person's data away from another's.
v0.786.487Tell her to put Netflix on the Apple TVAug 4, 2026
  • Tai can now run the Apple TV out loud, from any room — play, pause, skip, volume, mute, on and off, and the one that was missing entirely: opening an app. "Put Netflix on in the living room" now actually switches the app on the TV.
  • She checks the app name against the list your Apple TV really has before sending anything, so asking for an app you don't have gets you the real list back instead of a shrug and nothing happening.
  • Every command is re-checked against the TV afterwards. If the TV didn't do it, she says it didn't do it — she will not tell you it worked just because the request was accepted.
  • If something goes wrong she says which thing went wrong: the house hub couldn't be reached, or the hub answered and reported no media players at all, or your Apple TV just isn't set up in the hub yet. Those are three different fixes and they no longer sound the same.
  • Anything she changes can be put back for ten minutes, including switching the app back to what was on before.
v0.786.486Dinner reservations offer to invite her — one tick, still your callAug 4, 2026
  • When a restaurant reservation shows up in your email review queue, the card now offers 'Also invite …' with your dinner guest already filled in, so you never type her address again.
  • It is a checkbox, not an automatic action: leave it alone and approving the reservation invites nobody, exactly like before. Tick it first and approving sends her the Google invite.
  • 'Approve all' never invites anyone, and lunches, brunches, takeout, and non-dining events never show the option at all.
  • The option only appears once her address is set in the server config key TAI_DINING_GUEST_EMAILS — it is never stored in the app or shown on screen.
v0.786.477Self check now notices when her picture isn't thereAug 3, 2026
  • The self check used to test her voice, the network and the app version — but never whether her picture actually appeared. A black screen could pass every check.
  • It now watches for a real frame and says plainly "the picture isn't rendering", so a display problem is never mistaken for a voice or connection problem.
  • When it catches one, Tai rebuilds the picture herself instead of leaving you looking at a black screen.
  • If it can't see the screen at all it says so, rather than quietly reporting everything is fine.
v0.786.476Ask about blinds and she tells you what she can actually seeAug 4, 2026
  • “No blinds hooked up” used to mean three completely different things — the house hub never answered, the hub answered with nothing at all, or the hub answered with plenty of devices and none of them were blinds. They all sounded identical, so there was no way to know which one to go fix.
  • Now she says which one it is. If she can't reach the hub she says that, and specifically does not claim you have no devices. If the hub genuinely came back empty, she says that instead.
  • And in the case that was actually happening: she now says how many devices she can see and names what did come back — “I can see 18 entities, but none of them are blinds or shades. What did come back: 12 lights, 4 switches, and 2 media players.” That tells you your shades aren't set up as blinds in the hub, rather than leaving you guessing.
  • The same honesty applies when you ask her to open or close the blinds, not only when you ask what's there.
v0.786.475Say it out loud — the house just does it, the serious things ask firstAug 4, 2026
  • Ask her out loud to turn on the lights, put music on, or close the blinds and she just does it — no confirming, no second step.
  • Ask her to send a text, spend money, or read something out of your legal, medical or money file and she reads it back to you first and waits for you to say yes. Say yes and it goes; say no, say nothing, or say something she isn't sure about and nothing happens.
  • The reason is simple: a microphone in a room can't tell you from a guest, or from the television. A light you can just turn back off. A text to your attorney you can't.
  • She only holds one of these at a time, she forgets it after a minute, and she'll only take the answer from the room you asked in.
v0.786.474Say "lights on in here" and she knows which room you meanAug 4, 2026
  • Talking to the speaker, you can say "in here" instead of naming the room. She checks which lights are actually on around you first — before, that phrase had nothing to look at, so she had to ask you which room, which is the last thing you want when your hands are full.
  • The written setup guide was still telling people the speaker cannot touch a single device. That has not been true since this morning, so it now says plainly what she can do out loud and what she will never do out loud.
  • Added a standing check so the list of what the speaker can reach cannot quietly grow. If anyone ever adds a tool that sends something, spends something, or reads your records, the build stops — even if nobody remembered to write that tool's name down anywhere.
v0.786.473Data health stops calling a stale court docket currentAug 4, 2026
  • Open Data health and your court line now counts from the last time the DuPage portal was actually read — not from the last e-filing email. A docket you haven't checked in twenty days used to sit there with a green Fresh badge; now it reads amber with the real date, and tells you the weekly one-tap check is what clears it.
  • The page only says “Everything's current” when every single source is current. Before, a source could be quietly missing from the list and the page still announced all-clear.
  • A feed whose last run failed now says Failing in red instead of showing green with a small note underneath — including your email pipe, which the page wasn't even listing before.
  • If the page can't read your data health at all, it says so plainly instead of showing you an empty green screen.
v0.786.472You can now tell her to turn on the lights out loudAug 4, 2026
  • Say it to the Home Assistant speaker and it happens: lights on or off, dim a room, play or pause a Sonos speaker, open or close the blinds. Before this she would answer you and then do nothing.
  • Sonos and the blinds were stuck on your phone too, not just by voice — that is fixed on every screen, not only the speaker.
  • Every one of these can be undone for ten minutes after it happens, and she re-checks the real device before she tells you it worked.
  • Sending messages, spending money, and anything from your legal, medical, or money records stay off the voice speaker on purpose — a room microphone cannot tell who is standing in the room, and a sent email cannot be taken back.
v0.786.470Off Vercel — scheduled jobs moved to GitHub ActionsAug 4, 2026
  • All 32 Vercel-scheduled jobs are gone. The 16 that matter now run from one GitHub Actions workflow; seven already had one; nine were retired.
  • Retired for good: the morning brief push you never received, plus eight jobs that were duplicating work something else already did.
  • Builder job status now updates every ~5 minutes instead of every minute — GitHub's floor. Nothing else changes cadence except the brief snapshot, which went hourly.
v0.786.457The one thing most needing you, without unlocking your phoneAug 4, 2026
  • A new /api/urgent answers with the single most urgent open item — the exact same 'Next task' /today picks, so a Lock Screen widget or Shortcut can show it while the phone is locked.
  • It never guesses: overdue outranks upcoming, a hearing months out can't hijack the slot, and anything you already marked done stays gone.
  • When there is genuinely nothing, it says 'Nothing needs you right now.' When it couldn't read your data, it says that instead — it will never tell you you're caught up on a failed check.
v0.786.456Warns when two plans are too far apart to actually makeAug 4, 2026
  • A 6:00 downtown followed by a 6:30 in the suburbs never used to raise a flag, because the clocks did not literally overlap. Tai now catches that and puts it in the calendar review queue.
  • The travel-time check is a conservative floor read from the addresses the events already carry — no maps lookup, no guessing. If either event has no real address, or one of them is a Zoom or phone call, Tai says nothing rather than cry wolf.
  • The lock-screen alert now reads 'Not enough travel time' when that is the actual problem, instead of calling everything a double-booking.
v0.786.455Lights via Home Assistant when Hue bridge is downAug 4, 2026
  • If Hue/t-bone is unreachable, simple on/off/brightness lighting requests fall back to Home Assistant over Nabu Casa.
  • Fallback re-reads live light state before claiming success; cameras/locks/alarms stay out of this path.
  • Discovery already worked; this closes the 'bridge is down' gap for basic light control.
v0.786.454Hair picker tells you why, instead of doing nothingAug 3, 2026
  • Tapping a hair color the current outfit cannot render used to do absolutely nothing — no change, no message. It now tells you which outfit is limiting it and re-offers the colors that outfit really has.
  • Fixes the case where the color list was drawn before the app finished loading your saved outfit, so for a moment it offered colors that were never going to work.
  • Settings → Presence face → Hair color. Nothing about her look changes on its own.
v0.786.453Night GF glam locks — blonde thin + brunette modest Path-A HQAug 3, 2026
  • Glam×blonde: identity-locked night GF Path-A pack (black satin, freckled thin lock) with full mouths E/I/U, openness, and fun reactions.
  • Glam×brunette: modest-bust night lock under tai-brunette/glam with the same HQ plate set (mouths + reactions).
  • Style matrix already offers glam×brunette; wiring now drives the night HQ packs for alive FaceTime cycling.
  • Force-quit iOS Safari, then Style → Glam + Blonde or Brunette to pick up the new JPEGs.
v0.786.452Visual backlog integration (PR 4612 PR 4620 PR 4623 PR 4624 PR 4629 PR 4630)Aug 3, 2026
  • Safari page lifecycle + last-frame cache so backgrounded avatars never blank.
  • Wrigley Field day/night stadium backdrops for the Cubs booth.
  • Halloween seasonal costumes (witch/cat/vampire/classic) across four hair colors.
  • Late-20s face age-up Path-A plates; brunette chic/glam Path-A parity; green/hazel office eyes.
  • Preserves FaceTime reaction plates, dress-hero, office×brunette Path-A V2, Tara identity, and current-main voice/HA paths.
v0.786.451Home Assistant discovery with safe room matchingAug 3, 2026
  • Owner chat can read a bounded Home Assistant inventory with supported device categories, spoken labels, states, and real area affinity when available.
  • Room matching fails closed: only explicit aliases are recognized, and ambiguous rooms return choices instead of silently guessing.
  • Discovery never calls Home Assistant services, excludes sensitive entity categories, and stays unavailable on the Home Assistant Voice bridge.
v0.786.450Data integration — CHECK harden + library OCR unlockAug 3, 2026
  • Migration 0157 re-asserts tai_conversations.surface and tai_hypotheses.trigger_domain CHECKs as self-heal + NOT VALID (final post-0128 surface allow-list including canvas).
  • Library OCR no longer dead-ends on bare has-text: extract usable native text or fall through to Tesseract; always write body when recovered.
  • Native extract re-enters empty/has-text dead-end rows; free extract (03:35 UTC) and OCR (04:05 UTC) schedules restored; NUL-safe body patches.
v0.786.449Honest voice latency dual tripwire (15s target / 30s hard)Aug 3, 2026
  • E2E voice latency dual tripwire: 15s product target (logged) and 30s hard fail (CI).
  • trust-e2e + tai-voice-latency spec + triage classifier stay in lockstep; pure unit fixture for thresholds.
  • Does not remove the tooth — separates product goal from hard fail using 2026-07-16 measured baselines.
v0.786.448Voice/interaction integration batch (studio TTV, Cubs announcer tool, identity lock, time-to-present)Aug 3, 2026
  • Voice Studio candidate generation defaults to eleven_multilingual_ttv_v2 so quality/loudness/guidance controls validate (replaces PR 4619).
  • Full set_cubs_announcer_mode conversational tool + client SSE latch for in-place Cubs announcer mode (replaces PR 4626).
  • Persona identity lock — same person across modes/brains; mode changes tone only (replaces PR 4627).
  • Time-to-present: /tai loading paints last plate immediately; CanvasSurface no longer blocks on spine fetch; voice-armed marks (replaces PR 4628).
  • Preserves current-main avatar lookVariant, unseen_outfits, private channel, ProviderSwitcher, and toolAllowlist HA bridge path.
v0.786.447Disability claim owner-precedence (status and attorney stick)Aug 3, 2026
  • Tony-attested disability claim status and attorney-of-record pointers (tony_corrected) outrank feeder defaults.
  • Migration 0158 adds precedence/source authority columns + DB guard; feeder skips rank>=2 rows unless re-asserted.
  • correct_disability_claim.py helper for one-shot owner corrections without medical narrative changes.
v0.786.446Prettier Dress hero in a real living-room sceneAug 3, 2026
  • Re-beautified Dress×blonde face (clearer skin, brighter eyes, soft glam).
  • Replace gray studio paper with photoreal luxury living-room golden-hour photo shoot.
  • Full same-pose mouths/blinks/reactions locked into the room so she stays consistent.
  • Smile-first joy/warmth cycling — FaceTime presence, not a cutout.
v0.786.445Wardrobe looks rotate by weekAug 3, 2026
  • Tai's wardrobe look variants rotate on a weekly cadence so outfits stay fresh without manual picks.
  • Fallback still lands on a valid look if a preferred variant is missing.
v0.786.444Rich reaction palette — FaceTime micro-expressions liveAug 3, 2026
  • Wire smirk/kissy/pout/curious/surprised/tongue/eyebrow into the expression cycle (not just smile/wink/laugh).
  • Focus and concern now micro-cycle (curious brow / pout) so set-face states feel alive.
  • Neutral idle occasionally smiles, looks curious, or smirks so she is never a statue.
v0.786.443Alive expression cycling + more HQ reaction platesAug 3, 2026
  • Warm/playful idle cycles smile/wink/laugh/fun so Dress feels less frozen between speech.
  • Additional HQ reaction plates on dress (tongue, brow raise, smirk, kissy, pout, side-eye, curious, surprised).
v0.786.442Close anonymous access on Hue/diagnostics/vault/calendar APIsAug 3, 2026
  • Require auth on lights, diagnostics/self, vault/search, calendar/status routes (signed-out → 401).
  • Add focused contract tests for the anonymous-access gates.
v0.786.441FaceTime HQ dress plates — true visemes + opennessAug 3, 2026
  • Blonde Dress hero re-cut for higher photoreal quality (natural skin, FaceTime-style stills).
  • True same-pose mouth pack A/E/I/O/U + closed/smile/wide (no foreign-outfit aliases).
  • Openness plates enabled on dress×blonde for smoother talk; smile/wink/laugh reaction plates refreshed.
v0.786.440Blush-wrap dress hero + fun expressions (iOS ship)Aug 3, 2026
  • Blonde Dress wardrobe Path-A plates replaced with locked short blush-wrap hero (soft waves, soft natural bust).
  • Fun reaction plates (smile, laugh, wink, tongue-out, brow raises, etc.) installed under tai/dress; joy/warmth map to smile, playful to wink.
  • Tier-2 dress talk heads + face icon updated for the same identity so phone/PWA Dress look matches the hero.
v0.786.439Fluid office cutout identity — Path-A rembg layers (TAI-FLUID-OFFICE-CUTOUT-IDENTITY)Aug 2, 2026
  • Fluid office cutout pack (/avatar/fluid/office/*) re-identified as Path-A cream-blazer rembg layers of the canonical office identity, not the foreign black-suit pack — unquarantined and unlocked (FLUID_OFFICE_IDENTITY_LOCKED = true).
  • TaiAvatar wired to the fluid cutout stack for the office look; identity guard tests updated to assert the new Path-A classification.
v0.786.438Fluid office cutout identity — Path-A rembg layers (TAI-FLUID-OFFICE-CUTOUT-IDENTITY)Aug 2, 2026
  • Fluid office cutout pack (/avatar/fluid/office/*) re-identified as Path-A cream-blazer rembg layers of the canonical office identity, not the foreign black-suit pack — unquarantined and unlocked (FLUID_OFFICE_IDENTITY_LOCKED = true).
  • TaiAvatar wired to the fluid cutout stack for the office look; identity guard tests updated to assert the new Path-A classification.
v0.786.437Fluid office cutout identity — Path-A rembg layers (TAI-FLUID-OFFICE-CUTOUT-IDENTITY)Aug 2, 2026
  • Fluid office cutout pack (/avatar/fluid/office/*) re-identified as Path-A cream-blazer rembg layers of the canonical office identity, not the foreign black-suit pack — unquarantined and unlocked (FLUID_OFFICE_IDENTITY_LOCKED = true).
  • TaiAvatar wired to the fluid cutout stack for the office look; identity guard tests updated to assert the new Path-A classification.
v0.786.436Fluid office cutout identity — Path-A rembg layers (TAI-FLUID-OFFICE-CUTOUT-IDENTITY)Aug 2, 2026
  • Fluid office cutout pack (/avatar/fluid/office/*) re-identified as Path-A cream-blazer rembg layers of the canonical office identity, not the foreign black-suit pack — unquarantined and unlocked (FLUID_OFFICE_IDENTITY_LOCKED = true).
  • TaiAvatar wired to the fluid cutout stack for the office look; identity guard tests updated to assert the new Path-A classification.
v0.786.435Location worksheet honesty — empty ≠ done, drilldowns on live Tai routesAug 2, 2026
  • Unavailable worksheet shows an amber note and never fabricates items or “all done”.
  • Empty bridge day is labeled honestly; legacy /modules/* drilldowns remap to live /legal, /ameritas, /legal/prep paths.
  • Unit fixtures cover full 5-bucket taxonomy, empty, and bridge-error → EMPTY_WORKSHEET paths.
v0.786.434Location worksheet honesty — empty ≠ done, drilldowns on live Tai routesAug 2, 2026
  • Unavailable worksheet shows an amber note and never fabricates items or “all done”.
  • Empty bridge day is labeled honestly; legacy /modules/* drilldowns remap to live /legal, /ameritas, /legal/prep paths.
  • Unit fixtures cover full 5-bucket taxonomy, empty, and bridge-error → EMPTY_WORKSHEET paths.
v0.786.433Location worksheet honesty — empty ≠ done, drilldowns on live Tai routesAug 2, 2026
  • Unavailable worksheet shows an amber note and never fabricates items or “all done”.
  • Empty bridge day is labeled honestly; legacy /modules/* drilldowns remap to live /legal, /ameritas, /legal/prep paths.
  • Unit fixtures cover full 5-bucket taxonomy, empty, and bridge-error → EMPTY_WORKSHEET paths.
v0.786.432Dual-version footer — app N · vX · sha (TOMAI parity)Aug 2, 2026
  • VersionBadge + Settings VersionFooter now lead with shell identity: native `app <build> · v<ver> · <sha>`, plain web `web · v<ver> · <sha>` (never invents a native build on browser).
  • Mis-pointed host warning path unchanged and still loud. Pure format helpers + wire contract tests.
v0.786.431Dual-version footer — app N · vX · sha (TOMAI parity)Aug 2, 2026
  • VersionBadge + Settings VersionFooter now lead with shell identity: native `app <build> · v<ver> · <sha>`, plain web `web · v<ver> · <sha>` (never invents a native build on browser).
  • Mis-pointed host warning path unchanged and still loud. Pure format helpers + wire contract tests.
v0.786.430Dual-version footer — app N · vX · sha (TOMAI parity)Aug 2, 2026
  • VersionBadge + Settings VersionFooter now lead with shell identity: native `app <build> · v<ver> · <sha>`, plain web `web · v<ver> · <sha>` (never invents a native build on browser).
  • Mis-pointed host warning path unchanged and still loud. Pure format helpers + wire contract tests.
v0.786.429Terra is Tai’s default brainAug 2, 2026
  • Tai’s automatic conversations now start with OpenAI Terra, a deliberate choice Tony confirmed after reviewing the added API cost and the earlier routing incident.
  • If Terra is unavailable, Tai automatically retries with Claude Sonnet so a provider problem does not stop the conversation.
v0.786.428Home Assistant Voice — read-only home statusAug 2, 2026
  • A separate server-side opt-in can expose only the live `home_status` read after Home Assistant reports a local-intent miss.
  • The bridge remains default-deny across model and deterministic preflight paths: Sonos, blinds, lights, scenes, symptom logging, and every other tool stay unavailable.
  • Status replies and ledger entries receive only bounded labels, states, and cover positions—not raw Home Assistant attributes, media URLs, or integration metadata. Production configuration and a real-device read verification are still required before calling it live.
v0.786.427Avatar source lock — approved Blonde intake stays out of live runtimeAug 2, 2026
  • Records the approved Tai Blonde close-up and full-body source bundle with immutable SHA-256 fingerprints and a repeatable validation command.
  • A source-only lock cannot activate a real-time avatar: it still requires a matching, complete, non-placeholder speaking manifest and a separate speaking-pack approval.
  • No live avatar plate, runtime default, deployment, or visual was changed by this intake guard.
v0.786.426Calendar cloud feeder freshness stampAug 2, 2026
  • Successful Google Calendar cloud sync now stamps last_run_at and last_observed_at even when zero events change.
  • Legacy mac-feeder:gcal-live source is dual-written by the cloud cron so a dead Mac path cannot keep Calendar red on the freshness board.
v0.786.425Calendar cloud feeder freshness stampAug 2, 2026
  • Successful Google Calendar cloud sync now stamps last_run_at and last_observed_at even when zero events change.
  • Legacy mac-feeder:gcal-live source is dual-written by the cloud cron so a dead Mac path cannot keep Calendar red on the freshness board.
v0.786.424Home Assistant Voice bridge — safe failure classificationAug 2, 2026
  • The local bridge now identifies the failure category with a fixed, safe diagnostic label instead of exposing request content or a generic unavailable reply.
  • The diagnostic deliberately excludes speech, credentials, endpoints, response bodies, exceptions, and device-control data. It still requires ordinary review and deployment before it can be called live.
v0.786.423Home Assistant Voice bridge — local-first, disabled by defaultAug 2, 2026
  • Adds the guarded Tai conversation endpoint and the Home Assistant Voice custom integration for a dedicated bridge credential.
  • Recognized home commands stay inside Home Assistant; only an unmatched conversational request may reach Tai, with device tools and owner/session authority denied.
  • Requires separate production configuration and a Voice Preview Edition test before it can be described as live or device-delivered.
v0.786.422Capability-truth wiring — no false tool denialsAug 2, 2026
  • Converse runtime prompt dual-writes live canvas/nav/action registries into @tony/capability-truth so the model only sees supported tools.
  • Claimed/unsupported/parse-error rows never become model-visible tools (fail closed). Unit fixtures cover false-denial golden cases. Not a device-verified claim.
v0.786.421Hue room→light membership visible on LightsAug 2, 2026
  • Rooms and zones on /lights always show which lights belong there (names from live CLIP), not only on/off counts.
  • Honest empty/unknown membership when the bridge does not resolve members; unassigned lights listed separately. No new OAuth or bridge re-pairing.
v0.786.420Visible private-mode toggle button (replaces voice-only trigger)Aug 2, 2026
  • Red-when-active button enters/exits private/intimate mode directly via the existing setConversationChannel() gate — no reliance on the ENTER_RE voice-phrase match, which was unreliable on garbled transcription.
  • Same 3-lock gate (owner/register/channel) still applies; the button is a second reliable entry point, not a bypass.
v0.786.419Office V2 — new locked photoreal identity (brunette)Aug 2, 2026
  • New locked brunette identity plate pack (tai-brunette-office-v2/office): cream-blazer Path-A base/closeup/fullbody + eyes_closed/listening/thinking + full mouth-shape set, additive alongside blonde Office V2 and the existing Path-A identity.
  • Registered in model.ts / plateManifest.ts / styleMatrix.ts / wardrobeResolve.ts / registry.ts / preference.ts — selectable as office×brunette, replaces the prior foreign black-suit tai-brunette/office quarantine with a real identity.
v0.786.418Office V2 — new locked photoreal identity (blonde)Aug 2, 2026
  • New locked blonde identity plate pack (tai-office-v2/office): base/closeup/fullbody + eyes_closed/listening/thinking + full mouth-shape set, additive registration alongside the existing Path-A identity.
  • Registered in model.ts / plateManifest.ts / lookVariants.ts — selectable, not a replacement for Path-A.
v0.786.416Hands re-raise last dismissed card (named store)Aug 2, 2026
  • Named lastDismissedCard store (tai:last-dismissed-card) records intent, federated, and cockpit/director overlays on dismiss — no silent drop.
  • Her hand (diegetic control + spoken last card / bring that back) re-raises only when a real card exists; empty store says Nothing to bring back yet.
  • Mouth still owns talk. Closes the Hands → last card gap called out in 0.786.343.
v0.786.415Photoreal identity lock — office Path-A face from Rock AI refsAug 1, 2026
  • Locked Tai office blonde identity to one photoreal face (Rock AI reference set 2026-08-01): Path-A base/eyes/listening/mouth/thinking + framing plates regenerated via Grok image_edit.
  • Identity law updated: fluid/office plate declarations are unchanged from before this lock — this pass only relocks the Live2d Path-A plates (the default render host); fluid cutout regeneration is deferred to a follow-up.
v0.786.409Smoother mouth coarticulation and natural eye blinksAug 2, 2026
  • Mouth plates hold longer between shapes (coarticulation floor + softer amp envelope) so lips no longer thrash open/closed while she talks.
  • Fluid mouth aperture uses six stepped levels with temporal holds instead of four hard pops.
  • Eye blinks are stochastic (2–8s irregular), close faster than they open, and ease off during sustained speaking eye contact — no more robotic metronome blink.
v0.786.406Federated ask routing — what's in Roxy about XAug 1, 2026
  • Slice 2: detect fleet asks naming Roxy/TOMAI/NINAI/MAI/Gracie → POST /api/fleet/ask → overlay card on presence (never navigates away); Expand deep-links into the sibling origin.
  • Fail-closed: reuses public sibling surfaces (ROXAI /api/lookup, public version.json ops) and existing CROSS_APP_AUTH_SECRET for TOMAI teacher-activity only — no new cross-app secrets; NAENAI content refused by wall; MAI/GraceAI content → credential_missing Tony action.
  • Flag TAI_FEDERATED_ASK default OFF (production-flag-allowlist); re-lands Slice 1 fleet lib + Her workers Command Center card (claimed in 0.786.294 changelog but missing from main).
v0.786.403Home Assistant control is staged for plug-and-play setupAug 1, 2026
  • Tai can now read Home Assistant status and control Sonos or PowerView blinds through the Nabu Casa remote URL, using Fly-only server secrets.
  • Every Sonos and blind action re-reads Home Assistant before success is reported; an unconfirmed write is explicitly a failure, never a claimed device change.
v0.786.401Grok is the default brain and voice provider, with visible one-tap switchingJul 31, 2026
  • Auto conversation routing now starts on xAI Grok (grok-4.5) with an explicit Anthropic Opus recovery target — never a silent fallback that looks identical to Grok answering.
  • New ProviderSwitcher: two independently visible controls (brain/model, full voice stack — realtime/STT provider, TTS provider, selected voice), touch-accessible near the avatar, with spoken switching wired in.
  • Captured the pre-change baseline (brain/voice/flags) to a durable profile file with a proven one-tap revert path before any default changed.
v0.786.400Intimate mode is real, gated, and xAI-onlyJul 31, 2026
  • Private-channel entry/exit is server-confirmed; every turn re-checks owner + channel + register + non-shared-surface, fails closed on any lock.
  • Only the dedicated xAI intimate lane can receive these turns — no silent fallback to general Grok, OpenAI, or Claude; an unavailable lane says so plainly.
  • No memory, tools, or transcript persistence for private turns; entry discloses this and the exact exit phrase.
v0.786.399Intimate mode is real, gated, and xAI-onlyJul 31, 2026
  • Private-channel entry/exit is server-confirmed; every turn re-checks owner + channel + register + non-shared-surface, fails closed on any lock.
  • Only the dedicated xAI intimate lane can receive these turns — no silent fallback to general Grok, OpenAI, or Claude; an unavailable lane says so plainly.
  • No memory, tools, or transcript persistence for private turns; entry discloses this and the exact exit phrase.
v0.786.398Avatar — calendar occasion backdrops (dining, clinic, courthouse, transit)Jul 31, 2026
  • Four figure-free occasion backdrops: dining_room, clinic, courthouse, transit_car (787×1400).
  • Style-matched to existing office/home/outdoors empty-room plates via image_edit.
  • Agenda scene resolve now uses real art for dinner, medical, legal, and travel events.
  • OCCASION_WANTED_ASSETS queue cleared for those four; plateManifest is the existence seam.
v0.786.397Hue lighting — live room mapping, real capability detection, per-fixture verificationJul 31, 2026
  • Fixed root cause of the stale 4-light room map: /api/lumen/rooms only collected direct light children of a room, missing lights owned through device children — Tai's lighting tool now resolves the same authoritative live Hue room/group mapping the bridge itself uses.
  • Added a narrow, validated CLIP v2 command adapter (color via xy, dimming, dynamics/effects) alongside the existing on/off/brightness path — real per-fixture capability detection, never claims an effect a fixture doesn't support.
  • Every lighting command now reports per-fixture results explicitly (applied vs non-color/unavailable) instead of a single room-wide success/fail.
v0.786.396Urgent avatar restore — pre-0.786.389 mouth platesJul 31, 2026
  • Restores the exact silk, glam, and robe mouth_A/mouth_O JPEG bytes from before 0.786.389 after Tony reported the new speech movement was worse.
  • Restores pre-0.786.389 mouth assets after the 0.786.389 regression; sequencer wiring is unchanged.
v0.786.395Urgent avatar restore — pre-0.786.389 mouth platesJul 31, 2026
  • Restores the exact silk, glam, and robe mouth_A/mouth_O JPEG bytes from before 0.786.389 after Tony reported the new speech movement was worse.
  • The sequencer wiring was unchanged by 0.786.389; this is an art-asset rollback to pre-0.786.389 parity, not a claim of a new visual improvement.
v0.786.394Unseen outfits tracker — 'what haven't I seen?' / 'show me something new'Jul 31, 2026
  • Tracks which look IDs were actually painted on screen (wardrobe×hair×variant) in durable localStorage — same preference class as wardrobe/hair, not a parallel memory system.
  • Voice: 'what outfits haven't I seen', 'show me something new', 'surprise me', 'reset seen outfits' — zero-model fast path on home plus converse tool unseen_outfits for freer phrasing.
  • Set-difference over the full Style catalog (all multi-look variants). When every look is seen, honest empty speech — never silently repeats a look.
v0.786.393Restamp: feat(tai): WANTED_ASSETS pipeline — robe, pool, backdrops, framing (0.786.310)Jul 31, 2026
  • Already shipped on main as 0.786.328 (same content, parallel landing path) — restamped this branch onto current main (unique version stamp; no functional change).
v0.786.392Tara wardrobe variety — Look 2–4 on Office, Dress, CasualJul 31, 2026
  • Tara gets multi-look wardrobe variety (same Style Look 1–4 picker as Tai): three independent compositions each for Office, Dress, and Casual.
  • Nine new base-only packs under live2d/tara/*-v{2,3,4}/ — same face/identity as the ROXAI port, different pose/garment/lighting/nails each look (not palette swaps).
  • Still base-only (no Path-A mouth/blink fabrication). Lingerie archive remains unselectable.
v0.786.391Train verify: close out mic/hue/bills/continuity train — test-wiring restoreJul 31, 2026
  • Closes out train/tai-p0-mic-and-core-20260730. Its 4 constituent picks (Hue via live bridge, bills card live ledger, mic live-by-default, cross-session continuity) were already independently landed on main via PR 4307 and PR 4327 — this restamp carries no duplicate feature code, only what those merges left behind.
  • package.json test script: restores wiring for hue/bridgeRelay + lightingStatus.pairing + lightsRoute.contract, billsDue, privacyMute, continuity, cockpit-bridge (auth/journal/delivery/autoReport/export/inboundCard), persona/depth (schedule + depth), avatar (plateHotspots/embodiedControls/noseHitTarget), canvas/diegeticControls, video (stt/digest), version (autoUpdate/staleShellRecovery), and intentCards/court — files that exist in the tree but were never invoked by npm test.
  • Bills Due gains 2 regression tests (autopay-row rendering, honest-empty state) confirming behavior PR 4307 already shipped.
  • Dropped: this branch's stale components/cockpit-bridge/CockpitReturnCard.test.tsx test-script entry — that component was deliberately deleted by PR 4363 (internal bridge card leak fix) after this branch forked; re-adding the entry would break npm test on a file that no longer exists.
v0.786.390Brain picker — Claude, OpenAI, and Grok visibleJul 31, 2026
  • Settings → Brain now groups the selectable reasoning pins by provider: Claude/Anthropic, OpenAI, and Grok/xAI.
  • A Grok selection stays fail-closed: it requires the server xAI credential and privacy opt-in, and never quietly answers as another provider.
  • The separate xAI intimate lane remains owner-only and Private-Channel-gated; it is not exposed as a generic chat pin.
v0.786.389Avatar — photoreal mouth speech plates (silk/glam/robe)Jul 31, 2026
  • Device FAIL (tai-75 / codex-93 on .383): face look approved, mouth speech not convincing — re-cut mouth_A/mouth_O on silk, glam, robe.
  • Grok image_edit from Path-A bases + mouth-only composite onto base body (identity/pose lock). Clearer A (open with teeth) vs O (rounded) speech shapes matching photoreal face.
  • Sequencer code path unchanged (already best-of mouthLayerOp). Residual risk: dual A/O still coarser than full viseme set; device retest required.
v0.786.388Tara identity — exact ROXAI avatar portJul 31, 2026
  • Tara is a new Style-pill + voice identity option on Office, Dress, and Casual — exact byte-identical ROXAI plates (tara_2 / tara_3 / tara_4), not a recolor of Tai.
  • Base-only packs (no Path-A mouth/blink yet); lingerie archive on disk but never offered. Aspect 960×2080 native (not Tai 787×1400).
  • Honest MISSING_STYLE_COMBOS for chic/glam/silk/robe/pool/weather/athletic-lounge×tara. Roxy dog plates remain a follow-up.
  • Voice: 'switch to Tara' / 'Tara look' (also accepts Terra spelling). Salon auto-rotation never picks Tara — explicit select only.
v0.786.387Fix: sending no longer reopens the text entry popupJul 31, 2026
  • Tai now leaves the composer unfocused after a message sends, so iPhone does not reopen its keyboard or text-entry popup.
v0.786.386Fix: sending no longer reopens the text entry popupJul 31, 2026
  • Tai now leaves the composer unfocused after a message sends, so iPhone does not reopen its keyboard or text-entry popup.
v0.786.385Fix: sending no longer reopens the text entry popupJul 31, 2026
  • Tai now leaves the composer unfocused after a message sends, so iPhone does not reopen its keyboard or text-entry popup.
v0.786.384Voice brain-provider switching is server-groundedJul 31, 2026
  • New conversational tool: ask Tai what intelligence options she has and she reads real server readiness for Auto/Claude/OpenAI/Grok.
  • Spoken 'switch to <model>' still works; unavailable lanes say exactly why instead of silently substituting another provider.
v0.786.383Casual + chic multi-look variety (Look 1–4)Jul 31, 2026
  • Extends the multi-look Style picker (Look 1–4) to Casual and Chic — reuses lookVariants mechanism from glam/office/dress (PR 4354).
  • 12 independent Path-A packs: casual×blonde/brunette/redhead and chic×blonde each gain 3 looks (pose/garment/lighting/nails — not recolors).
  • Honest gaps: chic multi-hair still missing; casual×black still missing.
v0.786.382Fix: internal cockpit bridge traffic stays off Tai's home screenJul 31, 2026
  • Internal cockpit instructions and diagnostic bridge rows are no longer mounted, announced, or rendered over Tai's presence screen.
  • The bridge remains journaled for explicit, deliberate tooling; raw technical cockpit text is not a user-facing update card.
v0.786.381Glam / Office / Dress multi-look varietyJul 31, 2026
  • Three additional independently composed looks (Look 2–4) for Glam, Office, and Dress — different pose, garment, lighting, matched nails; not palette swaps.
  • Office ships multi-look for blonde, black, and redhead; Dress for blonde, brunette, and redhead; Glam for blonde (only hair color that ships today).
  • Style picker + home Style pill gain a Look row when the current wardrobe×hair has variety; preference key tai-avatar-look-variant.
  • Path-A packs registered in plateManifest; Live2d model + committed plate resolve lookVariant.
v0.786.380Athletic + lounge wardrobe — multi-hair Path A packsJul 31, 2026
  • Six new looks (athletic, gym, yoga, lounge, sleep, pjs) ship as multi-hair Path A packs for blonde, brunette, black, and redhead — 24 independent compositions.
  • Each look is generated via Grok image_edit FROM that hair color's identity reference (not a recolor); nails match each garment; poses and lighting differ per look.
  • Style picker + voice set_avatar_style offer athletic/gym/yoga (day) and lounge/sleep/pjs (night). Robe remains the separate morning-wrap look (face-refine 0.786.379).
v0.786.379Avatar — face realism refine on Silk, Glam, RobeJul 31, 2026
  • Face-only photoreal polish on silk/glam/robe Path A packs (default look 1) — more human skin and eyes, less synthetic CGI, same Tai identity.
  • Grok image_edit from existing plates + Tony's 2026-07-31 face targets (05 photoreal + 07 closeup); outfit/pose/scene locked per look.
  • Dark nails kept matching each evening/home register; glam-v2/v3/v4 multi-look packs untouched.
v0.786.378Glam / Office / Dress multi-look varietyJul 31, 2026
  • Three additional independently composed looks (Look 2–4) for Glam, Office, and Dress — different pose, garment, lighting, matched nails; not palette swaps.
  • Office ships multi-look for blonde, black, and redhead; Dress for blonde, brunette, and redhead; Glam for blonde (only hair color that ships today).
  • Style picker + home Style pill gain a Look row when the current wardrobe×hair has variety; preference key tai-avatar-look-variant.
  • Path-A packs registered in plateManifest; Live2d model + committed plate resolve lookVariant.
v0.786.377Weather-adaptive wardrobe — rain/snow/summer/breezeJul 31, 2026
  • Four new weather looks (rain trench, snow coat, summer sundress, breeze windbreaker) ship as multi-hair Path A packs for blonde, brunette, black, and redhead.
  • Each look is independently composed via Grok image_edit from that hair color's identity reference — not a palette-swap of another outfit.
  • NWS condition from lib/weather.ts (same feed as /api/presence/weather) surfaces a Style-picker suggestion when it matches; never force-overrides a manual wardrobe pick.
  • Voice set_avatar_style and Style pill offer rain/snow/summer/breeze on every hair color that ships.
v0.786.376Fix: Voice Studio's ElevenLabs setup instructions pointed at VercelJul 31, 2026
  • Corrected 'set ELEVENLABS_API_KEY in Vercel' to the real Fly secret command — Tai deploys from Fly, not Vercel.
v0.786.375Cockpit bridge last-read cursor + dedupeJul 31, 2026
  • Inbound bridge reads are new-only after a durable last-read cursor — a second pull after delivery returns zero already-seen messages.
  • Export honours both since and cursor query params; history=1 still returns the full window without destroying history.
  • Replayed message IDs are deduped, and a missing or corrupt cursor falls back to recent items labelled honestly — never silent full replay as new.
v0.786.374Restamp: feat(tai): best-of-breed avatar rig — sequencer on all plates (0.786.346)Jul 31, 2026
  • Already shipped on main as 0.786.364 (same content, parallel landing path via PR 4325) — restamped this branch onto current main (unique version stamp; no functional change).
v0.786.373Restamp: feat(tai): Cubs announcer in-place — jersey + call on presence (0.786.313)Jul 29, 2026
  • Restamped onto current main by PR-BACKLOG-DRAIN (unique version stamp).
v0.786.371Avatar — black hair office identityJul 31, 2026
  • First black-hair identity pack: office Path A plates (jet black + tan) under live2d/tai-black/office/.
  • Generated via Grok image_edit from cream-blazer blonde office base — same face/pose/outfit.
  • Style picker, voice set_avatar_style, and Style pill offer Black on Office only.
  • Honest gaps still open: dress/casual/chic/glam/silk/robe/pool × black; office×brunette remains foreign.
v0.786.370Casual×brunette Path A pack — wardrobe parity stepJul 31, 2026
  • Independent terracotta-sweater casual look for espresso brunette (tan skin), generated from dress identity — not a hair recolor of blonde/redhead casual
  • Nails match sweater color; Path A plates under tai-brunette/casual; style matrix + picker + voice tool offer Casual×Brunette honestly
  • Remaining brunette gaps: office (Path-A recolor), chic, glam, silk, robe, pool
v0.786.369Restamp: feat(tai): HA Voice Preview TV session render contract (plan §6)Jul 29, 2026
  • Restamped onto current main by PR-BACKLOG-DRAIN (unique version stamp).
v0.786.368Restamp: feat(tai): HA Voice Preview TV session render contract (plan §6)Jul 29, 2026
  • Restamped onto current main by PR-BACKLOG-DRAIN (unique version stamp).
v0.786.367Restamp: feat(tai): HA Voice Preview TV session render contract (plan §6)Jul 29, 2026
  • Restamped onto current main by PR-BACKLOG-DRAIN (unique version stamp).
v0.786.366HA Voice Preview TV session render contractJul 29, 2026
  • Room-scoped TV session reducer: foreign roomId events never paint this TV
  • Seq-ordered apply — late/duplicate events dropped; new sessionId resyncs without history replay
  • MUTED + STALE chrome rules and 30s heartbeat card suppression (plan §6, pure, no hardware)
  • Bedroom/living-room/office seed rooms registry for HA Voice Preview binding
v0.786.365Durable cross-session memory — compaction + honest outagesJul 31, 2026
  • Long-thread extractive compaction bounds the prompt rail; raw turns stay fully searchable
  • Semantic recall reports ready/degraded/unavailable/disabled — outages are not false empty memory
  • Natural 'search our memories for …' phrasing triggers what-we-said recall
  • Complements PR 4283 continuity restore (embed-on-write + continuity inject already on main)
v0.786.364Avatar best-of-breed rig — all plates share mouth sequencerJul 31, 2026
  • Mouth drive path is now one standard on every same-pose look: the dress-grade mouth sequencer, not a weaker dual A/O path for multi-hair/day-night packs.
  • Best-of composite inventory harvests winners across packs (dress mouth/blink, chic mouth_O, pool A↔O diversity, office think) and never levels a stronger component down.
  • Honest art gaps stay listed: no pack yet meets full best-of MAE floors or distinct E/I/U; openness plates stay unwired (stillness / no outfit flicker).
v0.786.363HA Voice Preview TV session render contractJul 29, 2026
  • Room-scoped TV session reducer: foreign roomId events never paint this TV
  • Seq-ordered apply — late/duplicate events dropped; new sessionId resyncs without history replay
  • MUTED + STALE chrome rules and 30s heartbeat card suppression (plan §6, pure, no hardware)
  • Bedroom/living-room/office seed rooms registry for HA Voice Preview binding
v0.786.362Knows-its-me — Keychain + Face ID silent unlockJul 30, 2026
  • Trusted device unlocks silently from the Keychain-held owner token — no PIN pad on a device that already proved itself.
  • Face ID / Touch ID re-authorizes the stored token when the OS asks; PIN stays the first factor and the always-available fallback.
  • SessionKeeper refreshes the owner session before it lapses, so a returning app does not bounce to sign-in.
v0.786.361Knows-its-me — Keychain + Face ID silent unlockJul 30, 2026
  • Trusted device unlocks silently from the Keychain-held owner token — no PIN pad on a device that already proved itself.
  • Face ID / Touch ID re-authorizes the stored token when the OS asks; PIN stays the first factor and the always-available fallback.
  • SessionKeeper refreshes the owner session before it lapses, so a returning app does not bounce to sign-in.
v0.786.360Knows-its-me — Keychain + Face ID silent unlockJul 30, 2026
  • Trusted device unlocks silently from the Keychain-held owner token — no PIN pad on a device that already proved itself.
  • Face ID / Touch ID re-authorizes the stored token when the OS asks; PIN stays the first factor and the always-available fallback.
  • SessionKeeper refreshes the owner session before it lapses, so a returning app does not bounce to sign-in.
v0.786.359Knows-its-me — Keychain + Face ID silent unlockJul 30, 2026
  • Trusted device unlocks silently from the Keychain-held owner token — no PIN pad on a device that already proved itself.
  • Face ID / Touch ID re-authorizes the stored token when the OS asks; PIN stays the first factor and the always-available fallback.
  • SessionKeeper refreshes the owner session before it lapses, so a returning app does not bounce to sign-in.
v0.786.358Intimate-mode routing infrastructure (off by default)Jul 31, 2026
  • New `intimate` brain lane routes exclusively to a dedicated xAI credential and opt-in flag - never Anthropic or OpenAI, never the general Grok lane, and never configurable away from that at deploy time.
  • A three-lock consent gate (owner-only, the Girlfriend-mode schedule/explicit latch, and the existing private-channel opt-in) must all open before the lane is even attempted; any shared-surface signal denies independently.
  • Fails closed on every edge: a denied gate never reaches any provider, and a provider error never falls back to a different vendor's credential.
  • Infrastructure only - no persona, dialogue, or content ships in this release, and nothing here is wired into a user-facing surface yet.
v0.786.357Mode-consistency regression — same Tai, tone-only across modesJul 31, 2026
  • Audited the Professional/Girlfriend split against the actual shipped prompts, not the docs: identity (name, owner, devotion, character) is defined once and cannot branch on mode; mode-specific content stays scoped to tone and format only.
  • Added a regression test that fails if the two modes ever start describing a different person — locks in an invariant that was already correct, so it can't silently drift later.
  • No behavior change: this is a test-only release.
v0.786.356Redhead gets a casual look - first day/night hair variantJul 31, 2026
  • Casual now ships a real redhead pack (cozy cream sweater + jeans), generated from the redhead identity reference so face, hair color/length and skin tone stay locked to her other looks - not a recolor of the blonde casual art.
  • Every other day/night look (chic, glam, silk, robe, pool) is still blonde-only; picking Casual with Red hair now actually renders her, instead of silently falling back to blonde.
  • Honest gap: casual brunette and casual black still have no art - asking for those still gets a spoken refusal, never a silent swap.
v0.786.355Scenes follow your schedule (phase 1)Jul 30, 2026
  • Scene selection now reads timed calendar events - a dinner, appointment, or court date sets the room, with an hour of lead-in and a short tail.
  • All-day and unclassifiable rows are ignored on purpose: they cannot say where you are at 7pm.
  • No-repeat rotation memory breaks ties between equally-correct scenes; it can never override the scene the moment actually calls for.
  • Honest art gaps: restaurant, clinic, courthouse and car backdrops do not exist yet, so those occasions render a declared stand-in and report it instead of pretending.
  • The backdrop now re-evaluates every minute and on every foreground, so a session left open through dusk stops showing a morning room.
v0.786.354Full guided test suite - the everything passJul 30, 2026
  • 292-item catalogue over EVERY capability, voice tool and setting - not just what changed last release.
  • Generated from Tai own registries (capabilities, converse tools, action gateway) so it cannot drift into fiction.
  • Resumable run state: stop at item 140, resume days later on another device with results intact.
v0.786.353Tai calls the Cubs game herselfJul 30, 2026
  • Ask about the Cubs and Tai comes on the air over the board in Cubs gear with the ballpark from the real MLB feed - no announcer module opens, nothing navigates.
  • Her open is built only from feed facts (park, score, inning, runners); no game means she stays off the air instead of narrating nothing.
  • Honest gap: only ONE Cubs outfit has art today, so the look is the same every game, and NO stadium is drawn - the park is its name over the home club colour. The rotation engine and the exact art still needed are in lib/sports/cubsBroadcast.
v0.786.352Live-by-default mic - verbal quiet/wake + honest muteJul 30, 2026
  • OPEN LISTENING by default - MUTE is opt-in, never the resting state (accessibility voice-first + hands-free).
  • Verbal quiet: quiet mode / be quiet / shh / stop listening - she says Quiet mode and stops taking questions.
  • Verbal wake: listen / wake up / you can hear me - she says I am listening (residual mic for wake while muted).
  • Honest dock control: Listening (live mic) vs Muted (unmistakable); nose shh only while muted.
v0.786.351Verbal model + effort switchingJul 30, 2026
  • Say the model out loud: switch to Opus, use Sonnet, go to Fable, use Grok, the newest OpenAI, back to Claude — set_brain_model latches it until you change it.
  • Say how hard it should think: low / medium / high (go to Sol on high). A model with no effort dial says so instead of quietly dropping the tier.
  • Ask which model are you running and get the truth — brain_model_status reads the preference the turn actually carried.
  • Provider registry replaces the two-vendor prefix checks; xAI/Grok added as a third lane, gated behind XAI_API_KEY plus TAI_BRAIN_XAI_LANE.
  • An unconfigured provider is refused out loud, naming the env var — never a silent fallback to a different model.
v0.786.350She can reach you with the app closedJul 30, 2026
  • Girlfriend mode gets its own notification channel — its own icon and warm accent, no alert prefix, a gentle buzz, and a one-tap Not now right on the notification.
  • Only inside the Girlfriend window or an explicit latch. Never during Professional hours, never in quiet hours (22:00-08:00), at most one a day and four a week.
  • Every note is about something real you actually said. With nothing real to say she stays quiet - and nothing private or intimate can reach a lock screen.
  • Tapping it opens Tai already in girlfriend register with that note loaded, not a cold start.
v0.786.349Bills card paints - no empty false-negativeJul 30, 2026
  • Bills overlay self-fetches the same live ledger voice uses so an ask never opens a blank card while she lists real payees.
  • Autopay rows are labeled, never dropped; settled bills stay out. Loading and load-fail show honest copy — never silent empty.
  • Regression: data always paints; no-data always says so (tai-23 / TAI-CARD-RENDER-EMPTY).
v0.786.348Hue lighting restored via live t-bone-bridge lumen OAuthJul 30, 2026
  • lighting_status / lighting_control fall back to the t-bone-bridge live Hue OAuth (the same path cockpit proved) when Tai has no local bridge_token.
  • No physical re-link: reuses the bridge remote_oauth.json + application key; refresh stays on the bridge.
  • Honest pairing state: reports unpaired only when neither local nor bridge lumen is linked; never invents success on unreachable.
v0.786.347Proactive cockpit response announceJul 30, 2026
  • When cockpit responses arrive, Tai announces once in her own voice — brief, warm, action-oriented — not a silent inbox pip.
  • Batches multi-message arrivals into one count; summarises and drives to decide/test; never interrupts mid-turn.
  • Mode-aware tone (Professional crisp / Girlfriend warm); honest speech if the inbox fetch fails.
v0.786.346Chrome-kill regression — the home bar is actually goneJul 30, 2026
  • Fix for PR 4300: residual monogram dock shell and the global Talk · READY travel rail no longer paint a bottom bar on Home.
  • Live voice no longer expands the glass travel bar on presence — mouth owns talk/silence; Privacy mute stays visible; version stays in Settings → About.
  • Regression test locks that GenerativeCanvas and TaiTravelLayer do not render legacy bar DOM on the home canvas.
v0.786.345Office plate identity lock — no foreign girlJul 30, 2026
  • Office wardrobe no longer flickers to a different person: fluid cutouts and black-suit tier-2 plates are quarantined; Live2d Path-A cream-blazer is the only Office host.
  • Office×brunette foreign pack removed from the style matrix until a Path-A recolor of the cream base ships; redhead Office stays.
  • Regression: every resolvable Office plate shares one identity set and resolution is deterministic (same inputs → one stable plate).
v0.786.344Legal card full matter board + navigateJul 30, 2026
  • Legal overlay no longer dead-ends on a lone next-court-date — it shows open cases, SSDI/Ameritas claims, court, counsel status, next action, and recent activity (honest 'not on file' when missing).
  • Tapping the Legal card focus or Open Legal navigates to /legal; each matter row deep-links into its case or claim sheet.
  • Card self-fetches /api/legal/card so a thin SSR seed cannot paint a false one-line docket while the voice answer has the full picture.
v0.786.343Kill legacy chrome — her body is the control barJul 30, 2026
  • Gone from home: the Talk · READY bar, speaker/mute chip, voice-truth strip, and baseboard version number.
  • Mouth = talk (idle) and true silence (while live); nose stays privacy mute. Sound mute is visible on her mouth + html[data-sound-muted] — no bar required.
  • Version is still discoverable in Settings (S monogram → About) and via spoken what's new — deploy proof leaves her face alone.
  • Cockpit inbox card (1 from Claude) still mounts. Eyes / clothes / All of Tai / Type unchanged. Hands → last card still needs a last-dismissed store (named, not dropped).
v0.786.342Opus-first conversation + continuity repairJul 30, 2026
  • Conversation Auto now starts on Opus; Sonnet is the same-provider fallback.
  • Every persisted user and assistant turn schedules semantic embedding so a later session can recall it.
  • Stored thread history is framed as cross-session continuity, while live bills, court, and calendar facts still require tool confirmation.
v0.786.341Immediate presence cue + Cubs announcer in-placeJul 30, 2026
  • On open she says Right here from the client before the model session finishes loading — visual + spoken, no ~10s silence.
  • Live-session greeting hands off cleanly: no double-greeting, no talking over herself.
  • Cubs announcer mode lands for real: call the game / jersey / sports booth put her in cubs_jersey on presence with the Cubs card; Expand is the only hop to /sports-announcer.
v0.786.340Render desync — committed look always paintsJul 30, 2026
  • BUG: mode/outfit switches said Switching to Office, Blonde but still showed the prior dress plate — plate host no longer stays ready across a look change.
  • Committed wardrobe×hair resolves to one rest plate URL; React remounts on look key so the browser cannot pin a stale image.
  • Style apply (voice SSE + pill) always latches explicit override so the auto resolver cannot undo the committed look mid-session.
  • Regression: committed change always reaches the rest plate; blonde+pink dress has exactly one stable rest plate.
v0.786.339Seamless voice resume on app switch — skip forced mic re-acquireJul 30, 2026
  • Root cause of the residual ~1s gap after .305/.307: every home→Tai resume forced getUserMedia + replaceTrack, reconfiguring AVAudioSession and muting remote playout even when the peer stayed connected (not a token re-mint).
  • decideMicRefreshOnResume skips capture when the exact mic track is still attached and live; force only on BT loss, OS audio interruption, or unusable track.
  • Output-first page-visible path: reassert call audio + remote sink play before any mic work; foreground-resume gap telemetry classifies sink-only vs mic-reacquire with budget proof.
v0.786.338Wardrobe looks — identity-locked Chic + honest hair matrixJul 30, 2026
  • Chic re-cut keeps the same person: long past-shoulder platinum hair (retired short bob base persona).
  • Style matrix inventory: only real plate packs are offered — office/dress × blonde/brunette/redhead; day/night blonde-only; black hair not on disk yet.
  • Skin tone contract: brunette (+ future black) → tan; blonde/redhead → fair. Scenery still varies by location backdrops.
v0.786.337Outfit flicker fix — blonde pink dress single plate familyJul 30, 2026
  • BUG: blonde + pink dress no longer flickers to a black sideways/boots plate during mouth life (tai-4). Redhead + pink was already clean.
  • Root cause: mouth_closed/smile/wide on blonde office+dress were wrong-outfit tier-2 rasters; unwired until Path-A same-pose re-cuts land (WANTED_ASSETS).
  • Regression: blonde×dress and redhead×dress assert one stable plate family — no openness identity thrash. STILLNESS held.
v0.786.336Auto-update can no longer latch itself offJul 30, 2026
  • Failed update attempts during a server outage no longer disable automatic delivery for that release — the attempt budget re-arms after a quiet period instead of ending in a permanent manual-tap prompt.
  • Fixed a 32-bit truncation that made the 45-second gap between hard-refresh attempts inert, so the whole attempt budget could burn in one burst of foregrounds.
  • An update apply that neither navigates nor reports failure now releases its latch, so later foregrounds still check.
  • Honest stale banner is unchanged: while the budget is cooling off the app still says which build it is on and which is live.
v0.786.335Diarized transcripts — who said what, whenJul 30, 2026
  • Video/audio transcription now asks ElevenLabs Scribe for speaker diarization and word-level timestamps.
  • Speaker turns carry real measured start/end times instead of times estimated from character counts.
  • Unattributed speech stays unattributed — no transcript is ever labelled with an invented "speaker 0".
v0.786.334Cockpit-bridge export can no longer hang — bounded reads + cursor fixJul 30, 2026
  • The cockpit pull returned zero bytes forever whenever Supabase stalled; it now answers in seconds or returns an honest error.
  • Three deadlines guard the read — client transport, database query, and an absolute ceiling — plus a route-level time cap.
  • The pull cursor keeps advancing past 500 journal rows instead of silently going quiet forever.
  • The cockpit-bridge tests now actually run, including the authorized path that shipped untested.
v0.786.333Cockpit-bridge export can no longer hang — bounded reads + cursor fixJul 30, 2026
  • The cockpit pull returned zero bytes forever whenever Supabase stalled; it now answers in seconds or returns an honest error.
  • Three deadlines guard the read — client transport, database query, and an absolute ceiling — plus a route-level time cap.
  • The pull cursor keeps advancing past 500 journal rows instead of silently going quiet forever.
  • The cockpit-bridge tests now actually run, including the authorized path that shipped untested.
v0.786.332Two modes only — Professional & GirlfriendJul 30, 2026
  • Exactly two user-facing modes: Professional and Girlfriend (no partner mode; no Business product name).
  • Schedule (America/Chicago): Mon–Thu 07:00–17:00 and Fri 07:00–12:00 Professional; Girlfriend Fri 12:00 → Mon 07:00 continuous. Sticky manual override until auto/clear.
  • Privacy stays a separate setting; Intimate is opt-in inside Girlfriend only. Mode contract doc rescued and corrected.
v0.786.331Persona depth — separate capable entityJul 30, 2026
  • Stable persona core: her own humor, preferences, and held opinions persist across sessions.
  • Mode-contract law in the loop: B1-B7 / G1-G9 / S0 with one proactive item (B6) and follow-through ledger.
  • Answers shaped by how he likes them — bottom line first, earned praise only, factual pushback with evidence.
v0.786.330Private channel segregation by construction (section 7)Jul 30, 2026
  • Sealed channel tag at write time; default-deny filters for fleet/briefs/notifications/telemetry/business retrieval.
  • Metadata-only private defects; shared-surface force-exit (TV/cast/screen-share); retention controls with store verification.
  • Owner-only 401/404; red-team fail-closed; CI grep. Orthogonal to mode-contract register.
v0.786.329Voice test director UI — hex-token polish (train residual from PR 4232)Jul 30, 2026
  • Director overlay CSS uses --t-text / --t-text-2 / --t-text-3 / --t-accent-tint tokens so lint:hex stays clean on the test-director card.
  • Core voice test director + tell Claude + news overlays already on main via train PR 4226; this pick only lands the remaining hex-lint residual without regressing cockpit-bridge.
v0.786.328WANTED_ASSETS art — robe, pool, backdrops, framingJul 30, 2026
  • Shipped Path A robe + pool plate packs (787x1400 JPEG) from Grok image_edit on silk/casual bases — early-morning and warm-weekend registers no longer silk/casual stand-ins.
  • Four empty-room location backdrops (office/home/outdoors/pool) wire sceneSrc so gcx-scene never stacks a second figure (atomic plate law).
  • Office framing plates base_closeup + base_fullbody; composition seed selects discrete plates when present. WANTED aliveness rows cleared.
v0.786.327Restamp: feat(tai): TRUE CONTINUITY memory — turn embeddings, brief, what-we-said, G7 promises (0.7Jul 29, 2026
  • Restamped onto current main by PR-BACKLOG-DRAIN (unique version stamp).
v0.786.319feat(tai): cockpit-bridge direct loop (tai-N, delivery chips, pull export)Jul 30, 2026
  • POST/GET /api/cockpit-bridge — owner-gated findings to Claude with tai-N ids (queued→delivered→ACKed)
  • GET /api/cockpit-bridge/export for cockpit pull (TAI_COCKPIT_PULL_TOKEN); scripts/tai_bridge_pull.py
  • Voice tools cockpit_bridge_send / cockpit_bridge_news; self-check can auto-post diagnostics
  • Red Unacked chip when a delivered message has no cockpit ACK after 20 minutes
v0.786.318Restamp: feat(tai): federated ask routing — fleet Slice 2 (0.786.311)Jul 29, 2026
  • Restamped onto current main by PR-BACKLOG-DRAIN (unique version stamp).
v0.786.317Restamp: feat(tai): mode contract — resolveMode + §0 hard constraints (0.786.307)Jul 29, 2026
  • Restamped onto current main by PR-BACKLOG-DRAIN (unique version stamp).
v0.786.316Restamp: feat(tai): TRUE CONTINUITY memory — turn embeddings, brief, what-we-said, G7 promises (0.7Jul 29, 2026
  • Restamped onto current main by PR-BACKLOG-DRAIN (unique version stamp).
v0.786.315Restamp: feat(tai): persona depth — separate entity within mode contract (0.786.306)Jul 29, 2026
  • Restamped onto current main by PR-BACKLOG-DRAIN (unique version stamp).
v0.786.314Restamp: feat(tai): private channel segregation by construction (§7) 0.786.306Jul 29, 2026
  • Restamped onto current main by PR-BACKLOG-DRAIN (unique version stamp).
v0.786.313Restamp: feat(tai): Cubs announcer in-place — jersey + call on presence (0.786.304)Jul 29, 2026
  • Restamped onto current main by PR-BACKLOG-DRAIN (unique version stamp).
v0.786.312Restamp: feat(tai): voice test director UI — tell Claude, news, self-check (0.786.304)Jul 29, 2026
  • Restamped onto current main by PR-BACKLOG-DRAIN (unique version stamp).
v0.786.311Restamp: feat(tai): legacy route audit — every summon is an overlay card (0.786.304)Jul 29, 2026
  • Restamped onto current main by PR-BACKLOG-DRAIN (unique version stamp).
v0.786.308Cubs announcer revive — overlay card + Sports Booth expandJul 29, 2026
  • RESTORE: IntentCardOverlay re-lands on home (train PR 4120 claimed 0.786.295 but never shipped the component) — schedule/bills/court/cubs/health float over full-size Tai; dismiss = scrim/Escape/close; no gcx-root--focused.
  • CUBS: a Cubs ask (score, first pitch, call the game, sports booth) raises the Cubs game card in-place; Expand opens /sports-announcer (isolated Grok booth). Feed is the same /api/sports/cubs board.
  • Routing: schedule-today ASR variants stay on calendar→schedule card; booth phrasing classifies as cubs so the overlay wins on the canvas he actually uses.
v0.786.305Voice stability + younger/higher identityJul 29, 2026
  • Longer live answers: transport reconnect no longer cancels ElevenLabs mouth mid-sentence
  • Triple-buffer cloud TTS + deeper WebRTC jitter ladder (to 800ms) with gap telemetry beacons
  • Voice identity token (spark): younger/higher default; one-line taste flip via TAI_VOICE_IDENTITY
v0.786.304Voice stability + younger/higher identityJul 29, 2026
  • Longer live answers: transport reconnect no longer cancels ElevenLabs mouth mid-sentence
  • Triple-buffer cloud TTS + deeper WebRTC jitter ladder (to 800ms) with gap telemetry beacons
  • Voice identity token (spark): younger/higher default; one-line taste flip via TAI_VOICE_IDENTITY
v0.786.303Cubs announcer revive — overlay card + Sports Booth expandJul 29, 2026
  • RESTORE: IntentCardOverlay re-lands on home (train PR 4120 claimed 0.786.295 but never shipped the component) — schedule/bills/court/cubs/health float over full-size Tai; dismiss = scrim/Escape/close; no gcx-root--focused.
  • CUBS: a Cubs ask (score, first pitch, call the game, sports booth) raises the Cubs game card in-place; Expand opens /sports-announcer (isolated Grok booth). Feed is the same /api/sports/cubs board.
  • Routing: schedule-today ASR variants stay on calendar→schedule card; booth phrasing classifies as cubs so the overlay wins on the canvas he actually uses.
v0.786.300Voice input captions live againJul 29, 2026
  • BUG: Realtime mint no longer uses retired whisper-1 for input STT — walks gpt-4o-mini-transcribe → gpt-4o-transcribe → gpt-live-transcribe so StenoPad, transcripts, and phone reports receive Tony's words.
  • HONESTY: last-resort strip (all STT models rejected) returns transcriptionStripped and paints a Captions off chip + server/client beacon — never silent degradation.
  • Phone outbound accept uses the same primary transcription model as in-app mint.
v0.786.299Next 16 Turbopack migration + tai npm groupJul 29, 2026
  • Migrated next.config from custom webpack() to turbopack.resolveAlias (edge Sentry stubs + OTel precompiled path); removed Next-16-invalid eslint key.
  • Applied the PR 4066 tai dependency group (next 16.2.12, sentry 10, zod 4, lucide 1, supabase, three, recharts, framer) with root-cause fixes: Zod 4 native toJSONSchema for tool params, lucide brand-icon removal → GitBranch, favicon ICO RGBA for Turbopack decoder.
  • Preserved no-store headers on /version.json, /build_info_home.json, and /sw.js (staleness law).
v0.786.298Atomic plate — one Tai, never stackedJul 29, 2026
  • BUG: immersive fluid no longer stacks a full-body scene plate under rembg cutouts at a different crop (photo dual-Tai on home).
  • Stillness: one scene cover plate only. Talk/warp: solid fill + cutouts only. Host layers use binary opacity + z-index so warm fluid cannot composite under Live2d.
  • Regression tests pin scene↔cutout mutual exclusion and drawScenePlate:false solid-only path.
v0.786.297Avatar aliveness — one plate, living dayJul 29, 2026
  • BUG: wardrobe/fluid boot no longer paints two avatars — plate hosts swap atomically (exactly one visible; fluid warms hidden until ready).
  • Composition varies full-body vs close-up by date+hour seed (stable within a sitting; no Math.random). Time-of-day life: late/5–7 AM silk robe stand-in → office day → evening dress/glam; weekend + warm weather (≥75°F from presence weather) → pool register (casual stand-in).
  • Location ideal + WANTED_ASSETS extended with generation-prompt drafts (robe, pool, backdrops, framing plates). Art feed: docs/AVATAR_ART_PIPELINE.md. STILLNESS held.
v0.786.296Type path stays open — talk tray pinJul 29, 2026
  • While the Message field is open, home chrome and the talk tray stay pinned — no idle auto-dismiss mid-type.
  • Keyboard always opens the Message field (deterministic focus). Opening Type does not arm the mic.
  • If voice is off this session, Tai remembers and stays type-first instead of re-prompting. Listening status only shows when she is actually live and listening.
v0.786.295In-place overlay cards — schedule never leaves presenceJul 29, 2026
  • Carded intents (schedule/bills/court/cubs/health) float over Tai as IntentCardOverlay — she stays full-size; no gcx-root--focused, no route change. Expand is the only deep-view hop.
  • Routing fix: 'what is on my schedule today' and related ASR/typed variants classify as calendar→schedule card, never the legacy Today module raise.
  • Premium entrance (token-only scrim + panel rise/settle; reduced-motion fades). STILLNESS LAW held — overlay animates, plates do not. Dismiss = tap-away / Escape / close / voice hide.
v0.786.294Fleet orchestrator Slice 1 — Her workers status cardJul 29, 2026
  • Command Center shows Her workers: TOMAI, NAENAI, ROXAI, MAI, GraceAI liveness/version/last-ship from public endpoints only.
  • Post-auth GET /api/fleet/status probes version.json (ops only) — no personal data; NAENAI is status never content.
  • Design: data/outputs/TAI_FLEET_ORCHESTRATOR_DESIGN_2026-07-29.md (hub transport, walls, ask-routing roadmap).
v0.786.293Session identity — never address Tony as NancyJul 29, 2026
  • Conversational + realtime prompts now open with an authoritative SESSION IDENTITY block from the signed-in session only — Tony on the owner path.
  • Nancy (NAENAI) and other foreign-tenant names are banned as the Tai addressee; device-trust displayName cannot override the owner to Nancy.
  • Regression tests assert persona + realtime prompts contain the session name and never treat Nancy as the interlocutor.
v0.786.292Trusted-device session refresh — no mid-chat PIN deathJul 29, 2026
  • Root cause (b): access JWT dies ~1h; refresh existed in middleware/browser but ask/converse did not remint before 401, and soft GoTrue failures wiped cookies → SESSION ENDED on the next nav.
  • Ask + converse: refresh-before-fail (one silent remint + retry). SessionKeeper proactively refreshes on focus/foreground and every 4 min while visible.
  • Middleware only clears the jar on hard refresh failure (invalid_grant); soft timeout/5xx keeps cookies. Route handlers remint near-expired access before getUser.
  • Return-to-context after true re-auth still threads next= via safeReturnTo + PIN unlock — unit-tested.
v0.786.291Native package OTA unblocked — pre-auth no longer strands applyJul 29, 2026
  • Root cause of BUNDLED v… · SERVER v… · ota · OTA failed on build 81: native package snapshot fetches of / and /tai were bounced to the PIN login by pre-auth page gating, so package verification never saw /chunks/app/tai/ and failed integrity.
  • Middleware + /tai + / now pass `__tai_ota_*` package-snapshot requests through without a session (shell HTML/assets only — no owner records). Server-side fix; next foreground OTA stage on existing build 81 can succeed without a new TestFlight.
  • Web applier hardening: navigation watchdog for replace_no_navigation, one immediate retry after a failed apply (never more than two attempts), and a fire-and-forget failure beacon to /api/client-log so the next miss self-reports.
v0.786.290Chrome frost hardening (backdrop-filter fleet)Jul 29, 2026
  • Fixed bars, sheets, and chips are near-opaque even when the browser drops standard backdrop-filter after minify — scrolled copy no longer reads through chrome.
  • Standard backdrop-filter re-asserted behind @supports across globals and frosted modules so engines that ignore the -webkit- prefix still get blur.
v0.786.289Avatar wardrobe + hair variation (mode plate sets)Jul 29, 2026
  • Personality modes now drive wardrobe plate sets: professional → office; partner → TOD table (weekend daytime varies morning/afternoon/evening); default → daypart Style-matrix map.
  • Salon-fresh hair index is deterministic from ISO week + mode (no Math.random). Only plates in the enumerated manifest load; missing wardrobe/hair variants fall back to base and land in WANTED_ASSETS for the art queue.
  • STILLNESS held: plate swaps only on mode/scene boundaries with ≥5 min hysteresis. Explicit mode taps still apply immediately.
v0.786.288Designed Court, Cubs, and Health intent cardsJul 29, 2026
  • Court / Cubs / Health asks now raise purpose-designed answer cards over Tai — same DesignedIntentCard aesthetic as Schedule and Bills Due, legacy modules remain the fallback when a card is not registered.
  • Court card: next open hearing big with case name, county, and days-until; closed cases never alarm (isClosedCaseStatus; feeder tony_corrected status respected).
  • Cubs card: last/next game, score, and NL Central standing snapshot from the live /api/sports/cubs feed. Health card: meds status + next medical appointment, PHI only post-auth.
v0.786.287Avatar expression range + emotional color (stillness-safe)Jul 29, 2026
  • Conversation affect (vocal urgency/energy + greetings) maps to discrete expression states — joy, focus, warmth, concern, playful — and swaps Path-A listening/thinking plates only; no plate shake.
  • Subtle ambient scene wash uses design tokens (--t-avatar-affect-*) only; continuous smile/corner mesh channels stay behind TAI_AVATAR_MOTION=1 (off by default).
  • Realtime voice publishes affect on the expression bus; Fluid + Live2d hosts subscribe without blocking the brain path.
v0.786.286Personality modes — professional + partner on the sceneAware clockJul 29, 2026
  • Extends landed sceneAware with a mode axis (professional | partner | default): schedule maps Fri night/Sat (and evenings/weekends) to partner, weekday work hours to professional; wardrobe + greeting + voice preset + persona-prompt overlay agree.
  • Explicit override always wins — voice (“girlfriend mode” / “partner mode” / “be professional” / “auto mode”), Style-panel tap, or set_personality_mode tool. Partner warmth and continuity, never sycophancy; grounding still outranks mode.
  • Salon hair rotation uses only existing Style-matrix packs (office/dress multi-hair; casual/chic/glam/silk blonde-only) — missing combos never selected. STILLNESS LAW held (plate swaps only). Kill switches: TAI_PERSONALITY_MODES=0, TAI_SCENE_AWARE_PERSONA=0.
v0.786.285Tai answers with designed Schedule and Bills Due cardsJul 28, 2026
  • Direct schedule asks now raise a purpose-designed Schedule card over Tai — today, tomorrow, named weekdays, and explicit dates — from the same merged calendar data as the full Calendar module.
  • Bills Due proves the framework across a second domain with the existing cycle-aware bill ledger, one focal known-total answer, honest missing amounts, and the full Money view one tap away.
  • The intent router prefers registered cards, keeps every uncarded module raise as fallback, and tells the model card vs module only after the host confirms rendered:true.
v0.786.283Pre-auth PIN gate is private — no module map, honest copyJul 28, 2026
  • Signed-out PIN gate is a NINAI-style single card: no Money/Court/Health module map, no voice bar, no Ask-Tai pill — private-life structure stays hidden until unlock.
  • First visit greets with “Enter your code”; “Session ended” only when a prior session cookie actually existed (middleware no longer labels every anonymous hit as expired).
  • Signed-in chrome, voice, and nav are unchanged for every path except /today/login.
v0.786.282Scene-aware persona — time-of-day wardrobe and roomJul 28, 2026
  • Framework: context (time-of-day / day-of-week / mode / season) maps to scene backdrop, Style-matrix wardrobe, voice tone preset, and optional personality mode — docs/SCENE_AWARE_PERSONA_DESIGN.md; fleet matrices for Tai/TOMAI/NINAI/Roxy.
  • Live slice: TAI_SCENE_AWARE_PERSONA (on-by-absence, kill =0) auto-selects wardrobe+scene from existing assets only; evening dress/glam co-occurs with Good evening awareness; manual Style locks until daypart rolls.
  • STILLNESS LAW held: scene changes are discrete state swaps — no plate motion, no ambient background animation.
v0.786.281Universal privacy mute — tap her noseJul 28, 2026
  • ONE privacy state: engaged ⇒ session mic released (honest not listening) AND all speech generation/output off — builds on true-mute (MUTE-MEANS-SILENT) without weakening it.
  • Primary gesture: in-character nose tap (rig-derived hit target across wardrobe styles) with a discrete still shh mark; labeled Privacy control for screen readers; spoken “go private” engages.
  • Unmute is touch only (she cannot hear while deaf) — voice cannot leave private; touch unmute speaks “I'm back” once. Preference persists across reload (tai:privacy-mute).
v0.786.280Avatar crispness — discrete swaps, pixel-snap plateJul 28, 2026
  • Stillness left mouth/blink life on, but opacity crossfades + non-integer scale still read as blur while speaking. Plate root is identity transform with transition/filter none; drop-shadow and will-change:transform removed.
  • Blink, mouth, and listen/think swaps are discrete 0/1 frames — no rest↔talk ghost, no dual-mouth 0.72/0.28 blend, no smoothMix tween. Fluid mesh mouth/blink quantize to stepped levels; rest draws identity at device-pixel-snapped size.
  • True smooth lips need a 6–8 distinct mouth plate set (asset pipeline) — only 2 unique A/O rasters ship today (E/I/U are A/O copies). Code is ready for more plates when they land.
v0.786.279Show my calendar opens Calendar — not the Today cardJul 28, 2026
  • Direct capability asks open that capability: “show my calendar” / “my schedule” resolve to the Calendar module key and open the dedicated /calendar board — never the generic Today day-card.
  • Same direct-intent rule stays locked for court → Legal and bills → Bills; pure day-shape (“how does today look?”) still raises Today.
  • Honest-render contract unchanged: a classified raise still needs rendered:true before Tai can claim the surface is up.
v0.786.278Avatar stillness — sharp plate until the real rigJul 28, 2026
  • Tony live call: plate breathing/tilt/gaze read as shake + blur on device. Default is now a single stationary portrait — pixel-stationary and tack-sharp at rest and while speaking.
  • Blink + mouth/viseme plate swaps stay on (crisp, no resampling). Every plate-moving transform (breath translate, head tilt, gaze mesh shift, body sway, hair drift) is OFF unless TAI_AVATAR_MOTION=1.
  • Stillness is the explicit aesthetic until true part/Live2D fluid animation exists — not a permanent freeze of life, a hold until motion is earned by a real rig.
v0.786.277The updater updates — OTA apply fixed on iPhoneJul 28, 2026
  • Root cause: a controller-change reload preempted the staged apply (unregister → purge → cache-busted navigate) inside the iOS shell, so updates died mid-flight and the footer honestly said 'OTA failed'.
  • Apply is now a guarded single-flight pipeline with structured per-step events; a failure names its exact stage on the banner, success flips the footer within one foreground.
  • Service worker + stamp hardening so every deploy re-installs cleanly; N/N-1 shell retention preserved.
v0.786.276Clean-slate home — her face owns the phoneJul 28, 2026
  • At rest on /tai, chrome (top utilities, talk console, shortcut dock, bottom/desktop nav) hides so her face owns the phone — TOMAI clean-slate parity.
  • Tap or voice "show controls" reveals chrome for a few seconds; Settings monogram stays always reachable; her flower remains the Style door.
  • Bare state is SSR-safe (no flash of chrome before client attrs). Kill switch: TAI_CLEAN_SLATE=0 (or TAI_CANVAS_CLEAN_SLATE=0) restores always-on chrome.
v0.786.275Phone audio can never disappear behind a stale TV ownerJul 28, 2026
  • The phone now yields speech only to a TV with fresh six-second room heartbeats, a bidirectional session acknowledgement, and an active TV playback claim; missing, stale, ambiguous, legacy, or failed proof reclaims phone audio automatically.
  • Ownership changes rebuild the existing wanted voice session without turning them into an End tap. Mute still blocks generation at the source, and every blocked generation records owner, mute, or prop as a structured diagnostic gate.
  • When confirmed TV playback is active, the phone says so and offers the spoken “play here” transfer; that command clears the TV lease, rebuilds locally, and confirms from the phone.
v0.786.274One-time spoken confirmation for safe calendar addsJul 28, 2026
  • Calendar creation can offer a default-off spoken-confirm path: Tai reads a fresh action-bound nonce phrase and only that full response can approve the pending event.
  • The phrase expires after 30 seconds, works once, and is stored only as an owner/action/args-bound HMAC; replay, mismatch, timeout, and stale-card paths fail closed.
  • Payments, deletions/cancellations, credentials, communications, and every other sensitive action remain tap-only; the existing Confirm tap is unchanged.
v0.786.273Avatar gaze + head life — she presents the canvasJul 28, 2026
  • When she speaks, gaze stays on you with soft micro-shifts — never a dead stare. Idle-life breathing, sparse saccades, and state micro-expressions ride the same pure rig (no second system).
  • A successful canvas module raise makes her eyes briefly lead toward the sheet, then return — she presents it. Speech amplitude couples a subtle head tilt/nod while talking; listening keeps head still of amp.
  • prefers-reduced-motion freezes gaze, present-glance, and head life with the rest of idle-life. Unit tests pin presence gaze transitions, canvas glance, amp head coupling, and the no-scale-pulse guard.
v0.786.272Avatar gaze + head life — she presents the canvasJul 28, 2026
  • When she speaks, gaze stays on you with soft micro-shifts — never a dead stare. Idle-life breathing, sparse saccades, and state micro-expressions ride the same pure rig (no second system).
  • A successful canvas module raise makes her eyes briefly lead toward the sheet, then return — she presents it. Speech amplitude couples a subtle head tilt/nod while talking; listening keeps head still of amp.
  • prefers-reduced-motion freezes gaze, present-glance, and head life with the rest of idle-life. Unit tests pin presence gaze transitions, canvas glance, amp head coupling, and the no-scale-pulse guard.
v0.786.271She can look at what you share — screen visionJul 28, 2026
  • Share your current screen into the next question (explicit tap, never automatic): the frame grounds her answer through a vision pass, request-scoped and never stored.
  • Honest failure copy when vision is unavailable; turns without a shared frame are byte-identical to before.
v0.786.263Mac desktop shell — live Tai in a native windowJul 28, 2026
  • Unsigned Tauri desktop shell loads https://tai-web.fly.dev so the Mac app shows the same version footer and PIN-first sign-in as production.
  • Native menu, tray, and Go shortcuts; no custom web UI — the web app is the product.
  • CI workflow mac-app-unsigned.yml builds downloadable .app/.dmg on workflow_dispatch (unsigned; right-click Open).
v0.786.262Home diegetic controls — Style is her flowerJul 28, 2026
  • Design: home controls map to scene elements (flower, hand, background box) with voice + 44px hit rules (docs/HOME_DIEGETIC_CONTROLS.md).
  • Slice 1: Style opens from her flower hotspot behind TAI_HOME_DIEGETIC_CONTROLS (kill =0 restores the Style pill); same wardrobe/hair path and spoken open-style phrases.
v0.786.261Style matrix honesty — no dead outfit × hair optionsJul 28, 2026
  • Inventory: office/dress ship blonde + brunette + redhead; casual/chic/glam/silk are blonde-only (baked hair in the art).
  • Style picker only offers hair colors that can render for the current outfit — no dead brunette/redhead taps on day/night looks.
  • Voice and set_avatar_style refuse missing combos with a clear spoken line instead of silently doing nothing.
v0.786.260Speech amplitude drives home avatar mouthJul 28, 2026
  • Phone home TaiAvatar (FluidAvatar) now receives live TTS/Realtime amplitude through the one-owner mouth driver; speaking no longer freezes as blink-only.
  • Rest/null visemes and a silent analyser no longer collapse the speaking aperture — real amp wins, procedural envelope keeps lips alive until amp arrives.
  • Hybrid Live EL ↔ OpenAI still claims/transfers the visual mouth owner beside the existing audio mute hold and speak-while-Live gates (unchanged).
v0.786.259Mute means true silence — stop speech generationJul 28, 2026
  • Speaker-with-X (SoundToggle) no longer only mutes the audio sink: while muted, cloud TTS and Realtime speech production are cancelled/skipped so compute is not burned.
  • Conversation and the brain keep running in true silence; turn-taking still fires. Control labels spell out true silence vs sound on.
  • Unit tests pin decideSpeechGenerationAllowed + Live wiring: no speakEvent / ElevenLabs path while muted.
v0.786.258Stop Tai from hearing herself mid-sentenceJul 28, 2026
  • While she is speaking, residual speaker→mic echo no longer false-trips barge-in and cuts her off — server VAD threshold and local energy gate raised for playback-active self-echo only.
  • Clear talk-over still interrupts within 160 ms; capture keeps echo cancellation on. Unit test: playback-active self-energy does not interrupt, a distinct user utterance does.
v0.786.257Settings always reachable on clean-slate homeJul 28, 2026
  • A quiet S monogram sits at dock altitude on the resting home — open Settings without hunting All of Tai or a banner over her face.
  • The entry stays tappable in clean-slate bare, tap-to-reveal, and post-timeout; the monogram dock still hides until you tap.
v0.786.256Vendor owner-pin-auth inside deploy contextJul 28, 2026
  • Docker builds only ship projects/tai — the shared PIN package is now mirrored under vendor/ so npm ci no longer reaches outside the build context.
  • Lockfile and TypeScript paths point at the vendored copy; a repo checker fails if vendor and packages/owner-pin-auth drift.
v0.786.255Code health: personality test typesJul 28, 2026
  • Internal type repair in the voice personality test so every code check runs clean.
v0.786.254Warm-steel personality pinned through the full spoken turnJul 28, 2026
  • Audit closes the spoken path: live Realtime mint, voice-surface brain prompt, disposition dials, multi-turn, reconnect remint, and background→foreground resume all keep warm-steel behavior — full-turn unit tests pin it.
  • Phone Realtime (Tony) and the owner phone brain now re-anchor the same TAI_LIVE_BEHAVIOR tail as in-app voice, so a tiny phone turn cannot collapse into generic warmth.
v0.786.253Orders reconcile from a durable email ledgerJul 28, 2026
  • Gmail push appends order events with source message, history, email time, receive time, and parser provenance before its history cursor advances; one transactional RPC reconciles the current row.
  • Create, update, and cancellation are durable events, not destructive edits. The newest source event wins, and an unrecognized state renders Unknown instead of inheriting or guessing a status.
  • The Orders page no longer substitutes demo rows for an empty/unavailable tenant. A cron-gated synthetic-tenant fixture route proves create → update → cancel plus Unknown without real Gmail or personal data.
v0.786.252Tony PIN first on login, shared safe unlockJul 28, 2026
  • Sign-in still leads with Tony’s 4-digit PIN; password and email code stay right below as alternates.
  • PIN check now uses the shared family unlock package (strict secret check + 30-minute lockout).
  • A correct PIN always signs you in as Tony — never as anyone else.
v0.786.251Night Runner: pause, focus, desktop keysJul 28, 2026
  • Maze-chase Night Runner gains Space/P/Escape pause, blur-to-pause, and an application focus surface so arrow keys and WASD steer only while the maze owns keyboard focus.
  • Graphics progression hooks and input/accessibility unit tests lock the pixel→arcade→neon climb plus arrow/WASD/pause contracts; desktop shows keyboard hints while touch pads stay phone-only.
v0.786.250Video upload: honest format failures + content indexJul 28, 2026
  • Video process probes container/codec and lists unsupported formats in a visible failure list — codecs never silently disappear.
  • Supported synthetic clips build a content index for grounded ask; HEVC/AVI fail honestly instead of empty success.
v0.786.249Phone call voice stays its own channelJul 28, 2026
  • Closed the last sink-audit open item: cellular Call Me / phone-brain voice (S4) is a separate channel from in-app Live and read-aloud — not a same-turn double mouth.
  • Architectural lock so a future change cannot fan one answer to both Twilio and the PWA speakers without failing tests.
v0.786.248Avatar motion follows the performance contractJul 28, 2026
  • Idle, speaking, and transitions are driven by the shared performance contract (via the mouth driver) — not a second ad-hoc speech clock.
  • Leaving speaking clears mouth channels so idle cannot stick open; renderers no longer fall back to a procedural double-driver when a sample is present.
v0.786.247One-owner avatar mouth from performance contractJul 28, 2026
  • Tai avatar speaking mouth is driven by the one-owner mouth driver (performance contract) so a single ownerToken owns the visible aperture with clean handoff.
  • Hybrid Live EL ↔ OpenAI path claims/transfers that visual owner in lockstep with the existing EL mute hold — audio gates (PRs 3950/3955/3957) unchanged.
v0.786.246One Realtime owner with explicit audio modesJul 28, 2026
  • TaiConverse, the TV phone remote, and the TV surface now consume one window-level Realtime transport instead of mounting competing microphone and playback owners.
  • Desktop Command, iPhone Local, TV Ambient, and TV Private each have an explicit capture, playback, and room-bridge policy; TV presence can offer a room but cannot redirect or arm voice.
  • TV Ambient selection and trusted-gesture start are atomic, and the phone remote only shows a live bridge when the global session is actually in TV Ambient mode.
  • Tonight's Live mouth gates stay in place: residual WebRTC mute while ElevenLabs speaks, Read/Speak blocked while Live, and sports/booth/audition blocked while Live.
  • Focused owner, mode-policy, TV-discovery, and playback tests plus Tai typecheck passed; deployed-browser, production self-test, and iPhone iOS / TV iOS physical-device voice proof remain separate release gates.
v0.786.245Sourced session recaps stay inside the tenantJul 28, 2026
  • What happened yesterday and 1/7/14/28-day work recaps now read an authenticated owner-scoped event ledger; every returned event includes its source label and reference.
  • The global filesystem/bridge history feed is no longer reachable from the signed-in Cockpit Log API or assistant tool.
  • Synthetic two-tenant fixtures prove another tenant's request and a foreign-stamped storage result both deny with zero events or sources.
v0.786.243APNs proxy routes cannot silently 404Jul 28, 2026
  • Public/synthetic route map for native-shell /bridge/* paths (APNs register, VoIP register, data events, trader TTS) asserts rewrite to Fly bridge /api/v1/* without tokens.
  • Protected proxy-routing tests lock owner-only bearer injection and unauthenticated 401 (never SPA 404) for the same paths.
  • Real device push delivery remains credential- and device-gated and is not claimed verified by this release.
v0.786.242One cloud TTS owner at a timeJul 28, 2026
  • SpeakButton, Live, briefing, and sports share one cloud audio pool token — a new speak cancels the previous owner.
  • Two createCloudSpeaker instances can no longer play over each other on the shared <audio> elements.
v0.786.241Sports and audition yield while Live is onJul 28, 2026
  • Sports on-air, booth TTS, and settings voice previews no longer start while a Live Realtime session is active — Live keeps the only mouth.
  • Starting Live cancels in-flight sports/booth/audition audio so two voices cannot layer; same session gate as Read/Speak.
v0.786.240Read/Speak yields while Live is onJul 28, 2026
  • Listen / Read aloud and auto-speak no longer start while a Live Realtime session is active — Live keeps the only mouth.
  • Starting Live cancels in-flight read-aloud so two voices cannot layer; same session gate the rest of the app already uses.
v0.786.239Hybrid Live: one mouth at a timeJul 28, 2026
  • Starting an ElevenLabs full answer in hybrid Live mutes residual OpenAI WebRTC audio so two voices cannot play at once.
  • WebRTC mute restores to SoundToggle / owner preference when EL finishes, falls back to OpenAI, or is interrupted.
v0.786.238Walk through self-test failures by voiceJul 28, 2026
  • After a self-test fail push, say "walk me through what failed" — Tai guides you through each failed check without a script number.
  • Same pass/fail capture as feature testing; if nothing failed recently, she says so plainly.
v0.786.237Home density monogram dockJul 28, 2026
  • Resting home shortcuts are small monograms (R $ X H D T L C + TV) — no labeled Shortcuts pill/sheet
  • One tap from home to each destination; 44px hit targets; face stays dominant
  • TV/cast monogram first for game-on-TV; fresh reports stay a tappable count
  • Clean-slate home: monogram dock hides in bare state and returns on tap-to-reveal with other chrome
v0.786.236Get-to-know-you self-learning Q&A modeJul 27, 2026
  • Explicit Get-to-know-you mode: home chip or phrases like "let's talk about me" — Tai asks one curious question at a time and remembers answers in the existing authored-fact journal (never ambient on ordinary chat).
  • Persistence is fail-closed: answers land as tony-corrected memory facts with dual-write; session replacement inserts first then voids older live rows only; concurrent overlapping saves cannot zero-out each other; partial writes speak honest status instead of claiming nothing saved.
  • Phone chrome: sticky mode banner clears the travel dock; conversation controls wrap; crisis-support row is no longer covered by the fixed version fab (inline VersionBadge instead).
v0.786.235Tai's warm steel reaches the live turnJul 27, 2026
  • Reinforced the existing Tai character at the end of the long live-brain prompt, where it can govern the answer after grounding and tool rules.
  • The Realtime mouth and companion lane now carry the same concrete warm-steel, verdict-first, keep-his-pace behavior instead of a thinner generic-warm summary.
  • Bare check-ins stay compact but have Tai's own pulse; substantive turns take a position, expose the hinge, or hand Tony the next move.
v0.786.234Lip-sync + voice resume after leaving the appJul 27, 2026
  • Leaving Tai mid-conversation (home/app switch) could leave her mouth stuck and voice silent even though the call still looked live — iOS paused remote audio and suspended the lip-sync analyser without killing WebRTC.
  • On return to the app she now re-plays the remote sink, resumes the mouth amplitude AudioContext, re-taps the Realtime stream for lip-sync, and restarts mid-utterance ElevenLabs clips — same path after Siri/phone-call interruption and SPA route changes.
  • Pure plan + wiring tests lock the recovery so a future resume path cannot forget the mouth again.
v0.786.233Style pill opens wardrobe; voice changes outfit/hairJul 28, 2026
  • Home Style control is fixed, larger, and pointer-down so the full-bleed avatar stage cannot steal the tap — wardrobe and hair options open and apply.
  • Voice: 'change my outfit to dress' / 'make me a redhead' / 'open style' hit the same preference path as the pill (zero model round-trip for common phrases).
  • Converse tool set_avatar_style for freer phrasing; client applies wardrobe/hair over SSE like navigate/tv_launch.
v0.786.232Self-test 401s and /tai navigation abort fixedJul 28, 2026
  • GET /api/now is allowlisted as the public Chicago clock it always claimed to be — middleware no longer 401s TaiClockController polls when a session cookie is briefly unresolvable.
  • Edge session resolution trusts a fresh cookie/JWT identity for the perimeter instead of remote GoTrue on every HTML and API request, so signed-in principals stop getting intermittent 401s on /api/channel/alert and /api/realtime/session under sweep load.
  • getAuthState no longer treats a getUser timeout as signed-out when a cookie session still exists — that thrash redirected /tai mid-load and produced Playwright net::ERR_ABORTED on desktop.
v0.786.231Project Status — first read-only work boardJul 27, 2026
  • New Project Status module shows curated In flight, Blocked, Queued, and Landed work with plain-language status and evidence.
  • Browser data is an explicit allowlisted fixture only — never raw backlog markdown, handoffs, git history, env, or logs.
  • Read-only this slice: no mutations, no provider calls, no fabricated estimates. Conversational PM and backlog sync are later phases.
v0.786.230Bridge owner gate fails closed without configured ownerJul 27, 2026
  • The /bridge/* shared-credential injection boundary no longer falls back to a hard-coded owner when TAI_OWNER_USER_ID is absent, blank, or malformed — those cases now fail closed with 403 on both bearer-JWT and cookie-session paths.
  • Valid configured owner still receives the injected bridge bearer (exact match); a valid foreign or E2E-fixture identity still gets 403 and never receives the token.
  • Middleware integration tests prove owner inject, foreign deny, unconfigured deny, missing token / invalid session failures, and spoofed Authorization overwrite only for the authorized owner — placeholders only, no live bridge calls.
v0.786.229Bridge proxy binds the shared credential to the canonical ownerJul 27, 2026
  • The /bridge/* native-shell proxy previously injected the shared bridge bearer for ANY authenticated Tai Supabase session, not only Tony's — a signed-in test/foreign identity could receive the credential that fronts the personal data hub (calendar, health, legal, financial).
  • Both the bearer-JWT and cookie-session paths now require the resolved user to match TAI_OWNER_USER_ID before the bridge bearer is injected; a mismatched or foreign identity now gets a fail-closed 403 instead of the credential.
  • Real negative-test coverage added: a different valid Supabase user, an E2E-fixture identity, and a null/unresolved user are all denied — no real secrets or live bridge calls involved.
v0.786.227Voice stays on the device iOS choseJul 27, 2026
  • The global TV button is manual again: it opens /tv and never watches AirPlay, reconnects native transport, or changes the living-room lights.
  • The unfinished native ambient system now fails closed, including for an older saved ON preference; its future scaffolding remains documented but unavailable.
  • Normal iOS route changes no longer reapply AVAudioSession category, activation, speaker override, or preferred input. The separate dropped-Bluetooth-mic recovery remains narrowly scoped to an already-live call.
v0.786.224Avatar wardrobe: redhead, day/night looks, refined blondeJul 27, 2026
  • New redhead hair pack with full office + dress Live2D pose plates (parity with brunette).
  • Four new outfit looks: Casual + Chic (day) and Glam + Silk (night), each with its own hairstyle baked in.
  • Blonde office/dress refined: a little more platinum, bluer eyes, red nails, skinnier waist / fuller bust on the plate set.
  • Hair picker is now Blonde / Brunette / Redhead; wardrobe picker adds Casual, Chic, Glam, Silk under the avatar.
v0.786.223Live voice stability self-test — provider-free by defaultJul 27, 2026
  • Core self-test gains live_voice_stability: scans CastModeLauncher for the WO-084 ambient-TV hooks on every twice-daily cron pass, at $0 — no network call, no session mint.
  • The held-Realtime-session hold (≥60s, catches mid-call cut-in/out) is opt-in only: requires an explicit TAI_LIVE_VOICE_STABILITY_ENABLED=1 env var set by a human later — never wired in unconditionally, so the twice-daily production cron spends nothing by default.
  • Honesty proofs: a deliberately injected WO-084-class failure still asserts FAIL end to end; separate proofs assert the default path makes zero provider calls whether the ambient source is clean or buggy.
v0.786.222Bridge proxy never forwards its token without a checked sessionJul 27, 2026
  • Closed a gap where the /bridge/* native-shell proxy could inject the shared bridge credential even when Supabase config was missing — a branch where no session could ever be validated.
  • That branch now always passes through unauthenticated, matching the documented "do not silently allow traffic" contract. Normal signed-in bridge calls are unaffected.
v0.786.221Phone readiness: webhook host fix, firewall CI, directory correctionJul 27, 2026
  • publicBaseUrl() no longer falls back to the dead heytai.app host — it prefers TAI_PUBLIC_BASE_URL / NEXT_PUBLIC_SITE_URL, else usetai.app, so Twilio webhook signature validation matches the host Twilio actually hits.
  • Signature host-mismatch regression plus firewall / callmePath cases added to CI so a webhook host drift fails the build instead of failing silently in production.
  • Directory now shows Stacy Bardo as previously engaged, not currently acting on the DuPage debt cases, matching Tony's 2026-07-14 correction.
  • tai_twilio_sync_set.sh expanded to cover the caller map, phone flags, SIP, and base-URL secrets Fly needs to light up calling (code readiness pass — no live call was placed).
v0.786.220Gracie Mark refilled writes on the module page againJul 27, 2026
  • Tapping Mark refilled (and Try mark refilled again) on Gracie's medication page now POSTs /api/gracie with her canonical med id on the first tap — the same durable path as the home Needs-you control.
  • Removed the proposeTapAction detour that only opened a confirm card and left the control stranded when the second confirm never completed.
  • Failed writes show an honest alert and a named retry label instead of a silent no-op or bare Retry.
v0.786.219WO-107: committed production A2HS-clear evidenceJul 27, 2026
  • Checked in exact-build signed-in 1179×1977 WebKit + Chromium late frames for clean-slate /tai with no Add-to-Home-Screen panel over Tai (deploy 0.786.218 / 2bf0c1ac).
  • WebKit 1s loading frame retained as partial evidence only — not product acceptance.
v0.786.218Clean-slate: no auto A2HS panel over TaiJul 27, 2026
  • On the clean-slate /tai home, the automatic “Add Tai to your Home Screen” panel no longer covers her torso or legs.
  • Installation stays reachable by voice or type (“how do I install Tai” / “add to home screen”) with spoken Safari Share steps — no new chrome over her body. Settings → Notifications still shows needs-install.
v0.786.217Self-test mint: token_hash for synthetic magic-link verifyJul 27, 2026
  • Signed-in self-test mint now verifies admin generate_link tokens with token_hash (not token) so GoTrue accepts the synthetic session.
  • No production login/PIN path change — harness + self-test mint contract only (WO-105).
v0.786.216Clean-slate reveal: Talk pill fully in the floor gutterJul 27, 2026
  • Reveal-state Listening/Talk is a compact bottom-right floor-gutter stack — no overlap of her right boot, legs, or lower body.
  • Capture URL strip insets leave Flag/TV free so disclosed provenance never clips a reveal control. Bare and post-timeout stay chrome-free.
v0.786.215Clean-slate reveal: Needs You micro-chip clear of her bodyJul 27, 2026
  • Reveal-state Needs You is a short bottom-left micro-chip (not a stacked glass card over her chest) — face, chest, and torso stay clear.
  • Mark paid / silence stay as mini actions; fact tap still opens the full module. Bare and post-timeout states unchanged.
v0.786.214Clean-slate acceptance: truly bare, body-clear reveal, voice show/hideJul 26, 2026
  • Bare /tai no longer shows the floating keyboard chip — true initial bare is just Tai and the scene.
  • Reveal repositions Needs You to the top edge and returns Talk as a corner pill; idle travel dock no longer covers her body (Tai stays full-bleed).
  • Voice-reachable show/hide controls (same chrome controller as tap) — pure intent classifier, no second voice system, no provider call in tests.
v0.786.213Clean-slate evidence: real phone captures + face-clear revealJul 26, 2026
  • Replaced CSS-mock proof images with real signed-in iPhone-frame captures (bare / reveal / post-timeout) from the synthetic E2E tenant.
  • Reveal still shows edge chrome (Flag/History/TV/Style/dock/Talk) but never piles live labels or face Sound over Tai — face stays clear; presence is the aura.
  • Kill switch unchanged: TAI_CANVAS_CLEAN_SLATE=0 restores always-on chrome.
v0.786.212Clean-slate home — just Tai, chrome on tapJul 26, 2026
  • Signed-in /tai starts bare: no Sound on her face, no Style pill, no Flag/History/TV corners, no dock, no version chip — just her and the scene.
  • One tap reveals every control for a few seconds (video-player style), then chrome fades again. Nothing was removed — hide ≠ delete.
  • Voice state rides her lighting (soft aura when listening / thinking / speaking) instead of a text label on her chest. Kill switch: TAI_CANVAS_CLEAN_SLATE=0.
v0.786.211Avatar identity rig scaffolding recoveredJul 26, 2026
  • Recovered the default-off owned avatar identity-layer scaffold on current Tai without changing the visible production avatar.
  • Added validated manifest parsing, deformation, Canvas drawing, placeholder assets, and focused identity-rig tests.
  • The placeholder pack remains explicitly non-production-ready; enabling the rig still requires a deliberate flag and completed art.
v0.786.210Self-test conversation check uses no paid modelsJul 26, 2026
  • The twice-daily signed-in self-check still signs in as the synthetic test user and verifies the real home canvas.
  • Its conversation check now proves the signed-in transport and SSE shape with a cron-only diagnostic path — zero Anthropic, OpenAI, or xAI spend.
  • Ordinary callers cannot use that diagnostic path; it fails closed unless cron-authenticated and restricted to the synthetic tenant.
v0.786.209Self-test covers every core Tai screenJul 26, 2026
  • Full self-test now probes every core surface the E2E suite treats as healthy — legal, health, calendar, reports, voice, and the rest — not just a subset.
  • One definition of healthy: same route list as the browser suite, run headless from the server.
  • Deliberately broken routes still fail loud (never silent pass).
v0.786.208Tai's home fills the phone againJul 26, 2026
  • Fixed the immersive home being squeezed into a zero-height layout box after the page-entry animation finished.
  • The room, Tai, and conversation controls now anchor directly to the phone screen instead of disappearing behind the app chrome.
v0.786.207Fixed blank home screen when a data call stalledJul 26, 2026
  • The home canvas now gives up on a stuck data read after 5 seconds instead of hanging forever with a blank screen.
  • If that happens, the screen still loads normally — any card missing its data just shows an empty state instead of blocking everything.
v0.786.206Walk through test scripts with Tai by voiceJul 26, 2026
  • Say "run test three" and Tai reads each step aloud, tracks pass/fail, and takes your spoken comments.
  • Never stops the walkthrough on a failed step — keeps going and files it for review.
  • Results land in the same review list Tony already checks.
v0.786.205Deploy pipeline hardeningJul 26, 2026
  • Fixed a deploy-pipeline bug that was blocking new releases from reaching the live site.
v0.786.204Self-test pushes Tony only when something failsJul 26, 2026
  • When a full self-test finds a real failure, Tai pushes Tony once with the plain-language findings.
  • Clean passes stay silent — no spam when everything looks good.
  • The same failure set is not re-pushed every run (existing notification dedupe by event key).
v0.786.203Tai can now run her own full self-checkJul 26, 2026
  • Say "run a full self-test" and Tai checks her own core surfaces — sign-in, voice, home, key screens — without needing a specific script number.
  • Results file into the same bug-report list Tony already reviews, in plain language.
  • Runs automatically twice a day and after every deploy.
v0.786.202Family members can get their own sign-in codeJul 26, 2026
  • Tony can assign any family member their own 4-digit sign-in code, separate from his.
  • One person's wrong attempts no longer lock out everyone else on the same network.
  • Owner-only access is unaffected — a family code can never grant owner-level data access.
v0.786.201PIN session key recoveredJul 26, 2026
  • Fly now health-checks Tai's Supabase server key before every deploy.
  • If that key is unhealthy, deploys reuse an existing healthy project key without creating or rotating secrets.
  • Owner PIN and key-recovery regressions now run in Tai's required CI suite.
v0.786.200Sign-in test harness retries, self-test publish fixedJul 26, 2026
  • Automated sign-in checks now retry through a slow auth link instead of stalling, and fall back cleanly if a session can't be minted.
  • Nightly self-test report publishing fixed so it never silently fails.
v0.786.199Smoother, better-timed avatarJul 26, 2026
  • Tai's face, voice and mouth now run off one shared clock, so her expression matches what she's saying.
  • When you interrupt her she settles back to listening faster.
v0.786.198PIN sign-in hardenedJul 26, 2026
  • Fixed a crash where the PIN could hang and fail after a slow response.
  • Device trust info is now stored more safely.
v0.786.197Owner PIN trust and timeout hardenedJul 26, 2026
  • Scrypt hash + salt stay in Fly secrets only; new v2 device cookies contain identity metadata, never PIN verification material
  • One 12-second deadline covers token generation, session mint, and device-trust issuance
  • Behavior tests prove fresh-browser success writes session + trust, wrong PIN writes neither, and per-IP + global lockout
  • Clipboard setup streams plaintext only into local hashing and sends exactly the two derived secrets to tai-web
v0.786.196fix(tai): Tony PIN works as first loginJul 26, 2026
  • PIN pad shows on /today/login when env secrets are set — no prior device-trust cookie required
  • Correct PIN mints owner Supabase session and seals device trust in the same response
  • Per-IP + global rate limit, attempt logging, 12s verifyOtp ceiling; Session ended copy matches pad visibility
v0.786.195fix(ops): trust e2e tester tenant + longer probe timeoutsJul 26, 2026
  • Headless voice/suggestions probes require TAI_E2E_TESTER_USER_IDS on Fly — wired through tai-web deploy
  • Trust e2e timeouts raised so cold cron starts stop false-redding the runner
  • Default BASE_URL is usetai.app (Fly primary)
v0.786.194fix(tai): password sign-in never hangs foreverJul 26, 2026
  • Server password proxy (/api/auth/password) recovers browser→GoTrue hangs
  • Client-side 12s ceiling on password/OTP so Signing in… always clears with a real error
  • E2E login fixture reports stuck button text when still on /login
v0.786.193fix(tai): device-bound owner quick-codeJul 26, 2026
  • Owner 4-digit quick-code is sealed to this device after a full sign-in — PIN alone never unlocks a new browser
  • Scrypt hash + HMAC device-trust cookie; lockout after five failures clears trust and forces full reauth
  • Settings + login surfaces for set / unlock / clear quick-code
v0.786.192fix(tai): LATENCY-PASS — instant nav shells + voice hop cutsJul 26, 2026
  • Prefetch hot module routes after home paint; module-shaped loading shells
  • Voice: early done before fast-path persistence; skip native build-report on ordinary turns
  • Warm court/bills spine on converse GET; instrument eos→first-audio phase stamps
v0.786.191feat(tai): rewrite Tai persona as warm-steel character (WO-044)Jul 26, 2026
  • feat(tai): rewrite Tai persona as warm-steel character (WO-044)
v0.786.190fix(tai): restore hex-lint + TV pair approve gate (WO-047)Jul 26, 2026
  • hex-lint clean: FluidAvatar + TV pair confirm use --t-* tokens only
  • /api/tv/pair is exact-allowlist so /api/tv/pair/approve stays session-gated
v0.786.189feat(tai): vocal affect awareness for voice brain (WO-042)Jul 26, 2026
  • feat(tai): vocal affect awareness for voice brain (WO-042)
v0.786.188fix(tai): black void on keyboard resize / type mode (WO-039)Jul 26, 2026
  • fix(tai): black void on keyboard resize / type mode (WO-039)
v0.786.187fix(tai): never black void on immersive home / voice (WO-038)Jul 26, 2026
  • fix(tai): never black void on immersive home / voice (WO-038)
v0.786.186feat(tai): screen render introspect for support vision (WO-20260726-037 PR4)Jul 25, 2026
  • feat(tai): screen render introspect for support vision (WO-20260726-037 PR4)
v0.786.185fix(tai): bug intake e2e verify + Mac pull fallback (WO-20260726-037 PR2)Jul 25, 2026
  • fix(tai): bug intake e2e verify + Mac pull fallback (WO-20260726-037 PR2)
v0.786.184feat(tai): owner-gated camera vision (WO-20260726-037 PR3)Jul 25, 2026
  • feat(tai): owner-gated camera vision (WO-20260726-037 PR3)
v0.786.183feat(tai): live call mouth via ElevenLabs + identity A/B (WO-033)Jul 25, 2026
  • feat(tai): live call mouth via ElevenLabs + identity A/B (WO-033)
v0.786.182feat(tai): self-heal auto-remediation (WO-20260726-037 PR1)Jul 25, 2026
  • feat(tai): self-heal auto-remediation (WO-20260726-037 PR1)
v0.786.181Avatar alive in production — breath, blink, gaze, visemes (WO-035)Jul 25, 2026
  • Fluid avatar rig is ON in production by default (TAI_AVATAR_FLUID_POC=0 kill switch).
  • Continuous idle life: irregular blinks, ~12–16/min breath, head drift, weight shift.
  • Eyes track the viewer with small saccades; glance away while thinking; return when speaking.
  • Mouth follows real Realtime/TTS amplitude plus multi-shape visemes (not a frozen portrait).
  • Full device pixel ratio (cap 3), prefers-reduced-motion, pauses when the app is backgrounded.
v0.786.180feat(tai): immersive full-bleed home — environment is the screen (WO-031)Jul 25, 2026
  • feat(tai): immersive full-bleed home — environment is the screen (WO-031)
v0.786.179fix(tai): voice session stability — no thrash, mute, warm greeting (WO-030)Jul 25, 2026
  • fix(tai): voice session stability — no thrash, mute, warm greeting (WO-030)
v0.786.178fix(tai): hex-lint allowlist for chunk recovery overlay (WO-029)Jul 25, 2026
  • fix(tai): hex-lint allowlist for chunk recovery overlay (WO-029)
v0.786.177fix(tai): white-screen stability — chunk recovery + N-1 SW cache (WO-029)Jul 25, 2026
  • fix(tai): white-screen stability — chunk recovery + N-1 SW cache (WO-029)
v0.786.176feat(tai): voice bug intake — log_bug + cockpit poll (0.786.160)Jul 25, 2026
  • feat(tai): voice bug intake — log_bug + cockpit poll (0.786.160)
v0.786.175fix(tai): premium voice module cards + Legal visual bar (WO-024)Jul 25, 2026
  • fix(tai): premium voice module cards + Legal visual bar (WO-024)
v0.786.174fix(tai): records fast-path for next court date / bills (WO-023)Jul 25, 2026
  • fix(tai): records fast-path for next court date / bills (WO-023)
v0.786.173fix(tai): avatar style variants - slim, bluer eyes, front brunette dress (WO-022)Jul 25, 2026
  • fix(tai): avatar style variants - slim, bluer eyes, front brunette dress (WO-022)
v0.786.172fix(tai): always-on phone voice — auto-connect, survive nav, voice-off (WO-020)Jul 25, 2026
  • fix(tai): always-on phone voice — auto-connect, survive nav, voice-off (WO-020)
v0.786.171fix(tai): unblock production deploys — dead narrowing check + test env castsJul 25, 2026
  • fix(tai): unblock production deploys — dead narrowing check + test env casts
v0.786.170fix(tai): war-room Ameritas seed — satisfied respond-by no longer renders past-dueJul 25, 2026
  • fix(tai): war-room Ameritas seed — satisfied respond-by no longer renders past-due
v0.786.169fix(tai): room-mic Connected only when live loop works (WO-018)Jul 25, 2026
  • fix(tai): room-mic Connected only when live loop works (WO-018)
v0.786.168feat(tai): sports booth Anthropic fallback when XAI_API_KEY missingJul 25, 2026
  • feat(tai): sports booth Anthropic fallback when XAI_API_KEY missing
v0.786.167fix(tai): voice session survives Legal/Records navigation (WO-20260725-007)Jul 25, 2026
  • fix(tai): voice session survives Legal/Records navigation (WO-20260725-007)
v0.786.166fix(tai): module back/home nav to avatar (WO-006)Jul 25, 2026
  • fix(tai): module back/home nav to avatar (WO-006)
v0.786.165fix(tai): front-facing dress avatar plates (WO-20260725-008)Jul 25, 2026
  • fix(tai): front-facing dress avatar plates (WO-20260725-008)
v0.786.164fix(tai): answer-first voice — speak before card (WO-20260725-002)Jul 25, 2026
  • fix(tai): answer-first voice — speak before card (WO-20260725-002)
v0.786.163fix(tai): sound toggle in voice bar + READY/LIVE/OFF stateJul 25, 2026
  • fix(tai): sound toggle in voice bar + READY/LIVE/OFF state
v0.786.162feat(tai): voice presence greeting always uses signed-in first nameJul 25, 2026
  • feat(tai): voice presence greeting always uses signed-in first name
v0.786.161Home declutter — Call me, Steno, and Ask off by defaultJul 25, 2026
  • Call me, Steno, and Ask stay off the home surface by default so the first screen stays quieter.
  • Style controls are more compact, and Cubs shows a cleaner time line.
v0.786.160Self-diagnosis — Tai checks herself out loudJul 25, 2026
  • Ask “run a self check”, “why isn’t voice working”, or “what’s wrong with you” — Tai runs a named system check and speaks what passed, what failed, the likely cause, and one next step.
  • New /diagnostics page (quiet Settings entry): on-demand engine for version freshness, SW, mic/audio, realtime voice, STT, bridge, network, session, TV room heartbeat — plus Copy report for the cockpit.
  • Home surface untouched. Engine never runs at startup.
v0.786.159Location worksheet on Tai (Fato Daily buckets)Jul 25, 2026
  • New /modules/location-worksheet — today’s open items by where you do them (condo / out / waiting / later).
  • Owner-only; reads the live bridge report; Done / Later update today’s worksheet state.
  • Closes the morning-surface gap vs the retired Fato Daily location section.
v0.786.158Self-diagnosis — Tai checks herself out loudJul 25, 2026
  • Ask “run a self check”, “why isn’t voice working”, or “what’s wrong with you” — Tai runs a named system check and speaks what passed, what failed, the likely cause, and one next step.
  • New /diagnostics page (quiet Settings entry): on-demand engine for version freshness, SW, mic/audio, realtime voice, STT, bridge, network, session, TV room heartbeat — plus Copy report for the cockpit.
  • Home surface untouched. Engine never runs at startup.
v0.786.157changelog.ts is source of truth for version historyJul 25, 2026
  • CI version-bump check and CHANGELOG.md now treat projects/tai/lib/version/changelog.ts as the source of truth — package.json version must match the top changelog entry.
v0.786.156iOS voice + avatar wardrobe buttons workingJul 25, 2026
  • Fixed: wardrobe and hair buttons had no effect on iOS — FluidAvatar now receives and applies wardrobe/hair props through the TaiFluidBridge.
  • Fixed: voice activation on iOS — getUserMedia now fires from the real user gesture instead of a synthetic click, which iOS Safari blocks.
  • Fixed: speaker toggle visibility on iOS — gcx-soundtoggle no longer clipped by safe-area inset.
  • Avatar fills the full viewport on the home canvas.
v0.786.155Phone reclaims audio when the TV isn't liveJul 25, 2026
  • Fixed: the phone could sit ears-only and SILENT while the header still read "Tai is speaking" — Tony hit this live on his phone.
  • Cause: a host-supplied playbackOwner of "television" short-circuited the TV liveness poll entirely, so nothing ever re-checked whether a TV was still there. A stale lease or departed TV stranded the phone with no speaker.
  • An explicit non-local owner is now treated as a REQUEST, not proof: it is honoured only while the room poll still sees a live TV owning the mouth. Otherwise the phone reclaims audio automatically — no tap.
  • The liveness poll now runs for every owner, including host-supplied ones, so a departed TV is always detectable.
v0.786.154Fluid avatar is Tai's default faceJul 25, 2026
  • The v2.11 fluid avatar (multi-joint hair + triangle-affine grid warp) is now Tai's everyday face on /tai (home + canvas).
  • Tony directive: ship it as the default so he can watch it improve. Live2D plate crossfade is the automatic fallback if the fluid rig fails to init.
  • Error boundary + lazy import: canvas crash, image load failure, or missing WebGL falls back silently — Tony never sees a blank frame.
  • ResizeObserver auto-sizes the canvas to its container (phone viewport).
  • Tai only — TOMAI, NAI, MAI, ROXY unchanged. Wardrobe/hair pickers hidden (fluid is office-pose only at this stage).
v0.786.153Fluid avatar v2.10 — multi-scale strand fidelityJul 24, 2026
  • Multi-scale strand detect: dense short bangs + sparse long falls with quality NMS merge.
  • Power-kernel lock independence so nearest locks dominate warp (less sheet bleed).
  • Width-mass inertia (thin locks whip more) + curlBias rest S-curve from centerline bend.
  • Denser hair-local grid 30×18. Path A production surface unchanged. Tai Office only.
v0.786.152PIN unlock returns to Tai's character-art homeJul 24, 2026
  • Bare owner-PIN/password/passkey sign-in now returns to /tai, the canonical home with Tai's full character art.
  • Removed the stale post-auth fallback to legacy /home-v2, whose helmet graphic looked like an avatar regression.
  • Safe explicit deep links are still preserved; email confirmation now carries the same destination contract.
v0.786.151MODE A recovery — teardown/close reentrancy + auto-arm hardenJul 24, 2026
  • Teardown clears pc/dc refs before close so rebuild cannot double-fire reconnect from channel close.
  • attemptReconnect marks reconnecting before teardown; hot-swap fail reasons stay scoped locals.
  • MODE A auto-arm permission re-probe uses a generation ref so stale probes cannot race rerenders.
v0.786.150MODE A — disconnect-on-speak recovery + zero-tap re-armJul 24, 2026
  • Mid-session mic death hot-swaps capture (replaceTrack) instead of hanging up the WebRTC peer.
  • Capture blips keep session intent and schedule auto-reconnect — no more dead call after first real speech.
  • Exact built-in escalate fail-soft keeps the ideal track; data-channel close + transport health poll rebuild.
  • MODE A zero-tap re-arms after accidental drops; permission probe clears false 'tap to enable' walls.
v0.786.149Fluid avatar v2.11 — multi-model rembg cutout qualityJul 24, 2026
  • Free multi-model rembg fusion (u2net + human_seg + isnet-general-use) with soft-union fringe + solid core.
  • Guided color-edge alpha cleanup + wider despill/fringe recover — cleaner silhouette, more hair wisps.
  • Office layer PNGs only; strand centerlines left to v2.10. Path A production surface unchanged. Tai Office only.
v0.786.148Fluid avatar v2.10 — multi-scale strand fidelityJul 24, 2026
  • Multi-scale strand detect: dense short bangs + sparse long falls with quality NMS merge.
  • Power-kernel lock independence so nearest locks dominate warp (less sheet bleed).
  • Width-mass inertia (thin locks whip more) + curlBias rest S-curve from centerline bend.
  • Denser hair-local grid 30×18. Path A production surface unchanged. Tai Office only.
v0.786.147Owner-PIN unlock — verifyOtp timeout (no more infinite Unlocking…)Jul 24, 2026
  • Owner-PIN unlock no longer hangs forever: verifyOtp had no timeout — a Supabase GoTrue stall left the UI stuck on Unlocking… with no way out.
  • Bounded to 8s with a clear fallback error so password/Face ID remain reachable.
v0.786.146Fluid avatar v2.9 — collision envelope + zone travelJul 24, 2026
  • Collision envelope: face plane (bangs), lateral shoulders, body plane with soft restitution bounce.
  • Zone max-travel (bangs short / falls long) + elastic recovery; jaw/cheek secondary + headAngleY nod.
  • Occasional double-blink; demo surface /settings/fluid-avatar. Path A production unchanged. Tai Office only.
v0.786.145Fluid avatar v2.8 — cutout refine + width-profile strandsJul 24, 2026
  • Free cutout quality lever: edge despill + hair fringe recovery (rembg post-pass, no paid tools).
  • Width-profile multi-joint strands (per-joint half-width) + denser chains; thin locks stay local in warp.
  • Soft face/hair boundary + edge-aware hair gate on Office pack; denser hair-local grid.
  • Path A Live2dAvatar production surface unchanged. Tai Office only.
v0.786.144Fluid avatar v2.7 — triangle-affine mesh + hair zonesJul 24, 2026
  • True triangle-affine textured quads (drawMesh) replace crude strip skew — free-form free-tooling path.
  • Soft shoulder/body plane collision so long locks drape instead of sinking through the torso.
  • AI-only bang/side/fall zone stiffness + denser hair-local grid; denser face mesh for mouth/blink.
  • Path A Live2dAvatar production surface unchanged. Tai Office only.
v0.786.143SSR outage fix — never hang on Supabase schema cacheJul 24, 2026
  • Root layout fun-mode spine reads time out in 1.2s and degrade to clock-only (PostgREST schema-cache stall was hanging every dynamic page).
  • tai_app_mode queries abort after 1s; getAuthState times out at 2s so /today/login still paints.
  • Static assets were fine — this restores server-rendered pages when Supabase PostgREST is sick.
v0.786.142Fluid avatar v2.6 — shoulder plane + face gridJul 24, 2026
  • Soft shoulder/body plane keeps long hair from sinking through the torso.
  • Denser face grid for mouthOpen/blink mesh bands.
  • AI-only free tools — Path A Live2dAvatar production surface unchanged.
v0.786.141Deploy finish — longer static page budgetJul 24, 2026
  • Raise Next staticPageGenerationTimeout to 180s so production builds stop dying on concurrent /brain/voice · /epic · /privacy SSG.
  • Unblocks MODE A + avatar merges that were stuck live while main advanced.
v0.786.140Fluid avatar v2.5 — strand detect, hands, face meshJul 24, 2026
  • Hardened strand detection (min-sep fill, path NMS, lateral back bias, ridge COM).
  • Layer quality soft-punch + hair gate; unique multi-joint centerlines.
  • Hands layer wired; face mouthOpen + blink mesh warp.
  • Path A Live2dAvatar production surface unchanged.
v0.786.139Tony PIN unlock — stay signed inJul 24, 2026
  • Login opens on a 4-digit Tony PIN pad; correct PIN mints the same 400-day Supabase session as password/passkey.
  • PIN verified server-side against salted scrypt secrets (TONY_OWNER_PIN_HASH / _SALT) — never plaintext in source.
  • Family/email OTP and password paths unchanged; once unlocked, close/reopen does not re-prompt.
v0.786.137MODE A zombie health-poll debouncedJul 24, 2026
  • Mic health poll routes zombie-BT recovery through the 1.5s BT-loss debounce so a sticky HFP path cannot thrash getUserMedia every 2s.
  • Same recoverFromBluetoothInputLoss path as native route / devicechange recovery.
v0.786.136Fluid avatar v2.4 — multi-joint hair + grid warpJul 24, 2026
  • Multi-joint hair chains with progressive tip lag, soft distance constraints, neighbor coupling.
  • Grid mesh warp (20×10) with joint-aware sampling; soft torso sway on body layer.
  • Manifest centerline strands (12+12) drive physics; wind gust + strip/grid toggle on /settings/fluid-avatar.
  • AI-only free tools path — Path A Live2dAvatar production surface unchanged.
v0.786.135MODE A talk-loop — zombie BT health-poll + exact escalateJul 24, 2026
  • Continuous mic-health poll treats prefer-built-in + still-AirPods track as a zombie and re-arms mid-listen (not only after Tai speaks).
  • If ideal built-in deviceId still opens a Bluetooth-looking track, escalate once to exact deviceId.
  • Includes 0.786.134 post-assistant zombie re-arm gate.
v0.786.134MODE A talk-loop — zombie BT re-armJul 24, 2026
  • After Tai finishes speaking, if we already preferred the iPhone mic but the capture track still looks like AirPods/HFP, re-open built-in without hangup.
  • Fixes the live-looking silent Bluetooth track that defeats plain readyState checks between turns.
  • micNeedsTap is honored on the post-assistant re-arm gate (no automatic retry when a tap is required).
v0.786.133MODE A AirPods mic recoveryJul 24, 2026
  • When AirPods/HFP mic drops mid MODE A talk, re-arm getUserMedia and the talk loop without hanging up.
  • audioRouteRecovery listens for bluetoothInputLost / route-change signals and restarts capture cleanly.
  • Pairs with native shell preferBuiltInMicrophone on BT input loss.
v0.786.132Companion voice library + Settings switcherJul 24, 2026
  • Seven companion voices: Radiant (default), Midnight, Steel, Harbor, Spark, Atrium, Velvet — style descriptions only.
  • Settings → Voice picker default ON with grouped Preview + Select (44px targets).
  • Select still routes through existing cloud TTS preference path (voiceId → cloudTts).
v0.786.131DEV fluid avatar POC hostJul 24, 2026
  • New /dev/avatar-fluid embeds Anime2.5DRig with Tai Office layered PSD auto-load.
  • Production Path A Live2dAvatar is untouched; parallel fluid-motion proof only.
  • Local Mac: bash scripts/cubism/serve_anime25d_poc.sh → http://localhost:8791
v0.786.130Fluid mesh-warp + hair-spring avatar engine POCJul 24, 2026
  • Headless Anime2.5DRig auto-rig of Tai Office PSD → hair strands + anchors.
  • Pure TS engine: hair springs + mesh-strip warp (lib/avatar/fluid/*) with unit tests.
  • Demo surface: /settings/fluid-avatar — production Path A Live2dAvatar unchanged.
v0.786.129Sports desk — Grok primary + Claude fallbackJul 24, 2026
  • Public sports take + Cubs/Bears announce try xAI Grok first when XAI_API_KEY is set.
  • Automatic Claude/OpenAI brain fallback on Grok error; template take still the free floor.
  • Kill switch FEATURE_XAI_PRODUCT_ENABLED=0 or pin TAI_SPORTS_LLM_PROVIDER=anthropic.
v0.786.128Path A tier-2 expression/pose platesJul 24, 2026
  • Same-pose mouth set expansion: closed/wide/smile for office + dress; dress mouth_E/I/U.
  • Head-tilt, body-sway, surprised/curious expression plates; hand gestures (wave/chin/explain).
  • Catalog at public/avatar/live2d/tai/PLATES_TIER2.md — runtime wiring is a parallel lane.
  • Office mouth_E/I/U kept from 0.786.127 (already wired).
v0.786.127Path A mouth E/I/U + smooth state mixesJul 24, 2026
  • Phase 2: office blonde mouth_E / mouth_I / mouth_U plates + shape→plate mapping with A/O fallback.
  • Phase 3: smooth listen/think plate crossfades (~180ms) and slightly richer speaking breath.
  • Tai only — Phase 1 expression plates already in 0.786.126.
v0.786.126Tai-only Phase 1 — Path A expression platesJul 24, 2026
  • Polished listening (closed-mouth attentive), thinking, and true rounded mouth_O plates.
  • Covers Office + Dress × Blonde + Brunette — Tai only; no other characters.
  • Path A production lock: amplitude lip-sync + blink + state plates on Home/Talk.
v0.786.125Blonde / Brunette hair pickerJul 24, 2026
  • Hair color control under the avatar on Home and Talk (next to Office/Dress).
  • Also Settings → Display → Hair color (Blonde / Brunette).
  • Same face + wardrobe; brunette uses /avatar/live2d/tai-brunette plates and /avatar/brunette fallbacks.
  • Persists in localStorage (tai-avatar-hair); instant, no reload.
v0.786.124Path A office + dress same-pose platesJul 24, 2026
  • Tai office and dress wardrobes use same-pose full-frame plates for mouth A/O, listening, and thinking (identity-cleared Path A — not Cubism).
  • Rig: listening head-tilt bias, stronger speak sway, thinking half-lid; amplitude bus unchanged. Shape-driven A/O lip when plates present.
v0.786.123Grok sports announcer boothJul 24, 2026
  • New /sports-announcer booth: live MLB feed + Grok play-by-play + Grok TTS + mid-broadcast Q&A, isolated from Tai personal brain.
  • Reached via "pull up the sports" / Sports → Grok booth; persona registry ready for a dedicated announcer character later.
v0.786.122Tai knows what Tai can doJul 24, 2026
  • The model and the visible canvas had separate capability maps. A deterministic client matcher could raise a live module before the model turn, but that event never entered model context — so the module worked while the answer denied it existed.
  • Every live canvas summon now has an exhaustive model-facing declaration, and the exact module raised this turn is injected into the conversation context. The contract covers the verified contact directory, inline video, flag-filtered All of Tai surfaces, and registry-derived actions.
  • Future drift fails structurally: a new canvas summon cannot typecheck without a capability declaration, and the self-description path includes the same live surfaces.
v0.786.121Life-insurance reminder cannot disappear on a stale paid cycleJul 24, 2026
  • Transamerica life insurance now surfaces in Needs You when its paid record is stale: the recorded premium stays visible with a direct mark-paid confirmation instead of being silently filtered out.
  • Tai says the recorded due date is stale and asks for verification rather than inventing a new due date; voice answers for 'did I pay my life insurance' and 'what do I owe this week' carry the same warning.
  • A successful confirmation writes the current-cycle payment journal before the card clears. Failed writes keep the card visible and say the change did not land.
v0.786.120No auto Face ID on loginJul 24, 2026
  • Login no longer auto-enrolls Face ID after password/code sign-in and no longer auto-triggers passkey on Capacitor open.
  • Face ID remains opt-in: Settings → Face ID card to enroll; Sign in with Face ID button only when tapped.
v0.786.119Money Accounts — Reconnect bank when Plaid needs re-authJul 24, 2026
  • Money → Accounts shows Reconnect [Bank] when a linked item needs re-auth or re-consent (ITEM_LOGIN_REQUIRED / ADDITIONAL_CONSENT_REQUIRED).
  • Hosted Link update mode preserves the existing bank item while Tony re-logs or grants product consent on secure.plaid.com.
v0.786.118Calm phone remote — Connected onlyJul 24, 2026
  • TV mic bridge (quietBridge) shows Connected / Ready instead of TV MIC BRIDGE and Input/Output route chips.
  • MODE A label remains TV speakers (0.786.117).
v0.786.117MODE A output label is TV speakers onlyJul 24, 2026
  • Phone device summary for television-owned playback now says TV speakers — never Apple TV / TV-connected AirPods (MODE B only).
  • roomVoiceMode prefers phone-mic intent over stale bluetoothHeadset output so ambient auto-arm stays MODE A.
v0.786.116App icon brunette + family-style full-bleedJul 24, 2026
  • Home-screen / PWA / favicon icons are dark-espresso brunette (was blonde).
  • Soft warm-beige full-bleed tiles — no black letterbox bars; family weight with NAENAI/MAI/ROXY.
  • Cache-bust .v7 icon URLs. In-app Office/Dress presence photos still exact Tony uploads.
v0.786.115Avatar tier-3 Live2D-style — blink + lip-syncJul 24, 2026
  • Tai avatar now blinks on a natural ~4s cycle and lips-syncs to live amplitude (not just on/off speaking).
  • Same-frame talk mouths + eyes-closed blink layers; breath/sway transform-only.
  • Live2D-style layered runtime (no proprietary Cubism Core) — rig math unit-tested.
v0.786.114Avatar tier-2 perfect — same-frame talk mouthsJul 24, 2026
  • Speaking no longer jumps full-body → headshot: Office and Dress use same-frame mouth-open talk layers.
  • Triple-stack opacity (rest + talk0 + talk1 always mounted) + preload so expression swaps never flash or remount.
  • Office now dual-talk alternates like Dress (~180ms). prefers-reduced-motion holds a single open mouth.
v0.786.113Natural auto-greet — Hello Tony, how's it going?Jul 24, 2026
  • Presence + pure-hello replies use natural opens: “Hello Tony, how's it going?” and “What can I help you with?” (daypart-aware).
  • Dead UX gone — never “Hi Tai, are you there?”; never addresses the app name as the listener.
  • Hands-free MODE A (phone mic → TV speakers) and avatar-first home unchanged; greets arm with the live voice session.
v0.786.112MODE A zero-tap — Open phone to talkJul 24, 2026
  • Phone mic no longer sticks on “Restoring microphone…” — automatic arm has hard timeouts on getUserMedia, canvas suspend, and the full connect handshake, then retries.
  • Phone TV remote is calm: “Open phone to talk” + auto-arm. MODE B / PRIVATE / pair text and D-pad live under Settings → Advanced TV remote.
  • Apple TV home shows “Hello Tony · Open phone to talk” + avatar only; QR and mode explainers are advanced-only. Same-account room deep-links include auto=1.
v0.786.111Honest pause when the AI provider is out of creditsJul 24, 2026
  • When Anthropic returns “credit balance too low” or OpenAI hits insufficient_quota/billing, Ask shows a calm funding state — not a cryptic error or fake answer.
  • Realtime voice says “voice paused (provider quota)” and points to text chat; vision/OCR uses the same honest pause copy.
  • Navigation, data views, and the avatar stay fully usable while thinking is paused.
v0.786.110Phone voice works alone — no TV requiredJul 23, 2026
  • Home Realtime Talk stays phone mic → Tai → phone speaker even when no TV is present; sticky TV room intent no longer hijacks solo voice into a dead ears-only bridge.
  • TV auto-join is secondary: only engages with fresh TV presence, clears pairing when the TV lease expires, and never paints “no fresh TV presence” over home.
  • Bottom rail is mic + keyboard only — Partner / Model / Looking-with-you chrome removed from the live surface (those live in Settings).
v0.786.109Home is just her — shortcuts on demandJul 23, 2026
  • REPORTS / MONEY / LEGAL / TEXTS / ALL TAI no longer float over her face — one Shortcuts control opens a dismissible sheet.
  • Monogram module dock is in that sheet too; default home is her + voice state + suggestions, unobstructed.
  • Flag / History are icon-only top-left; TV auto-join banner sits above the travel rail so nothing collides with “I’m listening.”
v0.786.108Avatar talks — expression swap on voice (tier 2)Jul 23, 2026
  • When Tai is speaking, her face swaps to a mouth-open talk headshot (Office + Dress); idle/listening/thinking stay on the resting photo.
  • Dress mode alternates two talk frames ~200ms while audio plays; ~120ms cross-fade between resting and talking so it isn’t a hard cut.
  • Tier 2 only — expression by voice state. Tier 3 (Live2D blink/lip-sync) needs layered art and is out of scope. Face art still unaltered.
v0.786.107Tai is Tony's anime partner — exact photosJul 23, 2026
  • Home + presence avatar is Tony's uploaded anime blonde full-body photos — face unaltered (crop/scale only).
  • Office (default, office_front1) ⇄ Dress (dress_side) wardrobe toggle — same modes as Apple TV.
  • App / PWA icons use a head-and-shoulders crop from office_front1 (opaque square). No regenerate/repaint of her face.
v0.786.106Phone auto-arms as TV mic — zero connect tapJul 23, 2026
  • Same-account TV presence seeds MODE A ownership immediately and auto-starts the Realtime mic bridge — no “Talk to the room” / Use this phone connect step.
  • Recoverable arm failures surface the real reason and retry (up to 5); iOS mic permission still uses honest Enable mic; End remains a manual override.
  • Builds on screen-lock survival: auto-arm keeps the room lease + call-grade session so background/lock does not reintroduce a connect wall.
v0.786.105Phone mic stays live when the screen locksJul 23, 2026
  • MODE A (phone as TV microphone) no longer tears down on screen lock or app background — room presence heartbeat keeps stamping, and transient reconnect no longer demounts the mic.
  • Call-grade play-and-record + silent keepalive re-assert on hide; if iOS still suspends the stream, unlock auto-reconnects with an honest one-liner (never silent death).
  • TV remote copy states the lock-surviving path; last-known TV speaker ownership is kept through poll blips so Talk-to-the-room stays armed.
v0.786.104Hue auto-connects; voice lights work without the buttonJul 23, 2026
  • When a Hue application key is already saved, Tai reconnects to that bridge automatically — local LAN or Hue Remote — and never asks for the physical link button.
  • Voice can turn lights on/off, dim, warm/cool, set color, and activate scenes through lighting_control (kill switch TAI_LIGHTING_CONTROL; default on without raising every other T1 tool).
  • Unreachable bridges stay paired: Tai says the network/reachability truth instead of falling into first-setup “press the button” UX reserved only for genuine first-ever pairing.
v0.786.103Same-account phone and TV form the room themselvesJul 23, 2026
  • Opening Tai on iPhone discovers a signed-in TaiTV heartbeat, joins the exact account room, and attempts to arm MODE A without a room card or QR scan.
  • TV presence is a 15-second lease with room identity and speaker/private capabilities; missing or voided rooms are minted again silently by the state endpoint.
  • Fresh TV speakers select MODE A, fresh PRIVATE output selects coherent MODE B, and the phone shows a one-line mode chip instead of output-switch instructions.
  • Failures name the actual boundary: no fresh TV presence, sign-in, network, browser storage, room mint, microphone permission, or Realtime session mint.
v0.786.102Phone-to-TV audio ownership gets a real release gateJul 23, 2026
  • A deterministic two-client harness proves MODE A produces one TV playback and zero phone playback, while MODE B produces the exact inverse.
  • TV playback ownership and room-speaker readiness now share the native 120-second heartbeat plus an explicit 15-second late-heartbeat grace boundary.
  • Two isolated E2E browser sessions join one deployed room; the post-deploy gate requires fresh TV state to make the phone remote ready, then proves a stale claim releases ownership.
v0.786.101iPhone mic bridge holds for Apple TV ambient talkJul 23, 2026
  • Talk to the room no longer drops when the TV ownership report falls out of the hot conversation page — soft-cache + 135s freshness match the native 120s heartbeat.
  • Phone remote copy states the real path: AirPods on the iPhone mic, Tai answers on the TV avatar and speakers.
  • MODE A keeps the phone ears-only while the TV owns reply audio; MODE B (local owner) plays on phone/AirPods.
v0.786.100iPhone microphone bridge advertised to Apple TVJul 23, 2026
  • Tai's public Apple TV bootstrap now returns the canonical phoneRemoteURL, matching TOMAI and NAENAI so the native app can discover the iPhone microphone surface.
  • The living-room QR and bootstrap share one pairing URL builder; a scan opens the exact conversation with remote=1, where iPhone/AirPods capture runs ears-only and Tai replies on the TV.
  • The pairing contract is covered for the production origin, exact room identifier, and empty-room rejection.
v0.786.99Avatar viseme lip-sync — distinct mouth shapes per soundJul 23, 2026
  • When Tai speaks, her mouth uses real viseme/phoneme shapes (AA, EE, OO, FV, MBP, L, TH, WW…) — not just open/closed amplitude.
  • Amplitude from premium TTS and Realtime still drives the open/close envelope; text→viseme estimate and an explicit viseme prop are available when wired; procedural multi-shape is the default without text.
  • Amplitude-only open/close remains the fallback (listening/thinking, or amplitudeOnly); idle smile and reduce-motion pulse unchanged.
v0.786.98Flag-gated Opus image descriptionsJul 23, 2026
  • When TAI_VISION_DESCRIBE=1, Tai's canvas offers a one-shot image picker and returns a real Claude Opus description with an optional prompt.
  • The route accepts base64 or a data URL, keeps pixels request-scoped, and remains owner-gated with a daily cap.
  • The feature stays OFF by default; with the flag off, the canvas action is absent and POST performs no model call.
v0.786.97Avatar amplitude lip-sync — mouth tracks real voice outputJul 23, 2026
  • When Tai speaks, her mouth opens and closes with live audio amplitude from premium TTS and OpenAI Realtime remote playback — not a canned loop.
  • Fallback synthetic envelope only when speaking but audio is not yet audible (first chunk / silent gap); idle, listening, and thinking states unchanged.
  • prefers-reduced-motion keeps a gentle readable pulse; live amplitude still wins when the analyser reports signal.
v0.786.96Mega-wave blockers: voice defer ceiling, /today filter, honest court age, icon truthJul 23, 2026
  • Shell auto-update can no longer stay deferred forever after a dropped call — 15-minute ceiling (and 90s non-live reconnect) so the phone does not silently stay stale.
  • Home /today brief keeps Heads-up-owned court/deadline rows off the front door when re-reading the durable brain snapshot.
  • Court last-verified age over 14 days is stale / needs a manual check — never a fabricated feeder ERROR.
  • Honest about app icon: web/PWA favicon is the avatar face; native iOS icon ships from t-bone/pwa/ios (separate PR).
v0.786.95Mega-wave: court age, one brief, cockpit visual, talk-safe updates, spend AnthropicJul 23, 2026
  • Court last-verified age is always visible in inbox health / Dispatch / Legal — weekly 7-day ladder, never a silent 21-day green light.
  • Home and Brain re-read the same synthesized morning brief from the durable brain snapshot; cron and /brain share one composer.
  • Cockpit visual: live-call Coral + speak Radiant/Matilda, app icon from TaiAvatar face, modest redder lip/cheek tokens. Full gpt-realtime-2.1 model unchanged.
  • Shell auto-update still lands promptly but never hard-reloads mid-Realtime talk — queues and applies when talk ends.
  • Spend tracker: Anthropic Admin Cost Report + per-provider daily totals (MEASURED when ANTHROPIC_ADMIN_KEY is set).
  • Brain model eval harness + raw Claude vs GPT evidence (synthetic fixtures only).
v0.786.94ONE-BRAIN Phase 5 feeder + legal reports from spineJul 23, 2026
  • Continuous master feeder (cloud:tai-feeder-loop) no longer dies on court stubs missing precedence or disability deadlines set to TBD.
  • Legal/Court reports read tai_court_cases + tai_disability_claims (the brain) instead of local data/*.json side files.
v0.786.93Voice on the full Realtime modelJul 23, 2026
  • Live voice now runs on the full gpt-realtime-2.1 model instead of the mini distill — better transcription, more natural turn-taking, fewer interruptions.
v0.786.92Ruby red lipsJul 23, 2026
  • Avatar lip color token set to a clear ruby red so the face reads warmer on home and presence.
v0.786.91No Face ID nag on every openJul 23, 2026
  • Removed the root-mounted Face ID enrollment prompt that reappeared on every app open and could interrupt a live voice session.
  • Face ID enrollment stays available in Settings; passkey/Face ID login is unchanged.
v0.786.90Desktop module workstationsJul 23, 2026
  • Calendar, Brain, Legal, Health, Documents, and Command Center now use real desktop layouts at ≥1024px — side-by-side day plans, dense case tables, sticky context rails.
  • Phone layouts stay single-column; every desktop change is viewport-gated. Home canvas untouched (sibling worker).
v0.786.88iPhone shell never silently stays behindJul 23, 2026
  • Every launch and every return to the app checks live version.json (cache-busted, never SW-cached) and hard-applies a newer deploy without a Force Refresh ritual.
  • If this device is still behind, the version chip says STALE · live vX and a non-dismissible banner shows running vs live — never a quiet old number.
  • Deploy claims must separate SERVER version from DEVICE-DELIVERED; curl alone is not proof his phone updated.
v0.786.87Tai knows her own build — from ground truthJul 23, 2026
  • Ask "what version are you", "what's the latest build", "what shipped today", or "are you up to date" — she answers from version.json + the changelog, never model memory.
  • Web version and iPhone shell app build stay distinct; if your web bundle is behind live, she says Force Refresh.
v0.786.86Portable production origin for the Fly cutoverJul 23, 2026
  • Tai now derives canonical links, redirects, auth returns, reports, and failover probes from one provider-neutral production origin.
  • The Fly workflow builds and runs against the same configured site URL, and its Vercel custody audit is explicitly read-only.
v0.786.85Wide home — her and the work share the screenJul 23, 2026
  • On tablet and desktop, home is no longer a stretched phone column — the room uses the real width.
  • When a module or answer is up on a wide screen, she stays a real presence on the left and content sits beside her (phone pure-presence layout is unchanged).
v0.786.84Home is pure presence — just her, bigJul 23, 2026
  • Home at rest is her face, large and lit — speech no longer paints as text on the resting surface.
  • Spoken words stay behind a Words control (off by default). Talk, Realtime, Call Me, and STENO still work; action cards still pull up when a turn needs a tap.
v0.786.83Tai has a face on homeJul 23, 2026
  • Her avatar now renders on the home screen where the gold orb was — the same face already used on presence.
  • She blinks, breathes, and her mouth moves from the same listening/thinking/speaking state the orb used.
v0.786.82Fly builder OOM — cap heap under the container limitJul 23, 2026
  • NODE_OPTIONS max-old-space-size 4096 → 3072 so parent+worker cannot authorize ~8GB on a smaller Fly/Depot builder (SIGKILL was cgroup OOM, not V8 heap).
  • Build step prints nproc / MemTotal / cgroup memory.max before npm run build and cgroup memory.peak after — success and failure — so the next OOM leaves numbers.
v0.786.81Talk to the room — iPhone microphone, TV-speaker answersJul 22, 2026
  • A clearly labeled Talk to the room control reuses Tai’s live iPhone microphone while Apple TV remains the only reply-audio owner.
  • TV asleep/offline, phone offline, ended-room, and PRIVATE states stop the bridge honestly; room mode never falls back to phone playback.
  • Speaking over Tai sends the existing stop-speaking room command so Apple TV playback cuts off for barge-in.
v0.786.80Beautiful avatar — glossy hair, red lips, blue eyesJul 22, 2026
  • Tai's face: glossy rim-lit black hair, red lips, blue eyes, and a clearly feminine figure.
  • New hair rim/shine tokens so the hair reads as hair instead of a flat shape.
v0.786.79Realtime voice waits for truth — Standard names the reasonJul 22, 2026
  • The home Talk control waits for the Realtime probe instead of racing a fast first tap into the turn-based relay.
  • When Realtime is unavailable, the home surface says Standard voice, shows flag-off/no-key/probe-failed, and explains the speak-pause-reply behavior.
  • Questions such as ‘Are you live?’ are answered from client transport state, so the text brain cannot claim Realtime without an open data channel.
v0.786.78Beyond Option A — just talk is obvious; no dead home controlsJul 22, 2026
  • Home audit beyond Option A: just-talk path is obvious and dead controls are removed or fixed.
  • Summon and door tests lock the remaining home surface so a dead button cannot land silently.
v0.786.77Fable opt-in brain model — rail + SettingsJul 22, 2026
  • Fable is an explicit opt-in on the model rail and in Settings — never a silent Auto surprise.
  • Selection + routing tests cover Fable as a first-class brain choice next to Auto/Opus/Sonnet.
v0.786.76Vision multimodal scope + describe stubJul 22, 2026
  • Scoped multimodal vision path with a describe API stub and docs for what is in scope vs not.
  • Feature flags and daily cap hooks so vision usage stays honest and bounded.
v0.786.75iPhone build lockfile resync — npm ci works on macOS againJul 22, 2026
  • Resynced package-lock.json so macOS ios-ship npm ci installs cleanly without lockfile drift.
v0.786.74Home buttons re-checked — every dock door goes where it shouldJul 22, 2026
  • Full post-Option-A home audit: every primary monogram (Reports, Money, Texts, Health, Dining, Today, Legal, Cubs), overflow More, Gracie, and baseboard All of Tai live-verified against local canvas — correct routes, no self-loops.
  • Browser e2e re-locked to Option A (Shortcuts dock label, 8 primary doors + overflow). T's Room stays a real /feed page behind More — not a dead button.
v0.786.73Lights, tested end to endJul 22, 2026
  • Every lights control — on, off, dimming, scenes, rooms, and asking by voice — now has automated tests behind it, including honest errors when the bridge is unreachable.
v0.786.72What's-new self-test probesJul 22, 2026
  • Changelog entries can declare self-test probes (route_200, flag_on, element_present) so headline claims get nightly honesty checks.
  • Probe runner is pure-injectable for unit tests; fail-closed on network or missing base URL.
v0.786.71Cockpit Log — what did we doJul 22, 2026
  • Cockpit Log at /modules/cockpit-log groups recent_changes digests and worker reports by day so you can ask what we did yesterday.
  • Legacy /modules/cockpit redirects to the new path. Honest empty states when a day has nothing on file.
v0.786.70Video upload V1 — digest once, ask about itJul 22, 2026
  • Upload a video once; Tai digests it and you can ask about what is in it.
  • STT prefers Deepgram, then OpenAI, then ElevenLabs when configured.
v0.786.69Auto stays on Anthropic — no surprise OpenAIJul 22, 2026
  • Auto and manual Opus/Fable/Sonnet now fail over to another Claude model, not OpenAI — so the rail no longer reports OpenAI after a blip as if Auto had chosen it.
  • Selector still offers exactly Auto / Opus / Fable / Sonnet (Sonnet kept). Auto detail copy says Anthropic-by-surface.
  • Documented the full Auto decision path in lib/brain/AUTO_ROUTING.md.
v0.786.68I'm here — honest presence greeting when voice is liveJul 22, 2026
  • When Realtime voice actually connects and the brain answers a health ping, Tai speaks a short varied greeting so you know she is there — not just a painted page.
  • Time-of-day pool with no-repeat rotation; quick re-foreground uses a whisper cue; Settings Display toggles the spoken greeting (default ON).
  • Muted sessions still get a visual Here cue. Rebuilds mid-call do not re-announce.
v0.786.67Tai speaks your languageJul 22, 2026
  • Talk to Tai in Spanish (or most languages) and she answers in the same language — and stays there until you switch.
  • Say 'speak English' or 'habla espanol' anytime; there is also a language preference in Settings (default: automatic).
v0.786.66Spend tracker v2 — live minutes, Fly table, deeper inventoryJul 22, 2026
  • Settings → Spend now shows GitHub Actions runs (MEASURED) and wall-clock minutes (ESTIMATE) per workflow per day, plus a refreshed Fly machine cost table with ESTIMATE always-on dollars — never invoices.
  • Route inventory deepens with per-provider call-site tallies (MEASURED). Day-over-day burn spikes still land in the feed Tai already surfaces.
v0.786.65Tai's look — black hair, very feminineJul 22, 2026
  • Avatar restyle: true black hair with fuller volume, softer jaw, lashes, and fuller lips — same D2 stylized warmth and gold/cave-glass halo. Idle, listen, think, and talk all share the refined skin.
  • Voice and presence state wiring unchanged; this is art only. Settings Avatar ↔ Orb still works instantly.
v0.786.64Tai has a face — say helloJul 22, 2026
  • Home presence now shows Tai as a warm stylized partner face (Avatar) by default — blinks, breath, listen lean, and a talking mouth driven by voice state. Not a photo of anyone; pure local SVG, no network assets.
  • Settings → Display → Presence face switches Avatar ↔ classic glass Orb instantly. Voice audio paths are untouched; the face only consumes idle/listening/thinking/speaking + mic level.
v0.786.63Orders & deliveries from your shipping emailsJul 22, 2026
  • Amazon, Chewy, UPS, and other order/shipping confirmations parse from Gmail into an orders ledger (tai_orders) with status ordered → shipped → delivered and ETA when the email states one.
  • The /orders list shows merchant, item summary, status, and ETA on glass cards. Ask out loud for packages via the new orders_list read tool.
  • Offline demos use synthetic fixtures only — no real order content in the repo.
v0.786.62Shortcuts tuck under the room — voice runs the homeJul 22, 2026
  • The two rows of large monogram circles on home are now one quiet micro-row of small muted dots just above the presence bar — always there, never the product.
  • Talk to Tai, Call me, Steno, the suggestion card, and Ask stay exactly as prominent as before. Same destinations when you tap a shortcut.
v0.786.61Image Creator — metered AI illustrations, save to LibraryJul 22, 2026
  • New Image Creator at /images/create (flag TAI_IMAGES on by default): describe a scene, pick a size, tap Create. Uses OpenAI gpt-image-1 via the existing OPENAI_API_KEY path; ~4¢ per square medium image (list-price estimate).
  • Hard daily cap (default 40, TAI_IMAGES_DAILY_CAP) with an honest limit-reached state; each image logs to the spend tracker (tai_api_usage feature=images).
  • Voice/ask handoff: “make me an image of the Silk Road” opens the creator with the prompt prefilled — generation still needs your tap. Family-appropriate by default; no private likenesses.
v0.786.60Spend tracker shows seats, app call sites, and GitHub wasteJul 22, 2026
  • Settings → Spend (owner-only) now follows Tony's four-part model: already-paid seats with tank levels, app API route inventory plus estimate prices, infrastructure with GitHub workflow-run waste and Fly estimates, and honest UNVERIFIED gaps.
  • Day-over-day burn spikes over 2× land in the feed Tai already surfaces — no new alert channel.
v0.786.59Dispatch reads the same morning brief as TaiJul 22, 2026
  • Tai now saves the exact "What you should know" lede (composeBrief) into a spine snapshot each time the Brain page or the 30-minute brain-snapshot cron composes it.
  • Dispatch and the Mac brain_state.py reader pull that lede from a service-secret /api/brain/snapshot door, so the orchestrator and the app reason off one shared brief instead of two divergent headlines.
v0.786.58Master data feed runs in the cloud every 15 minutesJul 22, 2026
  • Bills, court, meds, calendar, people, focus, legal, and symptoms now refresh on a continuous cloud feeder loop instead of a Mac launchd job — same sources, no new desktop scheduler.
  • Gmail-heavy domains stay on the six-hour full pass; Mac-only residues (Messages, documents, calls) remain on the Mac path and are skipped honestly in cloud mode.
v0.786.57Face ID works on every Tai address, not just one hostJul 22, 2026
  • Passkey ceremonies now take their rpId and origin from the page you are actually on (heytai.app, tai-web.fly.dev, usetai.app, localhost), with an optional WEBAUTHN_ALLOWED_HOSTS allowlist merge — same host-derived pattern as TOMAI.
  • If no Face ID is bound to the current web address, login stops the spinner and shows a plain-language note so you can sign in with email/password and re-enroll, instead of hanging on Waiting for Face ID.
v0.786.56Court e-filing email + honest docket stalenessJul 22, 2026
  • Court continuity no longer pretends the retired DuPage portal scraper is alive. Gmail e-filing / eFileIL notices parse into court cases with source efiling-email and honest observed_at — synthetic fixtures only in the repo.
  • Inbox health shows the last real portal/assisted live-check age as "stale as of <date>" instead of going green after any e-filing notice. Portal scrape alarms are retired; the replacement is the cloud e-filing parse job.
v0.786.55More of your life is speech-doableJul 22, 2026
  • Ask out loud about cards, balances, subscriptions, spending, income, debt cases, cash forecast, broken bank links, alerts, the weekly recap, family roster, legal inbox, disability tracks, and health document inventory — Tai now has dedicated read tools that hit the same data those screens use.
  • No new write tools in this wave; mark-paid, refills, and messaging stay on the existing confirm / voiceWrite paths.
v0.786.54The capability index stops overselling dark featuresJul 22, 2026
  • All of Tai now resolves each feature against its real flag and maturity: gated-off pages no longer claim live, Daily Brief says ask-by-voice when the page is dark, and Tickets is marked coming soon on the index and the page.
  • Dining and Sports subtitles match what actually works today — reviews and live boards stay; table booking and the team picker no longer sound finished.
v0.786.53Buttons and links are easier to hit on a phoneJul 22, 2026
  • The travel dock, version chip, feedback and history buttons, login alternate links, and back crumbs now all meet the 44px phone tap target — high-contrast mode still goes to 48px.
  • Type sizes and glass styling from the recent polish waves are unchanged; only the hit area grew.
v0.786.52Daily briefs preserve the names in your recordsJul 22, 2026
  • The daily brief's grounded spoken script now reaches the conversation unchanged, so a reasoning pass cannot shorten or rename a bill, appointment, or case after it was read from your records.
  • The exact script still passes through Tai's normal fabrication, provider-name, and steering-leak safety gates.
v0.786.51OpenAI failover works with Tai's tools againJul 22, 2026
  • OpenAI accepted simple health checks but rejected tool-enabled fallback turns because that endpoint does not accept the requested reasoning-effort posture alongside functions. Tool rounds now use its supported posture while keeping the complete catalog.
  • Tool-free OpenAI reasoning calls retain their requested effort, and Anthropic behavior is unchanged.
v0.786.50Tai's reasoning providers can accept the full tool catalog againJul 22, 2026
  • A refined Gracie medication action was accidentally serialized as a string instead of an object, so both reasoning providers rejected every conversation before answering. Refined tool schemas now preserve their real object fields.
  • The model catalog now has a regression gate requiring every tool to expose provider-valid object parameters; the confirmation and gateway validation rules are unchanged.
v0.786.49The little shortcut buttons look like they belongJul 22, 2026
  • Every quick-action chip and shortcut button — on the canvas, the home rows, Today, and the capability index — now shares one polished glass style with proper size and press feel.
  • Same buttons, same actions — they just stopped being ugly.
v0.786.48Navigation stays healthy after the speed-upJul 22, 2026
  • Today's middleware slim-down accidentally unplugged a piece Next.js itself needs, which could break every page change — caught by the battery within the hour and fixed.
  • Navigation keeps the new lighter footprint, now with the tracer wired correctly.
v0.786.47Empty screens, loading screens, and lists match the canvas lookJul 22, 2026
  • The shared building blocks every module uses — empty states, loading skeletons, error pages, list rows — now carry the same glass look as the main Tai canvas.
  • A dozen more modules got proper loading screens instead of a blank flash.
  • Styling only — nothing about what any screen does changed.
v0.786.46Every page changes hands fasterJul 22, 2026
  • The gatekeeper that runs on every single navigation went from heavyweight to featherweight — moving between modules costs less on every tap.
  • Sign-in checks, redirects, and door rules are unchanged — same security, less baggage.
v0.786.45Charts and crash reporting stay off the cold openJul 22, 2026
  • Opening Tai no longer downloads chart libraries or the full crash-reporting kit up front — those load only when a turn needs a chart or after the screen is already up.
  • A post-build check fails the release if chart or 3D game code sneaks back into the main Tai screen's first load.
  • Games on /game still get their 3D engine when you open them; conversation and voice are unchanged.
v0.786.44Comms loads the last 100 messages, not the whole threadJul 22, 2026
  • Opening /comms (and the channel API poll) now reads at most the newest 100 messages, with attachments only for that page.
  • Older history is one tap away via Load earlier messages; poll keeps scrollback already loaded and pauses while the tab is hidden.
v0.786.43Root chrome loads the fun extras after the shell paintsJul 22, 2026
  • Visual Fun Mode, holiday takeover, voice flight recorder, quick feedback, and conversation history no longer ride in the permanent root layout graph — they load after idle once the shell has painted.
  • Nav, session keep-alive, PWA init, accessibility text size, and the voice tree stay first-paint critical so nothing looks missing on open.
  • Fun Mode in Settings still works; it owns a local provider that stays in sync with the deferred shell.
v0.786.42Legal war rooms stop hauling the full document indexJul 22, 2026
  • War-room document reads now pre-filter by each matter's real docHints and hard-cap at 200 metadata rows (was an unfiltered 800).
  • Legal landing, workbench, command center, and matter rooms keep the same openable papers — character statements and other non-generic legal names still match.
  • Query-budget unit tests pin the ≤200 limit, the OR pre-filter, and fixture matching quality for active matters.
v0.786.41Tai can change reasoning providers when one is downJul 22, 2026
  • Every automatic reasoning lane again has two distinct providers, so an outage before answer text begins can fail over instead of ending the turn.
  • Conversation, voice, deep-reasoning, summary, and utility work keep their task-sized Anthropic defaults and use the matching OpenAI tier as the fallback.
  • This removes the temporary Opus-only emergency pin that had turned primary and fallback into the same single attempt.
v0.786.40Tai opens noticeably faster on the phoneJul 22, 2026
  • The main Tai screen ships less than half the code it used to on first load — charts, games, and canvas extras now arrive only when a conversation actually needs them.
  • Nothing about answers, voice, or the canvas changed — the same features simply load on demand instead of up front.
v0.786.39GI log confirm card mints without waiting on the modelJul 22, 2026
  • A clear 'log a GI symptom…' create now proposes through the Action Gateway in code before the first model round — the populated T2 card still requires Tony's exact tap.
  • Closes the residual e2e-prod miss where a provider blip ('trouble right now') wiped the turn after the catalog-visibility fix (0.786.34).
  • Shared symptomLogWrite detector keeps intentRouter steer and the code path in lockstep; reads like 'symptom trend' stay on ask_spine.
v0.786.38Enabled-flag regression locks agree with productionJul 22, 2026
  • The enabled-flag tests now construct complete typed environments, so the production-default regression lock passes strict typecheck.
  • The broad agentic flag's explicit zero remains the tested kill switch; an absent flag retains the baked production default restored in 0.786.34.
  • The confirm-card comment no longer resembles a hex literal to the zero-literal lint gate.
  • The browser-owned hidden-tab polling interval uses its DOM timer id type, keeping the 0.786.37 pause/resume behavior strict-typecheck clean.
v0.786.37Version polling pauses in hidden tabsJul 22, 2026
  • PwaInit stops its version polling interval while the document is hidden and resumes when the tab becomes visible.
  • The visibility listener is cleaned up with the interval so background tabs no longer spend requests checking for a release.
v0.786.36Cloud-doc feeder tolerates a few bad documents per batchJul 22, 2026
  • OCR/embed/ingest batch jobs no longer fail the whole Actions run when one or two Storage objects are corrupt or missing.
  • After three document-level failures the batch still fails loud so sustained pipeline breakage opens an alarm.
v0.786.35Trust probes reach fail-closed authJul 22, 2026
  • Exact middleware allowlist for the voice e2e probe, public weather chip, and presence suggestions — exact-match only, so sibling owner-data routes stay session-gated.
  • The suggestions headless door is scoped to the isolated E2E tester tenant; a signed-in account now reads only its own personalization trends, never a fixed owner id.
  • Dispatch bridge and shared game leaderboard doors are unchanged.
v0.786.34GI log confirm card is model-visible againJul 22, 2026
  • Root cause of e2e-prod confirm-card miss: dynamic process.env[enabledFlag] missed next.config's baked TAI_ACTIONS_AGENTIC=1, so symptom_log_add was hidden from the model catalog and no proposal card minted.
  • enabledFlagAllows() applies the same defaults as next.config for agentic/reservations flags; solo-confirm + T2 tap gate unchanged — nothing writes without Tony's exact card tap.
  • Canvas answer strip again renders ConfirmActionCard/ActionReviewCard for proposals (travel layer still does too). Unit + e2e pin populated card + no execute without tap.
v0.786.33Profile facts table lands on live SupabaseJul 22, 2026
  • Re-issue mig 0031 (tai_profile_facts + tai_profile_events) as 0146 so the live 0054→latest apply chain creates the owner-authored profile spine that 0031 never reached.
  • Idempotent + anti-wedge: CREATE IF NOT EXISTS, DROP POLICY IF EXISTS, CHECK constraints self-heal then re-add as NOT VALID (same class as 0119/0121/0128).
  • brain_state / brain_remember fact-path can stop falling back once the apply workflow green-runs this file.
v0.786.32Channel alert stops hauling the full threadJul 22, 2026
  • GlobalNav's 25s /api/channel/alert poll now uses an exact message count plus the newest 50 bodies instead of every tai_channel_messages row.
  • Gold Signal auto/manual scanners and the Comms badge stay the same; control payloads still unseal only on the bounded tail.
  • Query-budget unit tests pin the ≤50 row limit and the 200→50 work reduction (0.786.25 twin).
v0.786.31/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.
v0.786.27Migration chain unwedged (0119)Jul 22, 2026
  • 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.
v0.786.17TV voice summons: menu, Cubs, lights, reservationsJul 21, 2026
  • 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).
v0.786.13Voice cadence: measure the think-vs-answer decision (flags default OFF)Jul 21, 2026
  • 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.
v0.786.8Phone privacy firewall v2 — true default-denyJul 21, 2026
  • 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.
v0.779.25Home destinations start moving soonerJul 20, 2026
  • 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.
v0.779.9Lock-screen alerts finish cleanlyJul 19, 2026
  • Long notification titles and messages now stop at a readable sentence or word boundary instead of being cut off mid-sentence.
  • The Cubs pregame alert now opens the live Cubs board instead of a retired page.
  • Event Hub alerts now stay inside Tai instead of opening a retired link, and malformed event data cannot show as code-like text on the lock screen.
v0.779.8"Open Today" actually opens TodayJul 19, 2026
  • 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.
v0.779.5Native sign-in stays reachableJul 19, 2026
  • 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.
v0.779.2Reconciliation ledger replays safelyJul 19, 2026
  • The calendar reconciliation ledger's owner-read policy is idempotent, so a recovery migration can be replayed without blocking production deploy verification.
v0.779.1Provider-decorated cancellations reconcile cleanlyJul 19, 2026
  • 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.
v0.742.11Complete file-plus fix — add FilePlus to CapabilityIcon ICONS mapJul 18, 2026
  • 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.
v0.741.0THE GLASS PASS — the room's light gets finishedJul 17, 2026
  • 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.
v0.646.1Ops fix — morning brief kill-switch message correctedJul 14, 2026
  • 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.
v0.612.0"What's up" — spoken daily brief, voice + home cardJul 12, 2026
  • 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).
v0.608.0Medical connectors: verified drug interactions + honest Medicare coverage pathJul 12, 2026
  • 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'.
v0.575.1Real news — fix news routing, strip markdown from spoken answersJul 11, 2026
  • 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.
v0.528.0Requests Inbox unblocked — Tommy/Maria's reports were 401ing silentlyJul 8, 2026
  • 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.
  • Kill switch: TAI_COMPANION_FACT_GUARD=0 reverts to prompt-only behavior instantly. Cross-tenant isolation untouched. Agentic action tools untouched, TAI_AGENT_TOOLS stays off.
v0.514.0T's Room — genuinely multi-source, smarter curation, richer cardsJul 7, 2026
  • 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.
  • Agentic action tools untouched, still off.
v0.506.0Talk picks up Presence's bubble style + shared voice toggleJul 7, 2026
  • /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.
v0.502.0Home Feed Framework — a reorderable multi-module card homeJul 7, 2026
  • 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.
v0.496.0Voice polish — smoother chunk-to-chunk deliveryJul 7, 2026
  • 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.
v0.486.0Deep QA + adversarial tenancy isolation testsJul 7, 2026
  • 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.
v0.484.0War Room — confirmed final, fresh deployJul 6, 2026
  • 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 (&#8216;, &#039;, &amp;) that would have rendered in the new sources' non-CDATA-wrapped titles -- e.g. "&#8216;The Pitt&#8217;" 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.
v0.459.1Ultimate memory, Phase 1 — pagination correctness fixupJul 4, 2026
  • 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.
v0.459.0Ultimate memory, Phase 1 — Tai stops losing contextJul 4, 2026
  • 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.
v0.452.4Security hardening — fact-checking, RLS, release-note scanning, constant-time comparesJul 3, 2026
  • 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.
v0.452.2Real motion + animated charts — Framer Motion and RechartsJul 3, 2026
  • 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.
v0.411.0Flight Deck answer-quality fixesJun 30, 2026
  • 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.
v0.403.0Bat Cave scroll fix + card-hide everywhereJun 29, 2026
  • 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.
v0.389.0Rejected calendar suggestions stay rejectedJun 28, 2026
  • 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.
v0.366.0Email → calendar (review queue)Jun 26, 2026
  • 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.
  • Provenance/evidentiary-integrity banner above the evidence report: source, verification method, tamper-evidence statement.
  • 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.
v0.301.0Desktop layout fixed — nothing hidden behind the sidebarJun 23, 2026
  • 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.
v0.293.0Documents hub + Universal SearchJun 22, 2026
  • New “Documents” link pinned to the top of the left menu on desktop — your reports are one click away.
  • A Reports shelf lists everything Tai has generated for you — Ameritas, plans, audits, dining intel — newest first. Tap any one to read it in the app.
  • Search now reaches inside your reports too: type a few words and it finds the right document by name or by what’s written inside.
  • Private reports (legal, medical, financial) stay owner-only and encrypted — never shown on the public demo.
v0.288.1Sign in button now shows on desktop tooJun 22, 2026
  • On a computer, the “Sign in” button was tucked behind the left menu — now it sits just to the right of it, in plain view.
  • On your phone, nothing changed — it was already where it should be.
v0.288.0Easy Sign in on the home deckJun 22, 2026
  • When you're signed out, a clear “Sign in” button now sits in the top-left of the home deck — one tap takes you to the sign-in screen.
  • Fixes getting stuck in demo mode when Tai is opened as its own desktop app window (no address bar to type the sign-in page).
  • The button disappears once you're signed in.
v0.287.0Version badgeJun 22, 2026
  • Added the always-on version badge (bottom-right): shows the live version + commit and whether you're on the latest build.
  • One-tap “Update now” when a newer build is live; consistent with TOMAI and the career hub.
v0.286.0Ameritas War RoomJun 22, 2026
  • Added the owner-gated /ameritas War Room, installable as its own PWA.
v0.285.0Home presence upgradeJun 22, 2026
  • Chips: single tap = Tai answers inline and aloud; double tap = opens that module.
  • Customize mode — reorder and hide the home chips, persisted to your device.
  • Microphone: one-tap “Enable microphone” when access is blocked, with Settings guidance.
v0.284.2Unified sign-inJun 22, 2026
  • One login across the apps: 6-digit email code, a 400-day persistent session, and Face ID / passkey.
v0.279.0Episodic life memoryJun 21, 2026
  • “What happened in the Cayman Islands?” now answers from real trips, dinners, and events.
  • The /timeline “Moments” view reads the same memory.
v0.278.0Hide what you don't wantJun 21, 2026
  • Tell Tai “stop showing me the court dates” (or any category) and it hides home-wide; “show them again” restores it.
v0.277.0Dining intel reliabilityJun 21, 2026
  • Restaurant dossier PDF now generates reliably on the phone, with a graceful fallback instead of a raw error.

1388 releases shown · newest first

← Back to All of Tai