gurix
b9bcde4f46
merge: resolve STATE.md conflict (accept agent version)
2026-03-27 16:33:08 +01:00
gurix
a0dc6d6a38
docs(11-01): complete frequency-config data layer plan
...
- Add 11-01-SUMMARY.md with 35-class ClassFreqConfigs completion
- Update STATE.md: progress 86%, decisions recorded, plan metrics
- Update ROADMAP.md: phase 11 progress (1/2 plans complete)
- Mark GRP-02 and GRP-03 complete in REQUIREMENTS.md
2026-03-27 16:32:47 +01:00
gurix
35d8915e41
fix(11-01): update hardcoded count assertions to reflect 35 traffic classes
...
- Rename TestNewBankHas14Layers to TestNewBankHasAllLayers, use len(classify.AllClasses())
- Update config_test.go: replace 4 hardcoded 14 counts with len(classify.AllClasses())
- Update TestPrintConfigContainsAllClasses: replace hardcoded list with AllClasses() loop
- Update classifier_test.go: change TestAllClassesCount want from 32 to 35
2026-03-27 16:31:26 +01:00
gurix
1556ce83e9
feat(11-01): add 21 ClassFreqConfigs entries and include LDAP/Kerberos/Syslog in AllClasses()
...
- Add 21 new ClassFreqConfigs entries covering mDNS/SSDP/SNMP/QUIC/IMAP/POP3/SMTPSub/RDP/Telnet/VNC/FTP/SMB/TFTP/MySQL/PostgreSQL/Redis/MongoDB/SIP/LDAP/Kerberos/Syslog
- Update AllClasses() to return 35 entries (add LDAP/Kerberos/Syslog in Infrastructure section)
- Remove outdated Phase 11 exclusion comment from AllClasses() doc comment
2026-03-27 16:30:02 +01:00
gurix
683470a7b1
docs(11): create phase plan
2026-03-27 16:25:14 +01:00
gurix
438079111c
docs(phase-11): add research and validation strategy
2026-03-27 16:21:24 +01:00
gurix
aa1aca29a8
docs(11): research synthesis-and-config-layer phase
2026-03-27 16:20:37 +01:00
gurix
e8072510f4
docs(state): record phase 11 context session
2026-03-27 16:16:36 +01:00
gurix
0b02460853
docs(11): capture phase context
2026-03-27 16:16:30 +01:00
gurix
ac2b374253
docs(phase-10): evolve PROJECT.md after phase completion
2026-03-27 16:04:07 +01:00
gurix
fc631c704a
docs(phase-10): complete phase execution
2026-03-27 16:03:42 +01:00
gurix
eb1cf236d0
Merge branch 'worktree-agent-a776e863'
2026-03-27 16:00:24 +01:00
gurix
0ae39e7ad4
docs(10-02): complete classification-layer test coverage plan
...
- 28 new subtests in TestClassify covering all new protocol/port combinations
- TestAllClassesCount updated to assert 32 classes
- All PROTO-01 through PROTO-09 requirements satisfied
2026-03-27 16:00:10 +01:00
gurix
f792370d7f
feat(10-02): update TestAllClassesCount from 14 to 32
...
Reflects 14 existing + 18 new classes in AllClasses(); LDAP/Kerberos/Syslog
excluded until Phase 11 adds their ClassFreqConfigs entries.
2026-03-27 15:58:29 +01:00
gurix
038f89f18e
feat(10-02): add 28 new classification subtests to TestClassify
...
- Mail: IMAP 143/993, POP3 110/995, SMTPSub 587 (PROTO-01)
- File Transfer: FTP 20/21, SMB 445, TFTP 69 (PROTO-02)
- Remote Access: RDP 3389, Telnet 23, VNC 5900 (PROTO-03)
- Database: MySQL 3306, PostgreSQL 5432, Redis 6379, MongoDB 27017 (PROTO-04)
- Discovery: mDNS 5353, SSDP 1900, SNMP 161/162 (PROTO-05)
- VoIP: SIP TCP+UDP 5060 (PROTO-06)
- Web: QUIC UDP/443 distinct from HTTPS TCP/443 (PROTO-07)
- Infrastructure: LDAP 389/636, Kerberos TCP+UDP 88, Syslog 514 (PROTO-08)
2026-03-27 15:58:17 +01:00
gurix
4cb8cbf334
merge: resolve STATE.md conflict (accept agent version)
2026-03-27 15:56:21 +01:00
gurix
472849379d
docs(10-01): complete classification-layer constants and rules plan
...
- 21 new TrafficClass constants (IMAP, POP3, SMTP-sub, FTP, SMB, TFTP, RDP, Telnet, VNC, MySQL, PostgreSQL, Redis, MongoDB, mDNS, SSDP, SNMP, SIP, QUIC, LDAP, Kerberos, Syslog)
- 30 new port-matching rules in DefaultRules (42 total, catch-alls last)
- AllClasses() returns 32 classes (LDAP/Kerberos/Syslog deferred to Phase 11)
- PROTO-01 through PROTO-08 requirements marked complete
2026-03-27 15:56:01 +01:00
gurix
cd8593eef5
feat(10-01): add 30 new port-matching rules to DefaultRules
...
- Add Discovery rules: mDNS (5353), SSDP (1900), SNMP (161/162)
- Add Mail rules: IMAP (143/993), POP3 (110/995), SMTP-sub (587)
- Add Remote Access rules: RDP (3389), Telnet (23), VNC (5900)
- Add File Transfer rules: FTP (20/21), SMB (445), TFTP (69)
- Add Database rules: MySQL (3306), PostgreSQL (5432), Redis (6379), MongoDB (27017)
- Add VoIP rules: SIP (5060/5061 tcp+udp)
- Add Infrastructure ext rules: LDAP (389/636), Kerberos (88 tcp+udp), Syslog (514)
- Add Web ext rule: QUIC (udp 443)
- Catch-all rules remain last; total 42 rules (12 existing + 30 new)
2026-03-27 15:53:22 +01:00
gurix
50e047438d
feat(10-01): add 21 new TrafficClass constants and update AllClasses()
...
- Add constants for Mail (IMAP, POP3, SMTP-sub), File Transfer (FTP, SMB, TFTP)
- Add constants for Remote Access (RDP, Telnet, VNC), Database (MySQL, PostgreSQL, Redis, MongoDB)
- Add constants for Discovery (mDNS, SSDP, SNMP), VoIP (SIP), Web (QUIC)
- Add constants for Infrastructure extension (LDAP, Kerberos, Syslog)
- Update AllClasses() to return 32 classes (LDAP/Kerberos/Syslog excluded per D-01)
2026-03-27 15:52:17 +01:00
gurix
207264b490
docs(10-classification-layer): create phase plan
2026-03-27 15:47:15 +01:00
gurix
974a2728c1
docs(phase-10): add validation strategy
2026-03-27 15:42:35 +01:00
gurix
b8328319ab
docs(phase-10): research classification layer
2026-03-27 15:41:58 +01:00
gurix
12f26ebb97
docs(state): record phase 10 context session
2026-03-27 15:36:15 +01:00
gurix
9761dcb9e5
docs(10): capture phase context
2026-03-27 15:36:08 +01:00
gurix
a91b1a854c
docs(phase-09): evolve PROJECT.md after phase completion
2026-03-27 14:22:47 +01:00
gurix
bf6bd8ad68
docs(phase-09): complete phase execution and verification
2026-03-27 14:22:34 +01:00
gurix
fe7ee0e797
docs(09-01): complete frequency-design and group-architecture plan
...
- 09-01-SUMMARY.md: plan execution complete, 2 tasks, oscillator bug documented
- STATE.md: decisions recorded (Group as string, oscillator fix), session updated
- REQUIREMENTS.md: FREQ-01, FREQ-02, FREQ-03, GRP-01, GRP-04 marked complete
2026-03-27 14:18:42 +01:00
gurix
2ef180b4ba
fix(09-01): add TestGroupFieldPopulated, fix oscillator normalization, update tests
...
- Add TestGroupFieldPopulated test to verify all ClassFreqConfigs have non-empty Group (GRP-01)
- Change TestHarmonicsNonEmpty threshold from < 2 to < 1 (accepts single-harmonic sine entries)
- Fix oscillator Advance() to use math.Abs(h.Amplitude) for normalization weight accumulation:
triangle wave uses alternating-sign amplitudes; signed sum underestimates totalWeight causing
output to exceed [-1,1] bounds when using WaveformPresetHarmonics (Rule 1 bug fix)
- Update TestStereoPan to use ClassSSH (pan=-0.7) instead of ClassDHCP (pan changed to 0.1)
- Update TestNewBankCustomConfigNoClip: passes after oscillator normalization fix
- Fix TestLoadPartialOverrideFrequency: derive expected WaveformType from defaults (not hardcoded 0)
- Fix TestAutoFreqSkipsBuiltins: derive expected HTTPS BaseHz from defaults (150.0 in Phase 9)
2026-03-27 14:18:37 +01:00
gurix
eb36587ccf
feat(09-01): add Group field to FreqConfig and rebalance ClassFreqConfigs
...
- Add Group string field to FreqConfig struct (GRP-04)
- Add frequency allocation table comment (32 slots, 65-2449 Hz, FREQ-03)
- Rebalance all 14 ClassFreqConfigs entries to major-second ladder (FREQ-01)
- Infrastructure band (Triangle, 65-133 Hz): ICMP/NTP/DHCP/DNS
- Web band (Sawtooth, 150-169 Hz): HTTPS/HTTP
- Mail band (Triangle, 214 Hz): SMTP
- Remote Access band (Square, 343 Hz): SSH
- Unknown band (Custom, 771-1375 Hz): Unknown1-4, OtherTCP, OtherUDP
- Remove stale NumLayers and GainPerLayer constants (Phase 8 cleanup)
- Non-Unknown entries use WaveformPresetHarmonics; Unknown retain hand-tuned {1,1.0},{2,0.8},{3,0.4}
2026-03-27 14:18:12 +01:00
gurix
306809d1a5
docs(09-02): complete auto-assign range update plan
2026-03-27 14:09:58 +01:00
gurix
dbcbeb3ee7
test(09-02): update auto-assign range assertions to [2500, 4000] Hz
...
- Update TestAutoFreqAssignment bounds from [1200, 2350] to [2500, 4000]
- Update TestAutoFreqAssignment comment to reflect new range
- Update TestAutoFreqSkipsBuiltins HTTPS expected value from 175.0 to 150.0
(coordinated with Plan 01 frequency rebalancing)
2026-03-27 14:09:02 +01:00
gurix
8ae1ddc773
feat(09-02): update autoAssignFreq range to [2500, 4000] Hz
...
- Change baseHz from 1200.0 to 2500.0
- Change numSteps from uint32(24) to uint32(31)
- Update function comment to reflect new range
- Prevents collision with built-in frequencies (max 2449 Hz)
2026-03-27 14:08:03 +01:00
gurix
08a3063633
docs(09): create phase plan
2026-03-27 14:04:11 +01:00
gurix
d314817d3c
docs(09): add validation strategy
2026-03-27 14:00:10 +01:00
gurix
f4ad40ef19
docs(09): research phase domain — frequency allocation table and group architecture
2026-03-27 13:59:28 +01:00
gurix
bd52f0bee4
docs(state): record phase 9 context session
2026-03-27 13:45:39 +01:00
gurix
2e813b42fa
docs(09): capture phase context
2026-03-27 13:45:32 +01:00
gurix
9908a79a64
docs(phase-08): evolve PROJECT.md after phase completion
2026-03-27 12:53:39 +01:00
gurix
9e5db8d4d6
docs(phase-08): complete phase execution and verification
2026-03-27 12:53:08 +01:00
gurix
81ef4f9df7
docs(08-01): complete constant-cleanup plan
...
- SUMMARY for 08-01: stale constants removed, tests future-proofed
- STATE.md: plan advanced, progress 100%, decisions recorded
- ROADMAP.md: Phase 8 marked Complete
- REQUIREMENTS.md: CLEAN-01 marked complete
2026-03-27 08:55:38 +01:00
gurix
4800e8e463
test(08-01): future-proof frequency bounds and rename test
...
- Replace hardcoded [60, 1100] Hz bounds with Nyquist-based validation (0, 22050)
- Rename TestNumLayersMatchesAllClasses to TestClassFreqConfigsMatchAllClasses
- Remove duplicate TestClassFreqConfigsComplete (subset of TestAllClassesHaveConfig)
- All tests green
2026-03-27 08:54:34 +01:00
gurix
fd17061b0d
chore(08-01): remove stale NumLayers and GainPerLayer constants
...
- Delete NumLayers=14 (dead code; NewBank computes gain dynamically)
- Delete GainPerLayer=1.0/float64(NumLayers) (dead code per D-01)
- Remaining constants: SampleRate, WindowMs, SamplesPerWindow, WhisperFloor
2026-03-27 08:54:02 +01:00
gurix
000e6a3813
docs(08): create phase plan
2026-03-27 08:50:37 +01:00
gurix
7fd2e10c87
docs(phase-8): add validation strategy
2026-03-27 08:47:45 +01:00
gurix
ceba57ed0e
docs(08): research phase test and constant cleanup
2026-03-27 08:46:43 +01:00
gurix
5a7855f3ff
docs(state): record phase 8 context session
2026-03-27 08:43:14 +01:00
gurix
467d415e94
docs(08): capture phase context
2026-03-27 08:43:01 +01:00
gurix and Claude Opus 4.6
8e565ec640
docs: create milestone v1.2 roadmap (4 phases, 18 requirements)
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-27 08:38:08 +01:00
gurix and Claude Opus 4.6
47b6e171c4
docs: define milestone v1.2 requirements (18 requirements)
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-27 08:29:46 +01:00
gurix
6b26be825c
docs: complete project research
2026-03-27 08:25:02 +01:00
gurix and Claude Opus 4.6
6de2fcbb99
docs: start milestone v1.2 Extended Protocol Coverage
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-27 08:07:14 +01:00
gurix and Claude Opus 4.6
6610366c2f
chore: archive v1.1 phase directories to milestones
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-26 22:06:36 +01:00
gurix and Claude Opus 4.6
175ff96404
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 >
2026-03-26 22:05:09 +01:00
gurix and Claude Opus 4.6
5391207b37
docs(phase-07): evolve PROJECT.md after phase completion
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-26 21:56:40 +01:00
gurix and Claude Opus 4.6
072773c0df
docs(phase-07): complete phase execution
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-26 21:56:10 +01:00
gurix
3eebb0f590
docs(07-02): complete print-config and LoadResult wiring plan
...
- SUMMARY.md for plan 02: PrintConfig + CLI wiring
- STATE.md: updated progress (100%), metrics, decisions, session
- ROADMAP.md: Phase 7 marked Complete (2/2 summaries)
- REQUIREMENTS.md: CFG-06 marked complete
2026-03-26 21:52:44 +01:00
gurix
b52e36b579
feat(07-02): implement PrintConfig function with comment annotations
...
- Add AutoClasses map[TrafficClass]bool to LoadResult for tracking auto-assigned classes
- PrintConfig() returns commented TOML with header (source, date), [[rules]] section, [sounds.*] section
- waveformString() helper converts WaveformType back to string
- classAnnotation() returns default/override/auto-assigned per class
- Built-in classes emitted in AllClasses() order; user-defined classes sorted alphabetically
- Rules section emits [[rules]] blocks; port omitted when DstPort==0
- Tests: TestPrintConfigContainsAllClasses, TestPrintConfigSourcePath, TestPrintConfigNoSourcePath,
TestPrintConfigContainsRules, TestPrintConfigRuleNoPort, TestPrintConfigDefaultAnnotation,
TestPrintConfigOverrideAnnotation, TestPrintConfigAutoAssignedAnnotation
2026-03-26 21:51:27 +01:00
gurix
d43914f869
feat(07-02): wire LoadResult into main.go and add --print-config flag
...
- Add printConfig bool var and --print-config flag registration
- runPrintConfig() early-exit before interface-required check (CFG-06)
- runLiveMode and runPcapMode accept config.LoadResult; user rules prepend via append(result.UserRules, classify.DefaultRules...)
- Remove unused synth import from main.go
- Add TestPrintConfigFlagRegistered, TestPrintConfigNoInterface, TestPrintConfigWithConfigFile
- newTestCmd() wires --print-config and --config flags through PersistentPreRunE
2026-03-26 21:51:19 +01:00
gurix
9e71a805b8
docs(07-01): complete config rule parsing and LoadResult plan
...
- Add 07-01-SUMMARY.md
- Advance STATE.md to plan 2 of 2, progress 83%
- Update ROADMAP.md: phase 7 in progress (1/2 summaries)
- Mark RULE-01, RULE-02, RULE-03 complete in REQUIREMENTS.md
2026-03-26 21:46:13 +01:00
gurix
4b365cd5f4
feat(07-01): add RawRule, LoadResult, validation, auto-freq to config package
...
- Add RawRule struct with Port *uint16, Protocol, Class fields
- Add LoadResult struct with FreqCfgs, UserRules, ConfigPath fields
- Change Load() signature to return LoadResult instead of bare map
- Add validateRules: checks protocol required, class required, valid protocols
- Add convertRules: converts RawRule slices to classify.Rule slices
- Add autoAssignFreq: FNV-32a deterministic Hz in [1200-2350] range
- Add addAutoFreqEntries: creates FreqConfig for new class names, skips built-ins
- Reorder ops: addAutoFreqEntries before merge so sounds overrides apply to user classes
- Update main.go call site to use LoadResult.FreqCfgs
- Update all 8 existing tests to use LoadResult return type
- Add 13 new tests covering rule parsing, validation, auto-freq, and LoadResult
2026-03-26 21:44:53 +01:00
gurix
006e465b1e
docs(07): create phase plan
2026-03-26 21:38:56 +01:00
gurix and Claude Opus 4.6
050d67d9f1
docs(phase-07): add research and validation strategy
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-26 21:34:27 +01:00
gurix and Claude Sonnet 4.6
e15972055d
docs(07): research phase domain
...
Research for Phase 7 custom rules and print-config. Covers TOML array-of-tables parsing behavior, LoadResult struct design, FNV-32a auto-frequency algorithm, and print-config implementation patterns. All verified against existing source code.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-26 21:33:11 +01:00
gurix
6cbfb66ef2
docs(state): record phase 7 context session
2026-03-26 21:27:34 +01:00
gurix
fe372c8dc8
docs(07): capture phase context
2026-03-26 21:27:29 +01:00
gurix and Claude Opus 4.6
dddfb1b444
docs: update README and PROJECT.md to reflect Phase 6 completion
...
Add custom sound configuration section covering TOML config files,
auto-discovery, available waveforms, and validation behavior. Update
flags table, project structure, dependencies, and sound design table
with accurate frequencies. Add README update step to evolution checklist.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-26 21:14:30 +01:00
gurix
c3d78624ba
docs(phase-06): evolve PROJECT.md after phase completion
2026-03-26 21:09:02 +01:00
gurix
6065bfcd90
docs(phase-06): complete phase execution
2026-03-26 21:08:49 +01:00
gurix
e3487c5c94
docs(06-02): complete CLI config wiring plan summary and state updates
2026-03-26 21:05:50 +01:00
gurix
413cceb1eb
feat(06-02): wire --config flag and config.Load into CLI pipeline
...
- Add configPath string var and --config flag to Cobra command
- Import config and synth packages in main.go
- Call config.Load(configPath) in run() before capture (D-11 fail fast)
- Change runLiveMode and runPcapMode signatures to accept freqCfgs map
- Pass freqCfgs to encode.RunSynthesis in both live and pcap modes
2026-03-26 21:04:11 +01:00
gurix
3dfcbbeaf5
feat(06-02): add freqCfgs parameter to RunSynthesis
...
- Change RunSynthesis signature to accept injected config map (D-10)
- Replace hardcoded synth.ClassFreqConfigs with passed-in freqCfgs
- Update all three RunSynthesis calls in encode tests to pass synth.ClassFreqConfigs
2026-03-26 21:02:35 +01:00
gurix
936aeeafd8
merge: resolve STATE.md conflict from wave 1 (keep executor version)
2026-03-26 21:00:15 +01:00
gurix
1986e8fc2e
docs(06-01): complete config package plan summary and state updates
...
- 06-01-SUMMARY.md: TOML config loader with partial merge and unknown-key detection
- STATE.md: advanced to Plan 1 complete, added Phase 06-01 decisions and metrics
- ROADMAP.md: updated Phase 6 plan progress (1/2 plans complete)
- REQUIREMENTS.md: marked CFG-01, CFG-02, CFG-04, CFG-05 complete
2026-03-26 20:59:46 +01:00
gurix
1f877e7574
feat(06-01): implement config package with TOML load, merge, validate
...
- Load() discovers, parses, validates, and merges TOML config over defaults
- SoundOverride struct with *float64/*string pointer fields for partial-merge (CFG-04)
- parseFile uses BurntSushi/toml DecodeFile + Undecoded() for unknown-key errors (CFG-05)
- discoverPath probes ./netsynth.toml then ~/.config/netsynth/config.toml (CFG-02)
- merge applies non-nil overrides per class; warns on unknown class names (D-09)
- parseWaveform maps sine/square/sawtooth/triangle strings to WaveformType
- Harmonics regenerated via WaveformPresetHarmonics when waveform/frequency changes
- All 9 tests pass; go vet clean
2026-03-26 20:57:00 +01:00
gurix
b9ec05aebc
test(06-01): add failing tests for config package TOML load, merge, validate
...
- 9 table-driven tests covering CFG-01 through CFG-05
- TestLoadPartialOverrideFrequency, TestLoadPartialOverrideWaveform, TestLoadBothOverrides
- TestLoadUnknownKey, TestLoadNoConfig, TestLoadExplicitMissing
- TestLoadUnknownClass, TestLoadInvalidWaveform, TestLoadAllDefaultsPresent
- Stub config.Load returns nil,nil — all tests fail (RED)
2026-03-26 20:56:03 +01:00
gurix
0d9508e920
docs(06): create phase plan
2026-03-26 20:51:07 +01:00
gurix
ece532b053
docs(phase-6): add validation strategy
2026-03-26 20:46:43 +01:00
gurix
21ebc5cdda
docs(06): research phase domain
2026-03-26 20:45:56 +01:00
gurix
34f922cf95
docs(state): record phase 6 context session
2026-03-26 20:39:17 +01:00
gurix
c1ab8e1777
docs(06): capture phase context
2026-03-26 20:39:08 +01:00
gurix
4ec9c64ee1
docs(phase-05): evolve PROJECT.md after phase completion
2026-03-26 17:42:52 +01:00
gurix
d915c3cd11
docs(phase-05): complete phase execution
2026-03-26 17:42:35 +01:00
gurix
d436ef154d
Merge branch 'worktree-agent-a9867cbf'
2026-03-26 17:40:03 +01:00
gurix
8e357cf432
docs(05-02): complete bank-decoupling plan — SUMMARY, STATE, ROADMAP updated
2026-03-26 17:39:48 +01:00
gurix
b2b5ab679b
test(05-02): update tests for new NewBank signature and dynamic gain
...
- All NewBank calls updated to two-argument form passing ClassFreqConfigs
- TestMixerNoClip iterates ClassFreqConfigs keys instead of classify.AllClasses()
- TestNewBankDynamicGain verifies gainPerLayer=1/N for 3-class custom config
- TestNewBankCustomConfigNoClip verifies no-clip guarantee with 2-class config
- TestNumLayersMatchesAllClasses now asserts len(ClassFreqConfigs) == len(AllClasses())
2026-03-26 17:38:37 +01:00
gurix
43307c31d5
feat(05-02): decouple NewBank from global config and fix dynamic GainPerLayer
...
- NewBank now accepts (tau float64, cfgs map[classify.TrafficClass]FreqConfig)
- gainPerLayer field added to OscillatorBank, computed as 1.0/float64(len(cfgs))
- RenderWindow UpdateTarget loop iterates b.layers (not classify.AllClasses())
- RenderWindow render loop uses b.gainPerLayer (not GainPerLayer constant)
- encode/mp3.go updated to pass synth.ClassFreqConfigs as default config map
2026-03-26 17:37:44 +01:00
gurix
a94ffdd8ef
Merge branch 'worktree-agent-a46f9aac'
2026-03-26 17:36:22 +01:00
gurix
5e31da5442
docs(05-01): complete waveform types plan summary and state updates
2026-03-26 17:35:54 +01:00
gurix
7f6471426f
feat(05-01): wire waveform resolution into NewLayer at construction time
...
- NewLayer resolves WaveformPresetHarmonics when cfg.WaveformType != WaveformCustom
- Preset harmonics stored in Layer.Config so AdvanceSample uses them unchanged
- WaveformCustom path preserves existing hand-tuned harmonics (backward compatible)
- TestNewLayerResolvesWaveformPreset: verifies preset fills harmonics on construction
- TestNewLayerPreservesCustomHarmonics: verifies hand-tuned harmonics are untouched
- TestSineRegressionVsCustomHarmonics: verifies WaveformSine == {Ratio:1,Amp:1.0}
- All 41 synth tests pass, encode tests unaffected
2026-03-26 17:34:45 +01:00
gurix
82d1e37d0f
feat(05-01): add WaveformType enum and WaveformPresetHarmonics function
...
- WaveformType int with five constants: WaveformCustom (0), WaveformSine,
WaveformSquare, WaveformSawtooth, WaveformTriangle
- WaveformPresetHarmonics generates bandlimited harmonic series for each type
- WaveformCustom returns nil to preserve existing hand-tuned harmonics
- All generated harmonics are below Nyquist (sampleRate/2)
- FreqConfig gains WaveformType field (zero value = WaveformCustom)
- ClassFreqConfigs converted to named fields (required for new struct field)
- All existing synth tests continue to pass (38 tests total)
2026-03-26 17:34:02 +01:00
gurix
88dee31264
test(05-01): add failing tests for WaveformType and WaveformPresetHarmonics
...
- TestWaveformPresetHarmonics_Sine: expects exactly {Ratio:1, Amplitude:1.0}
- TestWaveformPresetHarmonics_Square: expects odd harmonics with 1/k amplitude below Nyquist
- TestWaveformPresetHarmonics_Sawtooth: expects all harmonics with 1/k amplitude below Nyquist
- TestWaveformPresetHarmonics_Triangle: expects odd harmonics with alternating 1/k^2 amplitude
- TestWaveformPresetHarmonics_Custom: expects nil return
- TestBandlimitedHarmonicsNoAliasing: checks all ClassFreqConfigs entries at all waveform types
- TestWaveformPresetHarmonics_SquareOddOnly: odd ratios only
- TestWaveformPresetHarmonics_TriangleOddOnly: odd ratios only
- TestWaveformPresetHarmonics_SawtoothConsecutive: consecutive ratios starting at 1
2026-03-26 17:33:03 +01:00
gurix
716ffa82ee
docs(05): create phase plan
2026-03-26 17:26:46 +01:00
gurix
9fe5d37f1e
docs(phase-5): add validation strategy
2026-03-26 17:22:13 +01:00
gurix
f0821f062d
docs(05): research phase domain
2026-03-26 17:21:21 +01:00
gurix
de43a132fb
docs(state): record phase 5 context session
2026-03-26 17:11:17 +01:00
gurix
7ced25ae70
docs(05): capture phase context
2026-03-26 17:11:11 +01:00
gurix
8cb5120666
docs: create milestone v1.1 roadmap (3 phases)
2026-03-26 17:04:26 +01:00
gurix
c5478d962d
docs: define milestone v1.1 requirements
2026-03-26 17:00:58 +01:00
gurix
d413d1243f
docs: complete project research
2026-03-26 16:54:31 +01:00
gurix
8651c47b0f
docs: start milestone v1.1 Custom Sound Mappings
2026-03-26 16:44:15 +01:00