| 178 | let runStart = first.time; |
| 179 | let runSig = first.liveness[scope] ?? ""; |
| 180 | const flush = (endTime: number) => { |
| 181 | const span = endTime - runStart; |
| 182 | if (span > maxStaticSec) { |
| 183 | issues.push({ |
| 184 | code: "motion_frozen", |
| 185 | severity: "error", |
| 186 | time: runStart, |
| 187 | selector: within ?? "composition", |
| 188 | message: `nothing moves${within ? ` within ${within}` : ""} between ${round(runStart)}s and ${round(endTime)}s (${round(span)}s static) — should keep moving`, |
| 189 | rect: ZERO_RECT, |
| 190 | fixHint: |
| 191 | "Add or extend motion so no shot freezes for this long, or shorten the static hold.", |
| 192 | }); |
| 193 | } |
| 194 | }; |
| 195 | |
| 196 | let lastTime = runStart; |
| 197 | for (const frame of frames.slice(1)) { |