Commit History
-
feat(intro): condensed tester teaching card so the short arc explains the loop
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>a39d3fb -
feat(pacing): shorten the tester run (end_affinity 35, recall_cooldown 1, bad_min_turn 3)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>b8e5756 -
feat(finale): tie the bad-ending threat to the lore (Caor/the Gaunt, the given)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>cadf187 -
fix(finale): silent convulse beat for loop & bad so the prior line isn't cut
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>3f5210c -
feat(end): title emits an end marker on the finale's final frame
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>642b2ac -
fix(finale): deterministic dev seed + good-ending convulse/sigh timing
- HOLLOW_FAST_FINALE now forces its named ending (force_ending), bypassing the tone branch that _enter_game's intro-tone seed could steer to loop — =good now reliably plays the redemption ending. - good finale: split the convulsion into a spoken line + a SILENT tremor beat, so the child finishes speaking BEFORE it convulses and the voice queue drains so the relief sigh lands exactly on the smile (no longer desynced / cutting the line). - convulse_good runs longer (~2s) with a faster image-to-image flicker so individual faces blur past; the smile eases in to match. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>f635212 -
feat(lore): good ending — Caor/Gaunt confession + brother (Edren) name recovery
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>817bcec -
feat(game): 'what it remembers' weaves the memories it stole from you
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>03129db -
feat(lore): short world note keeps improvised dialogue consistent
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>8fea751 -
feat(lore): OWN_FRAGMENTS become the deepening Caor/Gaunt arc
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>a887da3 -
test: finale cues assert class=cue-audio (queued) instead of autoplay
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>85d27fb -
feat(entity): optional per-turn cue marker (capture/recall/recover)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>6226702 -
fix(game): give stage real height, center dialogue, brighten scene
41c845f -
fix(game): letterbox stage layout + brighter silhouette with glow
1337168 -
feat(child): it gropes toward a name as it recovers itself
e05a544 -
feat(game): letterboxed scene shell + recovered drawer + tone wiring
5154bf5 -
feat(entity): cut-out silhouette in the scene (replaces gothic arch)
c30144e
-
feat(menu): move How to Play into menu card; fix overlay center + close
5119140 -
feat(menu): cohesive card with selectable mode rows (proxy), pinned credit
3fb8d1b -
feat(intro): selectable choice rows inside the dialogue panel
7cad5a9 -
feat(menu): cinematic letterbox frame + blurred backdrop, centered tagline
8ce42a9 -
feat(intro): per-card focal positions for cinematic crop
71a9e0b -
feat: _show_intro + _enter_game tone seed + intro image loader
43c44f6 -
feat: type_tick_wav_bytes — dry tick for the intro typewriter
c9fd308 -
feat: intro card copy + per-mode sequence constants
0d0b3b2 -
feat: front-door menu, Tester/Full modes, How to Play, menu music + ritual
- Two-view Gradio layout: menu_view (Direction C painted backdrop) and game_view. - mode-driven PACING config in memory.py (tester fast arc, full longer arc). - How to Play stone overlay. - Synthesized menu loop + chime->greeting ritual on mode-select/restart. - Docs (CLAUDE.md, AGENTS.md) and tests updated; 231 passing. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>8c9619e -
feat: chime-then-greeting opening ritual on start and 'begin again'
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>454c898 -
feat: remove the per-reply chime (redundant with voice, desynced under streaming)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>c116919 -
feat: child speaks each sentence as the stream builds (client audio queue)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>2818ad7 -
feat: stream the reply token-by-token into the chat
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>296d984 -
feat: shorter varied replies + one consolidated memory per turn
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>b4f9582 -
feat: front-load the recall wow + shorten the arc to 5-7 turns
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>ef2bc7f -
feat: child escalates its plea for a real memory over barren turns
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>ba63946 -
feat: client-timed idle that resets on any interaction (60s)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>07067e7 -
feat: client-side volume + real mute for the child's voice
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>2aa7aa5 -
feat: speak the opening line on the visitor's first message
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>1463933 -
fix: strip dashes from TTS input (Kokoro was saying 'dash')
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>730c858 -
feat: presence polish (voice every reply, idle anger, mute, fog-veil, faster finale) + race fixes
- phases 1-5 of the presence-polish plan - fix the idle/chat race that orphaned the '...' pending bubble: _start_turn now propagates state (activity stamp persists) and _on_idle never fires while a turn is in flight (pending bubble present) - idle threshold 12s -> 35s (was nagging too often) - drop the auto-spoken greeting: it fought browser autoplay and was cut by the reply voice; the child now speaks from its first reply + idle nudges instead Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>0bbde8d -
fix: voice no longer cut off + spoken opening greeting
- _on_idle returns no-op updates when not speaking, so the gr.Timer never clobbers a streaming finale or audio mid-play (the main cut-off cause) - finale step pauses stretch to the spoken line's duration, so each line is heard fully before the next replaces it - the opening line is voiced once on the first idle tick (plays on the visitor's first gesture; autoplay can't fire before any interaction) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>96e11a2
-
feat: B1 — Hollow speaks first when you go silent (gr.Timer)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>3faab14 -
feat: B2 — Hollow resurfaces your memories unprompted
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>a2e44d7 -
feat: B3 — Hollow notices how you write
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>e22b6d8 -
feat: voice every Hollow line in the three finales
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>b21a52e -
feat: voice on the recall turn + mute toggle
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>e12c3d4 -
feat: voice.py — guarded Kokoro whisper with locked DSP
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>2c4fa08 -
feat: seamless fast finale settle, climax sound on the final image
- convulsion holds the final face via a settle-face layer (eases in over the last 40%, fill-forwards) so the settle render is the same frame -> no pop - good/loop convulsions go silent; sigh/flatline move to new peace_settle / end_settle modes so the sound lands exactly when the final image appears - convulsions shortened to 3 cycles (~1.65s) + step pauses 1.7s so the final image arrives fast; bad frenzy keeps its longer 6-cycle build untouched Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>98232c3 -
feat: always-visible begin-again restart button
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>a5a72b8 -
feat: finale players build with heartbeat then convulse to settle
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>ea12cb7 -
feat: convulse stage in good and loop finale scripts
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>55acf49 -
feat: render convulse_good (sigh) and convulse_loop (flatline) modes
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>c7e26db