agent: lumotia-rebrand — docs, scripts, root config, residuals
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>
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
# Phase 0 — Cartography
|
||||
|
||||
*Acquisition-grade audit, Phase 0 deliverable. Date: 2026-04-30. Branch: `claude/rebrand-to-magnotia-UWYkg`.*
|
||||
*Acquisition-grade audit, Phase 0 deliverable. Date: 2026-04-30. Branch: `claude/rebrand-to-lumotia-UWYkg`.*
|
||||
|
||||
This is a survey, not a verdict. It maps what exists, sizes the surface, and flags every place the README disagrees with the code. Phase 1 (lean-pass) and Phase 2 (architecture conformance) consume this as input.
|
||||
|
||||
@@ -11,13 +11,13 @@ This is a survey, not a verdict. It maps what exists, sizes the surface, and fla
|
||||
| Layer | Path | Notes |
|
||||
|---|---|---|
|
||||
| Rust workspace root | `Cargo.toml` | `members = ["src-tauri", "crates/*"]`, `resolver = "2"` |
|
||||
| Tauri app crate | `src-tauri/` | Library `magnotia_lib` + binary `magnotia` |
|
||||
| Tauri app crate | `src-tauri/` | Library `lumotia_lib` + binary `lumotia` |
|
||||
| Library crates | `crates/*` (×9) | See §3 |
|
||||
| MCP standalone binary | `crates/mcp/` | Bin `magnotia-mcp` (separate process from main app) |
|
||||
| MCP standalone binary | `crates/mcp/` | Bin `lumotia-mcp` (separate process from main app) |
|
||||
| Svelte frontend | `src/` | SvelteKit, Svelte 5 runes, Tailwind 4 |
|
||||
| Static assets | `static/`, `src-tauri/icons/`, `src-tauri/resources/` | |
|
||||
|
||||
**Binaries shipped (2):** `magnotia` (Tauri app), `magnotia-mcp` (stdio MCP server).
|
||||
**Binaries shipped (2):** `lumotia` (Tauri app), `lumotia-mcp` (stdio MCP server).
|
||||
|
||||
---
|
||||
|
||||
@@ -55,44 +55,44 @@ This is a survey, not a verdict. It maps what exists, sizes the surface, and fla
|
||||
|
||||
| Crate | LOC | Files | `pub` items (lib.rs / total) | Tests |
|
||||
|---|---:|---:|---:|---:|
|
||||
| `magnotia-core` | 1,212 | 9 | 10 / 104 | 16 |
|
||||
| `magnotia-audio` | 1,533 | 8 | 14 / 38 | 14 |
|
||||
| `magnotia-transcription` | 2,617 | 12 | 13 / 51 | 51 |
|
||||
| `magnotia-llm` | 1,330 | 6 | 27 / 56 | 17 |
|
||||
| `magnotia-ai-formatting` | 1,502 | 6 | 9 / 21 | 47 |
|
||||
| `magnotia-storage` | 3,771 | 4 | 6 / 69 | 60 |
|
||||
| `magnotia-hotkey` | 632 | 3 | 5 / 14 | 4 |
|
||||
| `magnotia-cloud-providers` | 80 | 2 | 2 / 3 | 2 |
|
||||
| `magnotia-mcp` | 584 | 2 | 8 / 8 | 9 |
|
||||
| `src-tauri` (`magnotia` + `magnotia_lib`) | 8,330 | 27 | n/a | 67 |
|
||||
| `lumotia-core` | 1,212 | 9 | 10 / 104 | 16 |
|
||||
| `lumotia-audio` | 1,533 | 8 | 14 / 38 | 14 |
|
||||
| `lumotia-transcription` | 2,617 | 12 | 13 / 51 | 51 |
|
||||
| `lumotia-llm` | 1,330 | 6 | 27 / 56 | 17 |
|
||||
| `lumotia-ai-formatting` | 1,502 | 6 | 9 / 21 | 47 |
|
||||
| `lumotia-storage` | 3,771 | 4 | 6 / 69 | 60 |
|
||||
| `lumotia-hotkey` | 632 | 3 | 5 / 14 | 4 |
|
||||
| `lumotia-cloud-providers` | 80 | 2 | 2 / 3 | 2 |
|
||||
| `lumotia-mcp` | 584 | 2 | 8 / 8 | 9 |
|
||||
| `src-tauri` (`lumotia` + `lumotia_lib`) | 8,330 | 27 | n/a | 67 |
|
||||
| **Total** | **21,591** | | | **287** |
|
||||
|
||||
**Outliers worth a Phase-2 look:**
|
||||
- `magnotia-core` exposes 104 public items — high for a "shared types" crate; likely leakage of internals.
|
||||
- `magnotia-storage` exposes 69 public items across only 4 files; the file split is suspect (2.5k-line `database.rs`).
|
||||
- `magnotia-cloud-providers` is 80 LOC and 3 public items — README calls it "empty scaffolding" (verified: just an in-memory keystore + env-var fallback). Either grow it or remove it; it currently earns nothing.
|
||||
- `lumotia-core` exposes 104 public items — high for a "shared types" crate; likely leakage of internals.
|
||||
- `lumotia-storage` exposes 69 public items across only 4 files; the file split is suspect (2.5k-line `database.rs`).
|
||||
- `lumotia-cloud-providers` is 80 LOC and 3 public items — README calls it "empty scaffolding" (verified: just an in-memory keystore + env-var fallback). Either grow it or remove it; it currently earns nothing.
|
||||
|
||||
---
|
||||
|
||||
## 4. Crate dependency graph
|
||||
|
||||
```
|
||||
magnotia-core ──┬─→ magnotia-audio
|
||||
├─→ magnotia-transcription
|
||||
├─→ magnotia-llm ──→ magnotia-ai-formatting
|
||||
├─→ magnotia-cloud-providers
|
||||
├─→ magnotia-hotkey
|
||||
└─→ magnotia-storage ──→ magnotia-mcp
|
||||
lumotia-core ──┬─→ lumotia-audio
|
||||
├─→ lumotia-transcription
|
||||
├─→ lumotia-llm ──→ lumotia-ai-formatting
|
||||
├─→ lumotia-cloud-providers
|
||||
├─→ lumotia-hotkey
|
||||
└─→ lumotia-storage ──→ lumotia-mcp
|
||||
|
||||
magnotia (src-tauri)
|
||||
└─→ all 8 library crates (NOT magnotia-mcp — separate binary)
|
||||
lumotia (src-tauri)
|
||||
└─→ all 8 library crates (NOT lumotia-mcp — separate binary)
|
||||
```
|
||||
|
||||
**Observations:**
|
||||
- `magnotia-core` is the workspace floor; nothing depends on it depending on something else. Good.
|
||||
- `lumotia-core` is the workspace floor; nothing depends on it depending on something else. Good.
|
||||
- DAG is clean — no cycles, no upward dependencies.
|
||||
- `magnotia-mcp` correctly depends only on `magnotia-storage` (its sole job is to read the SQLite DB). The Tauri app does **not** depend on it, confirming the "separate process" claim in the README.
|
||||
- `magnotia-ai-formatting` depends on both `core` and `llm`. Reasonable.
|
||||
- `lumotia-mcp` correctly depends only on `lumotia-storage` (its sole job is to read the SQLite DB). The Tauri app does **not** depend on it, confirming the "separate process" claim in the README.
|
||||
- `lumotia-ai-formatting` depends on both `core` and `llm`. Reasonable.
|
||||
|
||||
> **Phase 2 will verify:** every `pub` item in the leaf crates (`audio`, `transcription`, `llm`, `storage`, `hotkey`) has at least one external consumer. Internal-only items shouldn't be `pub`.
|
||||
|
||||
@@ -130,7 +130,7 @@ Confirmed in `crates/mcp/src/lib.rs`:
|
||||
- `search_transcripts`
|
||||
- `list_tasks`
|
||||
|
||||
The `init_readonly` connection mode in `magnotia-storage` is opened at OS level (`SQLITE_OPEN_READONLY`), per `crates/mcp/src/main.rs:18` — Phase 4 will confirm with a write-attempt test.
|
||||
The `init_readonly` connection mode in `lumotia-storage` is opened at OS level (`SQLITE_OPEN_READONLY`), per `crates/mcp/src/main.rs:18` — Phase 4 will confirm with a write-attempt test.
|
||||
|
||||
### 5.3 Frontend route surface
|
||||
|
||||
@@ -155,7 +155,7 @@ The `init_readonly` connection mode in `magnotia-storage` is opened at OS level
|
||||
- Whisper (6): `whisper-tiny-en`, `whisper-base-en`, `whisper-small-en`, `whisper-distil-small-en`, `whisper-medium-en`, `whisper-distil-large-v3`
|
||||
- Parakeet (1): `parakeet-ctc-0.6b-int8`
|
||||
|
||||
> Moonshine is mentioned in the README's `magnotia-core` description ("Moonshine entries") but **no Moonshine entry exists in the registry**. See §7.
|
||||
> Moonshine is mentioned in the README's `lumotia-core` description ("Moonshine entries") but **no Moonshine entry exists in the registry**. See §7.
|
||||
|
||||
---
|
||||
|
||||
@@ -182,9 +182,9 @@ Items where the README disagrees with the code as-of this audit:
|
||||
| "10 crates" (line 14) | 9 library crates + 1 app crate (`src-tauri`) — depends how you count; technically the workspace has 10 packages | OK if counting `src-tauri`; misleading otherwise |
|
||||
| "Commands: audio, clipboard, diagnostics, hotkey, live, llm, meeting, models, paste, power, profiles, tasks, transcription, transcripts, update, windows" (line 95-97) — 16 listed | **22 modules with commands**: README missing `feedback`, `fs`, `intentions`, `nudges`, `rituals`, `tts`. Architecture diagram and §"Tauri commands" table both stale. | **MED** — visible to anyone evaluating the codebase |
|
||||
| "18 Tauri command modules" (line 117) | **25 files** in `commands/` (22 with command attrs + `mod`, `power`, `security`) | MED |
|
||||
| `magnotia-core` "model registry (Whisper + Parakeet + Moonshine entries)" (line 165) | **No Moonshine entries** in `model_registry.rs`. 6 Whisper + 1 Parakeet only. | **MED** — claims an unimplemented feature |
|
||||
| `lumotia-core` "model registry (Whisper + Parakeet + Moonshine entries)" (line 165) | **No Moonshine entries** in `model_registry.rs`. 6 Whisper + 1 Parakeet only. | **MED** — claims an unimplemented feature |
|
||||
| Stores listed: `settings, profiles, tasks, history, taskLists, templates, page, toasts, preferences` (line 202) | Actual stores: `page, preferences, profiles, toasts, focusTimer, llmStatus, nudgeBus, implementationIntentions, completionStats, speaker`. README list is **largely fictional** — there is no `tasks`, `history`, `taskLists`, `templates`, or `settings` store as a separate file. | **HIGH** — describes architecture that doesn't exist |
|
||||
| `magnotia-cloud-providers` "BYOK cloud-STT provider stubs… Currently empty scaffolding. When populated: OpenAI-compatible endpoint + Anthropic" (line 172) | Crate has an in-memory API-key store with env-var fallback — not "empty scaffolding". No HTTP code, no provider implementations. | LOW — partial |
|
||||
| `lumotia-cloud-providers` "BYOK cloud-STT provider stubs… Currently empty scaffolding. When populated: OpenAI-compatible endpoint + Anthropic" (line 172) | Crate has an in-memory API-key store with env-var fallback — not "empty scaffolding". No HTTP code, no provider implementations. | LOW — partial |
|
||||
| "Every new workspace crate needs a `description` in its `Cargo.toml`" (line 362, contributing rule) | **`crates/llm/Cargo.toml` has no `description` field.** Self-violation of the contribution rule. | LOW — easy fix |
|
||||
| README §"Architecture" Rust crate list spelling (line 102-104) | Correct, but the manual line-break formatting got mangled by the rebrand sweep — visible whitespace inconsistency. | TRIVIAL |
|
||||
|
||||
@@ -204,7 +204,7 @@ Items where the README disagrees with the code as-of this audit:
|
||||
|
||||
Five handovers in the repo root is unusual — most projects keep one. Phase 8 (docs truth) will recommend either archiving them under `docs/handovers/` or rotating to a single `HANDOVER.md` with prior content moved.
|
||||
|
||||
The post-rebrand state: all five handovers were rewritten by today's sweep (line counts identical, words different). They now reference `magnotia` paths but their **content** describes work done under the `kon` / `corbie` names — there's a temporal-vs-naming mismatch a reader has to mentally track. Acquirer-friendly fix: add a one-line note at the top of each historical handover saying "Originally written when the product was named X; references rewritten 2026-04-30."
|
||||
The post-rebrand state: all five handovers were rewritten by today's sweep (line counts identical, words different). They now reference `lumotia` paths but their **content** describes work done under the `kon` / `corbie` names — there's a temporal-vs-naming mismatch a reader has to mentally track. Acquirer-friendly fix: add a one-line note at the top of each historical handover saying "Originally written when the product was named X; references rewritten 2026-04-30."
|
||||
|
||||
---
|
||||
|
||||
@@ -223,7 +223,7 @@ Each task below is concrete: file, change, verification, effort. Pick any in any
|
||||
- **Effort:** 10 min.
|
||||
|
||||
#### A2. Moonshine claim has no implementation
|
||||
- **File:** `README.md`, line 165 (`magnotia-core` row in the crate table)
|
||||
- **File:** `README.md`, line 165 (`lumotia-core` row in the crate table)
|
||||
- **Current:** `model registry (Whisper + Parakeet + Moonshine entries)`
|
||||
- **Reality:** `crates/core/src/model_registry.rs` has 6 Whisper + 1 Parakeet entries. Zero Moonshine.
|
||||
- **Fix (pick one):**
|
||||
@@ -245,7 +245,7 @@ Each task below is concrete: file, change, verification, effort. Pick any in any
|
||||
- **File:** `crates/llm/Cargo.toml`
|
||||
- **Current:** `[package]` block has `name`, `version`, `edition` only.
|
||||
- **Reality:** README §Contributing line 362 declares this a hard rule. Self-violation.
|
||||
- **Fix:** add `description = "Local LLM engine for Magnotia (Qwen3 via llama-cpp-2). Cleanup, task extraction, content tags."` (or similar). Match the prose style of the other 8 crates' descriptions.
|
||||
- **Fix:** add `description = "Local LLM engine for Lumotia (Qwen3 via llama-cpp-2). Cleanup, task extraction, content tags."` (or similar). Match the prose style of the other 8 crates' descriptions.
|
||||
- **Verify:** `for d in crates/*/Cargo.toml src-tauri/Cargo.toml; do grep -L "^description" "$d"; done` returns empty.
|
||||
- **Effort:** 2 min.
|
||||
|
||||
@@ -265,18 +265,18 @@ Each task below is concrete: file, change, verification, effort. Pick any in any
|
||||
|
||||
### Tier C — Structural smells (defer to Phase 2 but flag now)
|
||||
|
||||
#### C1. `magnotia-core` over-exports
|
||||
#### C1. `lumotia-core` over-exports
|
||||
- **File(s):** `crates/core/src/lib.rs` and the modules it re-exports
|
||||
- **Symptom:** 104 public items in a "shared types" crate. High blast radius for any change.
|
||||
- **Fix (Phase 2 work, do not touch yet):** audit every `pub` item; demote anything not used outside the crate to `pub(crate)`. The expected outcome is a 30–60% reduction in public surface.
|
||||
- **Verify:** after the demotion pass, `cargo +nightly rustdoc` should still succeed and downstream crates should still compile without changes.
|
||||
- **Effort:** ~½ day (Phase 2 scope).
|
||||
|
||||
#### C2. `magnotia-storage::database.rs` is 2,534 lines
|
||||
#### C2. `lumotia-storage::database.rs` is 2,534 lines
|
||||
- **File:** `crates/storage/src/database.rs`
|
||||
- **Symptom:** single file holds CRUD for transcripts, tasks, subtasks, profiles, profile-terms, settings, error log, FTS5. No internal module boundaries.
|
||||
- **Fix (Phase 2):** split by domain — `database/transcripts.rs`, `database/tasks.rs`, `database/profiles.rs`, etc. Keep the public re-export shape unchanged so callers don't move.
|
||||
- **Verify:** `cargo test -p magnotia-storage` still passes; no public-API changes.
|
||||
- **Verify:** `cargo test -p lumotia-storage` still passes; no public-API changes.
|
||||
- **Effort:** ~2-4 hours.
|
||||
|
||||
#### C3. `SettingsPage.svelte` is 2,250 lines
|
||||
@@ -285,20 +285,20 @@ Each task below is concrete: file, change, verification, effort. Pick any in any
|
||||
- **Fix (Phase 2):** complete the planned restructure. Pick this up from HANDOVER.md §"9c — Settings (scaled down)".
|
||||
- **Effort:** ~½ day.
|
||||
|
||||
#### C4. `magnotia-cloud-providers` does not earn its existence
|
||||
#### C4. `lumotia-cloud-providers` does not earn its existence
|
||||
- **Files:** `crates/cloud-providers/` (80 LOC across 2 files)
|
||||
- **Symptom:** crate contains an in-memory keystore with env-var fallback. Not "empty scaffolding" as the README says — but also not provider-specific. No HTTP code, no providers.
|
||||
- **Fix (decide, then act):**
|
||||
- (a) **Fold** into `magnotia-core::keystore` (preferred — it's a generic key store, nothing cloud-specific). Drop the crate. README §Architecture and the dependency graph simplify.
|
||||
- (a) **Fold** into `lumotia-core::keystore` (preferred — it's a generic key store, nothing cloud-specific). Drop the crate. README §Architecture and the dependency graph simplify.
|
||||
- (b) **Grow** it: actually implement an OpenAI-compatible STT client and an Anthropic STT client, gated behind a `cloud-stt` feature flag. Earn the boundary.
|
||||
- **Verify (option a):** workspace builds with `cloud-providers` removed from `Cargo.toml` members; the two consumers (`commands/llm.rs` and wherever else) re-import from `magnotia-core::keystore`.
|
||||
- **Verify (option a):** workspace builds with `cloud-providers` removed from `Cargo.toml` members; the two consumers (`commands/llm.rs` and wherever else) re-import from `lumotia-core::keystore`.
|
||||
- **Effort:** ~1 hour (option a) / multi-day (option b).
|
||||
|
||||
### Tier D — Hygiene (Phase 1 / Phase 8)
|
||||
|
||||
#### D1. Five HANDOVER files in repo root
|
||||
- **Files:** `HANDOVER.md`, `HANDOVER-2026-04-{17,18,19,24}.md`
|
||||
- **Symptom:** root noise; rebrand also rewrote their content so they describe `kon`/`corbie` work but read as `magnotia`.
|
||||
- **Symptom:** root noise; rebrand also rewrote their content so they describe `kon`/`corbie` work but read as `lumotia`.
|
||||
- **Fix:**
|
||||
- Move the four dated files under `docs/handovers/`.
|
||||
- Add a one-line italic note at the top of each historical file: *"Originally written when the product was named Kon (and briefly Corbie); references rewritten in the 2026-04-30 rebrand sweep."*
|
||||
|
||||
Reference in New Issue
Block a user