The melodic-glyph audio makes "she lost words, speaks in tones" land harder if
she WAS music. Reframe her identity and port the artist evidence to a musician's,
keeping the emotional beats intact.
- The blank-mouth figure study (N02) -> an unfinished song: every bar of the
melody shaped with care, the final bar never written. Same wound (the unsaid
thing), musician's hand. "come back to this." stays.
- Design award (N03) -> a generative Composition Prize, "A Held Breath" (CS +
music, even more on-theme). Margin doodles (N04) -> scraps of melody. Pinned
sketches (N05) -> sheets of staff paper. sketchbook (N09/N14) -> manuscript book.
- topic_signal "art" -> "music" across notes.json, gemma.py (identity + signal +
prompt example), mock_inference.py (music keywords), CONTRACT.md, STATE.md.
- PLAN.md §3/§4/§7: profile + note descriptions reframed to musician.
- N11 childhood crayon drawings kept (a child's drawing is universal, not
artist-specific).
Co-Authored-By: Claude Opu…
Gameplay: give Lily a persistent mood across turns
She was re-rolling her emotion every reply (warm→heavy→warm), so she felt
disconnected turn-to-turn and internal_emotion stuck on "curious". Now mood is
session state, anchored to a per-act baseline (warm → wistful → releasing,
matching PLAN's act registers) and carried forward each turn.
- game.py: state["mood"]; in apply_turn, derive the next mood from the emotion
tone Lily actually VOICED (more reliable than the model's internal_emotion
field), else hold steady for continuity, snapping to the act baseline on a
transition. Echoed in the turn payload (will also drive the melodic key later).
- server.py: pass mood into the inference request.
- gemma.py: build_system(active, act, mood) injects "carried from before, you
feel X — stay within it, shift only gradually, never flip."
- CONTRACT.md: document the mood request field + ownership (server owns it).
Verified live: mood holds coherently across a 6-turn conversation instead of
flip-flopping; honors Act I's warm register.
Co…
Silently rate the player's tone guesses with Nemotron-Mini-4B on Modal,
replacing the offline token-overlap mock when USE_MOCK=0. Scoring judges the
guess by sense against the tone's true meaning (from tones.json, never shown),
so synonyms/paraphrases score green where token overlap missed them. Player
only ever sees a color (red/amber/teal/green), never a number.
- modal_app/nemotron.py: Nemotron deployment with score_guess + moderate.
Lives in its OWN Modal app `forgotten-lily-nemotron` — sharing the
`forgotten-lily` name with Gemma made each deploy clobber the other's class.
Fixes: apply_chat_template(return_dict=True)+generate(**inputs) (bare tensor
crashed); score against true meaning, not the detective's questions (which
don't reveal a symbol's meaning -> everything scored amber). Smoke test
passes: correct->green, wrong->red, synonyms->green; moderation 4/4.
- app/nemotron_inference.py: client wrapper for the deployed function.
- app/server.py: /api/guess routes to …
Make the decoding loop learnable and the evidence meaningful, plus a batch
of game-feel and content work.
Learnability & prompt
- Category scaffold (Self/Other/Time/Emotion/Action/Truth) on chips + lexicon
- Per-act tone cap (ACT_TONE_CAP 3/5/7) so Act I stays short and decodable
- Prompt: direct answers (yes/no -> truth tones; lead with honest emotion;
internal_emotion must match tones, stop defaulting to "curious")
- Promote time_now (∿) and act_stay (←) into Act I (8->10 tones); relax the
Act I->II gate to tolerate a couple rarely-used tones
Evidence <-> lexicon
- Each note carries a hint {tone_id,text}, surfaced in the lexicon once that
tone is heard, so evidence helps decode the language
- Provenance ("found") line on every card; per-type icons
Empathy system & story
- Caring/personal questions raise state.empathy (keyword heuristic) -> unlock
backstory evidence; family topic_signal + server-side fallback
- 5 new notes (N11-N15): divorce/two homes, mother's voicemail, c…
Phase 0-2 + atmosphere: playable vertical slice on mock inference