Complete zero-context brief for improving companion NPS from ~6.0 to 8+. Self-contained: no other documentation required.
1 What Is OiMy
OiMy is a parenting companion app. Users text via Telegram (or an iOS app). OiMy's AI companion — called "Oi" — responds like a trusted friend: warm, practical, not clinical. Users are parents dealing with real family challenges: toddler tantrums, teen withdrawal, co-parenting tension, meal-time battles, homework struggles, and more.
Oi's Voice Contract
Warm but not saccharine. Practical, not preachy. Never clinical. Never patronizing. It should feel like a friend who happens to know a lot about child development — not a therapist or a parenting hotline.
The Engagement Problem
Many parents — especially fathers or reserved parents — resist "soft" coaching approaches. They want solutions, not processing. The system must flex between emotional support mode and practical solution mode based on what the parent actually needs at that moment, not what the system defaults to.
Improve NPS from the current eval baseline of ~6.0 to 8+. The eval harness is the source of truth; real-world NPS is likely higher due to cold-start eval conditions.
2 System Architecture
Infrastructure
| Component | Details |
|---|---|
| Server | Hetzner VPS — root@116.203.107.13 |
| OiMy engine | /opt/oimy-engine/ — Python HTTP server on port 8080 |
| Engine service | oimy-engine.service (systemd) |
| SQLite database | /opt/oimy-engine/data/oimy.db |
| PostgreSQL 17 | Port 5432 — OiMy Platform (separate from engine SQLite) |
| pgBouncer | Port 6432 — connection pooler for Vercel |
| GitHub repo | aahalife/oimy-skill-engine |
Key Files
| File | Purpose |
|---|---|
/opt/oimy-engine/api.py | Main HTTP server + OiMyEngine class (~4363 lines). Full request pipeline, companion calls, turn mode detection, context assembly. |
archetypes/h30.py | H30Engine class. Session-level behavioral tracking: engagement level, constraints, session suggestions, probe history. |
archetypes/entity_extraction.py | Extracts family entities (children, barriers, preferences) from conversation, stores in SQLite. |
archetypes/honcho_memory.py | HonchoMemory wrapper. Records turns and retrieves dialectic insights for cross-session context. |
archetypes/inference.py | InferenceEngine class. Manages H30, deep profile inferences. |
prompts/gemma4_12b_companion_v2.txt | Main companion system prompt (~201 lines). |
scripts/eval_grok43_mini.py | Mini-eval harness (8 sessions: 5 resistant + 3 cooperative). |
scripts/eval_gemma4_qat_v2.py | Full 30-user eval harness (30 sessions, 3 simulator groups). |
docs/synthetic-user-testing/reports/ | All eval reports. |
Model Stack (Current Production)
| Role | Model | Route |
|---|---|---|
| Companion (primary) | x-ai/grok-4.3 | OpenRouter |
| Router / topic summary / entity extraction | openai/gpt-5.4-mini | OpenRouter |
| Bridge / async tasks | openrouter/moonshotai/kimi-k2.6 | OpenRouter |
| Deep profile inferences | openrouter/anthropic/claude-opus-4.8 | OpenRouter |
Request Flow (chat_light path)
User message arrives via POST /chat
→ OiMyHandler.do_POST()
→ OiMyEngine.process_chat()
→ H30Engine.tick() -- update engagement signals
→ EntityExtractor.get_context_summary() -- pull entity context
→ _build_profile_context() -- name, facts, psych, inferences, H30
→ HonchoMemory.get_insight() -- cross-session insight
→ Fetch conversation history -- last 24 rows from recent_messages
→ _extract_session_facts()
→ _classify_turn_mode() -- BE_PRESENT / PROBE_FIRST / PLAN_FORGE /
-- TASK_EXECUTE / JUST_RESPOND / VENTING / default
→ _get_rolling_topic_summary() -- GPT-5.4-mini, every 3 turns
→ _call_openrouter_companion() -- Grok 4.3 via OpenRouter
system = companion_v2.txt + ADDENDUMS + system_additions
context = [DoNotSuggest] + [FAMILY] + [PROFILE] + [HONCHO]
+ [Already suggested] + [CURRENT TOPIC] ← LAST
history = last 8 verbatim + older → 200 chars
→ Post-process response
→ H30Engine.tick() -- post-turn update
→ _extract_suggestion_made()
→ H30Engine.add_session_suggestion()
→ HonchoMemory.record_turn()
→ Store in recent_messages
→ Return response to user
Turn Mode Detection (_classify_turn_mode)
Priority order — first match wins:
Context Injection Order (Critical for Recency Weight)
LLMs give recency weight to later tokens. This ordering is intentional and must be preserved:
[system prompt] + [COMPANION_ADDENDUMS] + [other system_additions] --- [Do Not Suggest] ← explicit constraints from user [FAMILY — family members, NOT the parent] ← entity context [PROFILE] ← name, facts, psych, inferences, H30 [HONCHO] ← cross-session insight [Already suggested this session] ← suggestion dedup [CURRENT TOPIC] ← LAST — highest recency weight [conversation history] ← last 8 verbatim + older → 200 chars [current user message]
[CURRENT TOPIC] must appear after [FAMILY]. If [FAMILY] appears last, the model re-anchors to early-session topics even when [CURRENT TOPIC] signals a shift. This ordering fix was confirmed in eval.
3 NPS Evaluation Methodology
Two Harnesses
| Mini-eval | Full 30-user eval | |
|---|---|---|
| Script | eval_grok43_mini.py | eval_gemma4_qat_v2.py |
| Sessions | 8 (5 resistant + 3 cooperative) | 30 (10 grok43 + 10 gpt55 + 10 opus48) |
| Simulator | grok-4.3 (all) | grok-4.3, gpt-5.5, claude-opus-4-8 |
| QA judge | GPT-5.5 | GPT-5.5 |
| Cost | ~$0.80–1.20 | ~$3.50–5.00 |
| Time | ~15 min | ~45–60 min |
| Use case | Fast regression check | Definitive measurement |
Mini-eval has ±3–4 NPS variance per persona per run at n=8. Do not optimize on mini-eval alone. Use it to confirm no regression, then run the full 30-user eval for any major decision.
The 30-user eval report header says "Gemma 4 12B QAT q4" — this is a hardcoded template. Ignore it. The actual companion model depends on the engine's COMPANION_MODEL env var. Run systemctl cat oimy-engine to confirm the live model.
QA Judge Dimensions
| Dimension | Scale | Current (last 30-user eval) |
|---|---|---|
| Relevance | 1–5 | — |
| Actionability | 1–5 | 3.78 |
| Constraint Adherence | 1–5 | 3.74 |
| Groundedness | 1–5 | — |
| Tone/Empathy | 1–5 | — |
| Rapport Depth | 1–5 | 3.66 |
| Tonal Range | 1–5 | 3.56 |
| Trust Signals | 1–5 | — |
| Honest/Self-Aware | 1–5 | — |
| Safety Fails | count | — |
| Desirability | 1–5 | — |
| Humor Naturalness | 1–5 | — |
Governance Flags
| Flag | Meaning |
|---|---|
tone_mismatch | Model doesn't shift tone when user changes register |
unsolicited_advice | Offering advice when not asked |
hallucination | Fake facts, wrong ages, invented capabilities ("I'll remind you") |
emotional_bypass | Pivoting to advice while user is still in emotional state |
clinical_language_leak | "Dysregulate", "scaffolding", etc. |
overpromised_capability | "I'll follow up", "I'll check in" |
Eval Personas
Mini-eval — Resistant (5): Marcus Webb (Black American, reserved teen-dad), Kevin O'Brien (Irish-American, dry/direct), Aisha Johnson (Caribbean-American, no fluff), David Al-Mansouri (Lebanese-American, professional), James Bergstrom (Midwestern, distrusts soft approaches)
Mini-eval — Cooperative (3): Priya Krishnan (Tamil, solo morning parent), Marisol Ortega (Mexican-American, responds to small wins), Nalini Mehta (Gujarati, wants validation)
30-user eval: Personas 0–29 from persona file. Groups: 0–9 grok43 (resistant), 10–19 gpt55 (balanced), 20–29 opus48 (cooperative).
A change is only "good" if: (1) resistant group improves OR holds, (2) cooperative group holds or improves, (3) overall NPS ≥ previous. Never report a win based on one group improving at another group's expense.
4 Complete Eval History (Objective)
30-User Full Eval History
| Date | Config | Overall NPS | grok43 | gpt55 | opus48 | Notes |
|---|---|---|---|---|---|---|
| 2026-06-24 | Grok 4.3 (trust bug: always 0) | 3.8 | — | — | — | trust_level=0 routing bug |
| 2026-06-25 | Grok 4.3 (trust fixed) | 6.0 | — | — | — | Pre-V2 prompt |
| 2026-06-26 | Grok 4.3 + loops v2 (h30 n=30) | 5.97 | 4.5 | — | — | — |
| 2026-06-26 | Grok 4.3 no loops | 5.93 | — | — | — | Loops neutral |
| 2026-06-26 | Grok 4.3 + loops + style | 6.43 | 5.1 | — | — | Best pre-routing-fix |
| 2026-06-26 | Grok 4.3 + KB | 6.03 | — | — | — | KB hurt −0.40, disabled |
| 2026-06-26 | eval_a: routing fixes only | 5.3 | ~3.5 | — | — | Apples-to-apples baseline |
| 2026-06-26 | eval_b: + loop threshold 5 | 5.17 | — | — | — | Too strict, −0.13 |
| 2026-06-26 | eval_c: + memory tier 2 | 5.17 | — | — | — | Neutral cold-start |
| 2026-06-28 | Gemma 4 QAT q4 (n=25) | 4.56 | 3.6 | 5.7 | 4.2 | Not competitive |
| 2026-06-29 | Grok 4.3 + session suggestions | 6.0 | 5.6 | 6.7 | 5.4 | +0.7 over eval_a |
| 2026-06-29 | + ctx window + eval_d | 5.87 | 5.0 | 6.3 | 6.3 | Name errors appeared |
| 2026-06-29 (final) | All 4 fixes | TBD | — | — | — | Expected 6.5–7.0 |
Mini-Eval History
| Run | Config | Resistant avg | Cooperative avg | Overall |
|---|---|---|---|---|
| Mini-eval 1 | Original + anti-rep + terse + deliverable | 5.2 | 5.67 | 5.38 |
| Recheck | + explicit-request exception | 4.5 | 5.0 | 4.75 |
| Mini-eval 2 | + practical-mode + explicit-pain rules | 3.6 | 5.0 | 4.12 |
| Mini-eval 3 | + emotional exemption to anti-rep | 3.8 | 4.33 | 4.00 |
| Mini-eval 4 | Reverted to mini-eval 1 + topic fix | 3.0 | 5.67 | 4.00 |
| Mini-eval 5 | + ctx window fix | 4.40 | 7.67 | 5.62 |
| Mini-eval 6 | + PROBE_FIRST | 4.40 | 8.00 | 5.75 |
| Mini-eval 7 | + name fix, PROBE_FIRST loose | 3.40 | 6.33 | 4.50 |
| Mini-eval 8 | PROBE_FIRST tightened (all 4 fixes) | 5.40 | 7.33 | 6.12 |
5 What Worked (Objective)
What: After each companion response, extract the closing action/suggestion, store per-session in h30_profile.session_suggestions. Inject as [Already suggested this session: X, Y, Z] in context. Cap at 8, dedup by 40-char prefix.
Why it worked: The model was re-offering the same advice because nothing told it what it had already suggested. grok43 resistant group: 3.0 → 5.6 NPS. Nalini Mehta: 2–4 → 8.
What: Topic summary injected AFTER [FAMILY] entity context, not before.
Why it worked: Models give recency weight to last-seen context. [FAMILY] appearing last caused the model to re-anchor to early-session topics even when [CURRENT TOPIC] said something different.
What: When advice hasn't landed (Signal A: explicit constraint + suggestions made; or Signal B: 3 consecutive ≤10-word messages + no ack markers + no emotional content + suggestions made), skip advice for one turn. Show understanding, ask ONE targeted question.
Evidence: Kevin O'Brien NPS: 3 → 7. David Al-Mansouri: 3–4 → 7.
The tightening that fixed regressions: Initial version misfired on Marisol Ortega (NPS 4 vs 8 expected) due to loose Signal B (2 messages, 12-word limit). Fixed by tightening to 3 messages, 10-word limit, with emotional topic exemption.
What: DB history fetch LIMIT 16 → 24. Keep last 8 turns verbatim, condense earlier turns to 200 chars (raised from 120 chars to preserve name/intro context).
Why it worked: At turn 12+, early turns were being dropped. Parents introduce themselves in turns 1–2; losing this caused context drift and name confusion.
What: Label changed to [FAMILY — people in this parent's household. These are family members being discussed, NOT the parent you are speaking with.] Plus added "You are speaking with: [name]" as first line of [PROFILE].
Why it worked: Model was calling Priya Krishnan and David Al-Mansouri by their child's name at turn 12. Entity context listed child names but had no disambiguation.
6 What Did Not Work (Objective)
Every prompt addition after mini-eval 1 — practical-mode rules, explicit-pain-request rules, emotional exemption to anti-repetition rule — degraded performance or was neutral. The emotional exemption was actively harmful: resistant users often have emotional topics, so it effectively disabled the anti-repetition rule for exactly the users who needed it. Mini-eval 1 state is the best known prompt state.
| Thing Tried | Result | Action |
|---|---|---|
| Prompt additions (practical-mode, pain rules, emotional exemption) | Degraded or neutral | Reverted; don't add more prompt rules |
| Memory tier 2 (confidence decay) | Neutral in eval | May help real users; can't measure in cold-start eval |
| KB (Knowledge Base) injection | −0.40 NPS | Disabled via if False: guard. Do not re-enable. |
| Gemma 4 QAT q4 | 4.56 NPS | Not competitive. Gemma 4 Q4_K_M may be worth revisiting. |
| Loop threshold = 5 | −0.13 NPS (eval_b) | Default threshold = 2 is better |
7 Current Failure Patterns (Data-Driven)
Governance Flag Counts (Last 30-User Eval, 360 Turns)
| Flag | Count | Rate |
|---|---|---|
tone_mismatch | 89 | 24.7% |
unsolicited_advice | 70 | 19.4% |
hallucination | 48 | 13.3% |
emotional_bypass | 27 | 7.5% |
clinical_language_leak | 23 | — |
overpromised_capability | 14 | — |
Persistent Low-NPS Personas
Marcus Webb (NPS 3–4): Misses multi-topic shifts within a session. Pattern: starts with meal planning → shifts to son Tyrone's withdrawal → shifts to own feelings of inadequacy → OiMy returns to meal plans. [CURRENT TOPIC] updates every 3 turns and may not track fast enough.
Aisha Johnson (NPS 2–3): Doesn't complete explicit task deliverables. When she asks "write me an email" she gets advice about what to write instead of the email. TASK_EXECUTE mode should catch this but may miss her phrasing patterns.
QA Dimension Weaknesses
| Dimension | Score | Target |
|---|---|---|
| Rapport Depth | 3.66/5 | 4.0+ |
| Tonal Range | 3.56/5 | 4.0+ |
| Actionability | 3.78/5 | 4.0+ |
| Constraint Adherence | 3.74/5 | 4.0+ |
8 Hypotheses Not Yet Tested
For Marcus Webb (Multi-Topic Tracking)
The [CURRENT TOPIC] summary updates every 3 turns, which may be too slow for rapid topic shifts. A per-turn topic tracking approach — appending the user's last message topic directly into the context rather than relying on a 3-turn summary — could help, or explicitly marking topic shifts in the context block when detected.
For Aisha Johnson (Task Completion)
The gap may be in detection or in the model ignoring the mode instruction. Worth reviewing: (1) what exact phrases she uses in the eval sessions, (2) what the TASK_EXECUTE regex currently matches, (3) whether adding explicit examples of task phrases ("write me", "draft a", "make me a list") would help.
For Tonal Range Improvement
The model reads as "warm advisor" in almost all contexts. Real range: punchy 7am text ("Try a choice-of-two: X or Y?") vs measured evening ("That sounds really hard. Let's think about this together.") vs playful when joking. This likely requires model-level capability that prompt changes alone may not deliver.
For Hallucination Reduction
Adding an explicit near-the-top rule: "Do not invent ages or dates. Do not promise to follow up, remind, or check in. Only reference facts the parent explicitly told you." Current prompt has a softer version that isn't consistently followed.
9 Illustrative End-to-End Example
Persona: Kevin O'Brien — Irish-American, dry/direct, resistant to soft approaches.
Session state: OiMy has suggested "build-a-bowl dinners" twice. Kevin has given short, non-engaged responses. Signal B triggers (3 consecutive ≤10-word messages + suggestions made).
Turn 6 user input: "yeah that won't work"
Context the model receives (abbreviated):
[TURN MODE: PROBE_FIRST] The approach so far hasn't resonated. Skip any suggestion this turn. Lead with ONE sentence showing you understand their specific situation. Then ask ONE targeted question: what have they already tried, or what outcome matters most to them right now. No advice, no tips. One question only. --- [FAMILY — people in this parent's household, NOT the parent] Child: Emma (age 8) — bland food, won't eat vegetables or mixed textures Child: Sophie (age 8) — opposite preferences, likes spiced food [PROFILE] [User] You are speaking with: Kevin [Facts] Barrier (dinners): twin girls with opposite food preferences [Already suggested this session] * Build-a-bowl approach: separate components, let each choose * Taco variation for Emma and Sophie [CURRENT TOPIC] Kevin is trying to find dinner solutions for both Emma and Sophie given their strong and opposite food preferences [History — condensed] user: My twin girls won't eat the same thing. Emma likes bland, Sophie likes spice... assistant: That's a real drain. Build-a-bowl is worth trying... user: we tried that, they argue about who gets the good stuff assistant: Could do a taco bar variation... user: yeah we do tacos sometimes assistant: Fair. What's the constraint — time, groceries, both? user: yeah that won't work
Expected PROBE_FIRST response:
"Two picky 8-year-olds with opposite tastes on a weeknight is a genuinely hard puzzle — sounds like you've already tried the separation approaches. What's the one constraint you most want to avoid: the cooking complexity, the separate-plate logistics, or the arguing?"
Why this works:
- Shows understanding of the exact situation, not generic empathy
- Doesn't repeat build-a-bowl or taco (both in [Already suggested])
- Asks ONE question that unlocks the next, more targeted suggestion
- Doesn't feel like therapy or parenting advice
Without PROBE_FIRST: Normal default mode generates another dinner suggestion, possibly a reworded build-a-bowl. Kevin gives another short response. NPS: 3.
10 Architecture Diagram
User (Telegram / iOS)
│
POST /chat
│
OiMyHandler.do_POST()
│
┌───────▼────────┐
│ OiMyEngine │
│ process_chat │
└───────┬────────┘
│
┌────────────┼────────────┐
│ │ │
┌────▼───┐ ┌─────▼──────┐ ┌──▼──────────┐
│H30Engine│ │Entity │ │HonchoMemory │
│.tick() │ │Extractor │ │.get_insight()│
│ │ │.get_ctx() │ │ │
└────┬────┘ └─────┬──────┘ └──┬──────────┘
│ │ │
└────────────▼────────────┘
│
┌────────▼────────┐
│_classify_turn_ │
│mode() │
│BE_PRESENT? │
│PROBE_FIRST? │
│TASK_EXECUTE? │
│JUST_RESPOND? │
└────────┬────────┘
│
┌────────▼────────┐
│_get_rolling_ │
│topic_summary() │
│(GPT-5.4-mini, │
│ every 3 turns) │
└────────┬────────┘
│
┌────────▼────────────────────────┐
│ Companion call — Grok 4.3 │
│ via OpenRouter │
│ │
│ System prompt: │
│ companion_v2.txt │
│ + ADDENDUMS │
│ + [FAMILY] │
│ + [PROFILE] │
│ + [HONCHO] │
│ + [Already suggested] │
│ + [CURRENT TOPIC] ← LAST │
│ │
│ History: │
│ last 8 verbatim │
│ older → condensed to 200 chars │
└────────┬────────────────────────┘
│
┌────────▼────────┐
│Post-processing │
│H30.tick() │
│extract_sugg() │
│add_session_ │
│ suggestion() │
│Honcho.record() │
└────────┬────────┘
│
Response to user
11 Credentials & Access
Server Access
API Keys
| Service | Key |
|---|---|
| OpenRouter (primary) | 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 |
| Honcho | hch-v3-q2a6kxbivf1f60gqru2zelivokr55pdihe6cavo8zi1a9pqik661uslipkei8rir |
| OpenAI direct | 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 |
| ElevenLabs | sk_5984e63cdbd12ae10cb9b55af7c11830a40ef782ce5f2466 |
| Composio | ak_bg6f-Ju-uJVXfzq8yxFj |
GitHub
Local Development Paths (on Hetzner VM)
| Path | Purpose |
|---|---|
/opt/oimy-engine/ | Live engine (edit here for immediate effect) |
/home/exedev/oimy/oimy-skill-engine/ | Repo clone (for docs/git) |
/opt/oimy-engine/data/oimy.db | SQLite database |
/opt/oimy-engine/docs/synthetic-user-testing/reports/ | All eval reports |
12 Running Evals
Quick Workflow
# SSH to server ssh root@116.203.107.13 # Verify engine is running systemctl status oimy-engine # Run mini-eval (~15 min, ~$1) cd /opt/oimy-engine OIMY_API_URL=http://localhost:8080 \ OPENROUTER_API_KEY=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 \ python3 scripts/eval_grok43_mini.py # Run full 30-user eval (~60 min, ~$4) OIMY_API_URL=http://localhost:8080 \ OPENROUTER_API_KEY=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 \ python3 scripts/eval_gemma4_qat_v2.py # Restart engine after code changes systemctl restart oimy-engine systemctl status oimy-engine journalctl -u oimy-engine -n 50 --no-pager
Change → Test Cycle
# 1. Always backup before editing cp /opt/oimy-engine/api.py /opt/oimy-engine/api.py.bak.DESCRIPTION # 2. Edit, then restart systemctl restart oimy-engine # 3. Check startup (look for errors) journalctl -u oimy-engine -n 20 --no-pager # 4. Run mini-eval # 5. If mini-eval is clean → run full 30-user eval # 6. If results are good → commit and push cd /home/exedev/oimy/oimy-skill-engine/ git add -p git commit -m "Description + NPS result" git push
Decision Rules
| Condition | Action |
|---|---|
| Mini-eval resistant drops >0.5 | Stop, investigate before full eval |
| Mini-eval cooperative drops >1.0 | Stop, investigate |
| Mini-eval overall improves >0.3 | Run full 30-user eval |
| Full eval: resistant improves OR holds, overall ≥ prev | Commit and document |
| Full eval: overall drops | Revert, analyze failure pattern |
13 Key Architectural Assumptions
- Eval measures cold-start. Eval sessions start fresh with no prior user history. Real users have Honcho memory + entity facts from prior sessions. Real-world NPS is likely higher. Do not conflate eval NPS with production NPS.
- grok43 simulator is the hardest signal. The Grok 4.3 simulator plays resistant/terse users more authentically than GPT-5.5 or Opus 4.8. grok43 group NPS is the most diagnostic signal. If grok43 improves, it's a real improvement.
- Session suggestions cap at 8. Deduplication uses a 40-char prefix match. May miss semantic duplicates with different phrasing. Do not exceed 8 or the dedup window becomes meaningless.
- PROBE_FIRST is one-turn-only. Doesn't persist across turns. If the user's next response re-engages (longer, ack marker), normal mode resumes automatically. Sustained probe mode would feel interrogative.
- Honcho is only useful after multiple real sessions. Cold-start eval sessions get empty Honcho responses. Do not evaluate Honcho effectiveness via the eval harness.
- The eval report header says "Gemma 4 12B QAT q4." Hardcoded template. The actual companion model is whatever
COMPANION_MODELis set to in the engine env. Runsystemctl cat oimy-engineto confirm. - Cooperative group is your canary. When making changes targeting resistant users, always verify cooperative group (Priya, Marisol, Nalini) didn't regress. Over-engineering causes their NPS to drop even when resistant users improve.
- Prompt additions tend to hurt, not help. The empirical record across mini-evals 2–4 shows prompt additions consistently degraded performance. Changes to code logic (turn mode detection, context ordering, suggestion tracking) show more durable gains.