| Package | Files | Key Exports |
|---|---|---|
| `mapping/` | 1 | `File`, `Load`, `Classify`, `Kind`, sentinel constants |
| `audio/` | 5 | `Float64ToPCM16`, `AudioPlayer`, `BandpassShiftFilter`, `PowerSpectrumFFT`, `Resample`, `ResampleRate` |
| `wav/` | 4 | `WAVMetadata`, `ParseWAVHeader`, `WriteWAVFile`, `AudioMothData`, `GainLevel`, `ResolveTimestamp`, `ProcessSingleFile` |
| `spectrogram/` | 3 | `GenerateSpectrogram`, `SpectrogramImageFromSamples`, `WriteImage`, `ApplyL4Colormap`, `ImageProtocol` |
| `astro/` | 1 | `AstronomicalData`, `CalculateAstronomicalData`, `CalculateMidpointTime` |
**Key outcomes:**
- `utils/` is now a true leaf package — zero `database/sql` imports, zero DB interfaces, zero `*Input/*Output` structs, no `skraak/*` imports
- No circular imports; all extracted packages are leaf-level with clear dependency direction
- DB-facing interfaces moved to their consumers (`tools/import/`, `db/tx_logger.go`), each defining its own minimal interface
- All interfaces standardized on `*Context` method variants, compatible with `*sql.DB`/`*sql.Tx`
- `ResolveTimestamp`/`ProcessSingleFile` landed in `wav/` after Phase 4 broke the import cycle
See per-phase entries below for detailed change records.