Changelog
What changed in kensei.
2026-08-17
- FasterSheets and the recap carousel now follow your finger properly — a flick throws them, a grab catches them mid-motion, and buttons take a full fingertip on touch.
2026-08-07
- Newthe 28 N5 sentence patterns are now taught like everything else — you meet them on a card instead of being marked as already knowing them, and each one shows its real shape (〜のほうが〜より) rather than the bare kana run
- Fixedsentence patterns no longer show you kana you have not been taught yet — six of them displayed characters that were missing from their prerequisites, so they could turn up before the kana lesson that covers them
2026-08-05
- Fixedthree shipped features that had gone missing from this page are back
- Newshow what the report carries before it is sent (#380)
36b3ecbf - Newin-app issue reporting with reproducible state capture (#375)
dca04c5f - Fixedstop .glass material overriding Tailwind position utilities (#370)
73f420e2
2026-08-02
- Fixedmake the first-run notice the same glass card as the rest of the UI (#372)
8e70b098
2026-08-01
- Newblur the world behind open panels and graph sheets (#369)
6240b609
2026-07-27
- Fixedstop the card content flickering in on every card advance (#359)
4b1598ea
2026-07-26
- Fixedswallow Safari update() rejection on the version poll (KENSEI-X) (#361)
aa9a0710 - Newthree-state kana→furigana→kanji ladder + C3 trace ghost (T-355) (#357)
423e0914
2026-07-24
- Fixedland the card face during render to stop the new-card flicker (#350)
832da4a0 - Fixeddisable Safari Data Detectors to kill hydration mismatch (KENSEI-4) (#346)
27399c32
2026-07-23
- Fixeddrop local-dev events from the prod issue board (#344)
94ac9e8a - Fixedhide cross-face brush glyph, uncut ⓘ, collapse unlocks (#343)
6ebbf39c
2026-07-19
- Fixedstroke_speed schema is an object, not a number (#333)
8c0f3ffa - Fixeddon't show 'Locked' on the session card being actively taught (#331)
9f8de13b
2026-07-15
- Newconcept-anchor TTS audio — pipeline wiring + generated assets (#328)
eb787c56 - Fixedfade content under the sticky anchor; align morph alternates (#324)
4cd5fbf5 - Fixedmerge concept-tile chrome into one bar + full-world focus scrim (#323)
add31a87 - Fixedkeyboard focus into flip tile + editable-target shortcut guard (T-338, T-339) (#321)
cca20d88 - Newvalidate persisted user.db blobs with zod (T-324) (#320)
a3a39fdc
2026-07-13
- Fixeddisable event sends from local dev (#295)
a8916fb9 - Fixedrace-safe user-db migrations — refresh of #293 onto current main (#318)
bbc63539 - Fixedlabel canvas, unlock keyboard on touch devices, accessible search (#308)
24f91bb3 - Newone bottom-center control; move chrome off the world (#301)
6686677e - Newunify all remaining app surfaces on liquid-glass tokens (#286)
0c0ea604 - NewPhase 3 Option A — finish a loaded session offline (outbox replay + compose-guard) (#283)
9b2aed7f - FixedT-313 — realign content tests with kanji-surface vocab (T-289) (#294)
f998274d - Newmatch in-graph learning surfaces to liquid-glass + dev auto-login (#278)
69e940ff - NewT-302 — adopt healthy-gamification design rules (retention §6) (#292)
638298fc
2026-07-12
- FixedT-301 regen つき audio in Akemi voice, restore VOCAB 589/589 (#289)
8e5a1dfa
2026-07-11
- Fixedoffline replay must not lose answers — seq-order drain + no-claim-on-mismatch + monotonic batch clamp (#272)
b0bcfd8b - Fastersplit GraphViewData into cached static JSON + per-user overlay (T-270) (#268)
6cea2920 - NewPhase 3 outbox + shared-user.db userId-scoping (PR2 + PR2.5 train) (#264)
cfed5f34 - NewJourney Queue v1 PR3 — micro-scene celebration flow + §8 acceptance gate (T-188) (#256)
00659113 - Fixedstop flip-tile collapsing behind the keyboard on iOS (#258)
8041ca59 - Fasterpredicate-scoped snapshot loader + review_log partial index (T-265) (#259)
ade01cfb - NewN3+N2 kanji expansion — 246 → 980 kanji, panel-reviewed (T-269) (#239)
cb53edd4 - NewPhase 3 PR1 — G1 idempotent answer transaction + replay entry (server) (#248)
3c5e133c
2026-07-10
- Newalways-live graph behind every page + liquid-glass look (#220, #247)
9dbd978c - Newsumi-e token layer + floating glass navbar on real app (decision 9/10 step 1) (#216)
b2a26174 - NewJourney Queue UI — horizon chip, queue sheet, lit route + beacons, pick ritual (T-188 PR2) (#249)
2ec6ac0d - Fasterbatched user-state snapshot kills review-predicate N+1 family (#245)
e3dca8ce - NewJourney Queue v1 engine slice — collections, goal queue, W_GOAL steering, /api/goals (T-188 PR1) (#243)
958ca2ec - Newsettings toggle to opt out of daily-reminder pushes (T-255) (#237)
b8e6107e - FixedT-254 hygiene on logout/account-switch (#236)
14e60ec0 - Newself-host Geist via geist package — hermetic next build (T-201) (#234)
d51f5662 - Newalways-visible Learn button with prereq-bundle sessions (T-260) (#223)
0ab77f14 - Newdaily-lesson reminder push + app badge (Phase 2, T-016) (#232)
09ffa402 - NewPhase 0+1 — foundations + offline app shell (T-250) (#225)
fefacefd - Fixedkeep question and answer input visible when the keyboard opens (#221)
fa308116 - Fixedcontent.db drift tripwire + push-DELETE IDOR scope + email validation (#217)
60914801 - Fixedformat node due-time in learner TZ via mount-gated client component (#211)
d0783a65 - Fixedprint codepoint on unmapped-char errors (#208)
6047950a
2026-07-09
- Newstagger first-run notice ~1s after panel opens (#206)
b9ba2250 - Newfirst-run study-radio notice as a top snackbar + research page (#199)
5f34b5a6 - Newgapless Noise via in-browser Web Audio + background-playback hint (#194)
b21df3cf - Fixedrevert noise loops to AAC/.m4a (restore playback; keep data low) (#190)
370842ec - Fixedship noise loops as WAV to kill the loop-restart dropout (#188)
4800c1e0 - Newswipeable Noise variants + iOS volume handling (#185)
f01a0c98 - Newfold Noise variants into one station row + fade in on play (#180)
9f6beb6d - NewPhase 3 Stage A — EXEMPLAR edge-kind plumbing (dormant) (#150)
c526c67f - NewP5 — onboarding identity, activation first-read, comeback nudge, region milestone (#164)
a12ce8e1 - Newswipeable "Noise" focus station (white/pink/brown/dark + binaural) (#175)
385f10c0 - Fixedsynchronize the stroke-speed preview tiles (#167)
fd925e34 - Newlive 5-step preview for stroke speed-up + clearer hints (#165)
cbe2d2be
2026-07-08
- Newspeed up familiar-stroke draws by view count (#159)
ba688d29 - Fixedstop finished-glyph flash before each multi-glyph draw (#155)
35a3c2bd - Fixedstop shared-process env leak breaking content/user DB tests (#149)
6adc0c47 - Fixedstop kana strokes clipping at the canvas edge + multi-piece notch (#147)
5cfac269 - NewT-099 kanji-aware vocab decomposition (#144)
d04a9b89 - Fixedalign bottom FABs on one safe-area baseline (#141)
055059d3 - NewP4 credit propagation, blame retest, misconception diagnosis, client given channel (#140)
7dbf683f - Fixedmake heatmap fit width so recent activity is visible (#135)
365ad80f - Newkeep study radio playing when the phone is locked (#134)
b2b59143 - Newper-toggle hints + device-aware install guide (#133)
3c396e45 - Fixedstop COMPONENT nodes from crashing the page (#132)
9a614f68 - Newadd Graph link to the header nav (#130)
490328be - Newsurface Preferences section on profile page (#129)
26f366c0 - Fixedstop legend swipe-down from dragging the whole page (#128)
0b6f310e - Newlock phones to portrait with a rotate overlay (#127)
9c76e6f3 - Fixedmake the graph legend sheet closable + fix z-index underflow (#126)
c0028211 - NewP3 — intro scorer, band ramp, autonomy menu, curiosity teaser, contrast drills (#125)
863c2aac - NewPhase 2 — kanji COMPONENT nodes + component→kanji edges (KanjiVG) (#123)
d818c83e - NewP2 composer — retention dial, scheduling seam, leech quarantine, session composer, notices (#118)
cd401f82 - Fixedunexport AUTOPLAY_DEFAULT from settings route (#117)
1619427b - Newauto-focus typed answer + single-char auto-accept (#115)
48667141 - Newuser setting to disable automatic stroke drawing (#113)
6818fdba - Newserve tracks from R2 only — delete public/radio (T-191 PR2) (#114)
d3ae8e96 - Neweasy-wins batch 3 — streak, legend, autoplay setting, intro design, value prop, coverage audit, PWA nudge (#108)
067d8f05 - Fixedmake music pulse visibly track the beat (#111)
9e75e4ce - Newenable email+password signup/login in production (#110)
1a66c2ef - Fixeddeclare NEXT_PUBLIC_RADIO_BASE_URL as Docker build ARG (T-191) (#107)
7686bbed - Fixedmove kin-glow off the <svg> so WebKit stops clipping the halo (#105)
777ae3ce - Newserve tracks from R2 via NEXT_PUBLIC_RADIO_BASE_URL (T-191 PR1) (#97)
50e16473 - NewPhase 1 — kana→kanji reading-gate edges + focus constellation (#104)
eee8c1af - NewT-161 polish + T-160 answer-reveal + T-187 multi-glyph words (#102)
b064cb6c - New6 new milestones + progressive reveal teaser (#101)
165dc785 - Newgroup imported sentences by submission batch (T-074) + scenario-learning epic (#96)
d9021d6c - Fixedrestore touch/wheel scroll on flip-tile faces (#98)
7670408a - Newstamp book — awards, seals, ceremony (T-158 v1) (#91)
f1fe0997 - Newstroke animation for kanji, particles, single-kana words (T-163) (#86)
25ecf88c - Fixedfit focus-card text to card width, mirror tile hierarchy (#94)
bcf951cf - NewP1 signal layer — retrievability, Elo, readiness, debt, comeback, struggle, boredom, momentum (#89)
e1ec67c6 - Fixedclamp with real tile height, cap faces to safe band, center quiz card (#90)
ba66da45 - Fixedbuild analyser graph in gesture stack — Safari silence bug (#81)
289f1be4 - Fixedshow canonical Hepburn romaji only, keep aliases search/typing-only (#87)
efc7987c - Newthree small backlog wins — T-121 changelog filter, T-079 review telemetry, T-051 boot race (#85)
f16cf5b8 - FixedHepburn romaji for sokuon before ch — atchi not acchi (#84)
589caec8 - Fixedresolve 19 pre-existing tsc type errors in test files (#82)
7b262682 - Newkanji reading practice foundation + 2 bug fixes
febb50f2 - Newlower FAB on phones, playing ripple, study-radio skill (#75)
9bbf6463 - Fixeddrop "nn" as accepted romaji for ん/ン (#79)
4f91ef3c - NewP0 foundations — config, schema, migrations, learner CRUD (#78)
66c84161 - Fixedauto-accept correct typed answer as you type (T-067 intent) (#76)
c70d141f - Newbrush-drawn glyph on kana node pages (#72)
2aa1998b - Newstudy-radio player — two ambient stations, lazy audio (#71)
f2374c6c - Newbrush-draw engine — Tier-1 canvas brush + Tier-0 SVG kana stroke-order animation (#70)
cb55d983
2026-07-07
- Newsumi-e visual identity — unified design across the app
c4f8574a - NewN5 vocab import — 508 words JMDict-reanchored + 3-lens vetted (#60)
27c726d8 - Newwhole sentence tile clickable + hover feedback (#58)
c7689d38 - Newserver-side watchdog trigger + status folded into empty claim (#53)
ca7e7381 - Newlocked sentences visible, tap-to-detail, want-to-learn star (T-115) (#54)
fa6aba88 - Newthe knowledge graph now runs your learning sessions
d47323bf - Neweasy-wins batch 2 — label copy, synonym-leak MC fix, NFC import gate, daily-goal counter (#49)
a9ad9f5e - Fixedmora-decompose kana prereqs — yōon/sokuon/chōonpu words now ship (T-100) (#47)
57c46bbf - Neweasy-wins batch — 10 backlog fixes (audio, Read tab, import, intro, watcher) (#44)
6197a80e - Fixedsync clone deps before launchd runs the watcher (#41 rebased) (#43)
9bf39a1f - Newrelease tracking, user context, cron/CLI error capture (#38)
b720351e
2026-07-06
- Fixedclear T-098/T-099/T-026-remainder for clean main (#40)
e6696659 - Fixedcommit changelog.json so Railway build stops shipping empty (#39)
46e3fec2 - Newadd Sentry Next.js SDK (#36)
1c13d5fc - Fixedship content/ids.lock — build rewrites it on every node-add (#35)
695c90b7 - Newstage-3 UI layer — FAB dock, search, want stars, cluster mode, desktop deltas (#34)
ac0668ce - NewBetter Stack heartbeat ping on green cycles (T-064) (#33)
6990f000 - NewRoutine v1 — fully automated vocab validation (T-059) (#31)
c41b788a - Newstage-2 semantic zoom — levels, theme palette, focus card, deeplinks, activity springs (#30)
b8696ea4
2026-07-04
- Newnote when a reload restarts the placement check (T-052) (#23)
f24b8a94 - Fixedfocus Text field when submitting empty instead of dead button
f19a3679 - Fixedself-healing node-id feedback + list_import_issues tool
afefb43d - Fixedset busy_timeout before journal_mode — parallel build workers raced user.db to SQLITE_BUSY
359165fe - Newreload-persist, 24h time, calendar link, fix dead finish button (#17)
f467a035 - Fixedcontent.db unopenable on Linux — drop immutable URI, ship non-WAL artifact
de873ea7 - Newcontent review gate live — todo tests flipped
f3677f43 - Fixedrecord.test isolation — suite deleted a real ledger shard
152a4697 - Newbootstrap panel verdicts — full corpus reviewed by 3-lens panel
f6b232d0
2026-07-03
- Newregenerate tts-carrying audio + audio manifest (speechgen, 26 gen / 293 backfill)
a1100f0f - Fixeddrop vestigial MultiEdit from nudge hook matcher
fc4ff90f - Fixedpack->record digest passthrough kills bless-unreviewed race
580cb3b6 - Fixedfail-closed shard/vote validation + named orphan shards
d0ce62d0 - Newshard-based gate tests (todo until bootstrap) + content:* scripts + Railway build gate
b6b8493b - NewPostToolUse nudge on content edits (ledger dir excluded)
eae25bd5 - Newpre-push trampoline (delete-ref + pre-gate safe) with atomic installer
e9e824dc - Newcontent-review skill — 3-lens panel procedure with quote-anchored accuracy
de87c0f6 - Fixedpack throws on dangling sentence-token reference instead of emitting undefined item
14f029d3 - Newcontent:pack — quote-anchorable reference packs for the review panel
e0664dec - Fixedrebuild stale content.db (+51 particles) and open it immutable
954e996d - Newcontent:verify — deterministic offline gate over ledger shards and audio manifest
16e66b9e - Fixedhealth route returns 503 (not framework 500) on DB failure
85bc5b21 - Newmanifest-keyed regeneration — tts edits invalidate committed audio
77651c0e - Newledger:record CLI — per-item atomic panel verdict recording
6b2e5a8f - Fixedaudio Range support + import/read UX
a1da289b - Fixedbackfill resilience, health watchdog, queue truthfulness
9f2ada1b - Fixedharden MCP endpoint — invalid-body guard + shared tokenEqual
8084c7b7 - Fixedjudge.ts LedgerEntry literal carries required id field
5a51eab2 - Newsharded ledger with ASCII hash filenames, vote rule, deterministic checkability
0c80f137 - Newdigest covers romaji, tts, token surfaces, kanji readings, concept checks
e1b362ae - Newreview corpus covers everything buildGraph ships (kanji, concepts, kana romaji, content-keyed sentence ids)
c640eb51 - Newcapability-URL MCP route, verified voice allowlist, routine fire headers
fa2d6036 - Fixedkey placement probe card, wire skip, atomic seed
6ce81093 - Fixedatomic ffmpeg output + crash-proof audio backfill
e8065117 - Newboot-time id-move application and audio backfill kick
1674b1c5 - Newadaptive placement flow + probe endpoints + wizard
447e3fdc - Newdebounced routine trigger on import submission
82dcde6a - Newnative .ics daily study-block download route
08c97d34 - Newserver-side gate redirects un-onboarded users
b612f288 - Newresumable orchestration + FSRS bulk-seed (Tasks 7-8)
d0b9ab7d - NewMCP endpoint with claim/submit/status tools
672590d1 - Newflat-strata sample→bulk-seed engine (port sim-v4)
7e254d0c - Newserve volume audio at /audio with name validation and immutable cache
4aceeb44 - Newserver-side SpeechGen TTS with voice allowlist and async backfill
195287c8 - Newone-user claim, voice plumbing, shared prompt module
fa52cb83 - Newnullable voice column on user_sentences
617962b6 - Fixedenrichment review fixes — banner accuracy, te jlpt, keredo register, he tts, hashi gloss
da096ecd - Newexample sentences covering 21 N5/N4 particles (enrichment round 1)
30a89511 - Newapply JLPT levels to vocab from reference list (enrichment round 1)
2d450947
2026-07-02
- Fixedfinal-review fixes — ledger sort order, tts value validation, manifest preservation, judge hardening
9b37012f - Newin-app JMdict attribution (EDRDG licence compliance)
b0cfd476 - Newenrichment gap detectors as separate content:enrich command
6a2ca967 - NewLLM judge implementation + ready-to-flip coverage gate (batch run pending API key)
50a1630a - Newcontext digest + ledger coverage gate (gate pending first judge run)
3e7cef6d - Newdeterministic reference checks for kana, vocab, kanji, particles, sentences
78636e79 - NewisPlacementDone floor/cap/fringe stop rule
5d49954b - NewnextProbe per-region depth-staircase selection (units)
83b32644 - NewbuildDepthIndex longest-prereq-chain depth
5d12c7d6 - NewapplyProbeResult KST propagation with retraction + precedence
1a8683fe - NewbuildDependentsIndex inverts prereq edges
78e08248 - NewjmdictSeq + lemma mapping, wo tts fix, shared item enumeration
99dde983 - Fixedromaji policy を canonical wo, particle exception carries o
ed7a67d9 - Newromaji policy file + word-level wapuro-Hepburn function
64fef66c - FixedloadJMdict memoizes full parse, filters per call
6e83296c - NewJMdict/KANJIDIC2 dump parsers with fixture tests
0493851a - Newcommitted EDRDG reference dumps + manifest + refresh script
be3c4019 - Newcommit content.db build artifact — Railway deploys are plain docker builds
7057a435 - Fixedship changelog.json in runtime image
7edc4466 - NewRailway container — oven/bun Dockerfile, env-extendable trusted origins
00cacfd5 - Newremote watcher mode — pipeline drives import via watcher RPC
b63e7f38 - Fixedgeneric watcher rpc 500 body + equal-length wrong-token test
4b9ba861 - Newbearer-authed watcher RPC endpoint over ImportOps
208cfe65 - Newaudio for 51 new particles (speechgen Akemi 48k)
817d42b9 - Fixedsize graph canvas to the app shell instead of h-dvh
5a2f51c9 - New/graph raw graph view — canvas dots, hairline edges, pan/zoom, center fisheye
171bea24
2026-06-13
- Newgraph view data assembly (positions + edges + stage fills)
7d28fe7e - Newcircular fisheye lens math
6102b46a - Newbake node_positions into content.db at pipeline time
0bf7db58 - Newdeterministic d3-force layout precompute
0c35d3be - Newcomplete Japanese particle inventory — 58 particles in own region
1bb3334a
2026-06-12
- Fixedregenerate つき files on Akemi with kanji tts override
1e3c49ef - Fixedtts override for vocab/sentences — Akemi mispronounces hiragana つき
3755cdd5 - Fixedregenerate mispronounced つき audio, add TTS input overrides
cc3a46ff - Fixedcorrect JLPT tags for 4 vocab words, add missing 分 kanji
bb212a1b - Fixedstop emailing users without consent on import completion
17b16d34 - Fixedstore OAuth state in cookie, not database
a1bdc5d5 - Fixeddelete all user data tables on account deletion
17efff1d
2026-06-11
- Newmulti-channel completion notifications (push + consented email + ntfy)
277b92c1 - Newpush + email opt-in controls on /import
2b355da5 - Newone passwordless flow — scrap password UI, declutter OTP wait state
26b2c1a4 - NewPWA manifest + apple web app metadata
4c84d73c - Newservice worker, PWA manifest, kensei icons
ebaf36e1 - Newpush subscribe/unsubscribe API
f1711f69 - Fixedaddress review findings for task 3
9caeacb4 - Newweb push send library with dead-subscription pruning
8b3b0be4 - Newpush_subscriptions table
010daed6 - Newweb-push dependency + VAPID keygen script
a9a0c4de - NewN5+N4 kanji as locked explore content — 245 KANJIDIC2 nodes, gated behind kanji-intro concept
5a587a12 - Newgoal-sized bonus round, slider 5-20, retry card for failed session fetches
4fe1e3cc - Newdashboard card for /import
cd7ed390 - Newimport UI — blob rows, budget bar, Ko-fi wall
f3fd529e - Newimport API returns quota; 429 + Ko-fi at the wall
ec79f725 - Newdaily-goal slider, once-a-day bonus round with recap mix-in
492607c9 - Newblob submission with monthly quota gate
7180720d - NewJapanese flavor — konnichiwa@ sender, kanji wordmark, greeting
af2e33f2 - Newblob-splitting LLM contract + fan-out pipeline with quota
495eeb5d - Newmove Today nav item into Daily lesson floating button
27a65be1 - Newromaji readings on kana example words; clearer intro phrasing
3a4dfc96 - Newmonthly generation quota lib (atomic UPSERT counter + exemption)
ab0f41c3 - Newimport_queue blob columns + generation_quota table
358a8080 - Newthree-item text navbar; Progress moves to account page
badec6a4 - Newbranded HTML templates for OTP, verification, notify
004ab28e - Newdefault to email OTP, icon-only provider buttons
be4935cb - Newcompact emoji navbar; sign-out moves to account page
6f54a706 - Newin-app changelog from git history + mobile-responsive navbar
f5bb3d29 - Newspeechgen Akemi 48k as primary TTS engine, Kyoko fallback
48c56171 - Newswap SDK call for Claude Code CLI; add pending-row watcher
4b21cc92 - Newcustom sentence import v1 (LLM cron pipeline + notify)
1004999d - Newpasskey-first signup — create an account with no password at all
21493d21 - Newreplace native audio controls with minimal play button; larger reads line
df906fce - Fixeddisable automatic account linking to block pre-registration takeover
0cfd7530 - NewGitHub and Google sign-in via Better Auth social providers
175b24cc - Newpasskey sign-in and registration via @better-auth/passkey
af57912d - Newadopt shadcn/ui for a clean responsive interface
b921eba1 - Fixedunblock day-one pacing — grade concepts in intro session, auto-chain sessions
8c54488a - Newlogin page, session guards, sign-out header
fb0d14bb - NewAPI routes require a session — 401 unauthenticated, all queries user-scoped
8ca84381 - Newper-user learner state — user_id threads through schema, engine, scheduler
5b2b3ba8 - Newmount Better Auth (email+password, open signup) on bun:sqlite user.db
417172b4
2026-06-10
- Fixedlocal stage ladder in SessionPlayer — value import of STAGES pulled bun:sqlite into client bundle
dcd0cbb2 - Fixedstage toast shows honest direction — was rendering up-arrow on demotions
6432ccb2 - Newdon't grade same-session answers of newly introduced nodes
40269591 - Newserver-side answer contract — engine derives rating/first-attempt/introduction
9bb9afae - Fixedderive confusable-injection facet from the node; rename partner->confusable
dfac3845 - Newopen content.db readonly at runtime — enforce three-layer immutability
1a372192 - Fixeddefer IntroScreens empty-screens onDone to effect
53a24fe7 - Newreadable sentences page — honest all-parts-known feed seed
89b7e637 - Newprogress page — stage distribution per group
b3bf45ff - Newtypography — Japanese font stack, card styling, color scheme
41c2e5e5 - NewUI as pure renderer — server-driven loop, intro screens, dwell, flash, audio, stage toast
fc9be1dd - Newsession API — resume-or-start, answer returns next item + stage
4c538ab1 - Fixedregenerate stub audio files — size guard in pipeline:audio skip logic
d4e8148a - Fixedexport spacePartners per scheduler spec
9faf1e7b - Newfacet-aware session items — vocab/grammar cards, MC choices, intro data
c57e6343 - Newengine-owned session scheduler — sessions table, retry offset, partner injection, daily cap
1a9e408c - Newnamed learning stages over FSRS state
1929103f - Newunlock-value frontier ranking — graph computes the path
0d66b43a - Newpipeline TTS audio via macOS say (Kyoko) + deterministic asset naming
0d176d9f - Newkana mnemonics and example words in payloads
8a0b2caa - Newauthored starter sentences with tokenized node links
8f1173ef - Newstarter N5 vocab + grammar nodes with rated payloads and derived kana prereqs
64896599 - NewSIMILAR_TO confusable edges in graph
faad28e8 - Fixedaddress review findings — gate ordering, API hardening, retry semantics
1f4a1df1 - Fixedmove marked to dependencies — runtime import in pipeline/load.ts
c27c92c8 - Fixedlog settings fetch failure on mount, matching SessionPlayer error handling
362e8f5b - Newassessment-mode toggle and day-1 smoke test
25dbfa45 - Fixedrelease Continue latch and log errors when session fetch fails
7878558c - Fixedblock same-tick double-submits in session player
1d737228 - New/today session player (concepts, micro-checks, kana cards)
6e9d0cf4 - Fixedvalidate rating, make answer introduce+review atomic
c15ad4c5 - Newsession, answer, settings API routes
6fa834d9 - Fixedhonest payload type for concept checks; pin batch cap and due-first ordering
b01555fb - Newskeleton session composer (due reviews then capped new batch)
eeb4d282 - Newin-memory graph engine with passed-gating and convergence gates
9e6fb625 - FixedGrade cast, atomic review transaction, due-instantly test pin
383ec89b - NewFSRS wrapper with passed/learned predicates and assessment seeding
31926184 - Newuser.db bootstrap, settings, event log
73f35af2 - Fixedatomic ids.lock write + migration wiring TODO
beade9eb - Newpipeline emit + id lock ledger; first content.db builds green
d352b640 - Fixedcycle reports trimmed to the cycle itself
7f035140 - Newpipeline validators (cycles, orphans, id-lock, solvability)
0d9e11c5 - Fixedlocale-free canonical sort + count/uniqueness guards
88c9c6da - Newpipeline content loader and graph builder
62cbda0e - Fixedcorrect hiragana accuracy claims per review
b6a7c34c - Newstable slug id module
186a98a3 - Newbun:sqlite adapter and full v0 schema
db8e8eb6 - Newscaffold Next.js-on-Bun app shell
822c9f6c