# Surface index

Every dashboard screen in one table, with its route, the question it answers, what makes it appear, and where its subject is documented.

Source: https://tokentriage.com/docs/build/dashboard-surfaces

---
import Callout from '../../../components/Callout.astro';
import Details from '../../../components/Details.astro';
import NextSteps from '../../../components/NextSteps.astro';

You are looking at a screen and want to know what it is. This page is the map: thirty-seven
sidebar entries plus the routes that have no sidebar row, each with the question it answers,
the configuration that makes it appear, and a link to the page that documents its subject.

The tables below are generated from the shipped navigation definition and resolved against two
capability payloads captured from running binaries, so the counts and the routes are the
product's, not a description of it. The "shown in" columns report where each entry appeared:
**demo** is `tokentriage demo`, **minimal** is `tokentriage run --config` over a config file
carrying nothing but upstreams, a tier and a two-line `dashboard:` block.

Thirty-five of the thirty-seven appear in the demo. Twenty-three appear on the minimal
instance. The two the demo leaves out are Fleet and Instances, which need a peer.
If yours is shorter than a screenshot, [why your sidebar is
shorter](/docs/build/dashboard-navigation) explains the rule that decides.

Every route below is relative to `/ui` on the admin listener, so `/cost` is
`http://127.0.0.1:9090/ui/cost` at the default admin address.

## Money

Where the spend went, what it will be, and what cannot be accounted for. The concepts live in
[Cost & attribution](/docs/build/cost-analytics).

| Surface | Route | Answers | Appears when | Demo | Minimal |
|---|---|---|---|---|---|
| Overview | `/` | is everything healthy, where is the money going, and can I climb a rung | always | y | y |
| Cost | `/cost` | where the money went by tenant, tier, model and token, and what is excluded | the read model is on | y | y |
| Cost · breakdown | `/cost/breakdown` | what we spent this period, broken down by what we bill on | `analytics.enabled` | y | — |
| Chargeback | `/cost/chargeback` | what each team spent, as showback — nobody is billed | at least one chargeback report is configured | y | — |
| Recommendations | `/cost/recommendations` | which cheaper options the scan found, and what each is graded | `analytics.recommendations` | y | — |
| Realized | `/cost/realized` | what an applied recommendation did, measured on post-apply rows | `analytics.recommendations` | y | — |
| Reconcile | `/cost/reconcile` | how a provider invoice compares with the ledger, with a residual | reconciliation is composed | y | y |
| Forecast | `/forecast` | what this will cost, as a range rather than a single figure | `analytics.forecast` | y | — |
| Cost · measurement | `/metacost` | what the product spent producing its own evidence | `analytics.metacost` | y | — |

Reconcile appears on the minimal instance because its store is opened whenever the dashboard
is composed, independently of `analytics`. That asymmetry is the product's, and the nav
reports it rather than hiding a route that answers.

## Traffic

The rows themselves, and the identity that joins them.

| Surface | Route | Answers | Appears when | Demo | Minimal |
|---|---|---|---|---|---|
| Requests | `/requests` | which requests match this filter, grouped how I want them | the read model is on | y | y |
| Traces & agents | `/traces` | how one trace fanned out, as a cost waterfall rather than a latency one | business dimensions are available | y | y |
| Live | `/live` | what is arriving right now, costed, as it happens | the live stream is wired | y | y |
| Record | `/requests/{req_id}` | everything known about one request, in five tabs | reachable from any row | — | — |
| Receipt | `/requests/{req_id}/receipt` | the printable receipt for one request | reachable from a record | — | — |

Record and Receipt have no sidebar entry because they are per-row destinations rather than
places you navigate to. Both are deep-linkable, and the URL for a record is stable, which is
what makes it paste-able into an incident channel.

## Routing and quality

The trust ladder, the rules that implement it, and the evidence that licenses a promotion.
[Routing](/docs/build/routing) and [Calibration & Evals](/docs/calibration/overview) own the
concepts.

