Fix silent G1 baseline fixtures and add a parallel probe sweep #6

Merged
peterswimm merged 2 commits from baseline-probe-sweep into main 2026-10-20 23:25:59 +00:00
Owner

Scope

Two commits, one family: making the G1 breadth-first baseline actually observe something.

  1. Add G1 reference harness, module catalog, and calibration pipeline — the calibration work that accumulated locally since the initial public release, committed exactly as it stood (module manifest and catalog, reference-case create/compare/import, baseline and output-boundary plans, corpus tooling, and the per-module calibrations in docs/G1_CONTROL_EVENT_CALIBRATION.md). Commit 2 depends on it.
  2. Fix silent baseline fixtures and add a parallel probe sweep.

Every baseline comparison was silence against silence (OscA midpoint: rms 0 vs 0), so the "106 completed" baseline proved nothing. Three fixture bugs in baseline_fixture_patch:

  • The observing 2Output sink had level 0.
  • Cable connector-type fields held a signal type (audio = 1), but in the .pch format they flag output (1) vs input (0). Audio cables targeted an "output" and G1 ignored them; control cables into the OscA observer came from an "input", so G1 never saw modulation that Faust did. Every baseline cable now runs output → input.
  • Audio inputs were fed from AudioIn, which G1-Emu renders silent. Stimuli are now a sine OscA, and processors and physical sinks have their signal inputs (in, in 1, left/right, out*) driven on every probe; modulation inputs (FMA, sync, AM, sidechain) stay undriven unless probed.

tools/probe_sweep.py renders G1 and Faust for every probe of a retained baseline plan (parameter extremes, input and output ports — not only the midpoint) in a process pool, resumes from per-probe results, and prints a per-module triage table (pass, peak-only, pitch, level, shape-or-phase, silence-mismatch, both-silent). It is a deterministic script; no result promotes a module or becomes evidence. Captures and results stay under ~/.nardwahl.

Testing

  • Commit 1: the pre-fix generator was reconstructed and verified by regenerating all 1,510 fixtures of a plan written before any fix, byte-for-byte. A clean git archive export passes 76 tests.
  • Commit 2: a clean export passes 80 tests. New tests: the observer sink is audible and routable, processor probes drive signal inputs from a sine OscA, modulation inputs stay undriven unless probed, and every generated baseline cable for all 109 runtime modules runs output → input. The physical-output connector test now targets the shared source slot.
  • Ran the full sweep against the private G1-Emu adapter on plan v21: 1,355 of 1,489 probes now carry signal (both-silent 522 → 134) and passes rise from 92 to 207. The 300 level and 371 pitch verdicts are now real model mismatches to calibrate.

Impact Statement

  • Existing features: baseline fixtures change, so plans written before this PR (v1–v20) no longer match regenerated fixtures; create a new plan.
  • Public APIs / contracts: baseline_connection_type is removed (internal); new CLI-free tool tools/probe_sweep.py.
  • Schemas: none. Sweep results use a new private format nardwahl-probe-sweep-result-v1.
  • Data / artifacts: docs/G1_BASELINE_STATUS.json still reports the old, silent baseline and should be regenerated before it is relied on.
  • Integrations: needs the separately installed G1-Emu adapter profile for target renders, as before.
  • Mappings: no expected impact.
  • Backward compatibility: no reference evidence or module status changes.

Docs

tools/probe_sweep.py is documented in its module docstring and --help. It is not yet in tools/export_public.py's allowlist, so a public export omits it; follow-ups are adding it there and regenerating docs/G1_BASELINE_STATUS.json.

