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 fixesfebb50f2
  • 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 appc4f8574a
  • 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 sessionsd47323bf
  • 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 buttonf19a3679
  • Fixedself-healing node-id feedback + list_import_issues toolafefb43d
  • Fixedset busy_timeout before journal_mode — parallel build workers raced user.db to SQLITE_BUSY359165fe
  • Newreload-persist, 24h time, calendar link, fix dead finish button (#17)f467a035
  • Fixedcontent.db unopenable on Linux — drop immutable URI, ship non-WAL artifactde873ea7
  • Newcontent review gate live — todo tests flippedf3677f43
  • Fixedrecord.test isolation — suite deleted a real ledger shard152a4697
  • Newbootstrap panel verdicts — full corpus reviewed by 3-lens panelf6b232d0

2026-07-03

  • Newregenerate tts-carrying audio + audio manifest (speechgen, 26 gen / 293 backfill)a1100f0f
  • Fixeddrop vestigial MultiEdit from nudge hook matcherfc4ff90f
  • Fixedpack->record digest passthrough kills bless-unreviewed race580cb3b6
  • Fixedfail-closed shard/vote validation + named orphan shardsd0ce62d0
  • Newshard-based gate tests (todo until bootstrap) + content:* scripts + Railway build gateb6b8493b
  • NewPostToolUse nudge on content edits (ledger dir excluded)eae25bd5
  • Newpre-push trampoline (delete-ref + pre-gate safe) with atomic installere9e824dc
  • Newcontent-review skill — 3-lens panel procedure with quote-anchored accuracyde87c0f6
  • Fixedpack throws on dangling sentence-token reference instead of emitting undefined item14f029d3
  • Newcontent:pack — quote-anchorable reference packs for the review panele0664dec
  • Fixedrebuild stale content.db (+51 particles) and open it immutable954e996d
  • Newcontent:verify — deterministic offline gate over ledger shards and audio manifest16e66b9e
  • Fixedhealth route returns 503 (not framework 500) on DB failure85bc5b21
  • Newmanifest-keyed regeneration — tts edits invalidate committed audio77651c0e
  • Newledger:record CLI — per-item atomic panel verdict recording6b2e5a8f
  • Fixedaudio Range support + import/read UXa1da289b
  • Fixedbackfill resilience, health watchdog, queue truthfulness9f2ada1b
  • Fixedharden MCP endpoint — invalid-body guard + shared tokenEqual8084c7b7
  • Fixedjudge.ts LedgerEntry literal carries required id field5a51eab2
  • Newsharded ledger with ASCII hash filenames, vote rule, deterministic checkability0c80f137
  • Newdigest covers romaji, tts, token surfaces, kanji readings, concept checkse1b362ae
  • Newreview corpus covers everything buildGraph ships (kanji, concepts, kana romaji, content-keyed sentence ids)c640eb51
  • Newcapability-URL MCP route, verified voice allowlist, routine fire headersfa2d6036
  • Fixedkey placement probe card, wire skip, atomic seed6ce81093
  • Fixedatomic ffmpeg output + crash-proof audio backfille8065117
  • Newboot-time id-move application and audio backfill kick1674b1c5
  • Newadaptive placement flow + probe endpoints + wizard447e3fdc
  • Newdebounced routine trigger on import submission82dcde6a
  • Newnative .ics daily study-block download route08c97d34
  • Newserver-side gate redirects un-onboarded usersb612f288
  • Newresumable orchestration + FSRS bulk-seed (Tasks 7-8)d0b9ab7d
  • NewMCP endpoint with claim/submit/status tools672590d1
  • Newflat-strata sample→bulk-seed engine (port sim-v4)7e254d0c
  • Newserve volume audio at /audio with name validation and immutable cache4aceeb44
  • Newserver-side SpeechGen TTS with voice allowlist and async backfill195287c8
  • Newone-user claim, voice plumbing, shared prompt modulefa52cb83
  • Newnullable voice column on user_sentences617962b6
  • Fixedenrichment review fixes — banner accuracy, te jlpt, keredo register, he tts, hashi glossda096ecd
  • 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 hardening9b37012f
  • Newin-app JMdict attribution (EDRDG licence compliance)b0cfd476
  • Newenrichment gap detectors as separate content:enrich command6a2ca967
  • 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, sentences78636e79
  • NewisPlacementDone floor/cap/fringe stop rule5d49954b
  • NewnextProbe per-region depth-staircase selection (units)83b32644
  • NewbuildDepthIndex longest-prereq-chain depth5d12c7d6
  • NewapplyProbeResult KST propagation with retraction + precedence1a8683fe
  • NewbuildDependentsIndex inverts prereq edges78e08248
  • NewjmdictSeq + lemma mapping, wo tts fix, shared item enumeration99dde983
  • Fixedromaji policy を canonical wo, particle exception carries oed7a67d9
  • Newromaji policy file + word-level wapuro-Hepburn function64fef66c
  • FixedloadJMdict memoizes full parse, filters per call6e83296c
  • NewJMdict/KANJIDIC2 dump parsers with fixture tests0493851a
  • Newcommitted EDRDG reference dumps + manifest + refresh scriptbe3c4019
  • Newcommit content.db build artifact — Railway deploys are plain docker builds7057a435
  • Fixedship changelog.json in runtime image7edc4466
  • NewRailway container — oven/bun Dockerfile, env-extendable trusted origins00cacfd5
  • Newremote watcher mode — pipeline drives import via watcher RPCb63e7f38
  • Fixedgeneric watcher rpc 500 body + equal-length wrong-token test4b9ba861
  • Newbearer-authed watcher RPC endpoint over ImportOps208cfe65
  • Newaudio for 51 new particles (speechgen Akemi 48k)817d42b9
  • Fixedsize graph canvas to the app shell instead of h-dvh5a2f51c9
  • New/graph raw graph view — canvas dots, hairline edges, pan/zoom, center fisheye171bea24

2026-06-13

  • Newgraph view data assembly (positions + edges + stage fills)7d28fe7e
  • Newcircular fisheye lens math6102b46a
  • Newbake node_positions into content.db at pipeline time0bf7db58
  • Newdeterministic d3-force layout precompute0c35d3be
  • Newcomplete Japanese particle inventory — 58 particles in own region1bb3334a

2026-06-12

  • Fixedregenerate つき files on Akemi with kanji tts override1e3c49ef
  • Fixedtts override for vocab/sentences — Akemi mispronounces hiragana つき3755cdd5
  • Fixedregenerate mispronounced つき audio, add TTS input overridescc3a46ff
  • Fixedcorrect JLPT tags for 4 vocab words, add missing 分 kanjibb212a1b
  • Fixedstop emailing users without consent on import completion17b16d34
  • Fixedstore OAuth state in cookie, not databasea1bdc5d5
  • Fixeddelete all user data tables on account deletion17efff1d

2026-06-11

  • Newmulti-channel completion notifications (push + consented email + ntfy)277b92c1
  • Newpush + email opt-in controls on /import2b355da5
  • Newone passwordless flow — scrap password UI, declutter OTP wait state26b2c1a4
  • NewPWA manifest + apple web app metadata4c84d73c
  • Newservice worker, PWA manifest, kensei iconsebaf36e1
  • Newpush subscribe/unsubscribe APIf1711f69
  • Fixedaddress review findings for task 39caeacb4
  • Newweb push send library with dead-subscription pruning8b3b0be4
  • Newpush_subscriptions table010daed6
  • Newweb-push dependency + VAPID keygen scripta9a0c4de
  • NewN5+N4 kanji as locked explore content — 245 KANJIDIC2 nodes, gated behind kanji-intro concept5a587a12
  • Newgoal-sized bonus round, slider 5-20, retry card for failed session fetches4fe1e3cc
  • Newdashboard card for /importcd7ed390
  • Newimport UI — blob rows, budget bar, Ko-fi wallf3fd529e
  • Newimport API returns quota; 429 + Ko-fi at the wallec79f725
  • Newdaily-goal slider, once-a-day bonus round with recap mix-in492607c9
  • Newblob submission with monthly quota gate7180720d
  • NewJapanese flavor — konnichiwa@ sender, kanji wordmark, greetingaf2e33f2
  • Newblob-splitting LLM contract + fan-out pipeline with quota495eeb5d
  • Newmove Today nav item into Daily lesson floating button27a65be1
  • Newromaji readings on kana example words; clearer intro phrasing3a4dfc96
  • Newmonthly generation quota lib (atomic UPSERT counter + exemption)ab0f41c3
  • Newimport_queue blob columns + generation_quota table358a8080
  • Newthree-item text navbar; Progress moves to account pagebadec6a4
  • Newbranded HTML templates for OTP, verification, notify004ab28e
  • Newdefault to email OTP, icon-only provider buttonsbe4935cb
  • Newcompact emoji navbar; sign-out moves to account page6f54a706
  • Newin-app changelog from git history + mobile-responsive navbarf5bb3d29
  • Newspeechgen Akemi 48k as primary TTS engine, Kyoko fallback48c56171
  • Newswap SDK call for Claude Code CLI; add pending-row watcher4b21cc92
  • Newcustom sentence import v1 (LLM cron pipeline + notify)1004999d
  • Newpasskey-first signup — create an account with no password at all21493d21
  • Newreplace native audio controls with minimal play button; larger reads linedf906fce
  • Fixeddisable automatic account linking to block pre-registration takeover0cfd7530
  • NewGitHub and Google sign-in via Better Auth social providers175b24cc
  • Newpasskey sign-in and registration via @better-auth/passkeyaf57912d
  • Newadopt shadcn/ui for a clean responsive interfaceb921eba1
  • Fixedunblock day-one pacing — grade concepts in intro session, auto-chain sessions8c54488a
  • Newlogin page, session guards, sign-out headerfb0d14bb
  • NewAPI routes require a session — 401 unauthenticated, all queries user-scoped8ca84381
  • Newper-user learner state — user_id threads through schema, engine, scheduler5b2b3ba8
  • Newmount Better Auth (email+password, open signup) on bun:sqlite user.db417172b4

2026-06-10

  • Fixedlocal stage ladder in SessionPlayer — value import of STAGES pulled bun:sqlite into client bundledcd0cbb2
  • Fixedstage toast shows honest direction — was rendering up-arrow on demotions6432ccb2
  • Newdon't grade same-session answers of newly introduced nodes40269591
  • Newserver-side answer contract — engine derives rating/first-attempt/introduction9bb9afae
  • Fixedderive confusable-injection facet from the node; rename partner->confusabledfac3845
  • Newopen content.db readonly at runtime — enforce three-layer immutability1a372192
  • Fixeddefer IntroScreens empty-screens onDone to effect53a24fe7
  • Newreadable sentences page — honest all-parts-known feed seed89b7e637
  • Newprogress page — stage distribution per groupb3bf45ff
  • Newtypography — Japanese font stack, card styling, color scheme41c2e5e5
  • NewUI as pure renderer — server-driven loop, intro screens, dwell, flash, audio, stage toastfc9be1dd
  • Newsession API — resume-or-start, answer returns next item + stage4c538ab1
  • Fixedregenerate stub audio files — size guard in pipeline:audio skip logicd4e8148a
  • Fixedexport spacePartners per scheduler spec9faf1e7b
  • Newfacet-aware session items — vocab/grammar cards, MC choices, intro datac57e6343
  • Newengine-owned session scheduler — sessions table, retry offset, partner injection, daily cap1a9e408c
  • Newnamed learning stages over FSRS state1929103f
  • Newunlock-value frontier ranking — graph computes the path0d66b43a
  • Newpipeline TTS audio via macOS say (Kyoko) + deterministic asset naming0d176d9f
  • Newkana mnemonics and example words in payloads8a0b2caa
  • Newauthored starter sentences with tokenized node links8f1173ef
  • Newstarter N5 vocab + grammar nodes with rated payloads and derived kana prereqs64896599
  • NewSIMILAR_TO confusable edges in graphfaad28e8
  • Fixedaddress review findings — gate ordering, API hardening, retry semantics1f4a1df1
  • Fixedmove marked to dependencies — runtime import in pipeline/load.tsc27c92c8
  • Fixedlog settings fetch failure on mount, matching SessionPlayer error handling362e8f5b
  • Newassessment-mode toggle and day-1 smoke test25dbfa45
  • Fixedrelease Continue latch and log errors when session fetch fails7878558c
  • Fixedblock same-tick double-submits in session player1d737228
  • New/today session player (concepts, micro-checks, kana cards)6e9d0cf4
  • Fixedvalidate rating, make answer introduce+review atomicc15ad4c5
  • Newsession, answer, settings API routes6fa834d9
  • Fixedhonest payload type for concept checks; pin batch cap and due-first orderingb01555fb
  • Newskeleton session composer (due reviews then capped new batch)eeb4d282
  • Newin-memory graph engine with passed-gating and convergence gates9e6fb625
  • FixedGrade cast, atomic review transaction, due-instantly test pin383ec89b
  • NewFSRS wrapper with passed/learned predicates and assessment seeding31926184
  • Newuser.db bootstrap, settings, event log73f35af2
  • Fixedatomic ids.lock write + migration wiring TODObeade9eb
  • Newpipeline emit + id lock ledger; first content.db builds greend352b640
  • Fixedcycle reports trimmed to the cycle itself7f035140
  • Newpipeline validators (cycles, orphans, id-lock, solvability)0d9e11c5
  • Fixedlocale-free canonical sort + count/uniqueness guards88c9c6da
  • Newpipeline content loader and graph builder62cbda0e
  • Fixedcorrect hiragana accuracy claims per reviewb6a7c34c
  • Newstable slug id module186a98a3
  • Newbun:sqlite adapter and full v0 schemadb8e8eb6
  • Newscaffold Next.js-on-Bun app shell822c9f6c
kensei