# Retrospective ## Milestone: v1.0 — MVP **Shipped:** 2026-03-26 **Phases:** 4 | **Plans:** 11 | **Timeline:** 3 days (2026-03-24 -> 2026-03-26) **LOC:** 3,254 Go | **Files:** 84 modified ### What Was Built - Config-driven packet classifier with 12 protocol rules and 4 hash-bucketed unknown classes - Live packet capture via pure Go go-pcap with privilege detection and non-blocking channel pipeline - Additive synthesis engine: per-class oscillators, EMA amplitude smoothing, constant-power stereo mixing - MP3 encoding via embedded LAME, zero-packet guard - End-to-end pipeline with clean Ctrl+C shutdown - BPF filter and offline pcap file sonification with timestamp-based windowing ### What Worked - Risk-ordered phases: hardest foundation first (capture), then synthesis in isolation, then integration — no phase blocked on another's bugs - TDD approach in executor agents caught signature mismatches early - Pure Go capture layer (go-pcap) avoided libpcap dependency headaches - Hand-rolled synthesis kept dependencies minimal and code understandable - Wave-based parallel execution for independent plans ### What Was Inefficient - Some SUMMARY.md files had empty one-liner fields, causing noisy milestone extraction - Phase 4 research could have been lighter — BPF/pcap APIs were straightforward ### Patterns Established - Ordered []Rule slice for classifier (first-match-wins, extensible) - io.Writer injection for testable stderr output - Buffered channels between pipeline stages (512-1024) to absorb bursts - Package-level globals for Cobra flag binding - Timestamp-based windowing for non-live sources ### Key Lessons - Embedding C source (go-lame) is a good tradeoff: CGo at build time only, no runtime dependency - go-audio/wav was unnecessary — writing PCM bytes directly to LameWriter is simpler - Hash-bucketed unknowns (4 classes) are sufficient for audio distinction without k-means complexity ## Cross-Milestone Trends | Metric | v1.0 | |--------|------| | Phases | 4 | | Plans | 11 | | Days | 3 | | LOC | 3,254 | | Avg plan duration | ~8 min |