diff --git a/classify/types.go b/classify/types.go index 65e15f3..c1ce56c 100644 --- a/classify/types.go +++ b/classify/types.go @@ -54,21 +54,19 @@ const ( // --- Web extension (PROTO-07) --- ClassQUIC TrafficClass = "QUIC" - // --- Infrastructure extension (PROTO-08, D-01: no ClassFreqConfigs until Phase 11) --- + // --- Infrastructure extension (PROTO-08) --- ClassLDAP TrafficClass = "LDAP" ClassKerberos TrafficClass = "Kerberos" ClassSyslog TrafficClass = "Syslog" ) // AllClasses returns all known traffic classes in display order. -// Excludes ClassLDAP, ClassKerberos, and ClassSyslog — these have constants and rules -// but no ClassFreqConfigs entries until Phase 11, so they must not appear here -// (TestAllClassesHaveConfig in synth/config_test.go enforces the invariant). func AllClasses() []TrafficClass { return []TrafficClass{ // Infrastructure ClassICMP, ClassDNS, ClassNTP, ClassDHCP, ClassMDNS, ClassSSDP, ClassSNMP, + ClassLDAP, ClassKerberos, ClassSyslog, // Web ClassHTTPS, ClassHTTP, ClassQUIC, // Mail diff --git a/synth/config.go b/synth/config.go index 58ea9b8..731e06d 100644 --- a/synth/config.go +++ b/synth/config.go @@ -164,6 +164,58 @@ var ClassFreqConfigs = map[classify.TrafficClass]FreqConfig{ Harmonics: WaveformPresetHarmonics(WaveformTriangle, 214.0, SampleRate), Pan: 0.2, Group: "Mail", + }, + // --- Infrastructure additions (Triangle, 93-118 Hz) --- + classify.ClassMDNS: { + BaseHz: 93.0, + WaveformType: WaveformTriangle, + Harmonics: WaveformPresetHarmonics(WaveformTriangle, 93.0, SampleRate), + Pan: 0.3, + Group: "Infrastructure", + }, + classify.ClassSSDP: { + BaseHz: 105.0, + WaveformType: WaveformTriangle, + Harmonics: WaveformPresetHarmonics(WaveformTriangle, 105.0, SampleRate), + Pan: -0.2, + Group: "Infrastructure", + }, + classify.ClassSNMP: { + BaseHz: 118.0, + WaveformType: WaveformTriangle, + Harmonics: WaveformPresetHarmonics(WaveformTriangle, 118.0, SampleRate), + Pan: 0.2, + Group: "Infrastructure", + }, + // --- Web addition (Sawtooth, 190 Hz) --- + classify.ClassQUIC: { + BaseHz: 190.0, + WaveformType: WaveformSawtooth, + Harmonics: WaveformPresetHarmonics(WaveformSawtooth, 190.0, SampleRate), + Pan: -0.2, + Group: "Web", + }, + // --- Mail additions (Triangle, 241-305 Hz) --- + classify.ClassIMAP: { + BaseHz: 241.0, + WaveformType: WaveformTriangle, + Harmonics: WaveformPresetHarmonics(WaveformTriangle, 241.0, SampleRate), + Pan: 0.3, + Group: "Mail", + }, + classify.ClassPOP3: { + BaseHz: 271.0, + WaveformType: WaveformTriangle, + Harmonics: WaveformPresetHarmonics(WaveformTriangle, 271.0, SampleRate), + Pan: 0.4, + Group: "Mail", + }, + classify.ClassSMTPSub: { + BaseHz: 305.0, + WaveformType: WaveformTriangle, + Harmonics: WaveformPresetHarmonics(WaveformTriangle, 305.0, SampleRate), + Pan: 0.5, + Group: "Mail", }, // --- Remote Access (Square, 343 Hz) --- classify.ClassSSH: { @@ -173,6 +225,50 @@ var ClassFreqConfigs = map[classify.TrafficClass]FreqConfig{ Pan: -0.7, Group: "Remote Access", }, + // --- Remote Access additions (Square, 385-485 Hz) --- + classify.ClassRDP: { + BaseHz: 385.0, + WaveformType: WaveformSquare, + Harmonics: WaveformPresetHarmonics(WaveformSquare, 385.0, SampleRate), + Pan: -0.6, + Group: "Remote Access", + }, + classify.ClassTelnet: { + BaseHz: 432.0, + WaveformType: WaveformSquare, + Harmonics: WaveformPresetHarmonics(WaveformSquare, 432.0, SampleRate), + Pan: -0.5, + Group: "Remote Access", + }, + classify.ClassVNC: { + BaseHz: 485.0, + WaveformType: WaveformSquare, + Harmonics: WaveformPresetHarmonics(WaveformSquare, 485.0, SampleRate), + Pan: -0.4, + Group: "Remote Access", + }, + // --- File Transfer additions (Square, 545-687 Hz) --- + classify.ClassFTP: { + BaseHz: 545.0, + WaveformType: WaveformSquare, + Harmonics: WaveformPresetHarmonics(WaveformSquare, 545.0, SampleRate), + Pan: 0.5, + Group: "File Transfer", + }, + classify.ClassSMB: { + BaseHz: 612.0, + WaveformType: WaveformSquare, + Harmonics: WaveformPresetHarmonics(WaveformSquare, 612.0, SampleRate), + Pan: 0.6, + Group: "File Transfer", + }, + classify.ClassTFTP: { + BaseHz: 687.0, + WaveformType: WaveformSquare, + Harmonics: WaveformPresetHarmonics(WaveformSquare, 687.0, SampleRate), + Pan: 0.7, + Group: "File Transfer", + }, // --- Unknown (Custom harmonics, 771-1375 Hz) --- // D-05/D-06: dissonant harmonic character {1,1.0},{2,0.8},{3,0.4} retained for all Unknown entries. // WaveformType is zero value (WaveformCustom) so bank.go uses the stored Harmonics directly. @@ -212,4 +308,63 @@ var ClassFreqConfigs = map[classify.TrafficClass]FreqConfig{ Pan: 0.5, Group: "Unknown", }, + // --- Database additions (Sawtooth, 1543-2182 Hz) --- + classify.ClassMySQL: { + BaseHz: 1543.0, + WaveformType: WaveformSawtooth, + Harmonics: WaveformPresetHarmonics(WaveformSawtooth, 1543.0, SampleRate), + Pan: -0.4, + Group: "Database", + }, + classify.ClassPostgreSQL: { + BaseHz: 1732.0, + WaveformType: WaveformSawtooth, + Harmonics: WaveformPresetHarmonics(WaveformSawtooth, 1732.0, SampleRate), + Pan: -0.2, + Group: "Database", + }, + classify.ClassRedis: { + BaseHz: 1944.0, + WaveformType: WaveformSawtooth, + Harmonics: WaveformPresetHarmonics(WaveformSawtooth, 1944.0, SampleRate), + Pan: 0.2, + Group: "Database", + }, + classify.ClassMongoDB: { + BaseHz: 2182.0, + WaveformType: WaveformSawtooth, + Harmonics: WaveformPresetHarmonics(WaveformSawtooth, 2182.0, SampleRate), + Pan: 0.4, + Group: "Database", + }, + // --- VoIP (Sine, 2449 Hz) --- + classify.ClassSIP: { + BaseHz: 2449.0, + WaveformType: WaveformSine, + Harmonics: WaveformPresetHarmonics(WaveformSine, 2449.0, SampleRate), + Pan: 0.0, + Group: "VoIP", + }, + // --- Infrastructure auto-assigned (Triangle, 2950-3250 Hz) per D-02 --- + classify.ClassLDAP: { + BaseHz: 2950.0, + WaveformType: WaveformTriangle, + Harmonics: WaveformPresetHarmonics(WaveformTriangle, 2950.0, SampleRate), + Pan: -0.2, + Group: "Infrastructure", + }, + classify.ClassKerberos: { + BaseHz: 3250.0, + WaveformType: WaveformTriangle, + Harmonics: WaveformPresetHarmonics(WaveformTriangle, 3250.0, SampleRate), + Pan: 0.0, + Group: "Infrastructure", + }, + classify.ClassSyslog: { + BaseHz: 3050.0, + WaveformType: WaveformTriangle, + Harmonics: WaveformPresetHarmonics(WaveformTriangle, 3050.0, SampleRate), + Pan: 0.2, + Group: "Infrastructure", + }, }