OiMy Codex Agent Briefing

Complete zero-context brief for improving companion NPS from ~6.0 to 8+. Self-contained: no other documentation required.

Mission: NPS 6.0 → 8+ 2026-06-29 Sensitive — Contains Live Credentials

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.

Mission

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

ComponentDetails
ServerHetzner VPS — root@116.203.107.13
OiMy engine/opt/oimy-engine/ — Python HTTP server on port 8080
Engine serviceoimy-engine.service (systemd)
SQLite database/opt/oimy-engine/data/oimy.db
PostgreSQL 17Port 5432 — OiMy Platform (separate from engine SQLite)
pgBouncerPort 6432 — connection pooler for Vercel
GitHub repoaahalife/oimy-skill-engine

Key Files

FilePurpose
/opt/oimy-engine/api.pyMain HTTP server + OiMyEngine class (~4363 lines). Full request pipeline, companion calls, turn mode detection, context assembly.
archetypes/h30.pyH30Engine class. Session-level behavioral tracking: engagement level, constraints, session suggestions, probe history.
archetypes/entity_extraction.pyExtracts family entities (children, barriers, preferences) from conversation, stores in SQLite.
archetypes/honcho_memory.pyHonchoMemory wrapper. Records turns and retrieves dialectic insights for cross-session context.
archetypes/inference.pyInferenceEngine class. Manages H30, deep profile inferences.
prompts/gemma4_12b_companion_v2.txtMain companion system prompt (~201 lines).
scripts/eval_grok43_mini.pyMini-eval harness (8 sessions: 5 resistant + 3 cooperative).
scripts/eval_gemma4_qat_v2.pyFull 30-user eval harness (30 sessions, 3 simulator groups).
docs/synthetic-user-testing/reports/All eval reports.

Model Stack (Current Production)

RoleModelRoute
Companion (primary)x-ai/grok-4.3OpenRouter
Router / topic summary / entity extractionopenai/gpt-5.4-miniOpenRouter
Bridge / async tasksopenrouter/moonshotai/kimi-k2.6OpenRouter
Deep profile inferencesopenrouter/anthropic/claude-opus-4.8OpenRouter

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:

1
BE_PRESENT
Explicit "don't want advice"; distress signals detected
2
PROBE_FIRST
Signal A: session_constraints ≥ 1 + suggestions already made. Signal B: 3 consecutive ≤10-word messages + no ack markers + no emotional content + suggestions already made
3
PLAN_FORGE
User committed to something ("I'll try", "I did it")
4
TASK_EXECUTE
Explicit deliverable requested ("draft", "write", "make a list")
5
JUST_RESPOND
Casual conversation
6
VENTING
Emotional, no question, no task
7
(default)
Normal coaching response

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]
Why Order Matters

[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-evalFull 30-user eval
Scripteval_grok43_mini.pyeval_gemma4_qat_v2.py
Sessions8 (5 resistant + 3 cooperative)30 (10 grok43 + 10 gpt55 + 10 opus48)
Simulatorgrok-4.3 (all)grok-4.3, gpt-5.5, claude-opus-4-8
QA judgeGPT-5.5GPT-5.5
Cost~$0.80–1.20~$3.50–5.00
Time~15 min~45–60 min
Use caseFast regression checkDefinitive measurement
⚠ Mini-eval Variance Warning

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.

Hardcoded Report Header

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

DimensionScaleCurrent (last 30-user eval)
Relevance1–5
Actionability1–53.78
Constraint Adherence1–53.74
Groundedness1–5
Tone/Empathy1–5
Rapport Depth1–53.66
Tonal Range1–53.56
Trust Signals1–5
Honest/Self-Aware1–5
Safety Failscount
Desirability1–5
Humor Naturalness1–5

Governance Flags

FlagMeaning
tone_mismatchModel doesn't shift tone when user changes register
unsolicited_adviceOffering advice when not asked
hallucinationFake facts, wrong ages, invented capabilities ("I'll remind you")
emotional_bypassPivoting 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).

Governance Rule

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

DateConfigOverall NPSgrok43gpt55opus48Notes
2026-06-24Grok 4.3 (trust bug: always 0)3.8trust_level=0 routing bug
2026-06-25Grok 4.3 (trust fixed)6.0Pre-V2 prompt
2026-06-26Grok 4.3 + loops v2 (h30 n=30)5.974.5
2026-06-26Grok 4.3 no loops5.93Loops neutral
2026-06-26Grok 4.3 + loops + style6.435.1Best pre-routing-fix
2026-06-26Grok 4.3 + KB6.03KB hurt −0.40, disabled
2026-06-26eval_a: routing fixes only5.3~3.5Apples-to-apples baseline
2026-06-26eval_b: + loop threshold 55.17Too strict, −0.13
2026-06-26eval_c: + memory tier 25.17Neutral cold-start
2026-06-28Gemma 4 QAT q4 (n=25)4.563.65.74.2Not competitive
2026-06-29Grok 4.3 + session suggestions6.05.66.75.4+0.7 over eval_a
2026-06-29+ ctx window + eval_d5.875.06.36.3Name errors appeared
2026-06-29 (final)All 4 fixesTBDExpected 6.5–7.0

