01
AI personalizes the journey
Plans, lesson content, and contextual help work together around the learner’s goals.
MAINICHI / ENGINEERING
AI powers Mainichi’s personalized lesson journey, from goals and interests to teaching, contextual help, and feedback. Native UI and explicit state ownership keep that experience dependable.
Tim Horng · Personal iOS project · September 2026
How do you make a personalized AI learning path feel dependable as lessons, network requests, and account state change?
01
Plans, lesson content, and contextual help work together around the learner’s goals.
02
Completing a route is separate from demonstrating recall.
03
Synchronization commands are separate from read-only projections.
DEEP DIVE / STATE OWNERSHIP
A Home refresh defect exposed a circular dependency: sync completion triggered a projection refresh, which requested another sync. Clearing the kanji selection during each pass made the ownership problem visible.
Separate synchronization commands from projection reads. Freshness-sensitive actions wait for an explicit result covering their demand, while Home keeps previously loaded content visible.
AFTER / ONE-WAY OWNERSHIP
Explicit sync command
Covers requested freshness
No new sync command
User demand → sync result → read-only Home projection
Starting a new kanji lesson requires a current result and the same selection the learner saw.
Account, reset, and workspace boundaries prevent stale asynchronous work from committing.
A lesson keeps its original focus even when Home’s next suggestion changes.
01
AI shapes plans and teaching content around the learner within versioned response contracts. Fixed SwiftUI components make that flexible content usable. Navigation and learning state stay app-owned, with OpenAI access behind the server.
02
Readings belong to exact occurrences, including grouped readings such as 今日 → きょう. Invalid annotations fall back to the original text; the renderer does not invent character-level alignment.
EVIDENCE, WITH ITS BOUNDARIES
The September 28 release reached production backend services and internal TestFlight 2.0 (11). Authenticated checks exercised ordinary lessons, cached lessons, and feedback.
678 passed / 2 skipped / 0 failures
Serial native unit suite for that release. These are bounded test results, not evidence of learning outcomes or physical-device performance.
Still separate: public distribution, onboarding rollout, and signed physical-device completion. The new onboarding pipeline was deployed with its production rollout flag off.
Back to the app →