OpenCut v1.9.26 — Install rate limit 429 + structured filepath errors
v1.9.26 — Two bugs caught by deep behavioral smoke test
Rolling QA caught two more real bugs by exercising the actual running binary — neither were visible to static code review.
1. Install routes returned 200 + job_id on rate-limited retries, then failed async
make_install_route() was checking rate_limit("model_install") inside the @async_job body, so the rate limit violation surfaced only after a job record + worker thread were already created. The client got 200 OK + {"job_id": "..."} and had to poll /status/<id> to discover the failure.
Fix: moved the rate-limit check to the synchronous Flask handler layer — now returns 429 RATE_LIMITED immediately with no job spawned.
first call: 200 {"job_id": "..."} (install begins in worker)
second call: 429 {"code": "RATE_LIMITED", ← synchronous
"error": "A model_install operation is already running...",
"suggestion": "Wait for the current install to finish, then retry."}
2. @async_job filepath errors lacked code + suggestion
When a route rejected a filepath through @async_job, the response was {"error": "No file path provided"} with no structured code field. The CEP/UXP panels' ERROR_CODE_ACTIONS table relies on code to pick the right recovery hint — without it, users saw only the raw message.
Fix: @async_job now classifies filepath failures into INVALID_INPUT (empty, traversal, null byte, UNC prefix) vs FILE_NOT_FOUND (missing, not-a-file) and attaches a suggestion:
{"error": "No file path provided",
"code": "INVALID_INPUT",
"suggestion": "Select a clip in Premiere or pass `filepath` in the request body."}Applies to all 97 async routes that go through the @async_job decorator.
How this was found
A 9-step behavioral smoke test on the v1.9.25 exe that submitted real payloads and inspected the response shapes:
- CSRF enforcement (no-token / bad-token → 403) ✓
- Empty body → 400 (but
codewas None — bug!) - Path traversal → 400 (same bug)
- Non-existent file → 400 (same bug)
- Real silence-detect job submission
- Bad JSON body → 400 ✓
- 100 MB oversize payload → 413 ✓
- Double install call — expected 429 but got 200 twice (bug!)
- Shutdown → 200 ✓
Downloads
Windows
OpenCut-Server-v1.9.26-Windows.zip— 🆕 ready-to-run bundle, extract + double-clickOpenCut-Server.exeOpenCut-Server-Windows.tar.gz— same contents, tarball format
Linux
OpenCut-Server-Linux.tar.gz
macOS
OpenCut-Server-macOS.tar.gz
Built by GitHub Actions CI and uploaded automatically.