Mini-Eval History

RunConfigResistant avgCooperative avgOverall
Mini-eval 1Original + anti-rep + terse + deliverable5.25.675.38
Recheck+ explicit-request exception4.55.04.75
Mini-eval 2+ practical-mode + explicit-pain rules3.65.04.12
Mini-eval 3+ emotional exemption to anti-rep3.84.334.00
Mini-eval 4Reverted to mini-eval 1 + topic fix3.05.674.00
Mini-eval 5+ ctx window fix4.407.675.62
Mini-eval 6+ PROBE_FIRST4.408.005.75
Mini-eval 7+ name fix, PROBE_FIRST loose3.406.334.50
Mini-eval 8PROBE_FIRST tightened (all 4 fixes)5.407.336.12

5 What Worked (Objective)

Session Suggestion Tracking — +0.7 NPS in 30-user eval

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.

[CURRENT TOPIC] Reordering

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.

PROBE_FIRST Mode (tightened)

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.

Context Window Fix

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.

[FAMILY] Disambiguation Fix

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)

Prompt Additions Beyond Mini-Eval 1 State

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 TriedResultAction
Prompt additions (practical-mode, pain rules, emotional exemption)Degraded or neutralReverted; don't add more prompt rules
Memory tier 2 (confidence decay)Neutral in evalMay help real users; can't measure in cold-start eval
KB (Knowledge Base) injection−0.40 NPSDisabled via if False: guard. Do not re-enable.
Gemma 4 QAT q44.56 NPSNot 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)

FlagCountRate
tone_mismatch8924.7%
unsolicited_advice7019.4%
hallucination4813.3%
emotional_bypass277.5%
clinical_language_leak23
overpromised_capability14

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

DimensionScoreTarget
Rapport Depth3.66/54.0+
Tonal Range3.56/54.0+
Actionability3.78/54.0+
Constraint Adherence3.74/54.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

💡 Kevin O'Brien at Turn 6 — PROBE_FIRST in action

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

🔒
Security Warning — Live Production Credentials
This section contains live production credentials. Do not post publicly, commit to a public repo, share the URL broadly, or log to any monitoring system. Treat this document like a password manager entry. SSH password is intentionally omitted — Bharath provides it separately.

Server Access

Host
root@116.203.107.13
Auth
Password-based SSH
SSH password
Provided by Bharath separately — not stored here
Alternative
Add your SSH public key to /root/.ssh/authorized_keys

API Keys

ServiceKey
OpenRouter (primary)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
Honchohch-v3-q2a6kxbivf1f60gqru2zelivokr55pdihe6cavo8zi1a9pqik661uslipkei8rir
OpenAI directsk-proj-VCyrMIS_htE_tUFtiAL0YewYOrKazH2pb-BsUxBBiqjy1EN-Emt-3dzcPpP1I3690sTkXjJukUT3BlbkFJYPH3okGk6cflrglsrTmkK48ri9VHFVm_d0pBRV2XTRo-VOzO-WKpOPMSUd7QEHaRwg2J4E3WoA
ElevenLabssk_5984e63cdbd12ae10cb9b55af7c11830a40ef782ce5f2466
Composioak_bg6f-Ju-uJVXfzq8yxFj

GitHub

Repo
https://github.com/aahalife/oimy-skill-engine
PAT
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
Clone
git clone https://oauth2:[PAT]@github.com/aahalife/oimy-skill-engine.git

Local Development Paths (on Hetzner VM)

PathPurpose
/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.dbSQLite 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

ConditionAction
Mini-eval resistant drops >0.5Stop, investigate before full eval
Mini-eval cooperative drops >1.0Stop, investigate
Mini-eval overall improves >0.3Run full 30-user eval
Full eval: resistant improves OR holds, overall ≥ prevCommit and document
Full eval: overall dropsRevert, analyze failure pattern

13 Key Architectural Assumptions

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. The eval report header says "Gemma 4 12B QAT q4." Hardcoded template. The actual companion model is whatever COMPANION_MODEL is set to in the engine env. Run systemctl cat oimy-engine to confirm.
  7. 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.
  8. 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.