The full session log (session-drain.md — 16 sessions, gitignored)
16sessions logged
12active sessions (May 30 – Jun 1)
46words — the whole system prompt
~0mshook startup (Go, stdlib only)
2026-05-30T02:43ZSession 1 — first successful harness run. Hook injecting <played> blocks confirmed. prompt_input_exit
2026-05-30T02:46ZSession 2 — tuning chord clustering. Repeated notes show as xN. prompt_input_exit
2026-05-30T03:00ZSession 3 — C major arpeggio run; Claude produces chord card + 1-3-5 keyboard diagram. prompt_input_exit
2026-05-30T03:08ZSession 4 — F major. Common-tone discussion (C4 shared between I and IV). prompt_input_exit
2026-05-30T03:08ZSession 5 — Cmaj13 spread voicing. Claude explains dropped 5th in jazz voicings. prompt_input_exit
2026-05-30T12:47ZSession 6 — afternoon session. Calibrating 34→3 compression ratio (4-key chord × 3 repeats = 24 events → 1 line). prompt_input_exit
2026-05-30T13:10ZSession 7 — G major and G7 voicings. Dominant function discussion. prompt_input_exit
2026-05-30T13:34ZSession 8 — I–IV–V progression in C. Loop back arrow working: play → send → play → send. prompt_input_exit
2026-05-30T15:32ZSession 9 — "She's Electric" chord sequence (E → G#m → C#m → A). Claude generates multi-chord HTML card. prompt_input_exit
2026-06-01T12:56ZSession 10 — first session after the weekend gap. Harness still live. File-deletion boundary confirmed holding between sessions. prompt_input_exit
2026-06-11T00:00ZSession 11 — post-drift-commit session. Exploring chord-diagram.html format added in commit 7cb9815. prompt_input_exit
2026-06-11T14:05ZSession 12 — README updated to one-line pointer; old prose moved to git history. prompt_input_exit
2026-06-11T14:07ZSession 13 — verifying isolation: does streetlight bleed into the 46-word prompt? No — sibling dir, not ancestor. prompt_input_exit
2026-06-11T14:09ZSession 14 — future-ideas.md drafted: timing/rhythm capture parked deliberately. Harmony-read loop first. prompt_input_exit
2026-06-11T14:23ZSession 15 — blog post drafting: Brenda/Piano-YouTube motivation, recipe card, lessons, streams-and-lakes analogy. prompt_input_exit
session-drain.md is gitignored in the live repo — it contains local transcript paths that are noise publicly. Reconstructed above from file contents.
What an actual session looks like — chord → conversation loops
The harness sends a <played> block alongside whatever Jake types. Here are representative reconstructed exchanges from the active sessions.
Session 3 · 2026-05-30T03:00Z — C major arpeggio
user
what am I playing?<played>
C3 G3 C4 E4 x3
F2 F3 A#3 D4
G4
</played>
claude
You're playing a nice little progression — C major in root position (arpeggiated three times), then F major, then a single G4. That's a I–IV–V sketch in C. The C chord you're landing on with 1-3-5 hand shape is the home base — C4 (thumb), E4 (middle), G4 (pinky). I'll render you the card.
claude
Generated what-you-played.html — chord cards with fingered keyboards for C Major, F Major, and the G4 passing note.
Session 5 · 2026-05-30T03:08Z — Cmaj13 spread voicing
user
what's this one — the weird one<played>
C3 B3 E4 A4
</played>
claude
That's a Cmaj13 in an open "spread" voicing — C (root) in the left hand, then B (major 7th), E (3rd), and A (13th) stacked wide in the right. No 5th at all, which is normal: jazz voicings drop the 5th because it adds nothing. The B a major 7th above the bass C is what gives it that shimmering, unresolved glow — it wants to resolve but doesn't quite.
Session 9 · 2026-05-30T15:32Z — She's Electric
user
I'm learning She's Electric by Oasis — what are these chords<played>
E2 E3 G#3 B3
G#2 B3 D#4
C#3 E3 G#3
A2 C#3 E3
</played>
claude
Nice — that's the full chord sequence for She's Electric: E major (I), G# minor (iii), C# minor (vi), A major (IV). All diatonic to E major — every note fits the key. The I→iii→vi→IV pattern alternates major and minor colors which is why it feels like it moves without ever leaving home. I'll generate the chord diagram.
FINDINGS.md — the diagnostic that killed midi-coach (2026-05-29)
Before the working harness came midi-coach — a more ambitious first attempt that tried to sync MIDI notes with Wispr voice dictation using a byte-offset marker. It broke silently and the diagnostic below is why it was abandoned. Full file: ~/Documents/midi-coach/FINDINGS.md.
"Wispr is not working at all and I don't know that it ever has been." — Jake, 2026-05-29
①
The G-octave / C-octave demo dropped the notes that mattered. Jake narrated a deliberate test: "here comes a G... I'm playing two G notes... an octave... now a C octave... what do you see?" The <spoken-and-played> block that reached Claude contained only the opening slice of the dictation — everything from "here comes a G..." onward was absent. Both the words AND the notes for the actual demo were missing.
②
A turn where Jake said "this time I'm actually playing a note" came back words-only — zero MIDI clusters. A played note never reached the gate.
③
The hook's whisper re-transcription was regularly shorter than the clean Wispr message. Two transcripts of the same speech that didn't match — the hook was reading a partial audio clip, not the full dictation.
④
One turn DID produce rich interleaved output (~70 lines, plausible timestamps). But we never independently confirmed those notes matched what was played. There was never any ground truth — which is the meta-finding.
Root cause (FINDINGS.md, ranked most likely)
Two independent clocks reconciled after the fact. Wispr recorded audio on its clock; the Go listener logged MIDI on wall-clock epoch independently. The gate kept only notes whose timestamp fell inside Wispr's clip window. If those two clocks disagreed by even a few seconds (different process start, drift, epoch basis), the window missed the notes entirely. Architectural, not a tunable bug. Reconciling two clocks post-hoc is the fragility. The agreed fix was radical: kill the second stream entirely — which is what midi-harness does.