| Surface | Route | Answers | Appears when | Demo | Minimal |
|---|---|---|---|---|---|
| Routing | `/routing` | which rung am I on, and does the evidence let me climb | the control plane is wired | y | y |
| Policy | `/policy` | what would these first-match rules do, before I apply them | the control plane is wired | y | y |
| Honesty | `/honesty` | what does the verdict say, and on how many labelled rows | the control plane is wired | y | y |
| Calibration | `/calibration` | which calibration artifact is active, and what a threshold sweep does | the control plane is wired | y | y |
| Quality · scorecard | `/evals/scorecard` | one row per segment, split by evidence basis and never combined | the read model is on | y | y |
| Quality · reliability | `/evals/reliability` | does a calibrated score behave like a probability on held-out data | the read model is on | y | y |
| Quality · coverage | `/evals/coverage` | how much of my traffic a quality claim actually speaks for | the read model is on | y | y |
| Quality · drift | `/evals/drift` | did anything shift, and did anyone look | the read model is on | y | y |
| Evals · datasets | `/evals/datasets` | which pinned sets of ledger references exist to test against | the read model is on | y | y |
| Evals · experiments | `/evals/experiments` | how two candidates compare on a pinned dataset version | the read model is on | y | y |
| Evals · annotate | `/evals/annotate` | which requests are waiting for a human label | the read model is on | y | y |
| Quality · judges | `/evals/judges` | which LLM judges have been measured against human labels, and which floor a refused one missed | the read model is on | y | y |

The eight quality surfaces are gated on the read model rather than on a quality setting,
because each one folds ledger rows and there is no quality capability on the wire to gate them
on. A deployment that declines one of their reads gets a surface that says so; a nav entry
promises the screen exists, not that every read inside it is permitted.

Two of those eight belong to the judge track and are the pair a reader most often meets in the
wrong order. **Quality · judges** is the read: one card per judge subject with its agreement
statistic, the floors that run and the `need`/`have` behind a refusal, and it reports
`validation_state: empty` until some subject on your ledger carries human labels.
**Evals · annotate** is how those labels get there. Run the check that fills the first from
[Validate a judge and promote it](/docs/judges/validate-and-promote); the queue behind the
second is [Collect the labels a judge is measured against](/docs/judges/collect-labels).

<Callout type="warning">
The judges screen prints one cause for a missing agreement figure: `IAA not measured
(single-annotator gold set)`. Four situations produce that null and the screen names only the
first of them, so the sentence is right about a quarter of the time. Run
`tokentriage evals validate` and read its text output, which prints `unmeasured (<reason>)` on
the gold-set line with the reason its producer recorded. This is filed.
</Callout>

## Spend control

Two mechanisms with similar names that stop different things. [Cap spend with a
budget](/docs/build/dashboard-budgets) covers the difference.

| Surface | Route | Answers | Appears when | Demo | Minimal |
|---|---|---|---|---|---|
| Budgets | `/budgets` | how far through its ceiling is each budget, and will it stop anything | at least one `budgets:` entry is defined | y | — |
| Governance | `/governance` | which virtual keys and tenants exist, and what was turned away | governance is armed | y | — |
| Governance · limits | `/governance/v2` | what would this limit do before I enforce it | governance is armed | y | — |
| Governance · health | `/governance/health` | are coordinated limits converging, and what widened | governance is armed | y | — |
| Alerts | `/alerts` | which rules exist, what fired, and what would have fired | alerting is wired | y | — |
| Anomalies | `/anomalies` | what the last detection scan found, including when it found nothing | the detector is wired | y | y |

Budgets is the one entry with three states rather than two: present and enabled, present but
disabled when budgets are defined and enforcement is not granted, or absent when none are
defined. The disabled state carries its reason.

## Providers, prices and cache

| Surface | Route | Answers | Appears when | Demo | Minimal |
|---|---|---|---|---|---|
| Providers | `/providers` | one card per upstream: dialect, endpoint, key reference, health, cooldown | the control plane is wired | y | y |
| Pricing | `/pricing` | what the active price table resolves, and which rows have no price | the read model is on | y | y |
| Cache | `/cache` | is the cache earning its keep, and is each saved dollar backed by evidence | the response cache is configured | y | — |

