// Viewport below spec
This dossier needs a wider display.
▶ Rotate your phone to landscape
or open on a desktop for the full experience
← RETURN TO BOARD
reading···
CASE LB-2026  //  SEQ-01 ACCOMPLICE  //  ai assistant
SEQ-01
/ 05 case files
SEQ-01 // ACCOMPLICE · FULL CASE FILE STATUS: LIVE SYSTEM · ITERATING
// File Index · 05
SEQ-01ACCOMPLICE SEQ-02PUBLICIS SEQ-03EMERGENCE SEQ-04VEED SEQ-05DEFRA
[ SEQ-01 // Case File ]
AI Assistant
Solo build · Production system · Feb 2026 – present
LIVE · ITERATING
Subject

A personal AI assistant she has been building since February 2026. Live in production across four front-ends, sharing one backend and one memory. Not a finished product — an evolving system she actively iterates on.

The Brief She Set Herself

She wanted to see how far one person could take a personal AI system: persistent memory across months, multiple front-ends sharing a single state, autonomous behaviour without prompts, and the operational reality of running it as a real service — not a demo.

Architecture
~5,400
lines of Python
2,700+
gateway lines
54
endpoints
4
surfaces
6
memory layers
┌──[TG]──┐ ┌─[WEB]─┐ ┌─[MINI]─┐ ┌──[3RD]──┐ ◂ surfaces └───┬────┘ └───┬───┘ └───┬────┘ └────┬────┘ └────────────┴───────────┴─────────────┘ │ ┌─────────▼──────────┐ │ GATEWAY │ ◂ FastAPI · 2,700+ lines · 54 endpoints │ one state · one │ │ memory │ └─────────┬──────────┘ │ ┌────────┬──────────┼──────────┬────────┐ ▼ ▼ ▼ ▼ ▼ MEMORY RAG AGENTS SCHED TOOLS 6 layers BM25+vec email + cron- img / stt hybrid scout style / tts storage : SQLite · ChromaDB (vectors) deploy : docker compose · nginx · 1 VPS
Design Decisions That Turned Out to Matter

One state, four doors. Every front-end speaks to the same gateway and reads from the same memory. Chat clients are easy to ship; the shared state underneath is the part that's hard to copy.

Memory as layers, not a single pile. Short-term context, rolling summaries, structured facts and event timeline live in separate layers, each with its own retention and recall logic. Reply quality tracks recall quality — this is where most of the tuning goes.

Autonomy as a first-class feature. A keepalive loop wakes every 50 minutes, looks at recent activity, and decides whether to speak — no user input involved. Daily and weekly summaries generate themselves. It's what makes it an assistant rather than a tool.

Things That Broke and What She Learned
Incident 01 // Timeout Cascade

A long-running reply would silently hang. The chain ran: client → nginx → FastAPI → bridge subprocess → LLM call. Each hop had its own timeout, and the shortest one upstream killed work the downstream layer was still doing.

She redesigned the timeout chain so each layer's deadline derives from the request's overall budget, not a hard-coded constant. Lesson: in a multi-hop async system, timeouts that don't talk to each other are the bug.

Incident 02 // Email Triage Drifting

The email agent ran daily and reported "100 new emails" every morning — for a week. The numbers were a lie. Root cause: the agent pulled "all unread," and the Gmail account it watched was a forwarding sink she never read, so the unread pool only grew.

Fix: switch to IMAP UID watermarking, persist the last-seen UID, and pull strictly the delta. Lesson: "what's new" is a state question, not a query question. If you don't persist the cursor, you don't have a daily report — you have a daily re-print.

Incident 03 // One User, Four Inboxes

Adding the second front-end (WeChat) exposed a problem: the assistant remembered her perfectly on Telegram, then greeted her like a stranger on WeChat. Each surface was building its own implicit user model.

She restructured the identity model: a single shared user identifier with surface as a tag, not as an identity boundary. Lesson: shared memory only matters if it's actually shared. Decide whose state lives where, before adding the second client.

Current State
> LIVE Running continuously since February 2026 > DAILY EMAIL DIGESTS In production > JOB SCOUTING Embedded in keepalive cycles; standalone agent in progress > MULTI-AGENT BOARD Shared state table; one specialised agent live, more planned
Open Problems She's Still Working On

— A second specialised agent (job scouting) factored out of the keepalive into its own service

— Memory consolidation — automated deduplication and merging of long-running facts

— Surfacing the assistant on iOS as a dedicated PWA, not embedded in Telegram

Why This Project

It's the thing she points to when explaining what "AI builder" actually means to her: not prompting a model better, but designing and running a small system that has to keep working tomorrow, and the day after, and three months later — across surfaces, across failure modes, across her own changing requirements.

continue readingnext file → SEQ-02 // PUBLICIS
Case LB-2026 · Subject file SEQ-01 · File complete · ←/→ browse