Phase 9 of the rebrand cascade. Sweep covers everything the Phase 8
frontend pass deliberately skipped: docs/, root markdown, scripts,
Cargo.toml descriptions, code comments that survived earlier
word-boundary sed, plus a handful of identifiers caught on the final
verify pass.
transcription-app changes:
- README.md, HANDOVER.md, KNOWN-ISSUES.md, run.sh — magnotia/Magnotia
-> lumotia/Lumotia.
- docs/ — sweep across all subdirs except docs/handovers/ (preserved
as immutable audit trail). Includes architecture-map references
to magnotia_core::*, magnotia_storage::*, etc. now pointing at
lumotia_*; dev-setup.md tracing output examples (lumotia_startup
target); brief/ + superpowers/ + issues/ + whisper-ecosystem/ +
audit/.
- Cargo.toml descriptions on 9 crates (core, audio, cloud-providers,
hotkey, llm, mcp, plus referenced others).
- crates/core/src/{error,hardware,recommendation,paths}.rs +
crates/audio/src/wav.rs + crates/llm/src/model_manager.rs +
crates/cloud-providers/src/keystore.rs + crates/mcp/src/lib.rs —
doc comments and a model-manager user-agent string.
- Caught on final pass: BroadcastChannel("magnotia_task_sync") -> ...
("lumotia_task_sync"); magnotia_locale i18n localStorage key
renamed + migration shim added; CSS keyframe names
magnotiaPulse / magnotiaBar / magnotiaFade renamed in the design-
system kit; magnotia_viewer_item / magnotia_viewer_mode handoff
keys renamed in HistoryPage + viewer/+page.svelte; src/assets/
wordmark.svg text.
- src-tauri/src/lib.rs comment cleanup ("magnotia era" was sed'd
to "lumotia era" earlier — restored).
Preserved (intentional):
- crates/core/src/paths.rs — keeps "magnotia" / "Magnotia" / ".magnotia"
legacy detection strings in legacy_and_target_paths() so the
migration shim can still find user data from the magnotia era.
- src/lib/stores/{page,focusTimer}.svelte.ts + src/lib/i18n/index.ts
— migration call sites reference the legacy magnotia keys
deliberately.
- docs/handovers/ — historical audit trail.
cargo build --workspace passes. npm run check: 0 errors / 0 warnings
(3958 files). cargo test --workspace: 339 pass / 0 fail.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
8.2 KiB
name, type, tags, description
| name | type | tags | description | |||||
|---|---|---|---|---|---|---|---|---|
| handover-2026-04-24 | reference |
|
Session handover — 2026/04/24 Phase 8 forgiving gamification shipped end-to-end |
Lumotia Handover — 2026/04/24
Originally written when the product was named Kon (and briefly Corbie); references rewritten in the 2026-04-30 rebrand sweep.
Phase 8 session. Executed the forgiving-gamification spec + plan written at the top of the session against main. Shipped 14 commits end-to-end. All automated gates clean; manual dogfood walkthrough still owed when Jake next opens the running app.
Rebrand note
Product rename Lumotia → Lumotia still in flight. Copy in new docs is "Lumotia"; codebase paths / package names / repos still carry lumotia. No rebrand work this session. See ~/.claude/projects/-home-jake-Documents-CORBEL-Main/memory/project_magnotia_rebrand.md.
What shipped this session
Phase 8 — forgiving gamification
Today's header now shows Tasks · 3 today alongside a 7-day momentum sparkline. No streaks, no grace days, no loss language. Commits on main, 729b82c onwards:
| SHA | Summary |
|---|---|
2cc0697 |
docs: design spec for Phase 8 |
d5eb212 |
docs: implementation plan for Phase 8 |
729b82c |
migration v13, auto_completed column |
92b3228 |
cascade sets auto_completed = 1 on parent |
b992967 |
style fix, drop em-dash from cascade comment |
839754f |
uncomplete_task clears auto_completed |
83bd338 |
list_recent_completions storage fn + DailyCompletionCount + 5 tests |
42b423e |
list_recent_completions_cmd Tauri wrapper |
cb32285 |
DailyCompletionCount type + showMomentumSparkline setting |
4ffdae9 |
completionStats.svelte.ts store |
54ddd41 |
CompletionSparkline.svelte component |
3cadbb0 |
badge + sparkline wired into Tasks header (+ $derived → getter fix) |
c29720e |
emit lumotia:task-uncompleted + lumotia:task-deleted events |
fa93033 |
settings toggle for momentum sparkline |
Counting semantics (locked)
- Manual top-level completions count.
- Manual subtask completions count.
- Cascade-completed parents (
auto_completed = 1) do not count. - Uncompletions remove from the count on the spot.
- Day boundaries are local time via
DATE(done_at, 'localtime').
Architectural notes worth carrying forward
serdeis now a dependency oflumotia-storage. Added becauseDailyCompletionCountis serialised directly to the frontend via Tauri. The existingTaskRow→TaskDtosplit wasn't reused because the struct has no camelCase translation need (day,countare already frontend-friendly). Simpler, one fewer file to maintain.$derivedcannot be exported at module scope in.svelte.ts. Svelte 5 errors withderived_invalid_export. Originally hit during Task 9 integration; fix landed in the same commit (3cadbb0).svelte-checkmisses this; only Vite catches it. Plan/spec both mistakenly prescribed$derived; future stores should useexport function fooCount(): number+(...)call sites, or a$derivedwrapped inside a component script.- Tuple
FromRowin storage.lumotia-storagestrips sqlx'sderivefeature, so#[derive(sqlx::FromRow)]is not available. Use tupleFromRow(String, i64)etc. instead. Noted for future tasks in this crate.
Verification state at session end
Fresh run on main tip fa93033:
cargo fmt --check: clean.cargo clippy --all-targets -- -D warnings: clean.cargo test: 273 tests pass, 0 failed, 0 ignored. Storage crate alone: 55 passed (6 new Phase 8 tests: column exists + default 0, cascade flag, uncomplete clear, 5-day series shape, cascade excluded, manual top-level counted, uncomplete excluded, local-day boundary).npm run check: 0 errors, 0 warnings across 3955 files.npm run build: clean production build via@sveltejs/adapter-static.
Owed to Jake (next session)
-
Manual dogfood walkthrough. Cannot be driven by an automated agent. When opening Lumotia next:
- Fresh state, no completions → header shows only "Tasks" title; no badge, no sparkline.
- Complete one top-level task → badge "1 today"; sparkline appears.
- Complete two more → badge "3 today".
- Uncomplete one → badge "2 today".
- Micro-step a task; complete its final subtask so the cascade closes the parent → badge increments by 1 (subtask), not 2.
- Settings → Rituals → toggle sparkline off → sparkline disappears, badge remains.
- Toggle on → sparkline returns.
-
Phase 9 polish backlog items surfaced during review:
- Sparkline
aria-labelcurrently reads numeric list ("0, 1, 3, 2, 0, 4, 3"). Friendlier summary form ("3 completed today, 14 total over 7 days") would reduce screen-reader tedium. Not changed because spec prescribed the numeric list verbatim. - Per-day tooltip on sparkline hover was explicitly deferred to Phase 9 by the spec.
- Motion curves / enter animations on badge + sparkline deferred to Phase 9.
- Settings toggle currently co-located under "Rituals" section. Code reviewer flagged that placement reads as part of the "Launch at login" subgroup (the
border-tabove is visually claimed by a different setting). Two options for Phase 9 polish: wrap the sparkline toggle in its ownmt-4 pt-4 border-t border-border-subtlesubgroup, or move it to its own "Tasks" / "Progress" section. Rituals copy ("All off by default. Rituals only appear when you ask for them.") is mildly broken by the default-on sparkline; relocate the toggle rather than soften the copy.
- Sparkline
-
Plan quality note for future Phase 9+ plans. Two patterns I prescribed turned out to be wrong on this codebase and only surfaced during execution:
$derivedat.svelte.tsmodule scope: not supported.#[derive(sqlx::FromRow)]inlumotia-storage: feature is stripped.
Worth a one-screen "lumotia-storage gotchas" reference file or at least a note at the top of future plans that touch these areas.
What's left for v0.1
Unchanged except for Phase 8 now being closed:
| Phase | State |
|---|---|
| Phases 1 to 8 | All shipped. |
| Phase 9 | Polish debt (file-system .md save dialog, bulk select/export in History, LLM content tags, settings UX pass, visual polish, accessibility sweep). Absorbs backlog above. 1 to 2 days. |
| Phase 10a | QC: dogfood walkthrough, Rachmann's RB-08 Mac verification (parallel), cross-platform CI, a11y regression, clean-install test. Half day. |
| Phase 10b | Lumotia → Lumotia rename sweep: package name, all 10 crates, bundle ids, install paths, lumotia.db → lumotia.db, event names, repo rename on both remotes. Half to 1 day. |
| Phase 10c | Release: 0.1.0 version sync, CHANGELOG seeded from roadmap phases, release notes, tag + push. Half day. |
Release-blocker state
- 0 open CRITICAL.
- 1 open MAJOR. RB-08
power-assertion-macos-objc2(awaits Rachmann's manual runtime verification on his Mac:pmset -g assertionsduring a live session). Gates v0.1 tagging.
Cargo.lock
Cargo.lockis committed as ofb333c62(Jake's hardening pass). Roadmap doc updated this session to reflect resolution.
Repo state at session end
mainatfa93033.- 14 Phase 8 commits + 2 doc commits on top of yesterday's tip.
- Local branches:
mainonly. cargo build --workspacegreen /cargo test --workspacegreen (273 passing) /cargo clippy --workspace --all-targets -- -D warnings0 warnings /cargo fmt --checkclean /npm run check0/0 /npm run buildclean.
Anchors
- Spec: docs/superpowers/specs/2026-04-24-phase8-forgiving-gamification-design.md
- Plan: docs/superpowers/plans/2026-04-24-phase8-forgiving-gamification.md
- Roadmap: docs/roadmap/2026-04-23-lumotia-feature-complete-roadmap.md
- Previous handover: HANDOVER-2026-04-19.md
- Release-blocker index: docs/issues/README.md
- Rebrand memory:
~/.claude/projects/-home-jake-Documents-CORBEL-Main/memory/project_magnotia_rebrand.md - Active-focus upstream:
context/active-focus.mdin CORBEL-Main