Background
PR #364 added Rule 5 to step-6-build.md:
Every element whose visibility changes at a beat boundary needs a deterministic tl.set() kill after its exit tween — not just captions. Without it, non-linear seeking can land between the fade end and the next scene start, leaving the element partially visible or causing a black-frame gap.
Problem
In a/b testing of PR #364 (see review #4167523103), the sub-agent produced 0 tl.set() hard-kills even with the rule present in the prompt — in both runs. The rule is documented but documentation alone isn't a reliable enforcement mechanism for sub-agents.
Meanwhile, scans of existing Stripe compositions found 86 exit animations with only 1 tl.set() hard-kill, and black-frame gaps at every beat boundary in rendered snapshots. The bug is real and widespread.
Proposed linter rule
Flag any element that has an exit tween ending at or near a data-start boundary without a corresponding tl.set() clearing its opacity/visibility at that same position.
Heuristic:
- Find
tl.to(el, { opacity: 0, ... }, t) where t + duration ≈ a scene boundary
- Check whether a
tl.set(el, { opacity: 0 }) (or equivalent) exists at the same position
- If not → warn:
missing hard-kill after exit tween on <selector> at t=<time>
Notes
- The existing caption hard-kill check is already a narrower version of this. This would generalize it to all scene-boundary exits.
- False positive risk: elements that are hidden by other means (e.g., parent clip,
display: none on the scene root). May need to be scoped to elements inside .clip containers only.
- Related: linter heuristic inconsistency on
overlapping_gsap_tweens (separate issue) may be masking some of these cases.
Background
PR #364 added Rule 5 to
step-6-build.md:Problem
In a/b testing of PR #364 (see review #4167523103), the sub-agent produced 0
tl.set()hard-kills even with the rule present in the prompt — in both runs. The rule is documented but documentation alone isn't a reliable enforcement mechanism for sub-agents.Meanwhile, scans of existing Stripe compositions found 86 exit animations with only 1
tl.set()hard-kill, and black-frame gaps at every beat boundary in rendered snapshots. The bug is real and widespread.Proposed linter rule
Flag any element that has an exit tween ending at or near a
data-startboundary without a correspondingtl.set()clearing its opacity/visibility at that same position.Heuristic:
tl.to(el, { opacity: 0, ... }, t)wheret + duration≈ a scene boundarytl.set(el, { opacity: 0 })(or equivalent) exists at the same positionmissing hard-kill after exit tween on <selector> at t=<time>Notes
display: noneon the scene root). May need to be scoped to elements inside.clipcontainers only.overlapping_gsap_tweens(separate issue) may be masking some of these cases.