test(integration): chirp-directions round close-out (ticket 42) #38

Merged
ykp merged 1 commit from chirp-directions-integration into master 2026-09-27 19:09:55 +02:00
Owner

Backlog ticket 42 — the final ticket of the chirp-directions round (39–41 shipped as PRs #34/#36/#37). No production-code changes expected and none made, except one pre-existing defect the integration pass exposed: manual_tests/cola_chirp.py still referenced the pre-rename WAVEFORM_CHIRP constant (missed by ticket 39's rename) — repaired to WAVEFORM_UP_CHIRP.

Integration battery — tests/test_chirp_directions_integration.py (new, 36 tests)

Full-chain across all three chirp types: generate(project) → post chain → SigV3.1 write → read-back (sig_io.read_sig) with header metadata (Fe/FrequenceHF/BandeFI) per chirp type; byte-determinism (same project ⇒ same bytes; Double Chirp's θ* stable across runs); the operator scenario matrix (18 scenarios × 3 chirp types: single-band, multi-band equal + unequal levels, constant-BT, band-isolated, time-aligned overall); Double Chirp finite-PAPR optimum at the .sig level; L12/L14 refusals shared across the family.

Fixture note: band-isolated scenarios use a 33 MHz gap — adjacent-band fixtures (0 MHz gap) correctly refuse per the 1.1× max-BW isolation rule, so the battery uses well-separated fixtures instead.

Manual explorer — manual_tests/cola_chirp_directions.py (new)

Headless (--help works without a display, imports never require one), mirroring the cola_chirp.py pattern:

  • --waveform Up Chirp / --waveform Down Chirp — per-band seam explorer: measured seam level 0.7500 matches the predicted voltage COLA-weighted average for the 100/50 fixture, phase-continuity delta ~1.9e-2 rad, interior flatness ripple 4.4e-16; identical seam stats for both directions (mirror symmetry eyeball-checked)
  • --double-chirp — Double Chirp θ sweep panel: θ* ≈ 43.7°, PAPR 2.55 dB at the optimum vs 2.60 dB at θ=π on the default fixture; the coarse grid best and the refinement agree
  • repaired cola_chirp.py smoke-tested for both mode-0 and constant-BT

Spec consistency pass — doc/spec.md

§1 overview lists all 8 types; §2 diagram dispatch line covers the full dispatch (Up/Down/Double Chirp / Comb / Comb IQ / AGWN / Multi IQ / Other IQ); §3.1 ChirpDuration row uses family wording ("only used by the chirp family"); §5.2.1 heading now cross-references the shipped variants (§5.2.1b Down / §5.2.1c Double, not "later tickets"); §7 L8 already says "all chirp types" ✓; §9 renumbered 1–7 with the new determinism (incl. the Double Chirp phase search — seed-free), mirror-symmetry and I/O battery notes. Grep confirms no stale bare-"Chirp" waveform-type references and consistent 8-option counts.

Backlog archive (local, gitignored)

Round-8 table marked ✅ done with the wave summary (W1 39 → W2 40 → W3 41 → W4 42, all shipped; operator decisions + resolved assumptions A1/A2 recorded; integration notes documented). Tickets 39–42 archived into doc/done/ with README entries (38's previously-missing entry added too).

Gate

  • pytest: 1239 passed / 63 skipped (headless tier) — includes the new battery
  • ruff + mypy: clean (69 files)
Backlog ticket 42 — the final ticket of the chirp-directions round (39–41 shipped as PRs #34/#36/#37). No production-code changes expected and none made, except **one pre-existing defect the integration pass exposed**: `manual_tests/cola_chirp.py` still referenced the pre-rename `WAVEFORM_CHIRP` constant (missed by ticket 39's rename) — repaired to `WAVEFORM_UP_CHIRP`. ## Integration battery — `tests/test_chirp_directions_integration.py` (new, 36 tests) Full-chain across all three chirp types: `generate(project)` → post chain → SigV3.1 write → read-back (`sig_io.read_sig`) with header metadata (`Fe`/`FrequenceHF`/`BandeFI`) per chirp type; byte-determinism (same project ⇒ same bytes; Double Chirp's θ* stable across runs); the operator scenario matrix (18 scenarios × 3 chirp types: single-band, multi-band equal + unequal levels, constant-BT, band-isolated, time-aligned overall); Double Chirp finite-PAPR optimum at the `.sig` level; L12/L14 refusals shared across the family. Fixture note: band-isolated scenarios use a **33 MHz gap** — adjacent-band fixtures (0 MHz gap) correctly refuse per the 1.1× max-BW isolation rule, so the battery uses well-separated fixtures instead. ## Manual explorer — `manual_tests/cola_chirp_directions.py` (new) Headless (`--help` works without a display, imports never require one), mirroring the `cola_chirp.py` pattern: - `--waveform Up Chirp` / `--waveform Down Chirp` — per-band seam explorer: measured seam level **0.7500 matches the predicted voltage COLA-weighted average** for the 100/50 fixture, phase-continuity delta ~1.9e-2 rad, interior flatness ripple 4.4e-16; identical seam stats for both directions (mirror symmetry eyeball-checked) - `--double-chirp` — Double Chirp θ sweep panel: θ* ≈ **43.7°**, PAPR **2.55 dB** at the optimum vs 2.60 dB at θ=π on the default fixture; the coarse grid best and the refinement agree - repaired `cola_chirp.py` smoke-tested for both mode-0 and constant-BT ## Spec consistency pass — `doc/spec.md` §1 overview lists all 8 types; §2 diagram dispatch line covers the full dispatch (Up/Down/Double Chirp / Comb / Comb IQ / AGWN / Multi IQ / Other IQ); §3.1 `ChirpDuration` row uses family wording ("only used by the chirp family"); §5.2.1 heading now cross-references the **shipped** variants (§5.2.1b Down / §5.2.1c Double, not "later tickets"); §7 L8 already says "all chirp types" ✓; §9 renumbered 1–7 with the new determinism (incl. the Double Chirp phase search — seed-free), mirror-symmetry and I/O battery notes. Grep confirms no stale bare-"Chirp" waveform-type references and consistent 8-option counts. ## Backlog archive (local, gitignored) Round-8 table marked ✅ done with the wave summary (W1 39 → W2 40 → W3 41 → W4 42, all shipped; operator decisions + resolved assumptions A1/A2 recorded; integration notes documented). Tickets 39–42 archived into `doc/done/` with README entries (38's previously-missing entry added too). ## Gate - `pytest`: **1239 passed / 63 skipped** (headless tier) — includes the new battery - `ruff` + `mypy`: clean (69 files)
test(integration): chirp-directions round close-out (ticket 42)
All checks were successful
test / test (ubuntu-latest) (pull_request) Successful in 2m49s
09d2c87718
Closes out the chirp-directions round (39-41) with the integration
battery, manual explorer, spec consistency pass and the backlog archive:

- tests/test_chirp_directions_integration.py (new): full-chain across
  Up/Down/Double Chirp — generate → post chain → SigV3.1 write →
  read-back with header metadata (Fe/FrequenceHF/BandeFI per chirp
  type), byte-determinism (same project ⇒ same bytes; Double Chirp's
  theta* stable), the operator scenario matrix (single/multi-band
  equal+unequal levels, constant-BT, band-isolated with the 1.1x max-BW
  gap, time-aligned overall — 18 scenarios x 3 chirp types), Double
  Chirp finite-PAPR optimum, L12/L14 refusals shared across the family
  (36 tests)
- manual_tests/cola_chirp_directions.py (new): headless explorer per
  direction (Up/Down: seam explorer — measured seam level 0.75 matches
  the predicted voltage COLA-weighted average for the 100/50 fixture,
  phase continuity ~1.9e-2 rad, interior flatness ripple 4.4e-16;
  Double: theta sweep panel reporting theta* ~43.7 deg / PAPR 2.55 dB
  vs 2.60 dB at theta=pi on the default fixture)
- manual_tests/cola_chirp.py: REPAIR — the explorer still referenced
  the pre-rename WAVEFORM_CHIRP constant (missed by ticket 39's
  rename); now WAVEFORM_UP_CHIRP
- doc/spec.md: consistency pass — section 1 overview (all 8 types),
  section 2 diagram dispatch line, section 3.1 ChirpDuration row
  (family wording), section 5.2.1 heading cross-references the shipped
  variants (5.2.1b/c), section 9 renumbered with the determinism (incl.
  the Double Chirp phase search) + mirror-symmetry + I/O battery notes

Gate: pytest 1239 passed / 63 skipped (headless tier), ruff + mypy
clean (69 files).
ykp merged commit 56d82be65c into master 2026-09-27 19:09:55 +02:00
Sign in to join this conversation.
No description provided.