chore: complete v1.1 milestone — Custom Sound Mappings

Archive roadmap and requirements to milestones/, update PROJECT.md
with shipped state, collapse ROADMAP.md, update retrospective.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-26 22:05:09 +01:00
co-authored by Claude Opus 4.6
parent 5391207b37
commit 175ff96404
8 changed files with 263 additions and 94 deletions
+44 -7
View File
@@ -37,12 +37,49 @@
- 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
## Milestone: v1.1 — Custom Sound Mappings
**Shipped:** 2026-03-26
**Phases:** 3 | **Plans:** 6 | **Timeline:** 1 day (2026-03-26)
**LOC:** ~4,675 Go (+1,421 from v1.0) | **Packages:** 7
### What Was Built
- Four waveform types (sine, square, sawtooth, triangle) with bandlimited additive synthesis
- TOML config system: auto-discovery, partial overrides, unknown-key validation, `--config` flag
- User-defined `[[rules]]` classification rules with first-match-wins prepend semantics
- Auto-frequency assignment (FNV-32a hash) for custom class names
- `--print-config` flag with commented TOML output and source annotations
- LoadResult struct pattern for clean config-to-pipeline data flow
### What Worked
- Incremental config extension: Phase 6 built the config package, Phase 7 extended it cleanly
- TDD plans (type: tdd in frontmatter) produced higher-quality code with fewer regressions
- FNV-32a frequency assignment was verified experimentally during research before planning
- Worktree isolation for parallel executor agents prevented merge conflicts
- Reusing existing patterns (Rule struct, NewClassifier injection, Cobra flag-on-root) kept code consistent
### What Was Inefficient
- SUMMARY.md one-liner extraction continued to be noisy — summary-extract needs improvement
- Phase 5 could potentially have been merged with Phase 6 (waveform + config together)
### Patterns Established
- LoadResult struct for multi-value config returns (extensible without breaking callers)
- Pointer fields (`*float64`, `*string`) for partial TOML override semantics
- FNV-32a hash for deterministic resource assignment from string keys
- Flag-on-root pattern for early-exit operations (--list-interfaces, --print-config)
- `addAutoFreqEntries()` pattern: fill gaps in config before merge
### Key Lessons
- BurntSushi/toml Undecoded() works with array-of-tables (verified experimentally)
- Manual string building beats TOML encoder when you need inline comments/annotations
- Config extension is smooth when the original Load() was designed with clean boundaries
## Cross-Milestone Trends
| Metric | v1.0 |
|--------|------|
| Phases | 4 |
| Plans | 11 |
| Days | 3 |
| LOC | 3,254 |
| Avg plan duration | ~8 min |
| Metric | v1.0 | v1.1 |
|--------|------|------|
| Phases | 4 | 3 |
| Plans | 11 | 6 |
| Days | 3 | 1 |
| LOC | 3,254 | 4,675 |
| Avg plan duration | ~8 min | ~5 min |