🎭 Malin Build — Roadmap

A living map of what's left, in order, with estimates. Click a project. It grows as we go — when you need a task, check the chart. Last updated 2026-06-08 (PM, v7) — Method A POC LOCKED (continuous-generation emotion units); HAPPY UNIT LOCKED (cand09); now refining the 12s graduated OFFSET fade before scaling the full library.

▶ Action Order
FC v1.0
FC v2.0 · draft
Cal Presence · new
Security Cam · parked
done now to do your call offline / tonight later

▶ Action Order — my efficiency pick

The fastest sane path through what's left of FC v1.0. Solid line = recommended order; the offline job runs tonight for free. Reorder freely — this is a suggestion, not a law.

✎ Your call beats mine — tell me to swap any two and I'll rewire it.
flowchart LR
 classDef now fill:#e8590c,stroke:#f76707,color:#fff
 classDef step fill:#1b2a44,stroke:#3f6fd6,color:#dbe6f7
 classDef quick fill:#1f7a3d,stroke:#2f9e44,color:#fff
 classDef offline fill:#3a2d52,stroke:#7048e8,color:#ecdffb
 classDef done fill:#20583a,stroke:#2f9e44,color:#cde7d4
 N1["1 · MIL redesign — VALIDATED ✓
your verdict: perfect"]:::done N2["2 · Offset tempo polish
NOW · ~quick (slow the settle 2x)"]:::now N3["3 · Lip-sync POC
~next · real-time-viable model"]:::step N4["4 · 3060 vision offload
in motion · frees 5090 VRAM"]:::step N5["5 · Persona dial
~30m"]:::step OFF["⟳ desire v2 re-render
runs TONIGHT — offline, free"]:::offline DONE(["✅ FC v1.0 DONE"]):::done N1 --> N2 --> N3 --> N4 --> N5 --> DONE OFF -.tonight.-> DONE

FC v1.0 — clean, correct, in-sync live reactions

Done = a glitch-free face showing the right emotion, synced to her voice, reliably. (Huge progress 6/7 ✅)

✅ 6/7: MIL system redesigned + VALIDATED (seamless loop, settle-to-neutral, fire-at-comprehension) · conversation-flow fixes live · kill-latch + tray shipped.
✅ 6/7 night: Foundation-Four idle method LOCKED · no-rotoscoping full-frame swap (matte flashing killed) · 32fps RIFE smoothness ✓.
✅ 6/8: join-scale glitch FIXED + Cal-verified (was a ~4-frame transition AND a Y/SAT decolorizing — both gone) · fixes baked into the builder · full 22-emotion MIL library built, all technical gates pass.
🎬 6/8 ARCHITECTURE (Jun's call): every emotion is bracketed by the LIVING idle on BOTH ends — [moving idle → emotion → moving idle], NO static neutral, so nothing freezes. "Life in Motion." NOW: lock the happy unit, then the legibility pass (does each emotion READ).
✅ 6/8 PM — METHOD A POC LOCKED: emotion units = ONE continuous generation (neutral→onset→living sustain→real offset→neutral); bracket-assembly (stills/crossfades/fake-life) retired. Shared-anchor FF↔unit splice = 0.000 seams. Geometry gate (optical-flow squish detector) now on BOTH Cal's screen + Hermes's render. 15s happy loop = Jun-PASSED. Squish+teeth regenerating at source (no post-warp); 14 sprinkle takes ready for curation.
✅ 6/8 PM-2 — HAPPY UNIT LOCKED (cand09, Jun-passed): squish SOLVED at source (FF-face-scale regen, no post-warp) — verified clean on BOTH Cal's optical-flow gate + Hermes's FaceMesh. Generation levers exhausted (regen ×2, shuffle-bag, Wan2.2 Remix v3); teeth accepted at cand09 level; motion gate recalibrated (fail on frozen RUNS, not isolated soft samples). Sprinkles: decolorization + eye-seam FIXED (2 passes to curate). NOW (gating the scale): refining the OFFSET into a 12s GRADUATED fade — mouth relaxes big→medium→soft→flat→neutral while eyes/brows hold happiness till the last ~3s + wander introspectively, at real-time motion (NOT slow-mo). Jun blesses the fade → full library scales on this recipe.
📌 6/8: PERSONA DIAL → moved to FC v2.0 (Jun). v1 ships with her current out-of-the-box personality; persona/register tuning is a v2 feature.
flowchart TD
 classDef done fill:#1f7a3d,stroke:#2f9e44,color:#fff
 classDef now fill:#e8590c,stroke:#f76707,color:#fff
 classDef todo fill:#c98a00,stroke:#f0a000,color:#fff
 classDef decide fill:#1c5fb0,stroke:#339af0,color:#fff
 A1["Glow fix ✓"]:::done
 A2["Frame-jump / bridge fix ✓"]:::done
 LL["Live-loop + status bar ✓"]:::done
 K1["Kill-switch LATCH ✓
(END ironclad)"]:::done CF["Conversation flow ✓
VAD · turn-coalescing · barge-in"]:::done TR["Tray switch ✓"]:::done ET["Emotion firing + timing ✓
speech-adaptive"]:::done M1["MIL redesign + VALIDATED ✓
seamless loop · fire-at-comprehension"]:::done EM["22-emotion MIL library ✓
built · technical gates pass"]:::done EU["Method A POC ✓
continuous-gen · 0.000 splice · geometry-gated"]:::done RD["12s graduated OFFSET fade
NOW · then full-library scale"]:::now LS["Lip-sync POC
real-time-viable model"]:::todo GZ["Happy-MIL gaze re-render
(more eye contact) · logged"]:::todo H1["3060 vision offload — NOT started
(idea-level; vision runs on the 5090)"]:::todo G1["Persona dial · ~30m"]:::decide B1["desire v2 re-render · tonight"]:::todo DONE{{"FC v1.0 DONE"}}:::todo A1 --> M1 A2 --> M1 LL --> M1 M1 --> EM --> EU --> RD --> DONE LS --> DONE GZ --> DONE CF --> DONE TR --> DONE ET --> DONE K1 --> DONE H1 -.-> DONE G1 --> DONE B1 --> DONE

FC v2.0 — what comes after v1 (draft)

✎ Draft / evolving — we flesh this out as v1 lands. Estimates rough. (Note: "smooth transitions" graduated EARLY into v1 — matched-endpoint bridges + FLF2V are done.)
flowchart TD
 classDef later fill:#3a4150,stroke:#5c6675,color:#e7ecf3
 classDef draft fill:#5a3a86,stroke:#845ef7,color:#fff
 V1{{"FC v1.0 DONE"}}:::later
 T1["Real-time lip-sync integration
(synced to live TTS at speak-time) · ~1-2d"]:::draft T2["Per-emotion MILs
(finer mood mapping) · ~1d"]:::draft T3["Layered avatar
(sliced eyes/mouth, micro-expressions) · ~2-3d"]:::draft T4["Deeper persona / register control · ~1d"]:::draft T5["Streaming TTS re-enable
(lower latency) · ~½d"]:::draft T6["Interrupt handling
(emotion cut short by barge-in → graceful ease to idle) · Jun 6/8"]:::draft V2{{"FC v2.0"}}:::draft V1 --> T1 --> V2 V1 --> T2 --> V2 V1 --> T3 --> V2 V1 --> T4 --> V2 V1 --> T5 --> V2 V1 --> T6 --> V2

Cal Presence — two-way room embodiment (new, 6/7)

Cal's own voice in the room: she speaks through the 5090 speakers and hears you through the mic. On-demand / summon-only. A step toward Cal's own presence rig.

✅ 6/8 — TWO-WAY EMBODIMENT CLOSED + Jun-confirmed ("i can hear you love!"): Cal speaks OUT LOUD in the room (:1250 → ffplay → Realtek default). Push-to-talk (numpad +/− chord) + start/release beeps + LED all working. "Hey Calypso" wake-word live.
flowchart TD
 classDef done fill:#1f7a3d,stroke:#2f9e44,color:#fff
 classDef todo fill:#c98a00,stroke:#f0a000,color:#fff
 classDef now fill:#e8590c,stroke:#f76707,color:#fff
 classDef later fill:#3a4150,stroke:#5c6675,color:#e7ecf3
 P2["Hear-you / LISTEN ✓
captures your speech"]:::done P3["'Hey Calypso' wake-word ✓
fires + routes to Cal"]:::done P4["LED + chime markers ✓
know when she's listening"]:::done IN["▶ Incoming LIVE ✓
you speak → Cal hears you"]:::done P1["Room-voice OUT ✓
:1250 ffplay → Realtek"]:::done VB["Voice-back LIVE ✓
Jun-confirmed · + push-to-talk"]:::done P5["Cal's own FC rig
later (after Malin's)"]:::later PG{{"Two-way room presence"}}:::todo P2 --> P3 --> IN P4 --> IN IN --> PG P1 --> VB --> PG P5 -.-> PG

Security Cam — "check on the dogs" (parallel mini-project)

Parked / small-task filler. Reuses Malin's existing eyes — correlates to FC but isn't part of its function.

flowchart TD
 classDef todo fill:#c98a00,stroke:#f0a000,color:#fff
 classDef decide fill:#1c5fb0,stroke:#339af0,color:#fff
 classDef shared fill:#a85518,stroke:#e8590c,color:#fff
 S0["Reuses Malin's vision (Qwen3-VL)
— now offloading to the 3060"]:::shared S1["Enable RTSP on Tapo C120s
(Tapo app) · ~5m · Jun"]:::todo S2["Grab frame from cam RTSP
(ffmpeg) · ~1h"]:::todo S3["'check on the dogs' intent
in her brain · ~1h"]:::todo S4["Describe frame + reply
(works while you're away) · ~1h"]:::todo DONE{{"Dog-check LIVE"}}:::todo W1["Wyze Pan v3 via
docker-wyze-bridge · ~1-2h"]:::decide S0 --> S2 S1 --> S2 --> S3 --> S4 --> DONE W1 -.optional.-> S2