The Providers surface shows the *name* of the environment variable holding each key, never a
value. [Provider credentials](/docs/build/providers-credentials) covers why.

## Fleet and administration

| Surface | Route | Answers | Appears when | Demo | Minimal |
|---|---|---|---|---|---|
| Fleet | `/fleet` | which replicas are alive by heartbeat age, and what the last merged read covered | at least one peer instance is configured | — | — |
| Instances | `/instances` | which peers this hub is reading from | at least one peer instance is configured, and see below | — | — |
| Saved views | `/views` | which queries are saved, shared or scheduled | the control plane is wired | y | y |
| Settings | `/settings` | what config is running, and can I change it safely | always | y | y |
| Share read | `/share/{token}` | one frozen query, to somebody with no account | a share token was minted | — | — |

Fleet and Instances are absent from both columns because neither instance had a peer
configured. A direct visit to `/fleet` on a single node still renders, reporting one replica
rather than refusing.

Instances is the one entry with no route behind it. The navigation lists it when peers are
configured, and the router registers nothing for `/instances`; the product tracks it as a
known gap owned by the scale-out work. Fleet is the surface that answers today.

<Callout type="warning">
The Fleet coverage panel currently renders a fixed example rather than this instance's
coverage, so a single-node install is told two of three replicas answered. Read the roster
above it, which is live, and treat the coverage panel as unreliable until it is fixed. The
same applies to the divergence panel at the bottom of Cost, the backtest panel on Alerts, and
the limit-preview panels on Governance · limits. This is filed; see [what a new dashboard
shows you](/docs/build/dashboard-first-run#panels-that-are-not-yours).
</Callout>

## Settings, in more detail

Settings is one route with six panels, and it is the surface most likely to be what somebody
means by "the admin page".

| Panel | What it does |
|---|---|
| Running configuration | serves the config file verbatim, with its generation number and load time |
| Config editor | validate, diff against running, then apply under a compare-and-set guard |
| Mode control | set the ladder mode, subject to the promote gate |
| Users | add, change and remove local users and their roles |
| Content capture | reports whether bodies are being stored, and states the consequence |
| Audit | every attempted write, accepted or rejected, with its actor |

Retention appears here too, reporting the sweep policy. The mechanism belongs to
[the decision ledger on disk](/docs/operate/ledger-lifecycle).

<Details summary="Routes with no sidebar entry">

Five routes are reachable without appearing in the nav:

| Route | What it is |
|---|---|
| `/requests/{req_id}`, `/requests/{req_id}/receipt` | per-row destinations, reached from any row |
| `/traces/{trace_id}`, `/traces/{trace_id}/diff` | a single trace, and a two-trace comparison |
| `/share/{token}` | the public read plane |

The share plane renders with no navigation at all. A share-link recipient gets one frozen
query and nothing else, rather than a stripped-down dashboard.

Adding `?embed=v1&theme=light` to any surface strips the chrome for embedding in a Grafana
panel or a runbook. It removes navigation, not disclosure: the mode, snapshot and demo
watermark stay.

</Details>

## What this page does not cover

It names each surface's question, not its answer. What a cost figure *means* is
[Cost & attribution](/docs/build/cost-analytics); what a verdict chip means is
[the honesty model](/docs/concepts/honesty-model); what a limit does is
[Governance](/docs/build/governance). This page's job is to get you from a screen to the
right one of those in one hop.

<NextSteps items={[
  {title: "Why your sidebar is shorter", href: "/docs/build/dashboard-navigation", description: "The rule that decides which of these thirty-seven entries your instance renders."},
  {title: "How to read a number", href: "/docs/build/dashboard-reading-a-number", description: "The chips and flags that appear beside figures on every surface in this table."},
  {title: "What a new dashboard shows you", href: "/docs/build/dashboard-first-run", description: "What each of these surfaces says before any traffic has arrived."},
  {title: "The management API", href: "/docs/build/dashboard-api", description: "The endpoints behind these surfaces, and the reference that documents them."}
]} />
