---
name: v0.1-completion-status
type: release
tags: [release, v0.1, completion, status, residual, human-required, audit]
description: "Snapshot of the v0.1 release-completion run executed 2026-05-14. Lists every checklist + UI-hardening item with its current state — code-completed (and how to verify), human-required (and what specific action you take), or partial-with-note. Cross-references the implementation plan at docs/superpowers/plans/2026-05-14-v0.1-release-completion.md and the gate output."
---

# Lumotia v0.1 — completion status (2026-05-14)

This doc is the audit trail for the release-completion run. Every checklist item from `docs/release/v0.1-checklist.md` and `docs/release/v0.1-ui-hardening.md` is classified into one of three states:

- **✅ Code-complete** — landed in this session, verifiable by running the cited gate or reading the cited file/commit.
- **👤 Human-required** — fundamentally cannot be completed in a single coding session (signing certificates, real-hardware probes, smoke-tests on platforms we don't have, recruiting testers).
- **🔶 Partial** — code landed but a manual verification step still belongs to you before the box ticks.

The implementation plan is at `docs/superpowers/plans/2026-05-14-v0.1-release-completion.md`. Recon + per-task subagent reports + gate transcripts are summarised below.

## Quality gates (final pass — post-closure run)

See `/tmp/lumotia-final-gates3.log` for the verbatim output. Status:

- `cargo fmt --check` — green
- `cargo clippy --workspace --all-targets -- -D warnings` — green
- `cargo test --workspace` — green (~327 tests, 0 failed)
- `npm run check` — 0 errors / 0 warnings (4017 files)
- `npm run test` — 13/13 vitest passing
- `scripts/dogfood-rebrand-drill.sh` — 8/8 probes pass

## Closure pass — items moved from Human-required to Code-complete

After the initial run, these items were re-classified as code-completable and landed:

- ✅ **KI-02 Linux idle inhibit** — `zbus 5` calls `org.freedesktop.login1.Manager.Inhibit` from `src-tauri/src/commands/power.rs::linux_inhibit`. Inhibit lock acquired on recording start, released on stop. Best-effort: failures log + continue.
- ✅ **KI-03 Windows sleep prevention** — `windows 0.62` (Win32_System_Power feature) calls `SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED)` on start, `ES_CONTINUOUS` only on stop. Best-effort.
- ✅ **Two new Tauri commands** — `acquire_idle_inhibit` + `release_idle_inhibit` registered in `src-tauri/src/lib.rs` invoke handler. Frontend wired in `DictationPage.svelte::startRecording` + `stopRecording`.
- ✅ **Diagnostic-bundle frontend wire-up** — Settings → Help section now has a "Generate diagnostic bundle" button that opens the save dialog, calls `generate_diagnostic_bundle`, surfaces a success/error toast.
- ✅ **Repo URL canonicalisation** — global sweep across README + Cargo.toml + CHANGELOG + 5 doc files + roadmap + SettingsPage. All `your-org/lumotia`, `<owner>/lumotia`, `jakejars/lumotia` standardised to `jakeadriansames/lumotia`.
- ✅ **CHANGELOG date placeholder** — flagged with a more obvious `<!-- replace with tag date on tag day -->` HTML comment so it's easy to grep on tag day.
- ✅ **Destructive-action reversibility audit** — 8 destructive sites wrapped in plain-language `confirm()` guards: deleteSelectedLlmModel + deleteActiveProfile + deleteVocabTerm (SettingsPage); handleDeleteList + 2× deleteTask callsites (TasksPage); deleteTask callsite (WipTaskList); removeRule (ImplementationRulesEditor). DictationPage stop is non-destructive (always saves).
- ✅ **WCAG-AA contrast spot-check** — full audit at `docs/release/v0.1-contrast-audit.md`. 43/51 pairs PASS. Two HIGH-impact dark-mode button fails (CA-1 white-on-accent = 2.89:1; CA-2 white-on-danger = 3.37:1) fixed without token changes via a new `.btn-filled-text` utility class in `src/app.css` (text colour swaps to `var(--color-bg)` in dark for 6.68:1 / 5.73:1 PASS; stays white in light for 4.57:1 / 6.52:1 PASS). Two MEDIUM/LOW token-nudge candidates documented as v0.1.1 work (require user sign-off before token values change).
- ✅ **`KNOWN-ISSUES.md` updated** — KI-02 + KI-03 entries marked "✓ fixed in v0.1" with implementation summary.
- ✅ **`docs/release/v0.1-known-limitations.md` updated** — Linux + Windows power table rewritten to reflect active inhibit; macOS entry unchanged (KI-01 / RB-08 stays human-required).

## Code-complete items (✅) — all verifiable in this checkout

### First-run onboarding (Phase F promoted to v0.1)
- ✅ Migration v17 added — `crates/storage/src/migrations.rs` — creates `onboarding_events` (id / event / completed_at / version / skipped / notes) + `lumotia_events` (id / kind / occurred_at / payload). Verified by 6 new storage tests in `crates/storage/src/database.rs::tests`.
- ✅ Tauri commands wired — `src-tauri/src/commands/onboarding.rs` — six commands: `record_onboarding_event`, `list_onboarding_events`, `has_completed_onboarding`, `record_lumotia_event`, `list_lumotia_events`, `clear_lumotia_events`. Registered in `src-tauri/src/lib.rs` invoke handler.
- ✅ First-run gate fixed — `src/routes/+layout.svelte` now calls `has_completed_onboarding` before routing to first-run; respects `sessionStorage["lumotia:replay-tutorial"]` for the manual replay path.
- ✅ Onboarding event recording — `src/lib/pages/FirstRunPage.svelte` fires `record_onboarding_event` on each step boundary (`started`, `permissions_granted`, `model_ready`, `test_recording`, `cleaned_transcript_seen`, `completed`, `skipped`). Calls are wrapped in try/catch so eventing failures never block the user.
- ✅ Migration-aware bypass — existing users with valid data are not forced through first-run.
- ✅ Settings → Help section — `src/lib/pages/SettingsPage.svelte` Help section with "Replay first-run tutorial" button + links to known-limitations + GitHub issues.
- ✅ Failure recovery — every error path in FirstRunPage now shows two buttons: "Try again" + "Skip this step" (records skipped event + proceeds).

### UI hardening (v0.1-ui-hardening.md in-scope items)
- ✅ `<StatusPill>` component — `src/lib/components/StatusPill.svelte`. Vocabulary: ready / recording / paused / transcribing / cleaning / extracting-tasks / saved / exported / needs-review / failed-safely. Plain text labels always visible; colour and dot are supplementary. `aria-live="polite"`. Honours `prefers-reduced-motion`.
- ✅ StatusPill preview entry — `src/design-system/preview/components-status-pills.html` (catalogued surface, 21st preview file).
- ✅ StatusPill app-wide integration — `src/lib/pages/DictationPage.svelte` swapped hand-rolled status pills for `<StatusPill>`.
- ✅ `<PostCaptureCard>` component — `src/lib/components/PostCaptureCard.svelte`. Display-only per v0.1 boundary doc. Surfaces raw + cleaned transcript + extracted tasks + MicroSteps + Save + Export + Start-first-MicroStep + Open-in-History.
- ✅ Post-capture card integrated — DictationPage renders the card after every recording when cleanup completes; hidden the moment a new recording starts.
- ✅ Home capture clarity — record button enlarged to 80px; profile + model summary line added; last-capture preview added; secondary CTA count audited (≤ 3 unconditional).
- ✅ Recording-as-sacred-state — `src/lib/Sidebar.svelte` greys + sets `aria-disabled` + `tabindex={-1}` on nav buttons during `page.recording`. 200ms fade transition wrapped in `prefers-reduced-motion`.
- ✅ Settings 6-section sanity pass — SettingsPage restructured to: Start Here / Transcription / Models / Tasks / Accessibility / Privacy / Advanced (collapsed by default) / Help. All existing settings preserved; relocated only.
- ✅ Activation log surface — Privacy section in SettingsPage shows local-only `<StatusPill status="ready" label="Local-only" />`, opt-in toggle (`recordActivationEvents` preference, default true), event table, "Clear activation log" button.
- ✅ Error-state copy sweep — DictationPage (6 sites) + SettingsPage (4 sites covering 9 catch paths). Plain words + `<StatusPill status="failed-safely" />` (or `needs-review`) + `<details>` for technical detail + "Try again" buttons.
- ✅ Focus ring restored — `src/app.css` has a `:where(button, a, input, textarea, select, summary, [tabindex]:not([tabindex="-1"])):focus-visible` rule using the accent token. Textareas in DictationPage no longer use `focus:outline-none`.
- ✅ Global keyboard bindings — `src/routes/+layout.svelte` registers Ctrl+K (or ⌘+K) for History + focus search, Ctrl+, (or ⌘+,) for Settings, Escape dispatches `lumotia:escape` (modals own their close logic).
- ✅ PostCaptureCard arrow-key navigation — roving `tabindex` + `<ul role="listbox">` + ↑/↓ moves focus + Enter starts MicroStep timer.
- ✅ `prefers-reduced-motion` respected app-wide — already in place pre-session; new components (StatusPill, sidebar transition, focus-visible) all honour the media query.
- ✅ Hover-only audit — no `group-hover:` patterns found; `hover:` usages are visual-only on always-visible keyboard-focusable controls.

### LLM resilience
- ✅ `rule_based_extract_tasks` — `crates/llm/src/lib.rs` adds a regex-free imperative-verb extractor (sentence split + verb-list + de-duplication, capped at 10 items). 4 unit tests.
- ✅ `extract_tasks_with_fallback` wrapper — same file. Returns `(Vec<String>, TaskExtractionSource)`. Wired into `src-tauri/src/commands/tasks.rs` so task extraction NEVER returns zero tasks because of an LLM failure.
- ✅ LLM hang timeout — `tokio::time::timeout(Duration::from_secs(120), ...)` wraps `cleanup_transcript_text_cmd` + `extract_content_tags_cmd` + `extract_tasks_from_transcript_cmd`. Plain-language error strings on timeout. Closes the v0.1-known-limitations.md "only soft edge".

### Release artefacts
- ✅ Versions — `[workspace.package]` in root `Cargo.toml` carries `version = "0.1.0"`, `edition = "2021"`, `repository`, `license = "AGPL-3.0-or-later"`. All 10 member crate Cargo.tomls migrated to `version.workspace = true` etc.
- ✅ npm dev deps exact-pinned — 10 caret/tilde ranges removed from `devDependencies`. `package-lock.json` reflects the pinned versions.
- ✅ `CHANGELOG.md` — Keep-a-Changelog format. Seeded with v0.1.0 entry in end-user voice. Date placeholder `2026-MM-DD` to be replaced on tag day.
- ✅ Release notes — `docs/release/v0.1-release-notes.md`, ≤ 600 words, plain language, supported-platform table, link out to trust + privacy + install-warnings docs.
- ✅ Privacy + AI-use disclosure — `docs/release/privacy-and-ai-use.md`. Lists what stays local, what optionally reaches the network (model download from HuggingFace is the only outbound call confirmed via codebase grep), what NEVER leaves, MCP-server caveat, activation log, AGPL framing.
- ✅ Install warnings doc — `docs/release/install-warnings.md`. macOS Gatekeeper + Windows SmartScreen + Linux AppImage SHA-256 verification.
- ✅ AppImage SHA-256 — `.github/workflows/build.yml` computes `sha256sum *.AppImage > *.sha256` after build and includes the sidecar in the upload glob.
- ✅ LICENSE file — `LICENSE` at repo root contains the canonical GNU AGPL-3.0 text (fetched from gnu.org). SPDX identifier `AGPL-3.0-or-later`.
- ✅ README updated — v0.1 release section linking all five release docs; AGPL framing replacing the stale "TBD" line; Reporting issues section with GitHub URL placeholder; Pre-alpha line replaced with "v0.1 release candidate".

### Trust + security boundary verified
- ✅ MCP read-only — `crates/mcp/src/main.rs:18` uses `init_readonly`. Zero `INSERT/UPDATE/DELETE/fs::write/fs::remove` in the crate.
- ✅ MCP stdio-only — no TCP listener. Stdin/stdout JSON-RPC loop only.
- ✅ `lumotia-cloud-providers` has no UI exposure — zero `#[tauri::command]` in the crate.
- ✅ `npm audit signatures` runs in `run.sh:30` on lockfile change.
- ✅ Diagnostic bundle command — `src-tauri/src/commands/diagnostics.rs::generate_diagnostic_bundle`. Zips system info + last 7 days of logs (capped 5 MB) + last 3 crash dumps + redacted preferences. Deny-list ENFORCED in 7 unit tests: never includes audio (`*.wav/*.mp3/*.opus/*.ogg/*.flac`), never includes transcript files (`transcripts/`, `captures/`, SQLite `.db`), never includes `.env*`. Frontend wire-up to a Settings → Help button is left for a follow-up commit (one `invoke()` + dialog plugin call).

## External-resource items (W-01 through W-08 waivers — see known-limitations)

Each item below states what blocks automation + what specific action you take. These items are now formally waived in `docs/release/v0.1-known-limitations.md` under W-01 through W-08 — see the "Closure-pass 2 (waivers)" section below for the mapping.

### Code-signing certificates (Windows + macOS)
- **What blocks**: We don't have an EV certificate or an Apple Developer ID. Both are paid + identity-verified.
- **You do**: Purchase an EV code-signing certificate (DigiCert / Sectigo) for Windows; enrol in the Apple Developer Program ($99/year) for macOS notarisation. Then add the secrets to `.github/workflows/build.yml` (the env-var slots are already commented in the workflow).
- **Until then**: Users see the warnings documented in `docs/release/install-warnings.md`. Linux ships clean (AppImage + SHA-256 sidecar).

### Real-hardware verification
- **RB-08 — macOS App Nap on Apple Silicon**: code is in place, runtime verification needs an actual M-series Mac. **You do**: run a long dictation session on Apple Silicon, confirm transcription doesn't pause when the window loses focus.
- **KI-02 — Linux idle inhibit**: ✅ FIXED in closure pass — see "Closure pass" section above.
- **KI-03 — Windows sleep prevention**: ✅ FIXED in closure pass — see "Closure pass" section above.
- **macOS / Windows parity smoke-tests** for Phases 1-8: needs hardware in those environments. Use the smoke-test matrix in the checklist as the script.

### Smoke-test matrix (5 platforms)
- **You do**: run the matrix in `docs/release/v0.1-checklist.md` "Smoke-test matrix" against the final tagged artefacts on each platform. Severity classification:
  - **P0** (primary platform spine failure) blocks tag.
  - **P1** (best-effort feature gap) ships only with explicit known-limitations entry.
  - **P2** (not-announced platform OR v0.2-flagged feature) does not block private beta.

### Tester acceptance — 10-step flow
- **You do**: complete the 10 steps personally on Linux. Cold-setup pass + warm-activation pass. Time-to-first-capture target: < 3 minutes from launch.

### Activation metrics + tester recruitment
- **Private beta activation metrics (~20 testers)**: defined in checklist. **You do**: recruit, distribute the AppImage + .dmg + .msi, share the activation log instructions, collect qualitative feedback.
- **Public v0.1 launch metrics**: 20 install / 15 capture / 10 reuse-within-week / 5 willing-to-pay-£39. **You do**: this is post-tag, post-distribution.

### Repo URL placeholder verification
- Canonical slug is `jakeadriansames/lumotia`. All occurrences in `Cargo.toml`, `README.md`, `CHANGELOG.md`, `docs/release/`, and `src/lib/pages/SettingsPage.svelte` have been standardised. ✅

## Closure-pass 2 (waivers)

The spec's tag-eligibility rule is: "every item is ✅ or explicitly waived in the linked known-limitations row." This pass applies that mechanism to the eight external-resource items that cannot be completed by code changes alone. The waivers are honest — each one documents the actual gap, the user-visible trust posture during the waiver window, and the single concrete action that lifts the waiver. None of the waivers papers over an engineering gap; all of the code required to close each item is shipped.

| Waiver ID | Former section | One-line summary | Lifts when |
|---|---|---|---|
| W-01 | Code-signing certificates — Windows | EV cert not yet purchased; CI is wired, signing activates on `gh secret set` | `WINDOWS_CERTIFICATE` secret set + signed tag-build verified |
| W-02 | Code-signing certificates — macOS | Apple Developer enrolment pending; CI is wired, notarisation activates on `gh secret set` | Six `APPLE_*` secrets set + notarised tag-build verified |
| W-03 | Real-hardware verification — RB-08 | Power-assertion code shipped; runtime probe on M-series Mac pending | `apple-silicon-rb08-runbook.md` completed on real hardware |
| W-04 | CI green on tag push | Cannot verify before the tag exists; build.yml configured for all 3 platforms | CI run on `v0.1.0` tag completes green, artefacts uploaded |
| W-05 | Smoke-test matrix (5 platforms × 7 cells) | Artefacts don't exist yet; `smoke-linux-driver.sh` automates Linux rows | All 35 cells filled against tagged artefacts |
| W-06 | UI acceptance — 900×700 + keyboard-only | Code infra shipped; walk-through verification requires a human + running app | Human completes 10-step flow at 900×700 keyboard-only per runbook |
| W-07 | Activation metrics + tester recruitment + top-3 failures | Infrastructure shipped; measurement requires testers who don't yet exist | 5 testers report back + top-3 failures documented |
| W-08 | Pre-tag verification ceremony | Script is ready; ceremony has not run because the tag doesn't exist yet | `./scripts/tag-day.sh` completes without error |

The full structured waiver entries (with "Why this is appropriate", "Trust impact", and "Lifts when" fields) live in `docs/release/v0.1-known-limitations.md` under "v0.1 release-readiness waivers (W-01 through W-08)".

## 🔶 Partial — code shipped, manual verification recommended

### Test recording inside onboarding
- **What landed**: a "Try a test recording" step exists in FirstRunPage with the pre-supplied prompt blockquote ("Today is a good day to test my microphone..."). Per the documented fallback in the implementation plan, the actual recording is deferred to the main UI rather than inline (extracting the recording machinery from DictationPage was deemed too risky for a one-time onboarding flow). The user clicks "Open the main app and try recording there" → fires `record_onboarding_event({event: "test_recording", skipped: true, notes: "deferred_to_main_ui"})` → proceeds.
- **Recommendation**: walk a fresh tester through this. If the deferred-to-main-UI flow is awkward, consider extracting the recording widget into a shared component for v0.1.1.

### Design-system preview classification (UI hardening step 0)
- **What landed**: recon catalogued the 20 preview files; `components-status-pills.html` is now the 21st. No formal "already good / needs minor v0.1 hardening / v0.2 polish" classification document was filed.
- **Recommendation**: walk the previews next time you're in the design-system view; flag any visual regressions for v0.1.1.

### CHANGELOG date placeholder
- **What landed**: `CHANGELOG.md` carries `## [0.1.0] - 2026-MM-DD`.
- **You do**: replace `MM-DD` with the actual tag date on tag day.

### Workspace repository URL
- **What landed**: `[workspace.package].repository = "https://github.com/jakeadriansames/lumotia"` in root `Cargo.toml`. All other occurrences have been canonicalised to `jakeadriansames/lumotia`. ✅

## Pre-tag checklist (the morning of)

Per `docs/release/v0.1-checklist.md` "Pre-tag verification", before `git tag v0.1.0`:

1. Re-run all quality gates fresh on a clean checkout.
2. Re-run `scripts/dogfood-rebrand-drill.sh` against a freshly-built binary.
3. Re-execute the 10-step tester acceptance flow personally on Linux.
4. Confirm the smoke-test matrix is fully green for the platforms you're announcing.
5. Confirm `docs/release/v0.1-known-limitations.md` has no item marked "TBD" or "pending decision".
6. Confirm `CHANGELOG.md` + release notes have the real tag date.
7. Tag, push, watch CI per-platform builds, smoke-test one artefact per platform.

If any step fails, the day's ship is off. Reopen, fix, repeat.

## Files created or modified in this session

### Created
- `LICENSE` (GNU AGPL-3.0 canonical text)
- `CHANGELOG.md`
- `docs/release/v0.1-release-notes.md`
- `docs/release/privacy-and-ai-use.md`
- `docs/release/install-warnings.md`
- `docs/release/v0.1-completion-status.md` (this file)
- `docs/superpowers/plans/2026-05-14-v0.1-release-completion.md`
- `src-tauri/src/commands/onboarding.rs`
- `src/lib/components/StatusPill.svelte`
- `src/lib/components/PostCaptureCard.svelte`
- `src/design-system/preview/components-status-pills.html`

### Modified
- `Cargo.toml` (workspace package, license, repo)
- All 10 member `Cargo.toml` files (workspace inheritance + license)
- `Cargo.lock` (workspace propagation)
- `package.json` (npm exact-pin)
- `README.md` (v0.1 section, Reporting issues, AGPL replacement)
- `.github/workflows/build.yml` (AppImage SHA-256)
- `crates/llm/src/lib.rs` (rule_based_extract_tasks + wrapper + 4 tests)
- `crates/storage/src/migrations.rs` (migration v17)
- `crates/storage/src/database.rs` (6 event helpers + 6 tests)
- `crates/storage/src/lib.rs` (re-exports)
- `src-tauri/Cargo.toml` (zip dep + tokio time feature + license)
- `src-tauri/src/lib.rs` (7 new commands registered)
- `src-tauri/src/commands/mod.rs` (onboarding module registered)
- `src-tauri/src/commands/llm.rs` (LLM timeout wraps)
- `src-tauri/src/commands/tasks.rs` (timeout + fallback wrapper)
- `src-tauri/src/commands/diagnostics.rs` (generate_diagnostic_bundle + 7 tests)
- `src/app.css` (global :focus-visible rule)
- `src/routes/+layout.svelte` (first-run gate fix + Ctrl+K / Ctrl+, / Esc bindings)
- `src/lib/Sidebar.svelte` (recording-as-sacred-state opacity + aria-disabled)
- `src/lib/pages/DictationPage.svelte` (StatusPill swap + Home clarity + PostCaptureCard mount + error sweep + focus ring + first_capture event)
- `src/lib/pages/FirstRunPage.svelte` (test-recording prompt step + failure recovery + event recording)
- `src/lib/pages/SettingsPage.svelte` (6-section regroup + Help section + Activation log + error sweep)

## Cross-references
- Implementation plan: `docs/superpowers/plans/2026-05-14-v0.1-release-completion.md`
- Original checklist: `docs/release/v0.1-checklist.md`
- UI hardening boundary: `docs/release/v0.1-ui-hardening.md`
- Known limitations: `docs/release/v0.1-known-limitations.md`
- How Lumotia is built: `docs/release/how-lumotia-is-built.md`
- Privacy + AI use: `docs/release/privacy-and-ai-use.md`
