transcribe_pcm and transcribe_pcm_parakeet did not check that their respective engines were loaded before clone+spawn_blocking. transcribe_file already calls ensure_model_loaded; these now mirror that posture with a friendly error when the engine is unloaded, matching what extract_content_tags_cmd does. decompose_and_store and extract_tasks_from_transcript_cmd ran multi-second LLM inference inside spawn_blocking without the PowerAssertion guard that cleanup_transcript_text_cmd and extract_content_tags_cmd already use. Both now begin a guard so the macOS App-Nap inhibitor (and the planned Linux/Windows equivalents per KI-02, KI-03) can pin the process for the duration of the inference. HANDOVER.md gets a status note clarifying it captures Phase 9 state. The schema head referenced (v14) was the head at session time; current head is v15 (`idx_transcripts_profile_created` composite index) per the architecture map. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
12 KiB
name, type, tags, description
| name | type | tags | description | |||||
|---|---|---|---|---|---|---|---|---|
| handover-2026-04-25 | reference |
|
Session handover — 2026/04/24-25 Phase 9 polish debt mostly shipped |
Magnotia Handover — 2026/04/25
Note: Session-specific handover. Migration v14 (
transcripts.llm_tags) was the head at the time of this session. Subsequent work has advanced the schema; current head is v15 (idx_transcripts_profile_created, composite index). For the current codebase shape, seedocs/architecture-map/andKNOWN-ISSUES.md.
Phase 9 session. Spec + plan written from scratch and committed; plan corrections layered in after critical review against the actual codebase (Codex was unreachable for cross-model review, three retries failed at the ChatGPT-account-entitlement layer). Sub-phases 9a + 9b + sparkline polish landed end to end. Sub-phase 9c reduced to the Phase 8 carryover bug fix; sub-phase 9d's walkthrough sweeps deferred to Phase 10a QC.
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
9a — Export plumbing
write_text_file_cmdRust command in newsrc-tauri/src/commands/fs.rs, with two unit tests (UTF-8 round-trip + bad-parent error path). Registered ininvoke_handler!.tempfile = "3"added as[dev-dependencies]on the magnotia crate.src/lib/utils/saveMarkdown.tsutility centralisessuggestedFilename,saveTranscriptAsMarkdown,exportTranscriptsToDir(directory-mode bulk export with in-batch collision suffixing).- HistoryPage
exportMarkdownno longer copies to clipboard; it opens the OS save dialog and writes the file. Cancel returns silently. - HistoryPage gained a slim leading checkbox per row, a bulk-action toolbar (select-all / clear / export / delete),
Escto clear,Cmd/Ctrl+Ato select-all-visible when focus is inside the list and not in a text input.
9b — LLM content tags
magnotia-llmexports a newContentTags { topic, intent }, anINTENT_CLOSED_SET, anis_valid_intenthelper, aCONTENT_TAGS_SYSTEMprompt and aCONTENT_TAGS_GRAMMARGBNF (recursive style matching the existingTASK_ARRAY_GRAMMAR).LlmEngine::extract_content_tagsmethod follows the same render-chat → generate → JSON-parse shape as the existingcleanup_textandextract_tasks. Truncates to the trailing 2000 chars on a UTF-8 boundary; max_tokens 96 is enough for the JSON envelope. Smoke test incrates/llm/tests/content_tags_smoke.rsis gated onMAGNOTIA_LLM_TEST_MODELmatching the Phase 8 pattern.extract_content_tags_cmdTauri wrapper bridges throughstate.llm_enginewith the standardspawn_blocking+PowerAssertionguard.
9b structural — migration v14 + persistence wiring
A correction layered in after the critical-review pass discovered the original Task 9 was assuming a writable saveHistory() path that turned out to be a no-op stub.
- Migration v14 adds
transcripts.llm_tags TEXT NOT NULL DEFAULT ''. magnotia-storagedatabase.rsSELECT statements include the column.TranscriptRow+transcript_row_fromcarry it.update_transcript_metaaccepts anOption<&str>forllm_tags(sixth optional,#[allow(too_many_arguments)]keeps clippy happy without inverting the signature into a struct).commands/transcripts.rsTranscriptDto+UpdateTranscriptMetaRequestaddllm_tags;update_transcript_meta_cmdforwards.- Frontend types:
TranscriptEntry.llmTags: string[],TranscriptRow.llmTags: string,ContentTags, optionalTranscriptMetaPatch.llmTags. mapTranscriptRowhydratesllmTags.saveTranscriptMetanow also forwardsllmTagspayloads.buildFrontmatterunions auto + manual + LLM tags into the exported markdown frontmatter.- HistoryPage tag UI: per-row "Tag" button, dashed-italic LLM chips that promote-to-manual on click, top-toolbar "Tag all untagged" with progress text. Existing
addManualTag/removeManualTaghandlers swap their no-opsaveHistory()calls forsaveTranscriptMeta— picks up the latentmanualTagspersistence bug as a side effect.
9b incidental fix — Phase 8 brittle test
list_recent_completions_uses_local_day_boundary failed today because its UTC-anchored '-2 days', '+12 hours' offset drifts across UTC midnight relative to the local-day spine the query uses. Fixed by anchoring the timestamp to the local date 2 days ago directly: datetime(DATE('now', 'localtime', '-2 days') || ' 12:00:00'). Phase 9 was not the cause; the test happened to fail on today's clock.
9c — Settings (scaled down)
SettingsGroup.sveltereusable progressive-disclosure wrapper landed (animated chevron, hover, focus-visible, prefers-reduced-motion).- Sparkline toggle (Phase 8 carryover backlog) relocated from the Rituals section into a new dedicated "Tasks" section. Closes the Phase 8 review note that the toggle was visually claimed by the launch-at-login subgroup.
- Deferred: the deeper restructure to seven progressive-disclosure groups + search box. The 2309-line
SettingsPage.svelteuses a hand-rolled accordion that needs careful unwinding; full restructure was too invasive to land safely in this session.SettingsGroupcomponent is in tree, ready for that follow-up pass.
9d — Polish (partial)
CompletionSparkline.svelte: friendlier sentence-form aria-label ("3 completed today. 14 total over the last 7 days." rather than a bare numeric list), per-bar<title>tooltips with absolute date + count, 30 ms staggered scaleY entrance animation. Earlier drafttabindex=0on the SVG removed:role="img"+ aria-label is sufficient for SR navigation without putting it in the keyboard tab order (svelte-check'snoninteractive_tabindexwarning, correctly).- TasksPage badge: 180 ms opacity + translate-Y entrance animation on conditional mount. Both new animations respect
prefers-reduced-motion. - Deferred to Phase 10a QC: keyboard traversal walkthrough across every page, focus-visible ring sweep, WCAG AA contrast audit in both themes, dark-mode parity check, icon-only-button aria-label audit. These are walkthrough-driven and need a running dev server to validate.
Verification state at session end
Fresh run on main tip dd45f10:
cargo fmt --check: clean.cargo clippy --all-targets -- -D warnings: clean.cargo test: 277 tests pass, 0 failed. Storage gained 1 new test (update_transcript_meta_writes_llm_tags), magnotia-tauri gained 2 (write_text_file). The Phase 8 brittle test fix is in this count.npm run check: 0 errors, 0 warnings across 3957 files.npm run build: clean production build via@sveltejs/adapter-static.
Plan correction summary (for any future reader)
The original Phase 9 spec + plan committed at 49a795f + 48d3db7 had three mismatches against the actual codebase, surfaced by a critical-review pass before execution. Layered as a corrections appendix in commit 3eb24f2:
magnotia-llmisLlmEngine::generate(prompt, config)synchronous, not the speculatedLlamaEngine::generate_chat(messages, config).await.AppState.llm_engine: Arc<LlmEngine>is direct, not behind aRwLock.- Structural —
transcripts.llm_tagsrequires a real SQLite migration plus Tauri command extension because the frontendsaveHistory()is a no-op stub. Original plan assumedmanualTags-mirroring would suffice. Migration v14 +update_transcript_metaextension landed as a new task to cover this. Picked up the latentmanualTagspersistence bug for free.
Owed to Jake (next session)
-
Manual dogfood walkthrough. Cannot be driven by an automated agent. When opening Magnotia next:
- Export one transcript via the History "Export .md" button — save dialog opens, file written to chosen path. Cancel — no toast, no fallback.
- Select 3 history rows via checkboxes — toolbar surfaces, "Export selected" writes one .md per row to a chosen folder, collisions suffixed " (2)" etc.
- Click "Tag" on one row — within a few seconds, dashed
topic:*andintent:*chips appear. Click a chip — it moves intomanualTags(solid accent chip). Page refresh — bothmanualTagsandllmTagssurvive (this is the persistence-fix outcome). - "Tag all untagged" runs across the corpus, progress text updates, success toast at the end.
- Settings → new "Tasks" section appears with the sparkline toggle. Toggle off → sparkline disappears on Tasks page; badge stays. Toggle on → sparkline returns.
- Sparkline keyboard-focus-or-hover on a bar shows the date + count tooltip. Screen reader announces the sentence-form summary.
prefers-reduced-motionset in OS — badge entrance + sparkline stagger both stop.
-
Phase 9 follow-up to absorb in a future polish session:
- Full
SettingsPageregroup usingSettingsGroup(already in tree), search box, Start-here always-expanded, six collapsed groups by domain. - The walkthrough-driven a11y sweeps from Phase 9 Tasks 14-15. Phase 10a QC will catch most; document any issues for a follow-up polish commit.
- Full
-
Codex unavailability. Three retries on the codex-rescue subagent failed because the local
~/.codex/config.tomlpinsmodel = "gpt-5.5"which the ChatGPT account doesn't have access to, and explicit overrides (gpt-4o,o4-mini,codex-mini-latest,gpt-5.3-codex-spark) are also blocked at the ChatGPT-account level. Either upgrade the ChatGPT plan tier or switch Codex auth to an OpenAI API key (codex loginwith key) to unblock cross-model review on future plans.
What's left for v0.1
| Phase | State |
|---|---|
| Phases 1-8 | All shipped. |
| Phase 9 | Mostly shipped this session. Export plumbing, LLM content tags (with persistence), polish on sparkline + badge are live. SettingsPage deeper restructure + walkthrough a11y sweeps deferred. Roadmap entry updated. |
| Phase 10a | QC: dogfood walkthrough (above), 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.db → magnotia.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). Gates v0.1 tagging.
Repo state at session end
mainatdd45f10.- 18 Phase 9 commits (3 docs + 15 feat/polish) on top of yesterday's tip.
- Local branches:
mainonly. cargo build --workspacegreen /cargo test --workspacegreen (277 passing) /cargo clippy --workspace --all-targets -- -D warningsclean /cargo fmt --checkclean /npm run check0/0 /npm run buildclean.
Anchors
- Spec: docs/superpowers/specs/2026-04-24-phase9-polish-debt-design.md
- Plan: docs/superpowers/plans/2026-04-24-phase9-polish-debt.md
- Roadmap: docs/roadmap/2026-04-23-magnotia-feature-complete-roadmap.md
- Previous handover: HANDOVER-2026-04-24.md (Phase 8)
- 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