Files
Jake 26c7307607
Some checks failed
check / cargo check (macos-latest) (push) Has been cancelled
check / cargo check (ubuntu-22.04) (push) Has been cancelled
check / cargo check (windows-latest) (push) Has been cancelled
check / svelte build + lint (push) Has been cancelled
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>
2026-05-13 12:38:03 +01:00

5.4 KiB
Raw Permalink Blame History

name, type, slice, last_verified
name type slice last_verified
Core model registry architecture-map-page 05-core-storage-hotkey-build 2026/05/09

Core model registry

Where you are: Architecture mapCore, Storage, Hotkey, Build → Core model registry

Plain English summary. The static catalogue of every speech-to-text model Lumotia ships or knows how to download. One Parakeet ONNX model and six Whisper GGML variants, each with pinned Hugging Face revisions and SHA256 digests so a downloaded file can be verified bit-for-bit against the registry. Pure data — the recommendation scoring lives in core-recommendation.md.

At a glance

  • File: crates/core/src/model_registry.rs (247 LOC).
  • External deps: standard library only (LazyLock).
  • Public surface: Engine, SpeedTier, AccuracyTier, LanguageSupport, ModelFile, ModelEntry, all_models, find_model.
  • Consumers: slice 2 model commands, the model manager, the recommendation engine (core-recommendation.md), the runtime-capabilities banner, the frontend model picker.

What's in here

Enums — crates/core/src/model_registry.rs:7-36

pub enum Engine          { Whisper, Parakeet, Moonshine }
pub enum SpeedTier       { Instant, Fast, Moderate, Slow }
pub enum AccuracyTier    { Excellent, Great, Good }
pub enum LanguageSupport { EnglishOnly, Multilingual(u16) }

Moonshine is reserved (no live entries today). LanguageSupport::Multilingual(u16) carries the count of supported languages but only the variant is used in scoring.

ModelFilecrates/core/src/model_registry.rs:39

pub struct ModelFile {
    pub filename: &'static str,
    pub url: &'static str,
    pub size: Megabytes,
    pub sha256: &'static str,  // hex, length 64
}

Every URL pins a specific Hugging Face revision SHA. The registry's test (model_registry.rs:222-246) asserts that no URL contains /resolve/main/ and that every digest is exactly 64 hex characters.

ModelEntrycrates/core/src/model_registry.rs:50

pub struct ModelEntry {
    pub id: ModelId,
    pub engine: Engine,
    pub display_name: &'static str,
    pub disk_size: Megabytes,
    pub ram_required: Megabytes,
    pub speed_tier: SpeedTier,
    pub accuracy_tier: AccuracyTier,
    pub languages: LanguageSupport,
    pub files: Vec<ModelFile>,
    pub description: &'static str,
}

ALL_MODELScrates/core/src/model_registry.rs:63

A LazyLock<Vec<ModelEntry>>. Seven entries:

ID Engine Disk RAM Speed Accuracy Notes
parakeet-ctc-0.6b-int8 Parakeet 650 MB 700 MB Instant Great Four ONNX shards. English only.
whisper-tiny-en Whisper 75 MB 390 MB Fast Good Bundled with the app.
whisper-base-en Whisper 142 MB 500 MB Fast Good Sweet spot for low-RAM.
whisper-small-en Whisper 466 MB 1024 MB Moderate Great Accuracy-first.
whisper-distil-small-en Whisper 336 MB 900 MB Fast Great Distilled, ~6× faster than small.
whisper-medium-en Whisper 1500 MB 2600 MB Slow Excellent Best Whisper accuracy.
whisper-distil-large-v3 Whisper 1550 MB 2800 MB Moderate Excellent Near large-v3 accuracy.

All entries are English-only at present. Multilingual variants would slot into languages cleanly.

Public functions

pub fn all_models() -> &'static [ModelEntry];           // model_registry.rs:208
pub fn find_model(id: &ModelId) -> Option<&'static ModelEntry>;  // model_registry.rs:213

Both return references into the LazyLock. No allocation.

Data flow / contract

  • Pure data. Lookups are read-only.
  • The Parakeet entry's four files are fetched by the model downloader as a directory of <model_id>/ siblings (see core-paths.md). Whisper entries are single GGML files.
  • The description field is user-facing copy. British-English spelling enforced.
  • SHA256 verification happens in the model downloader (slice 3), not here.

Tests

crates/core/src/model_registry.rs:217-246:

  • every_model_file_has_sha256_and_pinned_url — guard against accidental drift. SHA must be 64 hex chars; URL must not contain /resolve/main/.

Watch-outs

  • Hugging Face revisions can be force-pushed. The pinned revision SHAs in the URLs are content addresses on HF's git LFS, but a maintainer with admin rights can in theory rewrite history. The local SHA256 verification at download time catches this. There is no automated CI check that re-fetches and verifies; verification happens lazily on user-facing downloads.
  • description is &'static str. No i18n. If we localise the model picker we will need a key plus a separate string table.
  • Adding a new model requires a recompile. No runtime registry override path. Conscious choice — keeps the surface area small and the SHA256 invariants meaningful.
  • Moonshine is in the enum but no entries. Compiler does not complain because the enum is non_exhaustive-shaped via match arms inside scoring (see core-recommendation.md). When a Moonshine entry lands, the scoring path needs an explicit accelerator branch.

See also