Problem
waitFor.timeoutMs passes straight to puppeteer with no range check; a negative timeout throws inside the run instead of a structured 400 like validateRecipeUrls produces.
Where
src/browser.ts (timeout: step.timeoutMs ?? 15000, no validation).
Acceptance
Add a failing test first asserting a recipe with timeoutMs: -5 is rejected at validation time with a 400 error. Then fix.
Problem
waitFor.timeoutMspasses straight to puppeteer with no range check; a negative timeout throws inside the run instead of a structured 400 likevalidateRecipeUrlsproduces.Where
src/browser.ts(timeout: step.timeoutMs ?? 15000, no validation).Acceptance
Add a failing test first asserting a recipe with
timeoutMs: -5is rejected at validation time with a 400 error. Then fix.