Vocabulary by-need additions and a model upgrade:
- Split category A "People & Things" into People (A) + Things (F) — naming a
person vs a thing are distinct decode hints.
- +3 story tones (28 total): friend (◐, People, Act 2 — she wanted friends),
study (▤, Things, Act 1 — learning was her refuge), emo_lonely (◌, Feeling,
Act 2). GRAMMAR_ORDER/mood/coverage updated; reachability holds (all 28 seen
+ N10 by turn 32, gates at 14/28).
- Backstory: she loved studying, had few close friends but longed for them.
- Frontend CATS gains Things (teal); lexicon 0/28. Mock learns study/lonely/friend.
- Model: Gemma 4 E4B -> Qwen2.5-7B-Instruct (bartowski GGUF) on the same
T4/llama.cpp path for sharper tone selection. Smoke test 0/10 issues.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Vocabulary rebuilt from what Lily needs to say rather than a tidy grid:
- Remove the 3 Link connectives, `pause`, and `always`; add `music`, `family`,
`tired`; broaden `nothing`→"empty/gone". 25 tones total.
- New by-need categories (uneven on purpose): People & Things · Action (now holds
feel/remember/forget) · Feeling · Time · Answer.
Coherence over correctness:
- With links gone, the engine sorts every reply into GRAMMAR_ORDER again so chips
always read as a clause; dropped the dangling-link guard and the trust-model-order
path. Prompt reframed: pick tones that together MEAN one true thing (an association
is a valid answer); the engine handles order; don't pad or default to happy.
- Finale + mock + smoke-test vocab updated to the new set (smoke lists now derived
from tones.json so they can't drift).
Frontend:
- Categories/colors updated; lexicon /25.
- Loading dots replaced with rotating evocative lines ("Lily gazes into the distance…").
- Act-change title cards: I Mee…
Prompt (modal_app/gemma.py): replace scenario coaching and the order/no-order
contradiction with a principle-based prompt — the active tones are Lily's whole
vocabulary; she composes one honest phrase in reading order, pointing outward
when the tones can't say a thing exactly. Also recover fused glyph+id tokens
("♯emo_afraid") the model emits, which were being silently dropped to a drift
fallback.
Engine (app/game.py): trust the model's tone order (drop the conditional
grammar reshuffle); guard dangling Link tones (a connective with <2 content
tones is dropped, killing "I and"). Empathy is now a resetting meter: caring/
personal questions fill it, each full meter surfaces the next memory and resets,
with a sorted-word fingerprint so repeating a question can't farm it.
Evidence (data/notes.json): drop the per-tone hint system; add helping-question
prompts to each note that point toward un-found topics/memories.
Frontend (index.html): remove hint UI; render tappable "ASK HER" prompt c…
Story pivot: dreams + travel + Mount Fuji; 3 connective tones; Her Things tab
Narrative recenters from the relationship onto Lily's unfulfilled dreams --
becoming a composer, seeing the world, standing at Mount Fuji at sunrise with
both her (divorced) parents after graduation. R is demoted to a faint, gentle
background thread. The night is reconstructed (morning breakup -> parents
arguing at the handoff -> she leaves on foot, upset -> the crossing) WITHOUT
revealing the outcome; every player-facing note is present tense and the death
foreshadowing is removed from all but the final reveal (N10).
- data/tones.json: +3 always-on connective tones (Link category G) -- and/with,
to/toward, but/yet -- so she can form coherent phrases at any act. 27 total,
all on-scale (verified).
- data/notes.json: full rewrite. Present tense, dreams/travel-centered, each note
carries an artifact (name, icon, relation). New: Fuji postcard, travel fund +
unstamped passport, 'stages I want to play', reconstructed-evening timeline.
- app/game.py: connectives always active; gramma…
Pivot: reframe Lily from visual artist to musician
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…
sad and afraid used unpleasant pitch tricks that clashed with the pentatonic.
- emo_sad: drop the downward glide (seasick portamento); now a sustained falling
minor third (C4+A3 dyad) — the melancholic interval, both in-scale. Warm, sad.
- emo_afraid: drop the minor-second cluster + wide vibrato (buzzy); now a clean
high G4 with a fast shallow tremolo so it trembles — anxious but consonant.
Both still verify on-scale.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Music: retune all 24 glyphs onto one shared scale (melodic tones)
The tones were designed sounds at scattered frequencies — they didn't combine
into music. Now every glyph sits on A minor pentatonic (A C D E G), so any
sequence of glyphs is consonant by construction and a reply plays as a melody.
- tones.json: each tone gets a `note` (scale step from A3=220Hz) chosen to fit
its meaning — self_i = the root/home, other_you = bright & high (reaching out),
act_fall = a descending pluck, emo_happy = an ascending sparkle, emo_sad = a
downward sigh, truth_yes = high & bright, truth_nothing = sub-bass two octaves
down (the end). Registers cluster by category for timbral coherence.
- synth.py: note_to_hz() resolves pitch from the scale; new ringing "bell"
envelope; a gentle plate reverb tail so notes bleed into each other; --verify
(FFT-checks every tone lands on the scale: 24/24 pass, <35c) and --demo
(overlap-adds tones into phrase WAVs so glyph-melodies can be auditioned).
Verified: 0 tones off-scale, no clipping, even loudness across the s…
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