EstadoAlarmas, EstadoGrabacion and EstadoRadio defaulted `esPremium` to
`() => true`, so any construction site that forgot to wire entitlement
compiled fine and silently ran ungated — failing OPEN to premium and
disabling the paywall with no test able to catch it.
The parameter is now required with no default. Production wiring in
app.dart was already correct and is unchanged; the 184 pre-existing test
call sites now pass `() => true` explicitly, which is exactly the old
implicit default, so every assertion is untouched.
EstadoRadio has no gate of its own but constructs EstadoGrabacion, so it
inherits the same contract.
The one test that existed to pin the old default is renamed to describe
what it still covers (the premium path through iniciar() with no
duracion); its assertions are unchanged.
Tier 4 visual fidelity, audit 9.1/9.5/9.6/9.8 (t4 lines 411-428):
- 9.1: new _HaloPulsante renders the prototype's 420px amber radial
gradient behind the hero content. Deliberately BOUNDED (one
grow-and-settle cycle), not the prototype's literal `infinite` CSS
animation: this screen's protected dismiss-guard test calls
pumpAndSettle() after every mount/interaction, and a genuinely
infinite AnimationController.repeat() would hang it forever with no
way to fix it. Skips its Animate wrapper under reduced motion, same
as every other entry animation in this app.
- 9.5: the hero time gets a local letterSpacing/height override
(-4/0.95) instead of the shared heroTime token's -2.0/1.0 — the
alarm editor's hour block is the token's other consumer and still
wants height:1, so the shared style is untouched.
- 9.6: ringing-screen art grows from 168/radiusLg(30) to 180/36 (t4
line 421), a local constant like the existing stop-button radius.
- 9.8: the POSPONER eyebrow regains its 19px warmCoral snooze icon.
All 5 protected files (including the dismiss-guard test) remain
empty-diff against main.