Results polled one drafts endpoint per schedule every minute, archived ones
included, so the Network tab filled with video-drafts reads. Each poll now
reads GET /agents/status once (with If-None-Match, mostly a 304) and reads a
schedule's drafts again only when its status changed, while a production plan
is at work, or after 30 minutes so signed video URLs stay valid. Without the
status read, every schedule is read as before. The poll is now every 30s.
Also documents how Express uses the engine API in docs/engine-api.md.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The proxy allows 10 requests a second per address and answers the rest
503. Limiting how many reads run at once still sent 40-50 a second, since
each answers in about 100 ms. Reads now share one pace of 8 a second,
actions skip the queue, and a 503 pauses every read for 2 seconds.
Results and Schedule share each schedule's production status, and an
archived schedule is read once until an action.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A user on Upload got a white page while the engine's proxy answered
many requests with nginx's rate-limit 503.
- Pages render inside an error boundary, so a crash shows a message
with Try again and Reload instead of unmounting the whole app.
- A 503 or 429 without the engine's JSON reads "The engine is busy",
and queries wait 5s, then 10s, before asking again instead of 1s.
- Upload asks for knowledge details two at a time and reuses them
until the document's knowledge status changes.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>