Skip to content

Stimulus defaults run up to 0 dBFS: plot ir defaults to -6 dBFS, level ramps end at 0 dBFS #459

Description

@mkovero

problem

Every emitting CLI command falls back to a hardcoded level when none is typed, and several of those defaults are far above anything this project runs on real hardware. Operator, 2026-09-15:

"-6dBFS is way too loud default to be anywhere"

For scale: the standing rig ceiling is −40 dBFS, and the speaker path on the dedicated rig is held at −50 dBFS because a −40 dBFS sweep through a Genelec 1083 is already "surprisingly loud".

Defaults on main (read at 298f77dc, PR #352's tip, which carries main):

command default where
ac plot ir −6 dBFS ac-cli/src/parse/plot.rs:47
ac plot level −40 → 0 dBFS ramp ac-cli/src/parse/plot.rs:11,14
ac generate level −40 → 0 dBFS ramp ac-cli/src/parse/generate.rs:24,27
ac calibrate −10 dBFS ac-cli/src/parse/calibrate.rs:32
ac plot −20 dBFS ac-cli/src/parse/plot.rs:87
ac generate frequency −20 dBFS ac-cli/src/parse/generate.rs:51

The server-side backstop does not close this. drive_max_dbfs defaults to −10 dBFS (ac-core/src/config.rs:18), so on a machine without a hand-edited config a bare ac plot ir is clamped to −10 dBFS, not refused, and a bare level ramp reaches −10. #360 made plot_ir and calibrate honour the clamp. Whether plot_level / sweep_level ramps do was not verified for this issue.

why it matters

A default is the level a user gets by not deciding. Typing ac plot ir with no arguments is the natural first try, and here it puts a full-band sweep 34 dB above the rig ceiling into whatever is connected — amplifier, loudspeaker, DUT, or someone's headphones. The only thing standing between that and the hardware is a −10 dBFS clamp that is itself louder than any consented run so far.

This is the silent-default shape: nothing warns, the command succeeds, and the level was never chosen by anyone.

acceptance criteria

  • No emitting CLI command defaults above a single, named, documented conservative level; the value and its reasoning live in one place, not six unwrap_or literals.
  • Level ramps (plot level, generate level) do not default to ending at 0 dBFS.
  • drive_max_dbfs's default is reconsidered together with the CLI defaults, so the backstop is not louder than the defaults it backs up.
  • Whatever the command prints says the level was defaulted rather than chosen.
  • Test: each emitting command parsed with no level token yields a level at or below the named default. A test that checks one command only would pass while another literal stays at −6.

Choosing the actual numbers, and whether some commands should instead require an explicit level, is a design decision — not settled here.

related

#360 (clamp coverage for plot_ir / calibrate), #442 (it_loopback_ir clamping at the −10 dBFS default).

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    agent:architectArchitect agent acted on itagent:devDeveloper agent acted on itagent:triageTriage agent acted on itbugSomething isn't workingdrive-pathStimulus/drive safety checklist applies (qa.md)in-reviewQA reviewed, awaiting human mergeready-to-implementSpec complete, developer can pick upsoftwareac Python/Rust codebasetier-1ac-core/measurement/ — QA runs the standards check

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions