Statuses: TODO, IN_PROGRESS, BLOCKED, DONE, FAILED.
| ID | Task | Status | Dependencies | Validation | Evidence/result | Commit | Notes |
|---|---|---|---|---|---|---|---|
| A01 | Inspect repository and environment | DONE | - | shell inspection | Empty directory; no Git; Swift 6.3.3; Apple Silicon macOS | pending | Baseline captured |
| A02 | Initialize repository metadata and ignore rules | DONE | A01 | git init; inspect ignore rules |
Git initialized; .gitignore authored |
aa07f88 | Initial commit contains baseline docs and ignore rules |
| A03 | Create required planning and ledger documents | DONE | A02 | file review | TASK.md, PLAN.md, LEDGER.md authored |
aa07f88 | Mandatory pre-code documentation committed |
| A04 | Commit initial project documentation | DONE | A02,A03 | git commit; clean tree |
PASS: root commit aa07f88 contains .gitignore, TASK.md, PLAN.md, and LEDGER.md |
aa07f88 | Required baseline complete |
| F01 | Choose native runtime and package architecture | DONE | A04 | package manifest/build | SwiftPM 6.0; Foundation + Network.framework; loopback HTTP/WebSocket; actor-isolated core; FluidAudio v0.15.6 |
working tree | Cohere runs in-process; S1 remains local |
| F02 | Implement configuration and environment overrides | DONE | F01 | unit tests | TOML/env overrides, validation, loopback-only bind, FluidAudio model path, S1 helper args and timeout | working tree | swift test passed |
| F03 | Implement bounded audio storage and PCM validation | DONE | F01 | unit/integration tests | 16-bit PCM WAV/raw decoding, stereo downmix, bounded secure temp accumulator | 039e6d7 | Generated fixture and malformed-input tests pass |
| F04 | Implement VAD and session lifecycle | DONE | F03 | unit/integration tests | RMS VAD, trim/padding, streaming speech events, commit/cancel/disconnect cleanup | 039e6d7 | Batch-on-commit; no fake partials |
| F05 | Implement authentication token lifecycle | DONE | F01 | auth tests | SHA-256 token digests, random bearer tokens, create/list/revoke/rotate, constant-time auth | 039e6d7 | Token file mode 600; parent directory 700 |
| F06 | Implement metrics and readiness state | DONE | F01 | status/health tests | Actor metrics, model readiness, queue/latency/temp storage status, Prometheus text | working tree | /readyz fails closed without the Cohere bundle or S1 helper |
| I01 | Research Cohere runtime and model licensing | DONE | F01 | source review; docs | Official Cohere upstream and FluidAudio CoreML conversion reviewed; published CoreML model card is CC-BY-NC-4.0; S1 official prompt/license findings | working tree | Sources and licensing decision in ARCHITECTURE.md |
| I02 | Implement recognizer abstraction and Cohere adapter | DONE | I01,F03 | adapter tests; native smoke | SpeechRecognizer protocol and in-process FluidAudio q8 INT8 Cohere adapter using CoreML/ANE |
working tree | No alternate ASR fallback |
| I03 | Implement S1 cleanup adapter and routing | DONE | I01 | routing/prompt tests | Exact S1 system/control prompt and local helper adapter; English routing/force override | 039e6d7 | cohere-raw disables cleanup |
| I04 | Implement bounded inference queue | DONE | I02,I03 | queue/concurrency tests | Bounded actor queue, queue-full response, single active inference | 039e6d7 | Queue timing is returned/recorded |
| I05 | Implement model lifecycle and warmup | DONE | I02,I03,I04 | readiness/native smoke | FluidAudio Cohere loads once; S1 helper loads once; readiness is fail-closed; graceful unload; native raw and long-form smoke passed | working tree | GPU excluded with .cpuAndNeuralEngine to avoid the .all MPS heap |
| I06 | Implement long-recording resource behavior | DONE | I02,F03,F04 | bounds/cleanup/native smoke | 600 s/57.6 MB bounds and disk-backed accumulation implemented; FluidAudio transcribeLong covers >35 s with five-second overlap |
working tree | 36 s native long-form smoke passed |
| I07 | Deliver native Cohere and S1 runtime plus licensed weights | BLOCKED | I01,I02,I03 | pinned model install and generated-speech acceptance | FluidAudio Cohere q8 assets are installed and exercised; S1 GGUF/helper remains installed separately | working tree | Combined task remains blocked until S1 also meets the native listener-free runtime criterion |
| H01 | Implement health readiness and status endpoints | DONE | F06,I05 | HTTP smoke tests | /healthz, /readyz, /api/v1/status, /metrics; readiness returns 503 without the Cohere bundle or S1 helper |
working tree | Loopback-only |
| H02 | Implement native transcription endpoint | DONE | H01,I04,I06 | integration/native smoke | Rich JSON request/response with PCM16 base64, timing/model fields, and FluidAudio long-form handling | working tree | Long-form segmentation is delegated to FluidAudio |
| H03 | Implement OpenAI-compatible transcription endpoint | DONE | H01,H02 | multipart compatibility test | /v1/audio/transcriptions supports file, model, language; cohere-s1/raw |
039e6d7 | 16-bit PCM WAV only for multipart |
| H04 | Implement models and OpenAPI endpoints | DONE | H01,H02,H03 | schema validation | /v1/models, /openapi.json, /docs; embedded JSON covers routes |
039e6d7 | Root YAML is source contract |
| H05 | Implement WebSocket audio streaming protocol | DONE | F04,I04,H01 | socket integration tests | Masked PCM frames, ordered output, VAD lifecycle, commit/cancel/error, bounded frames | 039e6d7 | Batch-on-commit; no partial transcript |
| H06 | Implement AsyncAPI streaming contract | DONE | H05 | contract review | asyncapi.yaml documents binary audio, controls, lifecycle events, bearer auth |
039e6d7 | speech.stopped and commit options included |
| O01 | Implement Tailscale Serve configuration tooling | DONE | H01,H04,H05 | dry-run; installed CLI check | Serve loopback command, JSON status check, Funnel refusal, reset path | 039e6d7 | No Funnel |
| O02 | Implement launchd installation and removal | DONE | H01 | dry-run/local install | Install/uninstall scripts with mode controls, config/model preservation, and 600 s bounded health/readiness startup gate | working tree | Production install fails if Cohere assets or S1 helper are unavailable |
| O03 | Implement speechd-admin token CLI | DONE | H02,H03,H05 | CLI smoke tests | Public server admin binary provides token create/list/revoke/rotate; private macOS client owns health/status/models/transcribe/stream | 039e6d7 | Server install remains self-contained; client code is separate |
| O04 | Implement privacy and secure temporary files | DONE | F03,F04,H02,H05 | cleanup/log tests | 700/600 temp permissions, cleanup on all session exits, no content logs | 039e6d7 | Debug content flag not used to log content |
| O05 | Implement benchmark command and results | DONE | I05,H02,H05 | actual benchmark runs | Repeatable 5/15/60 s harness with native FluidAudio and S1 service measurements | working tree | Legacy Python Cohere bridge removed; model assets stay outside Git |
| V01 | Create unit and integration test coverage | DONE | F01-H06 | swift test |
17 tests passed (16 behavior tests plus package-load smoke) including socket HTTP/WebSocket, JSONL helper lifecycle, bounds, lifecycle expiry, generated speech fixture, and auth-before-upload | b6a44ec | All passing |
| V02 | Create generated audio integration fixture | DONE | V01 | fixture execution | Tests/Fixtures/speech-fixture.wav generated from macOS say and ffmpeg as 16 kHz mono PCM16 speech audio |
b6a44ec | Fixture is used for behavioral routing tests and benchmark inputs; no exact transcript assertion |
| V03 | Validate OpenAPI and AsyncAPI contracts | DONE | H04,H06 | scripts/validate-contracts.sh; parser/endpoint comparison |
YAML contracts and embedded OpenAPI/AsyncAPI paths, methods, schema shapes, version, and bearer/channel structure match | 95b15ac | Run again at final acceptance |
| V04 | Run secure tailnet validation or document blocker | DONE | O01,O02,H03,H05 | real tailnet or evidence | Temporary Tailscale Serve validation passed previously; current script also validates explicit HTTPS/backend port mapping and refuses Funnel in dry-run | 0bd1382,95b15ac | Live tailnet state was reset; rerun is external operational evidence, not committed state |
| V05 | Perform explicit security self-review | DONE | O01-O04,V01-V04 | SECURITY.md review | Review complete; no content logging, shell helper execution, public bind, or token plaintext storage found; security scanner found no dangerous patterns | 0bd1382 | Remaining production risk is external helper/model provenance and verification |
| V06 | Complete README architecture and security docs | DONE | all implementation | doc review | README, ARCHITECTURE, SECURITY, BENCHMARKS, API contracts, config example, and .env.example cover build, operation, privacy, Tailnet, and helper contracts |
f34e10d | No model weights, credentials, or private tailnet state committed |
| P01 | Split and publish server/client repositories | DONE | V06,V07 | GitHub visibility and tree audit | ComicBit/speechd is public and ComicBit/speechd-client-mac is private; both publish only their intended main-branch files |
249e5a7 / 8bf005f | Public tree excludes private client, build products, model weights, and credentials |
| V07 | Run final acceptance checks and clean Git tree | DONE | V01-V06,I07 | release/build/tests/status/native smoke | Release build, 17 tests, contract validation, live health/readiness, private-client model/transcription smoke, and authenticated 5/15/60 s benchmark pass | 249e5a7 | S1 helper and model weights remain explicit deployment-time prerequisites and are not bundled |