The definitive reference · written 2026-08-17

OiMy, explained
properly.

A complete field guide to the architecture — memory, profiling, the skills engine, Hermes, model routing, safety, and where every piece actually came from. Written for someone who wants to genuinely understand this system, not skim a pitch deck.

Grounded in a file:line-cited production audit, 2026-08-16 Written by Fable 5 Assembled by Claude Code
live in production live, confirmed bug built, gated off planned, not built legacy / superseded active research track

How to read this. OiMy contains designed-but-unshipped systems sitting right next to live production code. This guide tags every claim with its real status — live, gated off, planned, legacy, or an active research track — so you always know which world you're reading about. Where something isn't known, this guide says so instead of guessing.

Start with Part 1 for the two-minute picture. Everything after that is depth you can explore in any order — jump straight to memory, or skills, or safety, whatever you're curious about first.

Part 1 — Orientation

The shape of the thing

What OiMy is, in a form you can read in two minutes and actually walk away understanding.

OiMy is a memory-enabled family AI companion. Per its own production system prompt, it exists for a family's ordinary stress, chronic overload, and crisis-adjacent moments — expected to be specific and useful, not just emotionally warm. It combines conversation, parenting and coaching support, household and life-management skills (reminders, shopping lists, meal plans), and persistent context that carries across sessions — so it remembers that Emma has soccer on Tuesdays, and that Dad usually does pickup. api.py:748-752

The personality users actually meet is called Oi — a warm, knowledgeable friend. Never "the app," never "OiMy," never "as an AI." Expert knowledge is treated as an internal compass, not surface content: the frameworks live inside a reply, never on top of it.

Today, the replies come from a cloud frontier model. A fine-tuned local model exists as a serious, measured research track research track — but it has never answered a real user's message. Hold onto that distinction; it recurs everywhere in this system.

The one fact that unlocks everything else

OiMy has two parallel product surfaces, built on different code paths. If you remember nothing else from Part 1, remember this — most confusion about OiMy comes from conflating them.

SURFACE 1 — the Telegram companion SURFACE 2 — the web app Parent's Telegram Light Hermes oimy-engine api.py · one shared process Hetzner server oimy.db vector_memory.db Browser · app.oimyai.com Traefik proxy VM OiMy-Platform (Next.js) A B C D E +18 one isolated OpenClaw container per family Postgres 17 engine has no Postgres connection
The engine (left) owns its own SQLite stores and answers Telegram. The platform (right) owns Postgres and provisions one isolated container per family. They share user/session data at the Postgres layer, but the engine process itself never connects to it directly.

Surface 1 — the Telegram companion live. This is oimy-engine — a large Python engine (api.py, 4,500+ lines) running on a Hetzner server, reached through a thin gateway called Light Hermes. Per the project's own July 15 architecture brief, this is "what users actually talk to." It's the system that received a rigorous independent code audit on 2026-08-16, and it's the primary subject of this guide.

Surface 2 — the web app at app.oimyai.com live. This is OiMy-Platform — a Next.js application that provisions one isolated OpenClaw agent container per family (19–22 Docker containers on the same Hetzner box as of July 2026), fronted by a separate proxy VM and a management API. This is where the multi-tenant family features live: community skill submission, heartbeat templates, a five-question onboarding interview, morning-brief crons.

"The engine" (Telegram, Grok 4.3, api.py) and "the platform" (web app, OpenClaw containers, Next.js) answer different questions. This guide always tells you which one it's describing.

The five ideas that define the engine

1 · Archetypes, not handlers
~80–90 skills, only 6 behavioral shapes. → Skills engine
2 · Layered memory
5 designed layers; 2 live, 1 gated, 2 planned. → Memory
3 · A model stack, not a model
Different models answer depending on routing. → Model routing
4 · Mechanical governance
Six code checks before any reply ships. → Safety
5 · A boundary drawn on purpose
Hermes forwards; the engine owns the data. → Hermes
Part 2 — The Pipeline

Life of a message

The best way to understand OiMy is to ride along with one real message, end to end. Every step below is live, confirmed by the 2026-08-16 audit.

