Skip to content

Captures pin the floor tier

Every capture path renders at the Floor quality tier, and it cannot do otherwise by accident. Renderer::new_headless takes no tier argument and resolves Floor by construction (Plan 0044 / ADR-0045), so there is no field a test can forget and no environment variable that can change what a baseline looks like. shot defaults to floor for the same reason and deliberately does not read RLX_TIER.

Two reasons, and both are load-bearing:

  • Reproducibility. A tier sets capacity — particle counts, the segment budget, the internal-grid caps — so a baseline blessed on a rich-tier run and compared against a floor-tier one differs for a reason that has nothing to do with the change under test. A capture is a pure function of its inputs (NFR §6), and the tier would otherwise be a hidden input.
  • Suite cost. The golden and visual-QA suites run on the WARP software adapter, where fill and instance count translate directly into wall-clock. At rich values the same suite would draw 3x the attractor particles into a 4K-capped trail grid on a CPU rasterizer.

--tier rich is the deliberate opt-in, for spot-checking that the raised budgets actually render.

A tier is no longer one number per scene, and the attractor is where that started: its sample budget is a density against the render target, capped by one ceiling in a window and a larger one under --render (ADR-0140). Every capture path — this page’s stills, filmstrips and reports, and both test suites — takes the window’s ceiling, and at capture sizes the law’s lower clamp resolves exactly the tier’s own count, so no baseline moves. See --render for the path that does not.

A Rich capture is an instrument, and never a baseline (ADR-0064). Use it to look, not to bless: a rich capture must never be written into core/tests/golden/. The reason is dated rather than principled — TierConfig::RICH’s values are the provisional ones Plan 0044 shipped and its Phase 4 calibration has never run, so every Rich baseline would be a re-bless waiting on a number nobody has measured yet. Revisit after that calibration, not before.

Omitting the flag is exactly --tier floor, byte for byte — verified at Plan 0057 Phase 1 rather than assumed, since “the default is the old behaviour” is the kind of claim that quietly stops being true.

The consequence ADR-0045 names and accepts: rich-tier regressions are caught only by those spot checks and by on-device runs, not by the suite. That is a real hole, not a solved problem.

--size is part of that tuple, and since Plan 0033 it does more than crop: the trails and kaleido_* stages size their internal grid from the render target (ADR-0034), so a preset composing either one genuinely renders differently at 640x360 than at 1080p rather than merely smaller. A given size is still exactly reproducible; two sizes are no longer scaled versions of one picture. Capture at the size you are judging.

Everything here is dev/agent tooling. The image crate is a dev-dependency only (ADR-0011), so the shipped ritmolux.exe is untouched; the CLI is a cargo run --example, not a subcommand of the app.

Package name note: the standalone crate is standalone, so the invocation is cargo run -p standalone --example shot -- ….

Built from a8ce055 at version 0.115.0. This site tracks main and is not versioned per release.