Atomic tasks β every item cites a SPEC and maps to a PR. Agent contributors should claim a task by opening a draft PR; see AGENTS.md.
Reconciled against shipped code on 2026-05-29 (current release
v2.0.0-alpha.16). Statuses below reflect what is actually onmain, not what a spec proposed. The companion spec index tracks the same implementation state per spec.
docs/SPECS/<id>.md exists; ready to claimmainThe product has a working foundation. The current cycle is about removing first-launch friction, fixing visible quality issues, and improving the surfaces new users land on β not building more features. Pick from this band first. Ordered by impact.
| Β | Task | Spec | Notes |
|---|---|---|---|
| π‘ | Code signing + notarisation β kill the first-launch Gatekeeper βright-click β Openβ dance | SPEC-025 | Biggest install-success unlock, still not delivered. Signing capability exists in scripts/wrap_app.sh (Developer-ID branch + hardened runtime + TSA timestamp), but no notarisation is wired (notarytool/stapler absent everywhere) and no shipped DMG is Developer-ID-signed β README/INSTALL still tell users to right-clickβOpen. Blocked on a paid Apple Developer ID ($99/yr account decision). Once thatβs cleared: add notarytool submit --wait + stapler staple to make_dmg.sh/release CI, then strip the Gatekeeper caveats. |
| π΅ | README demo gif β strong first-impression artifact | SPEC-027 | S; cheap solo win. The landing-page-polish half is already done (og/twitter cards, banner in docs/index.md). The genuinely-missing deliverable is a looping β€2 MB demo GIF at the top of README + landing page β no *.gif/*.mp4 exists in-repo yet. |
| π‘ | Mandarin auto-detect fix β visible quality bug (#17, open since 2026-05-09) | SPEC-021 | M. No fix on main yet. PR #20 (draft, CI green) banks only the categorical failure-mode metrics baseline + zh corpus β the user-facing fix (PR-2, model-layer language handling) is the actual deliverable. Land #20 as the baseline, then ship the fix. Pairs with #62 below. |
| π‘ | Sparkle auto-update β existing users stay current without reinstalling | SPEC-026 | Far past spec-only: dependency + Updates pane + framework bundling all shipped (#40/#50/#49). But auto-install is a deliberate no-op β SUPublicEDKey omitted, appcast.xml ships zero items. To finish: generate EdDSA keys, commit the public key, sign + publish appcast items (PR-C). Gated behind SPEC-025 (notarised signed builds) for a trustworthy update path. |
| π΅ | Voice reply to live sessions β modifier-key + notification voice-reply action | SPEC-031a | S; spec merged (#54), zero implementation on main. Injection mechanism (--resume -p vs daemon socket) resolved in impl PR. |
| βͺ | Re-transcribe a past dictation from History β recovery without re-speaking | β (#62) | New 2026-05-29 feature request. Re-run stored audio through transcription/polish from the History view, with optional explicit language + model override. Directly mitigates #17βs wrong-language case; reuses local history (SPEC-014). Needs a spec; good retention item. |
| βͺ | Submission tracking for awesome-mac / awesome-llm / awesome-swift lists | β | quiet but durable inbound |
| βͺ | Quarterly bench refresh β durable artifact + monthly relaunch hook | β | leverages existing 5Γ2Γ177 bench |
Two spec-doc PRs are clean and CI-green but cite already-assigned SPEC numbers and must be renumbered to the next free monotonic IDs before merge. They cross-reference each other, so renumber as a coordinated pair; do not rename the branches (renaming an open PR head ref can close it).
| PR | Becomes | What | Action |
|---|---|---|---|
| #41 | SPEC-033 | Privacy-respecting Pages visitor analytics (GoatCounter) | Renumber 031β033; fix body βAdds SPEC-028ββ033; its SPEC-032 cross-ref β SPEC-034. Then merge. |
| #42 | SPEC-034 | Active-install count via Sparkle appcast hits (Cloudflare Worker) | Renumber 032β034; fix body βAdds SPEC-029ββ034; its two SPEC-031 cross-refs β SPEC-033. Then merge. Impl gated on SPEC-026. |
These have SPECs and are ready to claim, but weβre holding new feature scope until install + retention pipelines are strong enough to justify the surface area. Pick from here only when Adoption focus is empty.
| Β | Task | Spec | Notes |
|---|---|---|---|
| π‘ | Custom dictionary auto-learn (PR-A as #32; PR-B/C deferred) | SPEC-022 | M. PR #32 (post-paste AXObserver + correction store) is CI-green and merge-clean but on hold β it sits in this deferred band and Adoption focus isnβt empty. No auto-learn code is on main. (Distinct from the shipped static-dictionary seed, PR #59, made invisible again in alpha.16.) |
| π΅ | Agent session protocol + PassthroughAgent + conversation panel |
SPEC-006 | M |
| π΅ | ClaudeCodeAgent β long-lived subprocess, streaming events |
SPEC-006 | M |
| π΅ | Approval prompt UX (overlay morph + buttons) | SPEC-006 | S |
| π΅ | Settings β Privacy + Agent panes | SPEC-006 | S; lands with agent impl |
| π΅ | TextPolishEngine protocol + OllamaPolishEngine (HTTP) |
SPEC-007 | S |
| π΅ | MLXLMPolishEngine (in-process via mlx-swift-lm) |
SPEC-007 | M |
| π΅ | Settings β Polish pane (engine picker, model picker) | SPEC-007 | S |
| π΅ | Bench polish WER delta + latency on openquack-bench |
SPEC-007 | S |
| π΅ | Domain-term accuracy bench (e.g. βClaude Codeβ not βcloud codeβ) | SPEC-007 | S |
| π΅ | βSend-confidenceβ bench: % of utterances clean enough to ship as-is | SPEC-007 | S |
| π΅ | Engine prompt-token cache β offline-path parity for customWords |
SPEC-032 | S; perf-fix groundwork for re-shipping the dictionary seed default |
| π΅ | Per-app tone profiles | SPEC-024 | M; needs SPEC-007 first |
| π΅ | App localisation (i18n) β runtime UI strings (READMEs already translated) | SPEC-019 | M |
| π΅ | ANE-cache-only model footprint (investigation) | SPEC-029 | S |
| π΅ | ANE cache footprint: volunteer measurement campaign | SPEC-030 | S |
| βͺ | OllamaAgent (local HTTP) |
SPEC-006 ext | S |
| βͺ | MLXLMAgent (in-process via mlx-swift-lm) |
SPEC-006 ext | M |
| βͺ | Active-app context: feed foreground app + focused field text into Whisper prompt bias and polish/agent prompt | β | M |
| βͺ | Investigate streaming for medium-length (15β30s) audio: bench WER vs. wall-time at lower targetChunkSeconds |
SPEC-012 ext | S |
| βͺ | Live partial transcripts in pill/popover while speaking | β | M |
| βͺ | System-audio capture (meeting mode) | β | ScreenCaptureKit |
| βͺ | Action confirmation UI for high-risk agent calls | β | privacy gate |
| βͺ | Per-agent transcript history pane (opt-in, local-only) | β | β |
| βͺ | Linux / Windows ports | β | post-2.0 |
| Β | Task | Spec | Notes |
|---|---|---|---|
| π’ | Agent kickoff: voice-launched claude --bg session via separate hotkey β daemon-managed, notification-driven |
SPEC-031 | shipped in v2.0.0-alpha.14 (#53); post-ship fixes #57/#58 |
| π’ | Update flow: install-aware banner + silent one-click brew upgrade (no Terminal, quit-first relaunch) | SPEC-011 | shipped via c193f0e; SemVer-precedence fix #61 |
| π’ | Copy button on the last-transcript card | SPEC-020 | merged in #18 |
| π’ | Send-feedback menu item β one click from status item to GitHub issue chooser | SPEC-018 | merged in #5 |
| π’ | Dictation distribution + personal performance stats (Longest dictation, avg realtime Γ, length histogram) | SPEC-028 | merged in #45 |
| π’ | fn / Globe key as a bindable hotkey (bare fn or fn+key) β closes #23 |
SPEC-003a | infra #28 (PR-A) + UI wiring a8371b8 (PR-B) |
| π’ | Launch at login (SMAppService toggle in Settings β General) β closes #29 | SPEC-023 | merged in #33 (reconcile) + #39 (UI) β issue #29 still open, needs closing |
| π’ | Recording overlay follows the cursor across monitors β closes #25 | SPEC-004 | merged in #27 |
| π’ | Usage stats pane: words dictated, time saved, audio processed β local-only | SPEC-013 | merged in c91da06 |
| π’ | Local audio + transcript history β local-only, retention cap | SPEC-014 | merged in c91da06 |
| π’ | Stream transcription for long audio (>~30s) β chunk while recording | SPEC-012 | perf; user never sees partials |
| π’ | App shell β SwiftPM target, menu bar, About panel | SPEC-010 | β |
| π’ | Audio capture β AVAudioEngine β 16 kHz mono WAV | SPEC-001 | β |
| π’ | Global hotkey (ββ§Space toggle, KeyboardShortcuts pkg) | SPEC-003 | β |
| π’ | Record β WhisperKit medium (en) β transcript in popover + clipboard |
SPEC-002 | β |
| π’ | Floating recording-state pill (top-centre, click-through) | SPEC-004 | β |
| π’ | CGEvent βV auto-paste at cursor (Accessibility prompt + clipboard fallback) | SPEC-005 | β |
| π’ | Onboarding flow (Welcome β Mic β Paste β Hotkey β Done) | β | β |
| π’ | Settings scene MVP (General / Models / Shortcut / About) | β | β |
| π’ | Smart text post-processing (capitalise, punct, fillers) | β | β |
| π’ | Live level meter + push-to-talk | SPEC-001 ext | β |
| π’ | VAD auto-stop + sounds + custom dictionary | β | β |
| π’ | App icon (procedural cream-gradient duck) | β | β |
| π’ | DMG + Homebrew cask + README polish | β | β |
| π’ | WhisperKit engine | SPEC-002 | primary; Apple Silicon Metal |
| π’ | Lightning engine (Python subprocess) | SPEC-002 | bench-only baseline |
| π’ | Metrics: WER / CER / RTF / RSS / cold-start | SPEC-002 | OpenQuackKit/Metrics/ |
| π’ | Corpus: 177 clips (TTS / multilingual / LibriSpeech / noise-aug) | β | bench/corpus/ |
| π’ | Bench rerun on enriched corpus β BENCHMARKS.md | β | M4/16GB matrix |
| π’ | openquack-cli (single-file transcribe) |
SPEC-002 | β |
| π’ | SPM scaffolding (Kit + bench + CLI) | β | Package.swift, three targets |
| π’ | Vision + roadmap + AGENTS.md + spec scaffold | β | β |
North-star reflection, not a committed milestone. No item below is claimed, dated, or gated on the Adoption focus band. It records where the repo would have to change to let agents run the contribution loop on their own β so the gaps are written down, not rediscovered.
What exists β the contract. Specs-as-law (AGENTS.md), four bench harnesses
(openquack-bench / -stream-bench / -polish-bench / -bias-bench), issue +
PR templates, the GTM trackers and playbooks, and persistent agent memory. An
agent that reads these knows what good work looks like and how it is judged.
The meta-gap β no machinery. The contract is human-readable, not
machine-executable. .claude/ holds only worktrees/ β no committed
agents/, commands/, workflows/, or settings. AGENTS.md is a manual a
human (or a prompted agent) follows by hand; nothing runs the
backlog β claim β branch β implement β draft-PR loop. CI smoke-tests the tiny
model on the short corpus only, so quality regressions pass unseen.
Three unlocks.
| Β | Unlock | Spec | State |
|---|---|---|---|
| π΅ | Committed .claude/ agent harness β named roles, saved workflows, trigger + permissions model with human gates on irreversible steps |
SPEC-037 | spec proposal |
| π΅ | CI eval-gate β fetchable corpus, medium-model WER/RTF thresholds on every quality-path PR | SPEC-038 | spec proposal |
| π‘ | Signed, tag-triggered release pipeline β the cut a release-bot can only PREP today | SPEC-025 | partial |
| βͺ | Privacy-preserving field-feedback loop β local self-diagnosis β consented reports β opt-in aggregates | SPEC-036 / 039 / 040 | building on shipped diagnostics |
Autonomy ceilings, per domain.
Realistic target. Agents run the loop; humans gate the irreversible and outward steps β merge, release, public post.