Phone Telegram Hermes Session + safety check Context assembly vector · entity · H30 2,500-char cap Router gpt-5.4-mini Model call grok-4.3 / deepseek / sonnet-4.6 Governance gate · 6 checks Delivery + ledger write-back: entity facts · profile · H30
Eight real stops between a Telegram message and a delivered reply. The dashed loop matters most: the reply is not the end of the story — it's what gets written back to memory that makes the next message better.
1Light Hermes receives the message
A thin gateway whose only job is one decision: does this belong to OiMy? It uses GPT-5.4-mini for that single classification and forwards the message — no memory, no persona of its own, deliberately (see Hermes for why). iMessage support is reportedly also running as of mid-August. unverified against the code audit; sourced from the July-15 brief
2Session boundary + early safety checks
The /chat endpoint decides continuation vs. new session, runs a narrow deterministic medical-emergency check (chest pain/breathing, fever + stiff neck), and checks for a pending bridge response in flight. api.py:2165-2212
3Context assembly
Pulls together vector-memory top matches, entity facts, H30 profile summary, and resolution/onboarding context — plus deeper psychological-profile layers if the memory tier were high enough (it isn't, in production today). Capped at 2,500 characters total. This is where the engine remembers who Emma is, her schedule, and that Dad usually does pickup. _build_profile_context · api.py:4407-4512
4The router picks a skill
GPT-5.4-mini classifies the message against the skill manifest (roughly 80–90 skills) and returns a skill_id + confidence. The manifest supplies a workflow_type: chat_light, action, coach, expert, planner, monitor, or profile. api.py:2482-2487, 2741-2767
5Dispatch and the model call
_execute() routes to the matching archetype. A direct companion turn goes to Grok 4.3; a coach turn commonly hits a DeepSeek V4 Flash scaffold, or escalates to a Claude Sonnet 4.6 "tall model" path — the model that answers depends on routing, not one universal companion. api.py:6042-6073, 4753, 4803-4885
6Everything injected into the prompt
Session constraints, entity context, truncated profile context, a Honcho insight, up to six recent session_suggestions, the full coaching-anchor file, the last eight raw history turns, H30 probing instructions, and — if a crisis pattern matched — a safety-alert addition. api.py:5461-5599
7The governance gate
Six code-level checks on the drafted reply: repeated-opener detection, literal + embedding clinical-language filters, an advice-embedding check, a content-recycling check, and an unknown-family-member / ledger-contradiction check. Any hit triggers one bounded correction-and-regenerate pass. confirmed bug that regeneration pass can lose its own correction instructions and ship the same violation — see model routing. api.py:4908-5157
8Delivery and memory write-back
The reply is logged to a durable turn ledger + outbox — proof it actually sent — delivered back through Hermes, and entity facts / profile / H30 state / governance metadata are written back for next time. api.py:2123, 2969-3018
Worked example · from the published architecture brief
"Can someone grab Emma from soccer at 5? I'm stuck on a call."

Hermes forwards it as a real request → simple single-person ask, no bridge needed → the engine already knows Emma's age and schedule, and that Dad usually handles pickup → Grok 4.3 drafts a reply using that context → the safety check confirms "Emma" is a real, known family member.

"On it — I'll text your husband, he's usually closer at that time. Want me to also remind you tomorrow she has a project due?"

Notice what made that reply good: not the model — the memory. That's the thesis of the whole engine, and why the deep dives below start with memory.

Part 3 — Deep Dives

One subsystem at a time

Each section below stands alone — jump straight to what you're curious about. Click any heading to expand.

3.1
Memory
Five layers on paper. Fewer in production. 2 live 1 gated off 2 planned

Memory is OiMy's central bet: a companion that doesn't remember isn't a companion. The design stacks five layers, from concrete facts up to long-arc life tracking.

1 · Entity Graph live 2 · Vector Semantic Memory live 3 · Deep Profile Inference built OIMY_MEMORY_TIER=1 (gate) 4 · Journey Tracker planned 5 · Post-Session Pipeline planned Prompt context 2,500-character cap what a live reply actually sees
Built ≠ live. Layers 1–2 reach every conversation. Layer 3 exists and works, but stops at a configuration gate. Layers 4–5 don't exist yet.

Layer 1 — The entity graph live confirmed bugs

People, concepts, and preferences stored as relationship triples — "Sarah --has_condition--> PCOS" — in SQLite + JSONL via gbrain_lite.py. A nightly "dream cycle" LLM sweep hunts for new entities in recent conversation. It's what recognized Emma in Part 2.

Three confirmed data-quality bugs: a null child age is stored as the literal text "None" entity_extraction.py:131; there's no deduplication, so duplicates accumulate entity_extraction.py:163,281; and only five categories — children, barriers, health, preferences, pets — actually reach the prompt. Extracted adult, schedule, motivator, and location facts are collected but dead on this path entity_extraction.py:249.

Layer 2 — Vector semantic memory live confirmed bug

Every message+response pair is embedded (all-MiniLM-L6-v2, 384 dimensions), with cosine-similarity search surfacing the most relevant past exchanges as "Relevant Past Context." FTS5 keyword search is the fallback if embeddings are unavailable.

Confirmed bug: the embedding cache key uses only the first 200 characters of a message, while the provider embeds up to 8,000 — two long messages sharing a 200-character prefix collide onto the same cached embedding. vector_memory.py:92,103

Layer 3 — Deep profile inference built, gated off

The most ambitious layer, and the one that most needs precision: the code exists, the schema is complete, and it is not reaching real users today.

Three depths of knowledge about a person: Surface (explicit onboarding data, confidence 1.0), Inferred (pain points, goals, communication style, 0–0.95, growing with evidence), and Deep (Hughes social needs, Hughes decision style, Maslow level, rapport level L1–L5, formative years, belief system — 0.1–0.9, always re-verified against current behavior, never assumed permanent).

Why it's gated: OIMY_MEMORY_TIER is unset in production, defaulting to Tier 1 — entity facts with confidence ≥0.70 only, no decay, no historical tagging, no psychological context. Tiers 2/3 exist in code but aren't active. Nuance: Tier 1 isn't a global "memory off" switch — vector retrieval and entity context are assembled independently of the tier gate api.py:2412-2470; the tier only gates the profile-fact depth/confidence branches api.py:4407. OiMy remembers plenty at Tier 1 — what it doesn't do yet is psychologize. (Full deep dive on this layer in Profiling.)

Layer 4 — Journey tracker planned

Long-arc goal, milestone, and deviation tracking across sessions — "Emma needs to improve SAT math by 120 points," with milestones and progress percentages, in a SQLite journey table. Designed. Not built.

Layer 5 — Post-session pipeline planned

The orchestrated nightly job that would tie everything together: summarize → classify stage of change → GBrain learn → update deep profile → update journey → dream-cycle pattern detection → generate the next session's agenda. Designed. Not built.

Two databases, often conflated

StoreHoldsOwner
SQLite oimy.dbEntity facts, profile, H30 state, recent messages, inference state, outboxThe engine
SQLite vector_memory.db384-dim embeddings for semantic searchThe engine path bug: api.py:1846
Postgres 17users, instances, user_sessions, user_chat_messagesOiMy-Platform (control plane)

The vector store's path is computed via a fragile string-replace on oimy.db's path, which on production resolves to a sibling directory rather than a sibling file — backups scoped to the engine's data directory may silently miss the entire vector store.

H30 — the session-state sidecar live confirmed bugs

An internal codename (its full meaning isn't documented anywhere read for this guide). Tracks recent messages, session constraints (a "don't suggest this again" list), suggestion history, and opening-variety state. Confirmed bugs: legacy session_constraints are untimestamped and never expire h30.py:378-413; the reset endpoint clears session_suggestions but not session_constraints api.py:6765; a first-message duplication bug on a user's very first tick h30.py:151,158.

3.2
Profiling
The psychology engine that isn't plugged in yet. built, gated off

OiMy's most intellectually distinctive subsystem — and the one where honesty matters most, because nearly all of it is gated behind the Tier-1 default described above. The right way to hold it: the system is built to understand people this deeply; today's live production surfaces only the entity layer, not this psychological layer.

Surface — confidence 1.0 (explicit onboarding data) Inferred — 0 to 0.95, grows with evidence (pain points, goals, style) Deep — 0.1 to 0.9, always re-verified against current behavior Hughes needs Maslow level Rapport L1–L5 Stage of change Formative years Beliefs current-state verification: does present behavior still confirm this? Tier 1 gate
Deep guesses expire unless re-earned — and today, the whole ladder stops at the Tier 1 gate before it reaches a live conversation.

How a profile gets built, by design

Per-message, real-time, zero-LLM (~0ms). Pure Python: pain points via regex, goals via keyword matching, sentiment via scoring, timing via time-of-day analysis. Cheap signals, harvested constantly.

Session-end LLM classification (teacher-authored prompts; production model for these classifications is unverified):

  • Hughes social needs — Chase Hughes' six-need framework: Importance, Approval, Pity/Validation, Power, Uniqueness, Safety. Shapes how suggestions would be framed once active.
  • Hughes decision style — how this person actually decides.
  • Stage of change — the Transtheoretical model (precontemplation → contemplation → preparation → action → maintenance), tracked per active skill. A parent can be in "action" on sleep and "precontemplation" on screen time simultaneously.
  • Formative years — era, childhood environment, family setting, schooling type. Always low confidence, explicitly speculative.
  • Current-state verification — the quiet star of the design: every old deep inference is periodically checked against current behavior, preventing a week-1 guess from silently defining someone in month six.

Two more gating frameworks shape how a live profile would be used: Maslow level (physiological / safety / love-belonging / esteem / self-actualization) gates whether OiMy pushes growth goals or offers practical logistics help; rapport levels L1–L5 gate conversational depth and directness — Oi earns depth, it doesn't presume it.

Two clever details worth knowing

The 4-field cold start. From just name, age, gender, and location, a teacher-authored prompt generates an initial speculative profile — confidence 0.1, explicitly marked as a guess — so OiMy has something to work with on message one. Real signal overwrites it within the first few messages.

The belief-system table (added post-May-17): limiting beliefs, core values, a self-efficacy map, a causal model, change-readiness belief — first computed at message 50, re-run every 30 messages after. The system waits for real evidence before daring to model what someone believes.

All of this is real, schema-complete code. None of it reaches real conversations today, because production runs at memory Tier 1. When you talk to Oi right now, it knows your facts, not your psychology.

3.3
The skills engine
Six shapes for ~90 skills. live

OiMy has roughly 80–90 skills (documented counts range 73–83 across dated snapshots; a recent reference says 89, unverified — treat "about 80–90" as the honest number). The naive architecture would be one handler per skill. The original prototype's design doc rejected that in one line: "81 skills would mean 81 handlers — unmaintainable."

Instead, every skill is an instance of one of six behavioral archetypes — six shapes of work:

Router gpt-5.4-mini ActionCRUD Profileno-LLM Coachtall model Plannerpipeline Monitorcron+diff ExpertRAG reminders parenting-coach screen-time meal-planning ⋯ ~90 skills
Ninety intents, six shapes. Adding skill #90 doesn't mean new execution code — it means a new YAML manifest naming which archetype already knows how to run it.
Action
SQLite CRUD
Deterministic, schema-validated: reminders, shopping lists, notes.
Profile
rule-based, no LLM
Onboarding, preferences — direct writes.
Coach
DeepSeek scaffold / Sonnet 4.6
Parenting, wellness, relationships — template + tall-model generation.
Planner
constraint extraction → template
Meal plans, travel, study plans.
Monitor
cron + diff
Screen time, mood, spending trends.
Expert
RAG + disclaimers
Legal / medical / financial domains.

Production routing is done by GPT-5.4-mini in the cloud — not the on-device Gemma 4 router the original prototype was built to prove out (see Lineage for that story).

confirmed bug Four active routing-guard regexes contain a literal backspace byte (0x08) where \b word-boundary escapes were intended — a classic Python string-escaping trap. Those specific reroute corrections (e.g. "reminder" phrases misrouted to meal-planning) silently never fire. api.py:2699, 2711, 2729, 2733

dead code A knowledge-base injection feature sits behind a literal if False: — present in the code, not live. api.py:2941

3.4
Hermes
The thin gateway, and the boundary drawn on purpose. Light Hermes live Heavy Hermes deferred

Sourcing caveat, stated up front: "Hermes" by name appears nowhere in the 2026-08-16 code audit, whose citations live entirely in api.py/oimy//archetypes/. Everything below comes from the 2026-07-15 architecture brief and a 2026-07-11 internal design doc — accurate as of those dated documents, unverified against the most recent code audit.

Light Hermes live per July-15 brief

The gateway users' messages actually pass through. Deliberately, almost aggressively thin: one job — decide "does this belong to OiMy" (using GPT-5.4-mini) and forward. No memory. No persona. Currently serves Telegram, with iMessage reportedly running as of mid-August, ahead of "planned" status in older docs.

Heavy Hermes designed, explicitly not built

The designed successor would give the gateway a full adaptive persona, fed OiMy's real coaching and knowledge content through a direct code-level hook (pre_llm_call) rather than a stuffed prompt. Forcing constraint: the vendor gateway framework caps personas at 20,000 characters, and OiMy's real coaching/knowledge file is roughly six times that size.

Why deferred, and this is worth admiring: an internal review of six real recent production bugs found only one was actually an architecture gap. Five were ordinary defects in the existing engine. So the team chose to stabilize the core engine first rather than build the next layer on a wobbling one.

TODAY DESIGNED — NOT BUILT Hermes oimy-engine 🔒 entity facts 🔒 deep profile 🔒 anchors 🔒 constraint ledger Heavy Hermes persona cap: 20k chars OiMy content: ~6x that oimy-engine same 4 vaults pre_llm_call hermes-agent internals — ~1,720 commits between minor versions documented hook + plain HTTP — stable
Build on the stable rail, never on the churn. The engine keeps its four vaults locked either way — Heavy Hermes changes how it's fed, not who owns it.

The boundary decision — why the engine keeps the data

A 2026-07-11 internal doc records an explicit architectural ruling: entity facts, deep-profile inference, coaching-anchor retrieval, and the constraint ledger stay owned by the engine, permanently. They will not migrate into Hermes.

The reasoning is concrete, not ideological. Hermes is built on a vendor open-source framework (hermes-agent) that evolves very fast — roughly 1,720 commits, 998 PRs, and 370+ contributors between just two recent minor versions. The project confirmed the Telegram platform module itself relocated between two versions it touched. What's stable is the documented pre_llm_call hook and plain HTTP — so that's all OiMy builds against.

One exception in the other direction: session/turn-boundary bookkeeping should lean on Hermes — letting Hermes' own session store become authoritative for Hermes-routed traffic, retiring the engine's competing bespoke session logic — because that was the one genuine architecture gap in the internal bug review, and Hermes had already solved it well. Keep what you must own; adopt what they've genuinely done better.

3.5
Model routing
The companion-coach stack — and a local research track that's never shipped. live research track

Ask "which model is OiMy?" and the honest answer is "which sentence?" This is the live production environment, read directly from /proc/<MainPID>/environ during the 2026-08-16 audit:

COMPANION_MODEL=x-ai/grok-4.3
FALLBACK_COMPANION_MODEL=anthropic/claude-haiku-4-5
ROUTER_MODEL=openai/gpt-5.4-mini
COACH_MODEL=x-ai/grok-4.3        ← set, but never read by the code
DEEPSEEK_MODEL=deepseek-chat
oimy-engine routing decision Routergpt-5.4-mini Companiongrok-4.3 Fallback ⚠haiku-4.5 recursion drops context Coach scaffolddeepseek-v4-flash escalate sonnet-4.6 COACH_MODEL=grok-4.3 unread — no live effect Gemma 4 12B LoRA research track — never serves users
Which model answers depends entirely on routing. The severed COACH_MODEL arrow is the diagram's whole point: a live environment variable that names a model nobody actually calls.

The live cast live

  • Router — GPT-5.4-mini. Classifies each message against the skill manifest. Small, fast, cheap: right-sized for a classification job.
  • Companion — Grok 4.3 via OpenRouter. The default chat voice; where most real replies come from.
  • Fallback — Claude Haiku 4.5 via OpenRouter. confirmed bug: the fallback-selection logic can recurse into repeatedly calling the same fallback model, and every recursive call drops system_additions and request_ctx — silently losing turn-mode instructions, topic context, and correction instructions. api.py:5424-5438, 5648 That last loss is what breaks the governance regeneration pass from Part 2, step 7.
  • Coach path — DeepSeek V4 Flash scaffold, with escalation to a Claude Sonnet 4.6 "tall model" path. Confirmed by a real eval trace: a patpat parenting-coach turn was answered by deepseek-v4-flash, not Grok.

The misconfiguration worth learning from

COACH_MODEL is set to x-ai/grok-4.3 in the live environment — and the code never reads it. Coach configuration actually flows through TALL_MODEL api.py:1822, 1841, which is unset, so a code default applies instead. Anyone reading the environment would confidently conclude "the coach runs on Grok" — and be wrong. Included here deliberately, as a lesson: configuration is a claim; only code that reads the variable makes it true.

Related liability: the coach's DeepSeek fallback contains a hardcoded embedded API-key default coach.py:935,938 — not the active credential path today since DEEPSEEK_API_KEY is set, but a silent liability if that variable ever disappears. Rotation recommended by the audit.

The local-model research track research track — real, measured, never shipped

Alongside the cloud stack runs OiMy's most patient experiment: fine-tuning a Gemma 4 12B (QAT) model with LoRA, on real production behavior categories, across three rounds.

Baseline
6.27
v2 LoRA
7.10
v3.1 LoRA
6.97
Grok 4.3 (live)
7.40
  • v1 — the ~$7 pilot. Proof that fine-tuning changes behavior at all. It did — and overcorrected into terse replies. Not shipped.
  • v2 — 19,074 training examples. Full 30-session eval: 7.10/10 vs. 6.27 baseline (+0.83) — a real, measured improvement. Known gap: sometimes under-delivers on multi-part asks.
  • v3.1 — +3,400 reasoning-trace examples + 733 fixes (23,866 total). Beat baseline more decisively, fixed the multi-part-ask gap, but landed at ~parity overall (6.97 — a wash), with a small new terseness quirk on short exchanges.

The honest scoreboard: the local model went from "worse" to "competitive," hasn't yet beaten the incumbent, and has never served a real user's message — the eval runbook explicitly resets production back to Grok after every run. Next planned step (MLX conversion for faster local serving) is blocked on an unavailable dev-machine SSH tunnel.

Why bother at all: cost ($15–40/day running Claude Sonnet 4.6 across the older 22-container OpenClaw fleet), latency (2–5s cloud round-trips vs. 200–500ms on-device), and privacy (sensitive family conversations staying on-device). Those pressures haven't gone away — the track is dormant-at-a-blocker, not abandoned. It lives in the sibling lora-v2 / lora-v3 / reasoning-dataset / oimy-ml-artifacts projects — see Lineage.

3.6
Safety & crisis handling
What works, and two things that don't yet. live 2 confirmed defects

Safety in OiMy is mostly mechanical — deterministic code-level checks rather than "we asked the model to be careful." That design choice is right, and much of it works. This section presents the current state plainly: an actively worked-on system with real strengths and two confirmed live defects. Neither is presented to alarm; both are presented because a collaborator deserves the same view the team has.

What works today live

  • Unknown-family-member detection _roster_unknown_names() — Oi cannot casually invent a child or reference a person the family roster doesn't know.
  • Ledger-contradiction detection _ledger_exclusion_violations() — replies are checked against the family's exclusion ledger (allergens and the like).
  • Clinical-language filtering, literal and embedding-based (cosine threshold 0.72) — keeps Oi sounding like a friend, not a chart note.
  • Advice-embedding and content-recycling checks, gated to restrictive modes.
  • A narrow deterministic medical-emergency check at the front door — before any model is consulted.

One reliability caveat: the embedding-bank import is fail-open — if it errors at startup, those checks silently disable rather than blocking boot, and nothing currently monitors for that condition.

Defect 1 — the broken fallback detect veto (correct) fallback: NameError "I'm here for you! What would you like to talk about?" intended: crisis- specific response Defect 2 — fast path outruns the classifier message emergency-family classifier (correct, slower) chat-light companion (returns first) safety injection: first-person only third-person ("he wants to kill himself") reaches no synchronous crisis response
Everything that works stays in the normal palette; only the two actual break points are marked. Engineering incident diagram, not an alarm poster.

Confirmed defect 1 — a broken safety fallback. _execute() takes five arguments and defines no local request_ctx api.py:6042, but a downstream fallback call references request_ctx=request_ctx api.py:6112,6120. That's a NameError, silently swallowed by a broad exception handler, substituting generic static text in place of the intended crisis-specific response. Reproduced in isolated execution: an action workflow correctly vetoed for a crisis/escalation signal fell through to "I'm here for you! What would you like to talk about?" Introduced 2026-07-11 (commit 080094a8); still live as of the August 16 audit.

Confirmed defect 2 — third-person self-harm can miss the synchronous crisis path. Phrases like "kill himself" about a child are correctly classified emergency-family/safety-class-4 chat.py:48,61,164, but that skill is typed workflow_type: coach, and the general chat-light companion fast path runs before coach/bridge dispatch and returns immediately on success api.py:2825,2950. The safety-alert injection only checks _detect_parent_crisis (predominantly first-person). Reproduced with the literal input "My son said he wants to kill himself tonight" — routed correctly, but a failed companion path produced a bridge/hold message with no crisis instruction. First-person parent self-harm is meaningfully better covered than third-person family-member self-harm.

The hybrid bridge — built, tested, found wanting built; effectively parked

A "hybrid bridge" routes complex multi-person deliverable turns to a bigger model. Built and honestly evaluated — and found net-negative: both return paths were skipping memory write-back, causing wrong-fact errors on the next turn. Measured trust scores: ~9.85/10 bridge-off vs. ~3.5/10 bridge-on. A feature that makes the product dramatically worse when enabled is a finding worth respecting. DISABLE_BRIDGE has never been explicitly set in production — flagged in July as needing a decision, still unset/ambiguous.

Context: a deliberately frozen engine

The core engine has been deliberately frozen since July 15, 2026 — zero engine commits between then and the August 16 audit, by stated policy: "stabilize before building the next layer." What kept moving: the gold-standard synthetic test dataset grew from 547 to 650+ rows across 18 simulated families, plus health-check monitoring and watchdogs. The most recent multi-family synthetic diagnostic (49 production-faithful contexts, simulated depths of 28–42 days) found zero structural failures at full depth, while ~33% of turns still showed quality-level gaps (stale-turn answers, tone mismatch, canned phrasing) — real but non-structural, and explicitly a synthetic offline evaluation, not live multi-user traffic.

Both safety defects above were introduced or persisted under that freeze — which is exactly why the freeze-then-audit-then-fix sequence exists. Finding these two is the audit doing its job.

3.7
Family features
Real, and honestly under-documented.

Deliberately the shortest section, for the most honest reason available: the family/multi-user mechanics are under-documented as a distinct architecture area in every source this guide draws on. What follows is confirmed; what's absent is flagged rather than filled with guesses.

Confirmed, engine side live: a family roster and exclusions system feeds the governance gate — the unknown-family-member detection and allergen/exclusion checks from Safety both draw on it. It's why Oi could verify "Emma" in Part 2. An emergency-family skill exists specifically for family-crisis scenarios (with the routing caveat from Safety). The prototype-era skill catalog includes family-oriented skills by name: family-announce, family-bonding, family-film, family-comms.

Confirmed, platform side live: the OiMy-Platform web surface is explicitly multi-tenant and family-shaped — one isolated OpenClaw agent container per family, with the Tradclaw-inspired onboarding interview generating household-level USER.md/HEARTBEAT.md files (full lineage below).

The known gap, stated plainly: a proper deep-dive into multi-user mechanics — how roster membership is established and mutated, how permissions work between family members, how the engine attributes messages within a household — would require a targeted read of archetypes/action.py and the profile/roster code beyond what the compiled research covers. This guide says "real but not fully mapped" rather than inventing a tidy answer.

Part 4 — Lineage

Where the pieces came from

OiMy did not appear fully formed. Every sibling directory examined ties back to the product in a real, documented way — production, prototype, or training pipeline.

oimy-engine Telegram surface OiMy-Platform web-app surface Tradclaw 4 adapted patterns fantastic-app-provider chat UI + licensed Fabulous content licensed content, mined into anchors chat UI prototype oimy-skill-engine (legacy) shape carried, code didn't lora-v2 / v3 / reasoning-dataset / oimy-ml-artifacts trains on production behavior; never serves users solid = direct reuse dashed = inherited shape only dotted = active parallel track
The legend is the lesson: solid lines are things that shipped, dashed lines are ideas that survived without their original code, and the dotted line is real work that still hasn't touched a real user.
Tradclaw direct pattern reuse

Claire Vo open-sourced Tradclaw (github.com/clairevo/tradclaw), a household-AI-assistant scaffold. Directly documented in OiMy-Platform/docs/OIMY_PLATFORM.md (originally titled TRADCLAW_PLATFORM.md), crediting it explicitly: "Adapted from Claire Vo's Tradclaw by the OiMy team." Four patterns were adapted for OiMy's multi-tenant Docker context — Tradclaw is single-user; OiMy-Platform is one container per family: the Skill Submission API gained an admin-review step; five heartbeat templates (Family Hub, Solopreneur, Home Manager, Health Focus, Minimal) ship pre-built; the five-question onboarding interview writes generated USER.md/HEARTBEAT.md into each family's container; the morning-brief cron became timezone-aware. This lineage lives entirely on the platform surface — none of it touches the Telegram engine.

Verdict: inspiration + direct, credited pattern reuse, materially adapted.
fantastic-app-provider direct reuse — two distinct things

1. The actual OiMy chat-UI prototype — a React web app ("ai-chat-app") with Clerk auth and framer-motion/lottie animations. Currently being repurposed into a testing client pointed at the dev engine.

2. A licensed content export from a real third-party self-improvement app called "Fabulous" (119 journeys, 501 chapters, 1,944 content steps, 386 habits, 331 tips, 114 audio trainings, 316 coaching entries), triaged and mined with founder-cleared licensing into OiMy's coaching-anchor file — which grew from 15 to 29 frameworks partly through this process. The refinement method: strip borrowed authority and citations, re-address broadcast copy as one-to-one conversation, de-moralize (no "clean" vs. "dirty" food, no willpower framing), convert commands into offers, replace completion-screen fanfare with specific noticing.

Verdict: direct reuse — a UI codebase and a licensed, heavily transformed content source.
oimy-skill-engine legacy

An on-device intent-routing prototype: Gemma-4-E4B as the router, 81 skills, 6 archetypes, SQLite-only, explicitly "isolated from the production OiMy codebase" per its own README, May 2026 timeline. The project's July 15 brief labels it plainly: "an earlier engine iteration, since superseded… legacy reference only, don't treat as current."

The best one-line reading: the archetype pattern and the five-layer memory design genuinely carried forward into production; the on-device-Gemma-router thesis that motivated building it did not. Production's live chat path is all cloud — while the on-device idea didn't die, it continued as the separate fine-tuning research track (below).

Verdict: inherited design shape; shipped no code. (Its docs also created the documentation confusion in Part 5.)
lora-v2 / lora-v3 / reasoning-dataset / oimy-ml-artifacts research track

The fine-tuning pipelines and training data behind the three-round Gemma 4 12B LoRA effort measured in Model routing. Trained against real OiMy production behavior categories and real production code paths, gated on human review before any production consideration. It reads from production reality and writes back nothing — yet.

Verdict: active parallel track — real, measured, never shipped.
OiMy-Platform core product, not lineage

Listed only for completeness: the multi-tenant Next.js web app and control plane from Part 1's Surface 2, connected to the engine surface via shared Postgres-level user/session data.

Also honestly noted: oimy-ml-artifacts's internals were not deep-dived beyond confirming its role as the LoRA/dataset home, and the landing-v*/scratch folders are prior marketing-site iterations — out of scope. Nothing in the directories examined was unrelated to OiMy.

Part 5 — A Closing Note

Why some of the docs disagree — and why that's the good news

Here's a fact this guide could have quietly smoothed over, and won't: the files literally named ARCHITECTURE.md, BACKGROUND.md, and README.md at the top level of the oimy-engine repo do not describe the production system. They are byte-identical — confirmed via md5sum — to the docs in the sibling oimy-skill-engine prototype. They describe the May-2026 on-device Gemma-4-E4B router prototype, complete with its own admission that it's "isolated from the production OiMy codebase." Anyone who opens the production repo and reads its front-door README is reading a museum placard hung on the wrong exhibit.

The more accurate description lives one directory down, in oimy-engine/docs/ARCHITECTURE.md — a different file, itself still confusingly titled "OiMy Skill Engine — Architecture" — whose file map matches the real files the 2026-08-16 audit actually cites in live production.

It would have been easy to fix the mislabel quietly and pretend the docs were always in sync. Instead, notice what this project actually did, in order: the July 15 architecture brief explicitly labeled the prototype "superseded… legacy reference only, don't treat as current." Then it commissioned an independent audit that trusted no document and traced every claim to a file and line — which is the only reason this guide can tell you, with citations, which memory layers are live, which env var is never read, and which two safety paths are broken. Then it asked for this explainer with one standing instruction: an accurate "we don't fully know X" beats a confident fabrication every time.

Stale docs are not the interesting fact — every fast-moving project has them. The interesting fact is the response: this project tells the truth about itself, on the record, in dated documents. That's why this guide can carry status tags like gated off and never shipped without hedging, and why you — the developer reading this — can trust the live tags precisely because the planned tags exist. If you build on OiMy, you inherit that norm. It's the most valuable thing in the repo, and it doesn't appear in any file map.

Appendix — quick-reference status board

SubsystemStatus
Telegram pipeline (Hermes → router → archetypes → governance → write-back)live
Web app: OiMy-Platform + per-family OpenClaw containerslive
Memory L1 entity graph, L2 vector memorylive bugs
Memory L3 deep profile inference (Hughes / Maslow / rapport / beliefs)gated off — Tier-1 default
Memory L4 journey tracker, L5 post-session pipelineplanned
Skills engine — 6 archetypes, ~80–90 YAML-manifest skillslive bugs
Light Hermes gateway (Telegram; iMessage reportedly running)live per July-15 brief
Heavy Hermesdesigned, deliberately deferred
Cloud model stack (Grok 4.3 / GPT-5.4-mini / DeepSeek / Sonnet 4.6 / Haiku 4.5)live bugs
Local Gemma 4 12B LoRA track (v2: 7.10 vs 6.27; v3.1: 6.97; Grok: 7.40)research track — never served a user
Safety: governance gate, roster/ledger checks, clinical filterslive
Safety defect: request_ctx NameError breaks crisis fallbacklive bug, confirmed + reproduced
Safety defect: third-person self-harm misses synchronous crisis pathlive gap, confirmed + reproduced
Hybrid bridgebuilt; net-negative in eval
Family / multi-user mechanicsreal; under-documented — known gap
Core engine change freeze (since 2026-07-15)deliberate policy
Usage / scale numbers (users, volume, uptime)unknown — not in any audited source; none invented here

How this guide was built. Research grounded in the project's dated internal docs (architecture briefs, integration reports, internal design decisions) and a rigorous, file:line-cited independent audit of live production performed 2026-08-16. Content written by Fable 5. Assembled, diagrammed, and deployed by Claude Code. Diagrams are hand-authored inline SVG — no AI image generation was available in this environment, so nothing here is a generated illustration; every diagram is a real explanatory drawing of an actual mechanism.

This is a living reference for a fast-moving system. Treat every citation as a pointer back to the source, and treat every "we don't know" as an invitation to go find out.