Chrome's window.scrollTo now returns a Promise. The effect that opens
each page at the top returned it, so React kept it as the cleanup and
called it on the next route change: "TypeError: Z is not a function",
which unmounted the whole app until a reload.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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>
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>
The window scrolls rather than the page area, so moving to another page
after scrolling down opened it at the same depth. Scroll to the top
whenever the route changes.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Org admins see every Express schedule in the organization, so a shared
organization mixed everyone's schedules together. The Schedule page now
shows "Created by …" on each one and, when others' schedules are listed,
switches between Mine and Everyone in the organization.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Each group label (Dashboard, Settings) toggles its items; a group starts
closed unless it holds the current route, and a manual toggle resets on
the next navigation. Mobile keeps every item visible.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Greet the user by name, drop the development-phase strip, move three metric
cards (material in the Brain, content made, uploaded to the LMS) below the
knowledge graph, and add a content activity section with the latest and
in-progress results as Results cards that open their preview in place.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Upload material (/upload) drops the metric cards for a larger upload box
above the material list; Brain and AI moves to /brain. Old paths redirect.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The sidebar now groups Production under Dashboard and the four existing
pages under Settings, and Production is the landing page. It shows content
in progress, material, content made, approved and LMS-ready counts, plus a
knowledge graph linking Brain documents, results, found sources and
schedules, with the schedule and what is being made right now beside it.
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>
The Instruction agent now confirms the output language before the plan is
ready: Bahasa Indonesia, English or 中文, the languages the engine writes
in. It can also be named in the instruction ("pakai bahasa Inggris"), is
read from short replies, and can be changed in the plan. Research alone
is not asked about.
The engine's content production has no language field, so the choice
goes into the agent's instructions; video schedules also set
video_options.language. ruleOf reads it back, so editing a topic keeps
it. The audio player recognises Chinese scripts and uses a zh-CN voice.
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>