chore: archive v1.0 MVP milestone
Archive roadmap and requirements to milestones/, reorganize ROADMAP.md, evolve PROJECT.md with shipped state, create retrospective. 4 phases, 11 plans, 16/16 requirements — all complete. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
# 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 |
|
||||
Reference in New Issue
Block a user