Files
Lumotia/HANDOVER-2026-04-24.md
Claude 89c63891fa chore: rebrand from Kon/Corbie to Magnotia
Replace all instances of the legacy product names "Kon" and "Corbie" with
"Magnotia" across user-facing copy, code identifiers, package names, bundle
ids, file paths, and documentation. Preserves the unrelated "konsole" (KDE
terminal) reference and the parent CORBEL company name.

- Renames 10 Rust crates (kon-* → magnotia-*) and the tauri binary
- Updates package.json, tauri.conf.json (productName + identifier)
- Renames CSS classes (kon-rh-* → magnotia-rh-*) and animations
- Renames brand and roadmap docs
- Regenerates Cargo.lock and package-lock.json

Verified: svelte-check passes; pure-rust crates compile under new names.
2026-04-30 13:06:55 +00:00

8.1 KiB

name, type, tags, description
name type tags description
handover-2026-04-24 reference
handover
session
magnotia
phase-8
gamification
Session handover — 2026/04/24 Phase 8 forgiving gamification shipped end-to-end

Magnotia Handover — 2026/04/24

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 Magnotia → Magnotia still in flight. Copy in new docs is "Magnotia"; codebase paths / package names / repos still carry magnotia. 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 magnotia:task-uncompleted + magnotia: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

  • serde is now a dependency of magnotia-storage. Added because DailyCompletionCount is serialised directly to the frontend via Tauri. The existing TaskRowTaskDto split wasn't reused because the struct has no camelCase translation need (day, count are already frontend-friendly). Simpler, one fewer file to maintain.
  • $derived cannot be exported at module scope in .svelte.ts. Svelte 5 errors with derived_invalid_export. Originally hit during Task 9 integration; fix landed in the same commit (3cadbb0). svelte-check misses this; only Vite catches it. Plan/spec both mistakenly prescribed $derived; future stores should use export function fooCount(): number + (...) call sites, or a $derived wrapped inside a component script.
  • Tuple FromRow in storage. magnotia-storage strips sqlx's derive feature, so #[derive(sqlx::FromRow)] is not available. Use tuple FromRow (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)

  1. Manual dogfood walkthrough. Cannot be driven by an automated agent. When opening Magnotia 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.
  2. Phase 9 polish backlog items surfaced during review:

    • Sparkline aria-label currently 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-t above is visually claimed by a different setting). Two options for Phase 9 polish: wrap the sparkline toggle in its own mt-4 pt-4 border-t border-border-subtle subgroup, 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.
  3. 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:

    • $derived at .svelte.ts module scope: not supported.
    • #[derive(sqlx::FromRow)] in magnotia-storage: feature is stripped.

    Worth a one-screen "magnotia-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 Magnotia → Magnotia rename sweep: package name, all 10 crates, bundle ids, install paths, magnotia.dbmagnotia.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 assertions during a live session). Gates v0.1 tagging.

Cargo.lock

  • Cargo.lock is committed as of b333c62 (Jake's hardening pass). Roadmap doc updated this session to reflect resolution.

Repo state at session end

  • main at fa93033.
  • 14 Phase 8 commits + 2 doc commits on top of yesterday's tip.
  • Local branches: main only.
  • cargo build --workspace green / cargo test --workspace green (273 passing) / cargo clippy --workspace --all-targets -- -D warnings 0 warnings / cargo fmt --check clean / npm run check 0/0 / npm run build clean.

Anchors