Implementation Status
This tracks what’s actually shipped in code vs. what each spec section describes. Specs are aspirational by design; this doc is the ground-truth pointer when a reader wants to know “can I use this today?”
Status keys:
- ✅ Shipped — implemented, exercised by reference apps, tests cover the core path.
- 🚧 Partial — primary path works, edges or polish missing.
- 🧪 Demo — real implementation exists but not yet wired into a reference app or production-shaped.
- 📝 Stub — type/scaffold present, no real logic.
- ❌ Not started — no code yet.
Last reviewed: ground-up audit at the end of the v0 reference-app push. If you change behaviour, update this doc in the same commit.
Core (crates/locara-core)
| Spec | Item | Status | Notes |
|---|---|---|---|
| 02 | Manifest validation (validate) | ✅ | Regex-checked schema; tests for missing models, wrong schema, invalid tooling. |
| 03 | Capability set + checker | ✅ | All ops gated; check failures appended to capability log. |
| 04 | Modality + tooling expansion | ✅ | Closed sets; tooling: ["echo"] + others recognised. |
| 04 | image-to-text modality | ✅ | Wired to OCR pipeline. |
| 04 | speech-to-text modality | ✅ | Wired to whisper streaming + file modes. |
| 04 | text-to-image modality | ❌ | No backend yet. |
| 04 | text-to-speech / voice-to-voice | ❌ | No TTS backend. |
SDK (packages/sdk)
| Spec | Item | Status | Notes |
|---|---|---|---|
| 05 | llm.chat / llm.chatStream | ✅ | Streaming via Channel<T>; raw event shapes translated client-side. |
| 05 | embed({input}) | ✅ | Single + array; runtime auto-routes arrays to embed_many for batched perf. |
| 05 | transcribe.fromFile | ✅ | Web Audio decode → 16kHz mono PCM → IPC. |
| 05 | transcribe.stream | ✅ | 'microphone', 'system', MediaStream, AsyncIterable<Float32Array> sources. |
| 05 | ocr.fromFile | ✅ | Sends base64 image bytes, runtime dispatches to OCR backend. |
| 05 | db.query / db.exec | ✅ | Coerces JS arrays of floats to f32 LE blobs for sqlite-vec params. |
| 05 | audit.capabilityLog | ✅ | LogEntry[] snapshot. |
| 05 | tools.invoke | ✅ | Routes to wasmtime via runtime registry. |
| 05 | vlm.describe | ❌ | Type exists; no backend. |
| 05 | audio.openMicrophone (legacy) | ❌ | Superseded by transcribe.stream({source: 'microphone'}). |
Runtime (crates/locara-runtime)
| Spec | Item | Status | Notes |
|---|---|---|---|
| 07 | LocaraState builder | ✅ | with_transcribe, with_ocr, with_embedding_backend, with_app_db, with_tool_invoker. |
| 07 | Tauri IPC commands | ✅ | All gated through check(); denials logged + structured-error’d. |
| 07 | run_with_clean_exit | ✅ | macOS C++ static-dtor crash workaround via _exit(0) on RunEvent::Exit. |
| 07 | Capability log | ✅ | Append-only CapabilityLog; readable via capability_log IPC. |
| 33 | Streaming transcribe (sliding-window) | ✅ | 10s window, 750ms tick, partial→final promotion. |
Shared model daemon (crates/locara-modeld*)
| Spec | Item | Status | Notes |
|---|---|---|---|
| 07 / ADR-0015 | Protocol crate (locara-modeld-protocol) | ✅ | Msgpack-over-Unix-socket framing; externally-tagged Body; 8 unit tests cover round-trip + oversize / truncated / garbage rejection. |
| 07 / ADR-0015 | Daemon binary (locara-modeld) | ✅ | Per-user socket, session table with refcount + idle eviction, graceful shutdown handle, SIGINT/SIGTERM aware, Chat dispatch streams tokens to clients via Notification::Token. 23 unit + 9 end-to-end tests. |
| 07 / ADR-0015 | Client crate (locara-modeld-client) | ✅ | Typed Client::connect, Client::load_model, Session::chat_stream returns a streaming ChatStream, Session with Drop-fires-release semantics. |
| 07 / ADR-0015 | Backend trait + StubBackend (v1.0) | ✅ | Backend::load + chat_stream. StubBackend echoes the user’s last message word-by-word — deterministic, exercises the full streaming round-trip in CI without real model weights. |
| 07 / ADR-0015 | Real inference via locara-llama (v1.1) | ✅ | crates/locara-modeld/src/llama_backend.rs adapts locara_llama::LlamaBackend to the daemon Backend trait, gated behind --features llama. llama_backend_factory(cache_root) plugs into Config::backend_factory. Resolves models from content-addressed + flat-cache layouts. 8 unit tests for the adapter; 1 gated integration test (LOCARA_TEST_MODEL_PATH=<gguf>). |
| 07 / ADR-0015 | Transcribe wiring (v1.2) | 🚧 | Runtime IPC for models_resolve_or_request + model_download plus a React first-run flow. Foundation primitives (fetch_to_cache, ModelDownloader) both exist; the wiring needs real-Mac end-to-end testing. |
| 07 / ADR-0015 | Tray UI (v2) | ❌ | Read-only menubar app: warm models, RAM consumed, current inferring app. |
| 07 / ADR-0015 | launchd auto-start (v3) | ❌ | locara modeld install / status / restart / uninstall writes the LaunchAgent plist. |
| 07 / ADR-0015 | Runtime opt-in path | 🚧 | v0 daemon ships disabled-by-default. App runtime gets the runtime.backend: "daemon" field with v1.2 (transcribe wiring). |
Backends
| Spec | Item | Status | Notes |
|---|---|---|---|
| 09 | locara-llama chat | ✅ | llama.cpp via llama-cpp-2; Metal on Apple Silicon. |
| 09 | locara-llama embed | ✅ | Mean-pool; embed_many shares one context across inputs. |
| 09 | locara-whisper (file) | ✅ | whisper.cpp 0.16; Metal. |
| 09 | locara-whisper (stream worker) | ✅ | Lives in runtime, calls WhisperBackend.transcribe per tick. |
| — | locara-vision-ocr | ✅ | Apple Vision via objc2-vision. |
| — | locara-microphone | ✅ | cpal CoreAudio input; f32/i16/u16 conversion. |
| — | locara-screencapture-audio | ✅ | macOS SCK; excludesCurrentProcessAudio = true. |
| — | bge-small-en-v1.5 dedicated embedder | ✅ | Wired through with_embedding_backend; 384-dim vec0 in DocVault. |
Tools (crates/locara-tools)
| Spec | Item | Status | Notes |
|---|---|---|---|
| 10 | Wasmtime + WASI Preview 1 invoker | ✅ | Fuel + memory limits, preopened dirs, JSON in/out. |
| 10 | Tool registry (in-memory) | ✅ | WasmToolRegistry in runtime; demo echo tool ships. |
| 10 | Content-addressed cache (ToolCache) | 🚧 | Type + tests exist; not yet used by any app. |
| 10 | Capability composition per invocation | ✅ | ToolGrant built per call; no ambient authority. |
| 10 | Real-world tool wasm artefacts | ❌ | Only the demo echo. Real tools (filesystem.search, etc.) unimplemented. |
Storage (crates/locara-storage)
| Spec | Item | Status | Notes |
|---|---|---|---|
| 08 | SQLite open + WAL pragmas | ✅ | locara_storage::open(). |
| 08 | sqlite-vec auto-extension | ✅ | locara_storage::init() registers it. |
| 35 | Migration runner | 🚧 | apply_migrations exists; DocVault uses idempotent CREATE IF NOT EXISTS in lieu of versioned migrations. |
| 08 | Schema parsing + diffing | 🚧 | parse_schema works; diff is type-shaped only. |
CLI (crates/locara-cli)
| Spec | Item | Status | Notes |
|---|---|---|---|
| 06 | locara init <template> <name> | ✅ | blank template scaffolds a runnable Tauri app. |
| 06 | locara verify | ✅ | Validates manifest + reports modalities/models. |
| 06 | locara doctor | ✅ | Checks bun, cargo, rustc, git. |
| 06 | locara model list | ✅ | Shows both flat-cache files (gguf/bin) and blobs/ content-addressed entries. |
| 06 | locara model add | ✅ | Local files and HTTP(S) URLs; streams via locara-models::fetch_to_cache with running SHA-256 verification and atomic blob rename. |
| 06 | locara add <component> | ✅ | Reads packages/components/registry.json and copies real files into src/components/ui/. |
| 06 | locara dev | ✅ | Resolves model, sets LOCARA_MODEL_PATH, shells to tauri dev. |
| 06 | locara test | 🚧 | Shells to bun test + cargo test; minimal post-processing. |
| 06 | locara build | 🚧 | Delegates to tauri build. |
| 06 | locara simulate | 📝 | Argument parser only. |
| 06 | locara publish | 📝 | Dry-run; no real registry yet. |
Components (packages/components)
| Spec | Item | Status | Notes |
|---|---|---|---|
| 11 | Primitives — Button / Input / Badge / Kbd / Card / Stack / Tooltip / Skeleton / Spinner | ✅ | shadcn-style copy-in via locara add <id>. |
| 11 | App shell — AppShell / AuditLog / AuditDrawer | ✅ | Right-slot accepts arbitrary children; audit drawer wired into every reference app. |
| 11 | Chat — Chat / MessageBubble / PromptBox / ChatComposer / MessageActions / ConversationList / TokenCount / VariableChip | ✅ | ChatComposer composites model-picker + mode-switcher + slash menu + attachments. |
| 11 | Voice — AudioInput / TranscriptStream / ListeningPill / VoiceOrb / WaveformBars / ListeningSurface | ✅ | Used by Listen / Transcribe. |
| 11 | Documents — DocDropzone / DocPreview / ResultsList / MarkdownView / PdfView / FileTree | ✅ | Used by DocVault. |
| 11 | AI affordances — ModelSelector / ModelDownloader / ToolCallCard / Reasoning / ThinkingIndicator / StreamingText / ContextMeter / ModeSwitcher / AttachmentChip / StatusPill / EmptyStateCards / FollowupRow / AcceptReject / SlashMenu / CommandPalette / HoverActionRow / AIText / CitationChip / SourceCard | ✅ | The “Cursor / Granola / Claude / Linear” pattern set. |
| 11 | Foundation primitives — Dialog / Sheet / Toast / ContextMenu / Switch / Checkbox / RadioGroup / Slider / Tabs / SegmentedControl / Select / Combobox / FormField / Avatar / Progress / CopyButton / TimeAgo | ✅ | Radix-flavoured + WAI-ARIA APG compliant. |
| 11 | Editors — MarkdownEditor / CodeEditor / DiffView / InlineEditPopover / EditorToolbar / SuggestionGhostText / EditorOutline | ✅ | Bear / iA Writer / Cursor / CodeMirror lineage. |
| 11 | Data + media — DataTable / CodeBlock / VegaChart / RemotionFrame / SandboxFrame | ✅ | DataTable used by data-analyser; SandboxFrame for inline LLM-generated UI. |
| 11 | Registry + locara add | ✅ | 60+ entries in registry.json; integration test asserts every entry resolves cleanly to disk. |
| 11 | Visual regression | ✅ | 46 Playwright snapshots of /components/[id] previews, 1% pixel-diff tolerance; live React demos for 15 interactive components via Astro islands. |
Reference Apps (apps/)
| App | Status | Notes |
|---|---|---|
apps/transcribe | ✅ | File → whisper transcript → optional Q&A via Qwen. |
apps/listen | ✅ | Real-time mic + system audio → sliding-window whisper transcript; demo echo tool registered. |
apps/docvault | ✅ | Drop text/images → OCR → chunked → bge-small embeddings → sqlite-vec KNN → grounded Q&A with citations; persists across restarts. |
apps/scribe | ✅ | Multi-modal scribe agent; uses locara-automation for browser drive. |
apps/voice | ✅ | Voice-to-voice agent shell. |
apps/reader | 🚧 | Local doc browser + grounded chat; agent loop uses list_sections / read_section tools. Builds clean, passes locara verify. Polish gap: first-run model download UX. |
apps/studio | 🚧 | Multi-track sandbox. Builds clean, passes locara verify. Same first-run gap. |
apps/data-analyser | 🚧 | DataTable + Vega + LLM Q&A over CSVs. Builds clean, passes locara verify. Same first-run gap. |
apps/video-gen | 🚧 | Describe-a-video → LLM emits Remotion JSX → live preview. Builds clean, passes locara verify. Same first-run gap. |
apps/demo | ✅ | Reference shell for new components. |
Website (website/)
| Spec | Item | Status | Notes |
|---|---|---|---|
| 45 | Static Astro site (238 pages) | ✅ | Manifesto, /apps, /components (per-id), /compatibility (Mac × model fit), /docs, /spec, /security. |
| 45 | Live React demos | ✅ | 15 components mounted as Astro islands on detail pages; production component code, scoped to a transformed containing block so modal/scrim stays inside the demo card. |
| 45 | Visual regression | ✅ | bun run test:visual — 46 baselines, runs in ≈10 s against astro preview. |
| 45 | Compatibility surface | ✅ | Every Mac SKU × every supported model: which fits, headroom, expected tok/s, ANE/MPS/AMX usage. |
Distribution / publishing
| Spec | Item | Status | Notes |
|---|---|---|---|
| 15 | App packaging (.app bundle) | 🚧 | Tauri’s defaults work for unsigned dev builds; signing/notarisation not configured. |
| 15 | Model fetch on first run | ❌ | Apps panic if LOCARA_MODEL_PATH / cache lookup fails. |
| 12 | Registry server / submission | ❌ | locara publish is a stub. |
| 24 | Monetisation hooks | ❌ | None. |
Cross-cutting
| Spec | Item | Status | Notes |
|---|---|---|---|
| 13/14 | Threat model + capability gating | ✅ | Every IPC capability-checked; tests assert denial paths. Tauri-consistency check now resolves cross-crate plugin permissions (e.g. locara-automation:default from its sibling crate). |
| 41 | Telemetry-zero | ✅ | No outbound network in any reference app. |
| 30 | Testing strategy | ✅ | 681 tests workspace-wide: 391 Rust (19 crates including 8 new tests for the LlamaBackend adapter; +1 gated integration test exercising real inference when LOCARA_TEST_MODEL_PATH is set), 244 TypeScript (80 components + 109 SDK + 49 manifest + 6 test-helpers), 46 visual-regression snapshots. cargo test --workspace && bun run ci is the canonical pre-commit. |
| 18 | Phasing | — | This doc captures the v0.0.4 reference-app + component-library push. |