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 schedule the proxy's rate limit answered with 503 was left out of that poll, so every count on
Production dipped for a minute and came back on the next. A busy schedule is now asked once more
after a pause, and if it still fails its results from the last poll are shown. A refused one (4xx)
is still left out.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Every read of results asks each video schedule for its drafts, and the
dashboard read them every 10s while anything was being made, so the
network tab filled with video-drafts requests. Poll once a minute on the
dashboard and Results page, and reuse a read under a minute old when a
page opens or regains focus. Actions still refresh results at once.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The dashboard polls results every 10s, and each poll fetched every
schedule's drafts in parallel. With many video schedules that burst
overloaded the engine, which answered some with 503 and dropped those
schedules' results until the next poll. Run at most 4 at once.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
One failing per-schedule request no longer blanks the whole graph, and
the graph shows the engine's own error instead of always saying the
engine cannot be reached.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A failed plan item gets a Retry button on its card and in the preview. It
asks the engine for a fresh quote for that item and starts it again, while
the engine still allows another attempt (three per item).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The engine can stop a plan item without updating its drafts: a run paused
on material_quote_changed leaves the draft "preparing" for good, so the
result showed Preparing forever. A draft still at work now counts as
failed once its plan item is failed, blocked, cancelled or skipped.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Includes fixes found while reviewing the app:
- Results: open each result by a type+agent+id key, so a video and a
material draft with the same id no longer open each other's popup
- AuthGate: clear the query cache during render, before pages build their
queries, and remount pages on organization switch (pages no longer stay
on skeletons for up to a minute after sign-in or refresh)
- Instruction: keep only failed rules after a partial approve, so retrying
does not create the successful schedules twice; drop the monthly note
once count or frequency is edited
- Parser/schedules: never schedule a count below one
- Audio: ignore the end event of a cancelled utterance when changing speed
- Downloads: revoke the object URL later so Safari/Firefox can read it
- Results: refetch SCORM content when any part's revision changes; show a
failed video as failed instead of "still rendering"
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>