A chat workspace for an eight-person team, with the context window, the cycle bill and the seat count all derived from the messages and the fixture arrays. Looking at it should settle whether an assistant product can show its own arithmetic without a single stored total.
Preview interactive design
A product lead runs the week’s writing, code review and research through one assistant, on a workspace allowance that resets on the first. Every turn re-reads the conversation, so a reply costs what is already in the window.
01The screens →A thread carries the files it is reading, and only a file the index actually read reaches the window. One that failed or is unsupported carries nothing and is left out of the meter.
nothing stored, counted per render02SendA turn is billed for the context that existed when it ran plus what it wrote, so the same question costs more late in a thread than early. Output bills at five times input.
a failed turn is absent, not zero03ReconcileThe usage screen, the thread’s own cost and the cycle charge are three views of one set of turns. Nothing writes a total — sending a message moves all three at once.
one array, three screens, no cacheTwenty-one registered routes: six sidebar destinations, six off it, four settings and five auth. There is deliberately no list screen for turns — a turn is only ever reached through the thread that holds it.
02The status set →The thread owes an answer for how full the window is and what the reply was based on. It shows the cited files under each turn, and refuses to imply a file is in context when the index could not read it.

The index is the honest part of an assistant product. Every row says whether the model can read the file, and a row that cannot carries the reason and the one move that helps. Nothing falls back to a zero token count.

The day chart, the model table and the person table are the same fourteen turns grouped three ways, so no two of them can disagree. It declines to chart a day with no turn on it as a zero.

A seat is held by a person or by an invite still standing, so the figure is people plus unexpired invites and never a stored count. A dormant member is recessed with the reason rather than disabled or hidden.

The current cycle has never been invoiced, so it is derived from the same turns the usage screen charts. The failed invoice is not a badge on its own — it carries the reason it failed and the thing that fixes it.

Four vocabularies over five fields, and none of them holds what an assistant product is expected to store: whether a thread is near its context limit, whether a prompt has gone stale, whether an invite still holds a seat, whether a card has expired. All four are computed at render.
03The awkward cases →Each of these is a real record in the fixture, and each one is the reason a figure on some other screen is derived rather than stored.
04The audit →Every derived figure was walked against the array under it and none disagreed — fourteen billed turns reconcile across the usage table, the person table and the cycle charge, and ten of ten seats reconciles with eight people and two standing invites. What the pass changed was interface: the composer carried a duplicated focus treatment, and the brand mark was sized by an inline style on one screen and by a rule everywhere else.
05Back to the top →
Reckon
Threads, files and seats are this template’s nouns, but the rule underneath travels: if a screen shows a total, the array that makes it is on the same page.