Adjacent captions are incorrectly flagged as overlap.
Use start >= previousEnd for the no-overlap rule and rerun the 700-ms boundary case.
Hands-on recipe
Reject ambiguous cue order, zero-length captions, overlap and past-end timing before rendering. This recipe only covers the declared simple SRT subset and a supplied two-second media boundary.
Includes executed local fixtures, scripts and receipts. These checks do not represent a video-generation service run.
node run-recipe.mjs --out ./my-run
The fixture uses integer milliseconds, sequential indices starting at one, no overlap and end > start. The media boundary is an explicit input; the script does not discover a video’s real duration. The one-hundred-millisecond gap before cue 3 is intentional.
Run the command and inspect cue-table.json. It contains the three actual parsed start/end values. A cue starting exactly at the previous cue’s end is accepted, and the last cue may end exactly at 2,000 ms.
The runner writes and tests overlapping, zero-duration, past-boundary, wrong-index, malformed-millisecond and invalid-minute variants. Each expected rejection records its concrete validation error. A correctly shaped timestamp with a minute component of 60 is still invalid.
Check all nine assertions and retain the cue table beside the original SRT. Font coverage, line layout, reading speed, HTML extensions and rendered appearance remain separate tasks. This download contains no CJK font inventory or burned subtitle video.
Use start >= previousEnd for the no-overlap rule and rerun the 700-ms boundary case.
Verify the supplied durationMilliseconds first. If it is correct, allow end equal to that boundary while still rejecting 2,001 ms.
Change only end so it is strictly later than start, then recheck overlap against the next cue. Do not delete the zero-duration rule.
Validated timings are a handoff input for a render stage. They do not prove a particular font displays, captions fit the frame or viewers can comfortably read the text.