Fable 5's psychological analysis, refined against live code, turned into a phased implementation plan by GPT-5.6-Sol (via Codex), then reviewed by Fable 5 for whether the plan actually preserves the psychology — not just the feature shape — with disagreements resolved by evidence, not by deferring to whichever model spoke last.
Surfaced by this review, unrelated to parenting: the request_ctx bug from this morning's audit is worse than first scoped. Fable 5's independent check found the NameError is inside a try block whose own except swallows it — meaning the chat-fallback branch of _execute() fails every time it's hit today, not just on crisis/escalation turns, and those users get static last-resort text instead of a real response. Recommendation: ship the one-line fix now, independent of the parenting timeline — not batched with anything else.
Second, smaller finding in the same pass: the repo root has stale June-1 copies of coach.py and scaffold_prompts.py, and an empty stale h30.db, sitting alongside the real archetypes/ versions and data/oimy.db. An engineer editing from memory could edit the dead copy and see nothing change. Worth cleaning up in Phase 0.
Codex's plan opened with seven places it disagreed with Fable 5's Round-1 recommendation after its own code read. Fable 5's review checked each with a fresh SSH pass — all seven held up.
Six substantive changes to Codex's draft — not just approval, real engineering and psychological corrections.
'worse' as a value — Phase 2 needs to add it and define the old→new outcome-enum mapping explicitly, or a family that says "that made it worse" keeps getting the same loop context injected anyway.Not a product phase — the reliability floor the parenting features would otherwise stand on top of and quietly compound. Fixes 8 of this morning's 14 audit findings: request_ctx, fallback context-dropping, governance accepting residual violations, the bridge bypassing governance, expired-outbox delivery, shared SQLite connections, never-expiring session constraints, and 504-workers committing state after their own deadline.
All eight independently re-verified live this round. Kill switch: OIMY_DISABLE_PARENTING_STRATEGY=1 gates everything downstream of this phase.
New archetypes/repair_engine.py, a ParentingCoordinator placed after profile construction and before the bridge-force check in the request lifecycle, new tables parenting_repair_cases / parenting_touchpoints. Detects rupture disclosure → presence-first acknowledgment (turn-mode instructions confirmed live: "Do NOT give advice, tips, suggestions, scripts, or next steps" stays in force on the disclosure turn) → one of 3–5 masked consent-gated offer phrasings → age-resolved, dialect-rendered repair script through the fully governed companion path → next-morning follow-through via a new hourly touchpoint scheduler, separately consented.
One offer per rupture; an unanswered offer goes quiet, not repeated. No clinical-language exemption, ever. Smallest build of the five phases, highest confidence — most of the machinery (rupture detection, presence gating, kitchen-table language enforcement) already ships today for other reasons.
New archetypes/loop_outcomes.py, normalized loop_outcomes table with a unique idempotency key, hardened thread-local _conn() for loop_state.py (currently bare sqlite3.connect, no timeout/WAL), record_loop_outcome() rewritten under BEGIN IMMEDIATE with an existence check. trend_json becomes a compatibility projection over the new table, not the source of truth. handle_loop_outcome() stays unwired until its stop-condition logic — currently a string search for four hardcoded tokens, ignoring the actual condition — gets redesigned.
No backfill from the 3,920 historical activations that never got an outcome — start clean going forward. The 'worse' suppression fix (change #3 above) ships in this phase.
New archetypes/family_playbook.py. Immutable plan versions, one active plan per loop enforced by a partial unique index, draft→confirm→activate authoring flow in calm. On recall: retrieval keyed to which loop actually matched this turn (not the current arbitrary "first two active rows" injection), one plan max per response, a ledger-exclusion preflight before the model call, and — the critical fix — advice_authorized scoped to the exact hash of the recalled plan text only, with the semantic advice checker staying fully active on everything else and zero new strategies allowed. Also replaces the hardcoded "OiMy has no persistent memory between sessions" line, which becomes false the moment plan retrieval ships.
Canary uses the existing multi-day loop0_whitaker_4 test lineage, extended to score cross-cycle plan retrieval specifically.
Additive columns on h30_profile (guarded by PRAGMA table_info checks, not H30's existing broad-except migration pattern), populated only from explicit signal — never inferred from engagement or DISC — NULL means unknown, never shown back to the parent as a label. Precedence ladder: safety > current explicit request > hard consents > explicit dialect > BCT tone > DISC/attachment. Blocked on the shared anchor-rendering unification from the disagreement above. Canary gate: no increase in unsolicited-advice or emotional-bypass eval failures.
Smallest, correctly last. In-conversation only to start (outbound stays behind a separate switch and separate consent), one sentence maximum, only when it helps answer the current question — never a milestone lecture. Windows ≥24 months wide (integer-year ages can't support narrower), confidence ≥0.85 and ≤90-day freshness required on stored age facts; a current-turn stated age can bypass that for the current turn only. Never fires during crisis, VENTING, BE_PRESENT, PROBE_FIRST, or explicit don't-fix turns.
| Order | Deliverable | Notes |
|---|---|---|
| Now | request_ctx hotfix | Live user-facing defect — ships independently, immediately |
| 0 | Foundation hardening | OIMY_DISABLE_PARENTING_STRATEGY=1 gates everything below |
| 1 / 1B | Repair core / follow-up | Follow-up gated on the outbox-expiry fix + separate outbound consent |
| 2 | Loop outcomes | Includes the 'worse' suppression fix |
| 3 | Playbook authoring/recall | With hash-scoped advice authorization |
| 4 | Dialect | Anchor-render unification is the blocker |
| 5 | In-conversation anticipation | Outbound stays off |
The closing invariant, as Fable 5 put it: presence and consent decide whether OiMy may intervene; durable state decides what it may recall; governance still decides what it may say.
Every citation in the review pass was re-checked against production HEAD 976b318 over live SSH, not assumed from either model's prior output. Full engineering detail (schemas, near-diffs, exact function names) exists in the underlying session transcripts — this page is the converged plan Bharath asked for; ask for the full technical appendix if an engineer needs to start building directly from it.