## Scope Two commits, one family: making the G1 breadth-first baseline actually observe something. 1. **Add G1 reference harness, module catalog, and calibration pipeline** — the calibration work that accumulated locally since the initial public release, committed exactly as it stood (module manifest and catalog, reference-case create/compare/import, baseline and output-boundary plans, corpus tooling, and the per-module calibrations in `docs/G1_CONTROL_EVENT_CALIBRATION.md`). Commit 2 depends on it. 2. **Fix silent baseline fixtures and add a parallel probe sweep.** Every baseline comparison was silence against silence (OscA midpoint: rms 0 vs 0), so the "106 completed" baseline proved nothing. Three fixture bugs in `baseline_fixture_patch`: - The observing 2Output sink had level 0. - Cable connector-type fields held a signal type (audio = 1), but in the `.pch` format they flag output (1) vs input (0). Audio cables targeted an "output" and G1 ignored them; control cables into the OscA observer came from an "input", so G1 never saw modulation that Faust did. Every baseline cable now runs output → input. - Audio inputs were fed from AudioIn, which G1-Emu renders silent. Stimuli are now a sine OscA, and processors and physical sinks have their signal inputs (`in`, `in 1`, `left`/`right`, `out*`) driven on every probe; modulation inputs (FMA, sync, AM, sidechain) stay undriven unless probed. `tools/probe_sweep.py` renders G1 and Faust for every probe of a retained baseline plan (parameter extremes, input and output ports — not only the midpoint) in a process pool, resumes from per-probe results, and prints a per-module triage table (`pass`, `peak-only`, `pitch`, `level`, `shape-or-phase`, `silence-mismatch`, `both-silent`). It is a deterministic script; no result promotes a module or becomes evidence. Captures and results stay under `~/.nardwahl`. ## Testing - Commit 1: the pre-fix generator was reconstructed and verified by regenerating all 1,510 fixtures of a plan written before any fix, byte-for-byte. A clean `git archive` export passes 76 tests. - Commit 2: a clean export passes 80 tests. New tests: the observer sink is audible and routable, processor probes drive signal inputs from a sine OscA, modulation inputs stay undriven unless probed, and every generated baseline cable for all 109 runtime modules runs output → input. The physical-output connector test now targets the shared source slot. - Ran the full sweep against the private G1-Emu adapter on plan v21: 1,355 of 1,489 probes now carry signal (both-silent 522 → 134) and passes rise from 92 to 207. The 300 `level` and 371 `pitch` verdicts are now real model mismatches to calibrate. ## Impact Statement - Existing features: baseline fixtures change, so plans written before this PR (v1–v20) no longer match regenerated fixtures; create a new plan. - Public APIs / contracts: `baseline_connection_type` is removed (internal); new CLI-free tool `tools/probe_sweep.py`. - Schemas: none. Sweep results use a new private format `nardwahl-probe-sweep-result-v1`. - Data / artifacts: `docs/G1_BASELINE_STATUS.json` still reports the old, silent baseline and should be regenerated before it is relied on. - Integrations: needs the separately installed G1-Emu adapter profile for target renders, as before. - Mappings: no expected impact. - Backward compatibility: no reference evidence or module status changes. ## Docs `tools/probe_sweep.py` is documented in its module docstring and `--help`. It is not yet in `tools/export_public.py`'s allowlist, so a public export omits it; follow-ups are adding it there and regenerating `docs/G1_BASELINE_STATUS.json`.
Brings in the calibration work that accumulated since the initial public
release: the stock G1 module manifest and catalog, private reference-case
creation and comparison, the breadth-first module baseline and
physical-output boundary plans, corpus tooling, and the per-module
calibrations recorded in docs/G1_CONTROL_EVENT_CALIBRATION.md (LFOA/LFOB/
LFOC rate and reset laws, OscA/OscB/OscC normalization, slave-oscillator
waveforms, PercOsc/DrumSynth trigger boundary).

Committed exactly as it stood before the baseline fixture fixes that
follow, which depend on it.
Fix silent baseline fixtures and add a parallel probe sweep
All checks were successful
PR policy check / policy-gate (pull_request) Successful in 1s
fcd6db06c7
Every breadth-first baseline comparison was silence against silence, so
the "completed" baseline status proved nothing. Three fixture bugs:

- The observing 2Output sink was written with level 0, muting it.
- Cable connector-type fields were filled with a signal type (audio=1),
  but in the .pch format they flag output (1) versus input (0). Audio
  cables therefore targeted an "output" and G1 ignored them, and control
  cables into the OscA observer came from an "input", so G1 never saw
  modulation that Faust did. Every baseline cable now runs output->input.
- Audio inputs were fed from AudioIn, which G1-Emu renders as silence.
  Audio stimuli are now a sine OscA, and processors and physical sinks
  have their signal inputs driven on every probe; modulation inputs stay
  undriven unless probed.

tools/probe_sweep.py renders G1 and Faust for every probe of a retained
baseline plan (not just the midpoint) across a process pool, resumes
from per-probe results, and writes a triage table by failure class. It
is a deterministic script: no result promotes a module or becomes
evidence.

On plan v21 the sweep has signal on 1,355 of 1,489 probes (both-silent
522 -> 134) with 207 passes, up from 92.
peterswimm deleted branch baseline-probe-sweep 2026-10-20 23:25:59 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
peter-swimm/nardwahl!6
No description provided.