docs(05-01): complete waveform types plan summary and state updates

This commit is contained in:
2026-03-26 17:35:54 +01:00
parent 716ffa82ee
commit 5e31da5442
4 changed files with 102 additions and 21 deletions
+4 -4
View File
@@ -18,8 +18,8 @@ Requirements for custom sound mappings milestone. Each maps to roadmap phases.
### Waveforms ### Waveforms
- [ ] **WAVE-01**: User can set waveform type per traffic class (sine, square, sawtooth, triangle) - [x] **WAVE-01**: User can set waveform type per traffic class (sine, square, sawtooth, triangle)
- [ ] **WAVE-02**: Non-sine waveforms use bandlimited additive synthesis (no aliasing artifacts) - [x] **WAVE-02**: Non-sine waveforms use bandlimited additive synthesis (no aliasing artifacts)
### Custom Rules ### Custom Rules
@@ -62,8 +62,8 @@ Which phases cover which requirements. Updated during roadmap creation.
| CFG-04 | Phase 6 | Pending | | CFG-04 | Phase 6 | Pending |
| CFG-05 | Phase 6 | Pending | | CFG-05 | Phase 6 | Pending |
| CFG-06 | Phase 7 | Pending | | CFG-06 | Phase 7 | Pending |
| WAVE-01 | Phase 5 | Pending | | WAVE-01 | Phase 5 | Complete |
| WAVE-02 | Phase 5 | Pending | | WAVE-02 | Phase 5 | Complete |
| RULE-01 | Phase 7 | Pending | | RULE-01 | Phase 7 | Pending |
| RULE-02 | Phase 7 | Pending | | RULE-02 | Phase 7 | Pending |
| RULE-03 | Phase 7 | Pending | | RULE-03 | Phase 7 | Pending |
+3 -3
View File
@@ -37,10 +37,10 @@ Full details: `.planning/milestones/v1.0-ROADMAP.md`
1. User can set a traffic class to square, sawtooth, or triangle waveform and hear a tonally distinct sound with no audible aliasing or buzzing artifacts 1. User can set a traffic class to square, sawtooth, or triangle waveform and hear a tonally distinct sound with no audible aliasing or buzzing artifacts
2. Sine waveform continues to produce the same output as v1.0 — no regression 2. Sine waveform continues to produce the same output as v1.0 — no regression
3. The synthesis bank builds layers from a passed-in config map rather than a hardcoded class list 3. The synthesis bank builds layers from a passed-in config map rather than a hardcoded class list
**Plans:** 2 plans **Plans:** 1/2 plans executed
Plans: Plans:
- [ ] 05-01-PLAN.md — Waveform types: WaveformType enum, WaveformPresetHarmonics, NewLayer resolution - [x] 05-01-PLAN.md — Waveform types: WaveformType enum, WaveformPresetHarmonics, NewLayer resolution
- [ ] 05-02-PLAN.md — Bank decoupling: NewBank injected config map, dynamic GainPerLayer, test updates - [ ] 05-02-PLAN.md — Bank decoupling: NewBank injected config map, dynamic GainPerLayer, test updates
### Phase 6: Config Package and Sound Overrides ### Phase 6: Config Package and Sound Overrides
@@ -74,6 +74,6 @@ Plans:
| 2. Audio Synthesis Engine | v1.0 | 3/3 | Complete | 2026-03-26 | | 2. Audio Synthesis Engine | v1.0 | 3/3 | Complete | 2026-03-26 |
| 3. Pipeline Integration and MVP | v1.0 | 2/2 | Complete | 2026-03-26 | | 3. Pipeline Integration and MVP | v1.0 | 2/2 | Complete | 2026-03-26 |
| 4. Power User Features | v1.0 | 2/2 | Complete | 2026-03-26 | | 4. Power User Features | v1.0 | 2/2 | Complete | 2026-03-26 |
| 5. Waveform Types and Bank Decoupling | v1.1 | 0/2 | Not started | - | | 5. Waveform Types and Bank Decoupling | v1.1 | 1/2 | In Progress| |
| 6. Config Package and Sound Overrides | v1.1 | 0/? | Not started | - | | 6. Config Package and Sound Overrides | v1.1 | 0/? | Not started | - |
| 7. Custom Rules and Print-Config | v1.1 | 0/? | Not started | - | | 7. Custom Rules and Print-Config | v1.1 | 0/? | Not started | - |
+17 -14
View File
@@ -2,15 +2,15 @@
gsd_state_version: 1.0 gsd_state_version: 1.0
milestone: v1.1 milestone: v1.1
milestone_name: Custom Sound Mappings milestone_name: Custom Sound Mappings
status: planning status: executing
stopped_at: Phase 5 context gathered stopped_at: Completed 05-01-PLAN.md
last_updated: "2026-03-26T16:11:17.884Z" last_updated: "2026-03-26T16:35:44.333Z"
last_activity: 2026-03-26 — v1.1 roadmap created, Phases 5-7 defined last_activity: 2026-03-26
progress: progress:
total_phases: 3 total_phases: 3
completed_phases: 0 completed_phases: 0
total_plans: 0 total_plans: 2
completed_plans: 0 completed_plans: 1
percent: 0 percent: 0
--- ---
@@ -21,14 +21,14 @@ progress:
See: .planning/PROJECT.md (updated 2026-03-26) See: .planning/PROJECT.md (updated 2026-03-26)
**Core value:** Network traffic patterns are instantly recognizable as distinct sounds — a ping sounds different from HTTPS noise, which sounds different from a port scan. **Core value:** Network traffic patterns are instantly recognizable as distinct sounds — a ping sounds different from HTTPS noise, which sounds different from a port scan.
**Current focus:** Milestone v1.1 — Custom Sound Mappings (Phase 5 next) **Current focus:** Phase 05 — waveform-types-and-bank-decoupling
## Current Position ## Current Position
Phase: 5 of 7 (Waveform Types and Bank Decoupling) Phase: 05 (waveform-types-and-bank-decoupling) — EXECUTING
Plan: Plan: 2 of 2
Status: Ready to plan Status: Ready to execute
Last activity: 2026-03-26 — v1.1 roadmap created, Phases 5-7 defined Last activity: 2026-03-26
Progress: [░░░░░░░░░░] 0% Progress: [░░░░░░░░░░] 0%
@@ -50,6 +50,7 @@ Progress: [░░░░░░░░░░] 0%
| 04 | 2 | ~7min | 3.5min | | 04 | 2 | ~7min | 3.5min |
**Recent Trend:** Stable **Recent Trend:** Stable
| Phase 05 P01 | 3min | 2 tasks | 3 files |
## Accumulated Context ## Accumulated Context
@@ -58,6 +59,8 @@ Progress: [░░░░░░░░░░] 0%
- [v1.1 Roadmap]: Phase 5 consolidates waveform types (WAVE-01, WAVE-02) with bank decoupling — both are internal refactors with no user-visible surface, establishing the injectable seam before config is added - [v1.1 Roadmap]: Phase 5 consolidates waveform types (WAVE-01, WAVE-02) with bank decoupling — both are internal refactors with no user-visible surface, establishing the injectable seam before config is added
- [v1.1 Roadmap]: Research steps 5+6 (wire config + freq/waveform overrides) collapsed into Phase 6 — they share the same integration boundary (encode.RunSynthesis signature change) and are safer to land together - [v1.1 Roadmap]: Research steps 5+6 (wire config + freq/waveform overrides) collapsed into Phase 6 — they share the same integration boundary (encode.RunSynthesis signature change) and are safer to land together
- [v1.1 Roadmap]: User class name collision with built-in TrafficClass strings is an unresolved design question — decide before coding Phase 7 (treat as override vs. reject as ambiguous) - [v1.1 Roadmap]: User class name collision with built-in TrafficClass strings is an unresolved design question — decide before coding Phase 7 (treat as override vs. reject as ambiguous)
- [Phase 05]: FreqConfig struct uses named field syntax for ClassFreqConfigs entries (required by WaveformType addition)
- [Phase 05]: WaveformType zero value is WaveformCustom — all 14 existing ClassFreqConfigs entries retain hand-tuned harmonics without modification
### Pending Todos ### Pending Todos
@@ -69,6 +72,6 @@ None.
## Session Continuity ## Session Continuity
Last session: 2026-03-26T16:11:17.877Z Last session: 2026-03-26T16:35:44.326Z
Stopped at: Phase 5 context gathered Stopped at: Completed 05-01-PLAN.md
Resume file: .planning/phases/05-waveform-types-and-bank-decoupling/05-CONTEXT.md Resume file: None
@@ -0,0 +1,78 @@
---
phase: 05-waveform-types-and-bank-decoupling
plan: "01"
subsystem: synth
tags: [waveform, additive-synthesis, bandlimiting, enum, tdd]
dependency_graph:
requires: []
provides: [WaveformType enum, WaveformPresetHarmonics, NewLayer waveform resolution]
affects: [synth/config.go, synth/layer.go]
tech_stack:
added: []
patterns: [TDD red-green, bandlimited additive synthesis, zero-value backward compat]
key_files:
created:
- synth/waveform_test.go
modified:
- synth/config.go
- synth/layer.go
decisions:
- "ClassFreqConfigs converted from positional to named struct literals (required by new WaveformType field)"
- "FreqConfig.WaveformType zero value is WaveformCustom, ensuring all existing entries auto-preserve hand-tuned harmonics"
metrics:
duration: "~3 min"
completed_date: "2026-03-26"
tasks: 2
files: 3
requirements:
- WAVE-01
- WAVE-02
---
# Phase 5 Plan 01: Waveform Types and WaveformPresetHarmonics Summary
WaveformType enum with four bandlimited presets (sine, square, sawtooth, triangle) added to synth package with construction-time resolution in NewLayer.
## What Was Built
- **`WaveformType int` enum** in `synth/config.go` with five constants: `WaveformCustom` (0), `WaveformSine`, `WaveformSquare`, `WaveformSawtooth`, `WaveformTriangle`
- **`WaveformPresetHarmonics(wt, baseHz, sampleRate)`** function that generates bandlimited harmonic series — all partials below Nyquist (sampleRate/2)
- **`FreqConfig.WaveformType` field** added; zero value `WaveformCustom` ensures full backward compatibility with all 14 existing `ClassFreqConfigs` entries
- **`NewLayer` waveform resolution** — presets resolved at construction time, stored in `Layer.Config.Harmonics`, so `AdvanceSample` requires no changes
- **`synth/waveform_test.go`** with 12 tests covering all preset shapes, bandlimit enforcement, odd-only ratios, consecutive ratios, nil return for Custom, regression vs hand-tuned harmonics, and NewLayer construction behavior
## Tasks Completed
| Task | Description | Commit | Files |
|------|-------------|--------|-------|
| 1 (RED) | Failing waveform tests | 88dee31 | synth/waveform_test.go |
| 1 (GREEN) | WaveformType enum + WaveformPresetHarmonics | 82d1e37 | synth/config.go |
| 2 | Wire waveform resolution into NewLayer + 3 more tests | 7f64714 | synth/layer.go, synth/waveform_test.go |
## Verification
- `go test ./synth/... -v`: 41 tests, all pass (28 existing + 12 new waveform + 1 regression)
- `go test ./encode/...`: 3 tests pass (no regressions)
- `go vet ./synth/...`: clean
## Deviations from Plan
### Auto-fixed Issues
**1. [Rule 1 - Bug] ClassFreqConfigs positional struct literals broken by new field**
- **Found during:** Task 1 GREEN phase
- **Issue:** Adding `WaveformType WaveformType` field to `FreqConfig` caused compile errors on all 14 positional struct literals in `ClassFreqConfigs` ("too few values in struct literal")
- **Fix:** Converted all 14 entries from positional `{65.0, []HarmonicDef{...}, 0.0}` syntax to named field `{BaseHz: 65.0, Harmonics: []HarmonicDef{...}, Pan: 0.0}` syntax. WaveformType field implicitly zero (WaveformCustom), preserving hand-tuned harmonics as per D-03.
- **Files modified:** synth/config.go (ClassFreqConfigs block)
- **Commit:** 82d1e37
## Known Stubs
None — all waveform preset logic is fully implemented and wired.
## Self-Check: PASSED
- synth/waveform_test.go: FOUND
- synth/config.go (WaveformType): FOUND (verified by go test passing)
- synth/layer.go (NewLayer resolution): FOUND (verified by TestNewLayerResolvesWaveformPreset)
- Commits 88dee31, 82d1e37, 7f64714: all present in git log