diff --git a/skills/website-to-hyperframes/references/step-5-build.md b/skills/website-to-hyperframes/references/step-5-build.md index 5bcb94a6a..c723bf5a4 100644 --- a/skills/website-to-hyperframes/references/step-5-build.md +++ b/skills/website-to-hyperframes/references/step-5-build.md @@ -455,7 +455,7 @@ For each SFX entry: 3. Add beat-local + global start: `3.5 + 1.2 = 4.7s`. 4. Write `data-start="4.7"` in index.html. -**Forbidden:** writing `data-start=""` by reading the storyboard and estimating by eye. The evidence block above MUST quote both the storyboard SFX line and the index.html `data-start` line — and confirm they match within ±0.05s. A 1-second drift is not a rounding error; it's a build failure. +**Forbidden:** writing `data-start=""` by reading the storyboard and estimating by eye. The evidence block above MUST quote both the storyboard SFX line and the index.html `data-start` line — and confirm they match within ±0.1s (≈3 frames at 30fps; same tolerance `w2h-verify.mjs` enforces and `step-6-validate.md` uses for playback verification). A 1-second drift is not a rounding error; it's a build failure. ### Surface recurring sub-agent workarounds to the user diff --git a/skills/website-to-hyperframes/scripts/w2h-verify.mjs b/skills/website-to-hyperframes/scripts/w2h-verify.mjs index 26ce8eefd..a67dcd1b0 100644 --- a/skills/website-to-hyperframes/scripts/w2h-verify.mjs +++ b/skills/website-to-hyperframes/scripts/w2h-verify.mjs @@ -26,7 +26,7 @@ const PROJECT_DIR = resolve(process.argv[2] || "."); // Thresholds — change here, not by interpretation. const HEADLINE_MIN_PX = 80; // 80px floor for primary headline at 1920×1080 const TIMELINE_COVERAGE_MIN = 0.7; // max GSAP event position must reach ≥70% of beat duration -const SFX_DRIFT_TOLERANCE_S = 0.5; +const SFX_DRIFT_TOLERANCE_S = 0.1; // 3 frames at 30fps; matches step-5 evidence rule + step-6 playback floor const BEAT_DURATION_DRIFT_TOLERANCE_S = 0.5; const SHADER_NAMES = [