| # Immersive Time-Travel Experience Execution Plan | |
| Date: 2026-06-13 | |
| ## Product Direction | |
| Build a surreal time-travel spectacle first. The user should not feel like they opened a voice chatbot; they should feel like they activated a machine, crossed a portal, landed in another time, and met a person who belongs there. | |
| The core demo sequence: | |
| 1. User chooses coordinates and presses **Launch**. | |
| 2. The cockpit begins a dramatic portal sequence. | |
| 3. A year counter rewinds or fast-forwards from the current year into the destination year. | |
| 4. The portal hides model latency while world, character, and optional narration assets are prepared. | |
| 5. The destination fades in slowly: first atmosphere, then world image, then character portrait. | |
| 6. A narrator voice introduces the world and character in a cinematic tone. | |
| 7. The narrator voice stops. The character voice is clearly different. | |
| 8. Live conversation begins inside the revealed world. | |
| 9. The user can ask for an artifact/souvenir and receive a visual object from that world. | |
| ## Hackathon Constraints | |
| - The app remains a Gradio app hosted as a Hugging Face Space. | |
| - The 32B parameter limit is treated as **per model used**, not cumulative across all models. | |
| - Every model used for core functionality must have an individually defensible parameter count. | |
| - Cloud APIs are allowed unless a specific bonus badge requires local-only operation. We are optimizing for wow and reliability, not Off-the-Grid. | |
| - Current model choices remain valid: | |
| - LLM: Qwen/Qwen3-8B, 8B. | |
| - STT: nvidia/nemotron-3.5-asr-streaming-0.6b, 0.6B. | |
| - TTS: ResembleAI/chatterbox or Chatterbox Turbo family, about 0.5B. | |
| - Image: black-forest-labs/FLUX.1-schnell, 12B. | |
| ## Architecture Strategy | |
| Keep the existing ports-and-adapters architecture. | |
| Add immersion as typed events and UI state, not as one-off Gradio hacks: | |
| - `ImmersiveScene`: generated/fallback scene metadata. | |
| - `CharacterPortrait`: generated/fallback portrait metadata. | |
| - `Narration`: text, audio path, narrator voice profile. | |
| - `Artifact`: visual souvenir image plus markdown description. | |
| - `ImmersiveEvent`: event emitted during launch/reveal. | |
| The backend remains responsible for encounter state. The frontend owns visual animation and audio mixing. | |
| ## Phase 1: Portal Shell And State Plumbing | |
| Goal: Make launch feel dramatic before any new model integration. | |
| Build: | |
| - Portal stage in `cockpit.html`. | |
| - Year-travel counter that animates from current year to destination year. | |
| - Dramatic launch states: dormant, launching, traversing, resolving, revealing, conversation ready. | |
| - World reveal container with fallback gradient/texture. | |
| - Character portrait aperture with fallback silhouette. | |
| - Narration caption slot. | |
| - JS function to ingest a hidden JSON UI payload and update the portal. | |
| - Preserve existing live voice controls and transcript. | |
| No external APIs. | |
| No image generation. | |
| No narration audio yet. | |
| Validation: | |
| - User clicks Launch and sees a cinematic portal sequence. | |
| - Year counter moves in the correct direction for past/future. | |
| - Destination/persona data appears in the immersive shell. | |
| - Existing voice controls still work. | |
| - The app still runs with fixture profile. | |
| ## Phase 2: Immersive Backend Contracts | |
| Goal: Add backend contracts that can carry scene, portrait, narration, and artifact data without forcing UI rewrites. | |
| Build: | |
| - Domain models: | |
| - `ImmersiveScene` | |
| - `CharacterPortrait` | |
| - `Narration` | |
| - `VisualArtifact` | |
| - Domain events: | |
| - `SceneEvent` | |
| - `PortraitEvent` | |
| - `NarrationEvent` | |
| - `VisualArtifactEvent` | |
| - UI render state fields for immersive payload JSON. | |
| - Fixture adapter data for at least two hero encounters. | |
| - Tests for event ordering and serialization. | |
| Validation: | |
| - Fixture encounters populate scene/portrait/artifact placeholders. | |
| - Hidden JSON payload updates after launch. | |
| - No real image/audio APIs are required. | |
| ## Phase 3: Image Generation With Together FLUX | |
| Goal: Generate the world and character from the destination/persona. | |
| Build: | |
| - `ImageGenerationPort`. | |
| - Together adapter using `black-forest-labs/FLUX.1-schnell`. | |
| - Generate scene and portrait in parallel after destination/persona are available. | |
| - Cache base64 images per encounter. | |
| - Fallback to generated CSS visual if image generation fails. | |
| - Add `image` model entry to `config/models.yaml` with 12B parameter count. | |
| - Update model-budget validation to check each enabled model individually against 32B. | |
| Validation: | |
| - Scene and portrait appear during or shortly after portal traversal. | |
| - Slow image generation does not block the visual launch sequence. | |
| - Failure leaves the demo usable. | |
| ## Phase 4: Cinematic Narration | |
| Goal: Add a movie-opening narration that is distinct from the character voice. | |
| Build: | |
| - Narration prompt template: | |
| - 15-25 seconds max. | |
| - Describes year, place, atmosphere, and the person being contacted. | |
| - Uses third-person cinematic narration. | |
| - Avoids speaking as the character. | |
| - Narrator voice profile: | |
| - Stable, lower-energy, documentary/cinematic style. | |
| - Separate from character `VoiceProfile`. | |
| - Generate narration audio during portal animation. | |
| - Play narration once after world reveal. | |
| - Duck ambient audio under narration. | |
| - Only open live voice after narration finishes or user skips. | |
| Validation: | |
| - Narrator and character voices are obviously different. | |
| - Narration improves immersion without delaying interaction too much. | |
| - Skip/continue control exists if audio generation is slow. | |
| ## Phase 5: Ambient Sound And Reactive Mixing | |
| Goal: Make the world feel alive before the character speaks. | |
| Build: | |
| - Bundle small CC0 ambient loops: | |
| - temporal storm / portal hum | |
| - rain | |
| - market/crowd murmur | |
| - fire/hearth | |
| - wind | |
| - machinery | |
| - insects/night | |
| - water/harbor | |
| - Ambient selector based on destination atmosphere, mode, and visual motifs. | |
| - Web Audio mixer: | |
| - portal hum during traversal | |
| - crossfade to destination ambience | |
| - duck ambience under narration and character speech | |
| - optional stereo panning/small reverb | |
| Validation: | |
| - Launch has sound even before voice response. | |
| - Ambience does not fight speech. | |
| - Audio remains optional and browser-safe. | |
| ## Phase 6: Artifact Reveal | |
| Goal: Create a memorable "the character handed me something" moment. | |
| Build: | |
| - Extend souvenir generation into a visual artifact: | |
| - letter | |
| - map fragment | |
| - newspaper clipping | |
| - receipt | |
| - sketch | |
| - warning poster | |
| - tool tag | |
| - Generate artifact prompt from destination, persona, and conversation. | |
| - Reveal artifact in the portal/world UI with a physical animation. | |
| - Save artifact with encounter trace. | |
| Validation: | |
| - Asking for a souvenir creates a visual object, not just markdown. | |
| - Artifact matches the era and persona. | |
| - Artifact is shareable in screenshots. | |
| ## Phase 7: Hero Demo Polish | |
| Goal: Make the submission judge-ready. | |
| Build: | |
| - Two golden paths: | |
| - Surreal past encounter. | |
| - Strange/future encounter. | |
| - A deterministic demo script: | |
| - Launch. | |
| - Listen to narration. | |
| - Ask what is happening. | |
| - Ask about one visible object. | |
| - Ask for a souvenir. | |
| - Challenge with a modern concept and watch the character react in-world. | |
| - Field Notes doc. | |
| - Shared traces. | |
| - Screenshot/video-friendly layout. | |
| - HF Space deployment check. | |
| Validation: | |
| - Demo works cold. | |
| - Demo video can be recorded in one take. | |
| - The app visibly qualifies for Off-Brand, Field Notes, and Sharing Is Caring. | |
| ## Deferred Until After Core Wow Works | |
| - Full 3D avatar. | |
| - Wav2Lip/SadTalker/LivePortrait realtime animation. | |
| - Three.js room navigation. | |
| - Gaussian splat viewer. | |
| - WebXR. | |
| - Fully live image generation for every conversation turn. | |
| These are visually attractive but risky. A generated scene, portrait, ambient sound, narration, and artifact reveal provide most of the perceived immersion with much lower demo risk. | |
| ## Agent Implementation Model | |
| Use agents by phase with disjoint ownership: | |
| - Frontend worker: `cockpit.html`, `cockpit.css`, `cockpit.js`. | |
| - Backend contracts worker: domain models/events, view model payload. | |
| - Adapter worker: image generation port and Together adapter. | |
| - Audio worker: narration/ambient audio integration. | |
| - Test worker: focused unit/smoke tests and fixture updates. | |
| At the end of each phase: | |
| 1. Run focused tests. | |
| 2. Start the app if needed. | |
| 3. Validate UI behavior. | |
| 4. Stop and collect feedback before proceeding. | |