-
feat(02-04): normal-baseline synthetic generator + make synth-normal
- model/synth/state_machines/normal_baseline.py: emits FRAMES_PER_WINDOW=30
healthy-shape frames per window with class label _normal_baseline (Pattern 8b)
- model/normal_split.py: generate_normal_split() writes 1000 windows = 30k rows
to data/normal.parquet using phase2_seeds()['normal_split_synth'] (D-REPRO-02)
- Makefile: add synth-normal target (D-ANOM-02)
- _COLUMNS mirrors Phase 1's exact 24-column generate.py order so
load_anomaly_features() works on the output without modification
- 8/8 tests green; byte-identical regeneration verified
- normal.parquet SHA-256: 47514283e934504963d4c2eaf3789d7e0b58d8447a118e59ea29b2c1c903a059