# Changelog

## Score

- CAI 53 → 65 (+12.8)
- Rubric changed (rubric-2026.09.11 → rubric-2026.09.18) — scores are not directly comparable.

## Lenses

- Code Health 96 → 96 (+0.3)
- Architecture 69 → 98 (+28.6)
- Maturity 62 → 64 (+2.5)
- Readiness 34 → 55 (+20.9)
- Security 67 → 75 (+8.3)

## Resolved (12)

- Dependency hygiene PARTLY measured — SwiftPM pinning read, dependency currency NOT established
- Documentation: no installation or build instructions (README.md)
- Documentation: no usage examples (README.md)
- Hotspot: Sources/parrot/Parrot.swift (Sources/parrot/Parrot.swift)
- MethodTooLong: Run.run (Sources/parrot/Parrot.swift)
- No ADRs found
- No artifact signing
- No automated tests
- No tests found
- Run.run (cognitive 33) (Sources/parrot/Parrot.swift)
- Run.run (cyclomatic 19) (Sources/parrot/Parrot.swift)
- Test reliability not included

## New (18)

- Coverage not measured — Swift suite
- Daemon.runLoop (cognitive 21) (Sources/ParrotCore/App/Daemon.swift)
- Daemon.runLoop (cyclomatic 17) (Sources/ParrotCore/App/Daemon.swift)
- Documentation: no contributor guidance (README.md)
- Documentation: no project overview (README.md)
- Duplicated block (13 lines × 2) (Sources/ParrotCore/Input/HotkeySettings.swift)
- Duplicated block (6 lines × 2) (Sources/parrot-bench/main.swift)
- Duplicated block (7 lines × 2) (Sources/parrot-bench/main.swift)
- Hotspot: Sources/ParrotCore/App/Daemon.swift (Sources/ParrotCore/App/Daemon.swift)
- Hotspot: Sources/parrot-bench/TranscriptionBench.swift (Sources/parrot-bench/TranscriptionBench.swift)
- Low cohesion: MenuBarController (LCOM4 7) (Sources/ParrotCore/UI/MenuBarController.swift)
- No assertions: testStopWithoutStartIsSafe (Tests/ParrotTests/HALInputTests.swift)
- Off the main sequence: ParrotCore
- Outdated: swift-argument-parser
- Secret passed as a command-line argument
- TranscriptionBench.run (cognitive 49) (Sources/parrot-bench/TranscriptionBench.swift)
- TranscriptionBench.run (cyclomatic 33) (Sources/parrot-bench/TranscriptionBench.swift)
- WhisperKitTranscriber.migrateLegacyModels (cognitive 22) (Sources/ParrotCore/Transcription/WhisperKitTranscriber.swift)

## Changes since last survey

- 123 commits — 121 feature/other, 2 fixes

## By area

- Sources/ParrotCore — 78 commits
- (root) — 15 commits
- .github/workflows — 5 commits
- docs/architecture.md — 5 commits
- Sources/parrot — 4 commits
- site/index.html — 4 commits
- scripts/dev-install.sh — 3 commits
- Tests/ParrotTests — 2 commits
- docs/assets — 2 commits
- docs/decisions — 2 commits
- docs/app-icon.png — 1 commit
- docs/dictionary.md — 1 commit
- packaging/Info.plist — 1 commit

## Notable commits

- fix: fix install URLs after move to humanitas-labs
- fix: run: exit 0 on startup failures a relaunch can't fix
- change: app: a white icon macOS doesn't put on a gray tile
- change: app: add UserFacingError for failures the user should see
- change: app: check for updates daily and from the menu
- change: app: drive the dictation loop from DictationController
- change: app: run as Parrot.app, launch at login through SMAppService, move off the LaunchAgent
- change: app: show a mid-recording route change in the pill
- change: app: wait for Accessibility and load the model behind the menu-bar icon
- change: audio: capture through an AUHAL input unit behind --capture hal
- change: audio: follow a rate change mid-recording instead of discarding it
- change: audio: fresh engine per recording, format-safe tap, mic permission
- change: audio: log press-to-first-sample for every capture
- change: audio: make the AUHAL input the default capture path
- change: audio: prepare the input unit between presses behind --capture prepared
- change: audio: run the microphone through a CaptureInput
- change: audio: trim leading and trailing silence before transcription
- change: bench: measure first-word recall with trim and padding flags
- change: bench: move the benchmarks into a parrot-bench target, out of the app
- change: bench: time press-to-first-sample with parrot bench capture
- …and 103 more
