Skip to content

Practice that listens: Say it, Explain it, streaks, the drills corpus (phase 4) - #70

Open
ChaliceForAuri wants to merge 2 commits into
companionfrom
practice
Open

ChaliceForAuri wants to merge 2 commits into
companionfrom
practice

Conversation

@ChaliceForAuri

Copy link
Copy Markdown
Owner

Stacked on #69. Phase 4 of the product map: every drill spoken, every drill scored like a command.

The drills

Drill Check Judge
Spell it the letters heard against the word, deterministic none
Say it SayItGuardrail: the sentence must use the word and be a sentence; the verdict must be one yes-or-no with one line ModelDrillJudge (TimbreModel), greedy
Explain it ExplainItCheck: the meaning's key terms against what was said, stems allowed; pass above 60%, fail below 25% only in the unsure band

DrillPlanner picks the drill per entry per day (acronyms explained, spellings spelled, words alternate by day); without the model nothing is planned that needs a judge, so the Watch and an older iPhone still practise. Streaks is the private game: days met or practised, the week's counts, the five words most worth a minute.

Surfaces

  • Mac: a Practice window (menu › Practice…, and Settings › Library › Practise now…) on its own SpokenInput, so the hotkey pipeline is never borrowed; streak and week in Settings › Library.
  • iPhone: the Spell it tab becomes Practice with all three drills; Today shows the streak.

Measured

Fixtures/drills.json, 12 cases. Checks run in TimbreCoreTests on every push. The judge runs in timbre-eval --drills --repeat; on this Mac, checks 12/12 and the judge 4/4 solid at three repeats, with reasons like "You used 'ephemeral' to mean forever, but it means very short-lived." --examples measured 7/8 solid; the finance case came back empty each time, and the harness now prints the model's error for it rather than a blank. Backstage's Evals page gains a Learning tab listing all four corpora (44 cases).

Verified

Core 99 tests, Kit 169, lint clean; the Mac app, the companion (Practice tab seen on the iPhone 17 simulator) and the site build; sync:docs regenerated.

🤖 Generated with Claude Code

@vercel

vercel Bot commented Oct 19, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated
timbre Ignored Ignored Preview Oct 21, 2026 8:59pm UTC

Request Review

ChaliceForAuri and others added 2 commits October 21, 2026 13:56
… (GDR-0023 phase 4)

Three drills, each with a check the harness can score:

- Spell it: the letters heard against the word (as before).
- Say it: SayItGuardrail before the model (the sentence must use the word
  and be a sentence) and on its verdict (one yes-or-no, one line);
  ModelDrillJudge in TimbreModel asks the on-device model, greedy.
- Explain it: ExplainItCheck on the words first — the meaning's key terms
  against what was said, stems allowed — the judge only in the unsure
  band, so most rounds never need the model.

DrillPlanner picks the drill per entry per day (acronyms are explained,
spellings spelled, words alternate, nothing needs a judge without the
model). Streaks is the private game: days met or practised, the week's
counts, the five words most worth a minute. PracticeQueue orders the
sitting.

The Mac gets a Practice window (menu › Practice…, Settings › Library) on
its own SpokenInput so the hotkey pipeline is never borrowed, and the
streak and week in Settings. The iPhone's Spell it tab becomes Practice
with all three drills; Today shows the streak.

Fixtures/drills.json (12 cases) runs its checks in TimbreCoreTests and its
judge in timbre-eval --drills --repeat; measured on this Mac: checks
12/12, judge 4/4 solid at three repeats. --examples measured 7/8 solid;
the one empty draft now reports the model's error instead of a blank.
Backstage's Evals page gains a Learning tab listing the four corpora.

Core: 99 tests. Kit: 169. Lint clean. The Mac app, the companion and the
site build.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Xcode 26's compiler rejects reading a main-actor static from the judge's
nonisolated async method; Xcode 27 let it through. The enum is pure and
reads a nonisolated system property, so it is nonisolated, and CI's
toolchain is the floor.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant