Explain button beside a queued message's failed recipients, the Classify verdict, Logs rows, trace events (stored and live) and settings fields; a panel with the model's reading, copy and cancel, and messages for busy, paused, unavailable and the hourly limit. Shown only when the session's aiExplain flag is set. The Local AI page gets an Explanations card (switch, model, hourly count, longest wait).
Needs the server's feat/ai-explain (inbuxa/inbuxa-server). On older servers the flag is absent and nothing changes.
Strings: 63 new explain.* strings, English inline like the rest of the console; no other catalogues to update.
Checks: type-check, eslint, prettier, 391 unit tests pass. Seen working in Chrome against a local server on 2026.9.23 demo data, with a stub model: settings fields, the Classify verdict, Logs rows, live and stored trace events, and the Explanations card. The failed-recipients card wasn't exercised (the demo queue is empty).
Fixed during the check: live events' key-values arrive as a JMAP map, so Explain threw on every live event; live events now share the stored view's normalizing (features/tracing/normalize.ts), which also makes the live timeline show event details for the first time. Four changed upstream files got the modification notice.
Explain button beside a queued message's failed recipients, the Classify verdict, Logs rows, trace events (stored and live) and settings fields; a panel with the model's reading, copy and cancel, and messages for busy, paused, unavailable and the hourly limit. Shown only when the session's `aiExplain` flag is set. The Local AI page gets an Explanations card (switch, model, hourly count, longest wait).
Needs the server's `feat/ai-explain` (inbuxa/inbuxa-server). On older servers the flag is absent and nothing changes.
**Strings:** 63 new `explain.*` strings, English inline like the rest of the console; no other catalogues to update.
**Checks:** type-check, eslint, prettier, 391 unit tests pass. Seen working in Chrome against a local server on 2026.9.23 demo data, with a stub model: settings fields, the Classify verdict, Logs rows, live and stored trace events, and the Explanations card. The failed-recipients card wasn't exercised (the demo queue is empty).
**Fixed during the check:** live events' key-values arrive as a JMAP map, so Explain threw on every live event; live events now share the stored view's normalizing (`features/tracing/normalize.ts`), which also makes the live timeline show event details for the first time. Four changed upstream files got the modification notice.
An Explain button sits beside four kinds of thing that are hard to read:
a queued message's failed recipients (in a small card above the queue
form), the Classify verdict on Actions, each Logs row and trace event
(stored and live), and each settings field. It opens a panel with the
local model's short reading, labeled as the model's and not as fact,
with copy, cancel and a clear message when the model is busy, paused
or over the hourly limit.
The button appears only when the session's aiExplain flag says the
server can answer: a superuser, a configured chat model, and
explanations switched on. The Local AI page gains an Explanations card
for that switch, the model to use, the hourly count per administrator
and the longest wait.
Needs a server with inbuxa:Explanation/set (sysAiExplain); on older
servers the flag is absent and nothing changes.
The live stream sends each event's key-values as a JMAP map ({"0": …}),
not an array. The live page cast it straight to an array, so Explain
threw on every live event, and the timeline never showed an event's
details. Live events now go through the same normalizing as stored
traces, moved to features/tracing/normalize.ts.
Also adds the modification notice to four upstream files this branch
changed.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Explain button beside a queued message's failed recipients, the Classify verdict, Logs rows, trace events (stored and live) and settings fields; a panel with the model's reading, copy and cancel, and messages for busy, paused, unavailable and the hourly limit. Shown only when the session's
aiExplainflag is set. The Local AI page gets an Explanations card (switch, model, hourly count, longest wait).Needs the server's
feat/ai-explain(inbuxa/inbuxa-server). On older servers the flag is absent and nothing changes.Strings: 63 new
explain.*strings, English inline like the rest of the console; no other catalogues to update.Checks: type-check, eslint, prettier, 391 unit tests pass. Seen working in Chrome against a local server on 2026.9.23 demo data, with a stub model: settings fields, the Classify verdict, Logs rows, live and stored trace events, and the Explanations card. The failed-recipients card wasn't exercised (the demo queue is empty).
Fixed during the check: live events' key-values arrive as a JMAP map, so Explain threw on every live event; live events now share the stored view's normalizing (
features/tracing/normalize.ts), which also makes the live timeline show event details for the first time. Four changed upstream files got the modification notice.The live stream sends each event's key-values as a JMAP map ({"0": …}), not an array. The live page cast it straight to an array, so Explain threw on every live event, and the timeline never showed an event's details. Live events now go through the same normalizing as stored traces, moved to features/tracing/normalize.ts. Also adds the modification notice to four upstream files this branch changed.