Moving between pages sometimes left a white screen until a reload: an
error outside the page's own error boundary (the layout, the sign-in
gate) unmounted the whole app. An error boundary now wraps the whole
app, shows the error's name and message, and tries again when the route
changes.
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>
Read from GET /organizations/me, refreshed after every action and every
30 seconds, since agents and schedules spend credits in the background.
The date is dropped from the topbar, and its items wrap on phones.
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>