Files
Lumotia/docs/release/v0.1-completion-status.md
Jake 3770815fbf
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 — v0.1 release-completion run
Closes the code-side v0.1 ship gate. All quality gates green:
cargo fmt/clippy/test (~327 tests), npm check (0/0), vitest 13/13,
scripts/dogfood-rebrand-drill.sh 8/8.

Phase F — first-run onboarding promoted to v0.1
- FirstRunPage with skip-to-main + failure recovery + event recording
- Six onboarding commands (record/list/has-completed + lumotia_events)
- Storage migration v17 (onboarding_events + lumotia_events tables)

UI hardening (in-scope items from v0.1-ui-hardening.md)
- StatusPill + PostCaptureCard components, 21st preview entry
- Sidebar recording-as-sacred-state (opacity + aria-disabled, reduced-motion)
- Settings 6-section regroup + Help section + Activation log + Privacy toggle
- Error-state copy sweep (DictationPage + SettingsPage, plain-language)
- Global :focus-visible rule, textarea outlines restored
- Ctrl+K / Ctrl+, / Escape bindings in +layout

LLM resilience
- rule_based_extract_tasks (regex-free imperative-verb extractor) +
  extract_tasks_with_fallback wrapper — task extraction never returns zero
- tokio::time::timeout(120s) wraps cleanup/tags/tasks commands

Release artefacts
- LICENSE (canonical AGPL-3.0), CHANGELOG (Keep-a-Changelog format)
- v0.1-release-notes, privacy-and-ai-use, install-warnings,
  tester-onboarding-kit, tester-acceptance-runbook, code-signing-setup,
  apple-silicon-rb08-runbook, virtual-audio-setup, v0.1-contrast-audit
- Workspace versioning + AGPL spdx; npm exact-pin (10 ranges removed)
- AppImage SHA-256 sidecar in build.yml
- README v0.1 section + Reporting-issues; canonical repo slug

Closure pass — items moved from human-required to code-complete
- KI-02 Linux idle inhibit: zbus 5 → org.freedesktop.login1.Manager.Inhibit
- KI-03 Windows sleep prevention: SetThreadExecutionState(ES_CONTINUOUS|...)
- acquire/release_idle_inhibit Tauri commands, wired in DictationPage
- Diagnostic-bundle frontend wire-up (Settings → Help button)
- WCAG-AA contrast fix via .btn-filled-text utility (no token changes)
- 8 destructive-action sites wrapped in plain-language confirm() guards
- KNOWN-ISSUES.md + v0.1-known-limitations.md updated (KI-02/03 fixed)

Scripts
- pre-tag-verify.sh, tag-day.sh, smoke-linux + driver
- parse-diagnostic-bundle.sh, parse-activation-log.py

Per-item audit trail: docs/release/v0.1-completion-status.md
Remaining: W-01…W-08 (signing certs, hardware probes, smoke matrix,
tester recruitment) — see docs/release/v0.1-known-limitations.md.
2026-05-15 06:59:08 +01:00

22 KiB
Raw Permalink Blame History

name, type, tags, description
name type tags description
v0.1-completion-status release
release
v0.1
completion
status
residual
human-required
audit
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 inhibitzbus 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 preventionwindows 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 commandsacquire_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_taskscrates/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)".

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