Test and monitor¶
The Test & Monitor group is pre-launch verification and post-launch observation in one place. Gating is per
row: the evaluation and insight pages are for everyone, while the /admin/* observability screens carry a
permission. On a personal install Playground, Quick Task and Jobs folded into Assistant on
2026-10-18: their rows leave the sidebar and their routes redirect there. On lite and full installs they keep their
rows and pages, as described below.
| Label | Route | Nav needs | Backend rule |
|---|---|---|---|
| Playground | /playground |
any member (not on a personal install) | the picked agent's access rules apply |
| Agent quality | /agents/quality |
any member | reads open; dataset, calibration and simulation writes need PERM_MANAGE_AGENTS; accepting an improvement needs PERM_MANAGE_GUARDRAILS |
| Turn inspector | /agents/turns |
PERM_VIEW_AUDIT_LOG |
GET /api/agents/{agentId}/turns/{turnId}/journal needs PERM_VIEW_AUDIT_LOG and VIEWER on the agent |
| Quick Task | /quick-task |
any member (not on a personal install) | signed-in |
| Jobs | /jobs |
any member (not on a personal install) | schedule writes need PERM_MANAGE_AGENTS |
| Insights | /insights |
any member | spend reports (/api/admin/spend-reports/**) need PERM_VIEW_USAGE; job counts are open |
| Cost & ROI | /roi |
PERM_VIEW_USAGE |
reads PERM_VIEW_USAGE; writes PERM_MANAGE_BILLING |
| Usage | /usage |
any member | signed-in |
| Files | /files |
any member | the caller's own files |
| Issues | /admin/issues |
PERM_VIEW_AUDIT_LOG |
/api/admin/issues/** needs PERM_VIEW_AUDIT_LOG |
| Live activity | /admin/audit-tail |
PERM_VIEW_AUDIT_LOG |
/api/audit-log/** needs PERM_VIEW_AUDIT_LOG |
| Audit log | /admin/audit |
PERM_VIEW_AUDIT_LOG |
/api/audit-log/** needs PERM_VIEW_AUDIT_LOG |
Playground (/playground)¶
Chat with one agent at a time to try it out. Arriving from an agent's "Chat" link (?agent=<id>) pre-selects that
agent; ?prompt= pre-fills the box. Each finished reply carries the request X-ray (prompt, sampling, tool list). The
chat exposes the agent's memories (with delete), the tool-call log, the model request log of a session, inline
approval decisions, per-turn feedback, attachments and session export. Generated images, audio, video, documents
and sandbox artifacts render in the thread.
When the install keeps chat history (APP_CHAT_BRANCHING_ENABLED, on by default), each of your messages has
Edit message and each reply Regenerate response; both keep the earlier version, and a "< 2/3 >" switcher
moves between versions. The history is stored for 30 days. If a reply has not started after 8 seconds, a line says
"The model is starting up - the first reply can take up to a minute. Replies after that are fast." (a hosted model
that was idle, or a local model that was unloaded, loads first).
On a personal install /playground redirects to Assistant with ?agent= and ?prompt= carried
over; the Assistant's agent picker does the same job there. API: POST /api/agents/{id}/chat (streamed),
/api/agents/{id}/chat/attachments, /api/agents/{id}/tool-calls, /api/agents/{id}/sessions/{sessionId}/llm-requests,
/api/agents/{id}/memories.
Agent quality (/agents/quality)¶
Titled "Agent Quality". Evaluation scoring for one agent, deep-linked with ?agentId=. An agent picker sits above
five tabs; links go to the Agent Lab (/agents?agentId=...&lab=open) and to Agent learning.
| Tab | What it holds |
|---|---|
| Live quality | Turn-by-turn scores on real conversations (helpfulness, accuracy, tone, length, relevance, safety), then the Improvements card below. |
| Datasets & gate | Golden-case eval datasets, case import and export, regression runs and history, judge calibration, statistics, and the eval gate that decides whether promoting the agent's head configuration to Production is allowed. A run replays in one of two modes, shown on every run in the history: Full pipeline (the default: the same tool selection, guardrails, approvals and budget as a real message, in a sandbox where only tools that read really run and everything that could write, send or pay is simulated and listed in the run detail) or Quick (text only) (the agent's tools are withheld). Pick the mode per run in the run options, pin one on a dataset, or let a workspace admin change the default (quality.eval.defaultMode). See configuration. |
| Simulations | Persona-driven simulation sessions and attack reports. |
| Reliability | Reliability runs and comparison against a measured noise floor. |
| Solutions | The proof ledger of an applied App Builder envoy, next to the per-agent quality panels. The full envoy view is at /build/{id}. |
API: /api/agents/{id}/quality/** (summary, history, datasets, runs, gate, judge calibration, simulations,
reliability, statistics, trajectory eval). The Datasets, judge-calibration and statistics lists use the shared pager.
Improvements¶
A card on the Live quality tab: "Suggestions for this agent's prompt and procedures, based on its recent behaviour."
- Generate suggestions scans the agent's open recurring issue clusters and distils new pending suggestions. It spends LLM budget on this agent. The result is bounded and de-duplicated; the toast reports how many new suggestions were created.
- A status filter (Pending, Accepted, Dismissed, All) and the shared pager (client-side) page through the suggestions. Each shows its rationale and proposed text.
- Accept applies the suggestion: a prompt revision replaces the agent's system prompt; a new procedure creates a procedure from the text and attaches it. Dismiss parks it.
- Permissions: listing and the health snapshot need viewer access to the agent; generate, accept and dismiss need
editor access; accept additionally needs
PERM_MANAGE_GUARDRAILSbecause it can create and attach a procedure.
API: GET /api/agents/{id}/improvements, POST .../improvements/generate, POST .../improvements/{suggestionId}/accept,
POST .../improvements/{suggestionId}/dismiss, GET .../improvements/health (the last computed health and confidence
snapshot, null until the first sweep or generate).
Quick Task (/quick-task)¶
A fast alternative to building a workflow: describe a task and run it while you watch (streamed). It previews the
agent and tools it will use, asks you to confirm, then runs and can deliver the result to WhatsApp, SMS or a call.
On a personal install /quick-task redirects to the Assistant's Quick task mode (/assistant?mode=task).
/quick-task/history is the history page on every install: a paged list of the user's runs (server paging with
limit/offset and X-Total-Count, so the footer can say "50 of 200") that opens a run's full untruncated log.
API: POST /api/quick-task, /api/quick-task/preview, /api/quick-task/stream, GET /api/quick-task/recent,
GET /api/quick-task/{taskId}.
Jobs (/jobs)¶
The console for background agent runs (start a job and close the tab): a launcher on top, the run list under it and
recurring schedules on a second tab. ?agentId= pre-selects an agent and filters the list. On a personal install
/jobs redirects to the Assistant's In background mode (/assistant?mode=background), whose work rail shows
running and finished background work. On every install /jobs/{agentId}/{jobId} shows one job live (status,
result, progress and the trace streamed over SSE; job endpoints are agent-scoped, so the agent id is in the route),
/jobs/all is the tenant-wide list and /jobs/schedules the schedules. API: GET /api/agent-jobs, POST /api/agents/{id}/jobs,
/api/agents/{id}/jobs/{jobId} (and /cancel, /progress, /trace, /trace/stream),
/api/agents/{id}/schedule (and /resume, /run-now, /runs). Schedule writes need PERM_MANAGE_AGENTS.
Insights (/insights)¶
"How your AI workers are doing", in plain words. Charts for AI calls per day and estimated cost per day, a success
rate and response-time summary, Top agents by estimated cost, Top models by estimated cost, and a Jobs right
now bar with a job status chart. A 403 on the spend data is an expected state: the page then shows the jobs section
only, with a short note. Every number follows the same rules as Cost & ROI (no rate from zero calls, cost always
"estimated"). A link points to Cost & ROI. API: /api/admin/spend-reports/{summary,by-day,by-model,by-agent}
(PERM_VIEW_USAGE), GET /api/agent-jobs/counts.
Turn inspector (/agents/turns)¶
Dependent on an off-by-default backend flag. A sidebar row since 2026-10-18, shown to holders of
PERM_VIEW_AUDIT_LOG. The inspector shows the recorded journal of one agent turn: an ordered, hash-chained list of
the stages the turn went through. It is the UI for the turn journal in
ADR-0020, designed in
ADR-0021. Your browser also re-checks the hash chain itself, and the
page's Export as test fixture button downloads the turn as turn-<id>.fixture.json.
- You give it an agent and a turn id, or an agent and a chat session id to list that session's turns. It reads
GET /api/agents/{agentId}/turns/{turnId}/journalandGET /api/agents/{agentId}/turn-journal?sessionId=.... - You see one row per event, in order: type (
INTAKE,GUARD,MODEL_CALL,TOOL_CALL,APPROVAL,VERIFY,COMMIT), a short redacted summary, the SHA-256 of the payload, the previous and own hash, and the time. The server also returnschainIntactand, when the chain does not verify,brokenAtSeq(the first event whose hash does not recompute, which means an event was edited, removed, inserted or reordered). - What it never shows: prompts, tool arguments, tool results or answers. The journal stores only hashes and a short summary with emails, bearer tokens, key-like tokens and long digit runs masked.
- Empty and denied states are shown on the page rather than as an error toast:
404means nothing was recorded for that turn,403means you lackPERM_VIEW_AUDIT_LOGor access to the agent. - Needs the flag: nothing is recorded unless the deployment sets
app.turn-journal.enabled=true(environmentAPP_TURN_JOURNAL_ENABLED; defaultfalse). Every reasoning depth and delegated or specialist turns are journaled, and a call held for approval writes anAPPROVALevent (a gated call that an eval's sandbox auto-approved writesdecided:eval-approved, never a person's decision); workflow runs are not journaled, and nothing purges old rows, so the table grows until an operator prunes it. The read works with the flag off (it serves what was recorded earlier), so an empty result on a fresh install is expected. Not even the personal install turns the flag on. See configuration. - Limits of what it shows: a
TOOL_CALLrow carriesstatus=ok,error,blocked,parkedor (an eval turn whose sandbox answered with a simulated result instead of running the tool)simulated, worked out from what the platform answered; the journal still stores hashes only, so for the arguments and the result check the agent's tool-call log. While the journal is on, the chat response carries the turn id in theX-Journal-Turn-Idheader, and the by-session listing finds a session's turns without it.
Cost & ROI (/roi)¶
Per-agent cost, outcomes, budget and the pilot report. Described in full in Cost and ROI.
Usage (/usage)¶
Titled "Usage & limits". How much of the plan's hosted-AI token allowance the workspace used this month (the same counter the platform enforces), with warnings above 80 percent and at the limit. It is deliberately in this group rather than Plans so it survives with billing off. For a workspace using its own provider keys (BYOK) the page says the platform pool allowances do not apply. Further cards:
- What's protecting your spend: the active cost mechanisms (prompt caching share, cost-aware model routing,
tool-schema minimization, approval gates), active or inactive only, with no invented savings figures.
GET /api/tenant/spend-protection. - Monthly AI spend limit: the cap set by the platform administrator on hosted-model use this calendar month (UTC), with an 80 percent marker and, when reached, the date calls resume. Hidden when no cap is set.
- Model spend & call log (only for holders of
PERM_MANAGE_BILLING): with billing on, a link to the money view on Billing; with billing off, the model-spend section (#llm-usage) is rendered directly on this page. - Top up budget: see below.
API: GET /api/tenant/usage-quota, GET /api/system/status/llm-telemetry, /api/admin/llm-usage/**
(PERM_VIEW_USAGE).
Budget top-up¶
The Top up budget card lets a member buy more of their own per-user usage budget when it runs out (the follow-through for the HTTP 402 "per-user budget exhausted" answer). The text reads "Add to your usage budget when it runs out. Amounts from $min to $max."
- Pick a preset amount or enter a custom amount in USD (checked against the minimum and maximum).
- Top up creates a payment order (
POST /api/budget/top-up) and opens the gateway checkout window. - After payment the card confirms it (
POST /api/budget/top-up/confirm). Nothing is credited until the confirmation succeeds; the server takes the amount and modality from its own pending-order record, never from the browser. - Outcomes the card can show: "Added $X to your budget"; "This payment was already applied to your budget"; "The payment was received but nothing was credited. Contact support."; or, if confirmation failed, "Do not pay again; retry the confirmation" with a Retry confirmation button.
The card hides itself when top-ups are off. Top-ups are controlled by platform settings
(platform.budget.per-user.topup.enabled, the preset list, and minimum and maximum amounts; the built-in defaults are
a $0.15 minimum and $50 maximum) and require a configured payment gateway. The credit lands on the very counter the
chat path checks, for the signed-in user. The web card buys the default text modality. API: GET /api/budget/top-up/options,
POST /api/budget/top-up, POST /api/budget/top-up/confirm. Any signed-in user may call them; they are not under
/api/platform/**.
Files (/files)¶
One place to see, search and download generated files. It merges six sources into one searchable table with the
shared pager: knowledge documents (aggregated across every collection) and generated images, ElevenLabs and Sarvam
speech, generated video and generated documents. Images, speech and video cannot be paged by the API, so they are
fetched whole and paged in the browser; a notice tells the operator when one of those lists hit its cap, and a
failure to load a source is reported rather than shown as an empty table. API: /api/knowledge/collections/{id}/documents,
/api/imagegen/images, /api/elevenlabs/audio, /api/sarvam/audio, /api/videogen/jobs, /api/documentgen/documents.
Issues (/admin/issues)¶
The admin issues portal: deduplicated failure records. A recurring failure accumulates onto one row
(occurrence count and last seen) instead of flooding the list, so what is shown is distinct problems. Status tabs
(All, Open, Acknowledged, Resolved), a search box, Acknowledge and Resolve actions, and the shared pager.
The list is server-paged (limit/offset with X-Total-Count; without parameters the API still returns the newest
200). Against an older core that ignores paging, the page loads up to the newest 200 rows once and pages them in the
browser, so paging works but there is no true total.
API: GET /api/admin/issues, POST /api/admin/issues/{id}/acknowledge, POST /api/admin/issues/{id}/resolve.
Live activity (/admin/audit-tail)¶
The live audit tail given a whole page. It polls the append-only audit trail every 6 seconds and shows a live,
paused or history state with Pause, Resume and Latest controls and a filter that applies to the
current page only. It is server-paged. API: GET /api/audit-log.
Audit log (/admin/audit)¶
The tenant's audit trail as a filterable table. The time-range and action-type filters are applied by the server
(from, to, actionType, targetType) and cover the whole log; the search box and the actor filter narrow the
current page only, and the page says so. Export this page (CSV) exports the rows on the current page that match
the page filters. The log is server-paged (limit 1..1000, offset, X-Total-Count counted over the server
filters). API: GET /api/audit-log, /api/audit-log/action-types, /api/audit-log/counts. See
list endpoint paging.