Source: qdash /teams — c67 strip metric exploration, 2026-08-15
The v7 Teams strip only speaks spend. This page brainstorms every per-team metric the data already supports, picks five for a lens switcher, and works out the visual grammar — because the thin bar means something different per metric family, and it must not lie. Everything here derives from /api/costs.by_team plus a client rollup of userRollups() — no backend work.
Every metric the strip could speak
Grouped by family, mapped to the page's ranked jobs. Per-team trends are off the table — the daily series is fleet-wide only. Identity is mostly degenerate per team (members are mapped by definition): the amber Unassigned chip, not a metric, carries J3.
| Family | Metric | Question it answers | Job | In the select? |
|---|---|---|---|---|
| Spend | Cost /30d | Where does the money go? | J2 | yes |
| Spend | $ / person | Who burns hottest per head? (raw spend just ranks team size) | J2 J4 | yes |
| Spend | Tokens /30d | Same, token-denominated | J2 | Cost Center owns the $/Tokens unit toggle — a metric × unit matrix answers nothing new |
| Spend | Calls /30d | Raw request volume | J2 | weak story; correlates with tokens |
| Adoption | Active now | Is anyone on right now? The only near-real-time signal | J4 J1 | yes |
| Adoption | Agents / person | "Tried it once" vs "runs a stack" | J4 | yes |
| Adoption | People | How big is the observed team? | J3 J4 | permanent sub-line anchor instead — the denominator of half the metrics |
| Adoption | Sessions /30d | Usage intensity | J4 | correlates with spend, weaker story |
| Adoption | Last active / new this week | Dormant teams, growth edge | J4 | tooltip + roster material, not a lens |
| Adoption | Models breadth | Exploration vs standardization | J4 J2 | niche; tooltip material |
| Risk | At-risk people | Which team needs me now? | J1 | yes |
| Risk | Crit / Elev counts | How bad, exactly? | J1 | folded into the Risk lens sub-line |
| Risk | Findings · DLP opens | Open review debt, data exposure | J1 | tooltip; roster columns own the detail |
| Risk | Σ riskScore | Sortable composite | J1 | sort-only — a heuristic ordering signal, never displayed |
| Identity | Alias count | Attribution debt inside a mapped team | J3 | tooltip; the amber chip carries J3 |
The strip with a lens switcher
UxTabGroup (the c66 Cost Center idiom — a lens is a mode, exactly one always selected). Sort follows the metric, descending; the amber Unassigned chip always pins last, so the row's one landmark stays put through reorders. Switch to Risk and watch the bars disappear — severity is never a length.
Teams
Meridian — 14 people · 4 teamsTeams
at scale — 214 people · 26 teams · top 5 by the selected lensFour semantics, one chip
The bar is the danger zone: it must not imply "share of a whole" when the metric isn't one. One rule per family, and the Unassigned chip's participation decided per metric.
Today's grammar, kept: grey fill, widths sum to 100% across chips, "% · people" sub-line. The bar answers "how is the whole divided."
Unassigned: participates fully — its share of spend is the amber chip's whole point.
Bars no longer sum — the hottest team is full-width, others relative. Two guards against misreading as share: the % leaves the sub-line, and the fill stays the same magnitude grey (one hue, still a quantity).
Unassigned: denominates by identity ("$67 per identity") — a genuinely useful which-pool-to-map-first signal.
Own denominator per chip (2 of 4), so it's a meter, not a share bar: success-hue fill on a success-tinted track. The hue switch is deliberate — it announces the semantic switch at a glance. Value is "2/4" mono.
Unassigned: kept — running state exists for unmapped identities too, and "3 of 61 running right now" is the best catch-them-in-the-act mapping prompt on the page.
A magnitude bar invites "3 Elevated > 1 Critical," which is backwards — and status colors never encode length. The track slot stays empty (chip height never changes); the value is the at-risk count toned by worst level; the sub-line spells "1 Crit · 2 Elev" in words. Clear teams say "clear," quietly — calm chips make hot ones pop.
Unassigned: participates fully — risk among unmapped identities is the sharpest J1×J3 intersection on the page.
Decisions & ship notes
A lens is a mode: exactly one always selected — TabGroup's contract. FilterGroup deselects to null (a "no metric" strip) and its styling reads as scoping the data. A dropdown hides the option space; five flat labels invite lens-flipping at one click each. Precedent: c66's $/Tokens toggle — the page teaches one switching idiom.
Re-ranking is the payoff of switching — at scale the top-5 cap changes membership (Research under $/person, Support-Ops under Active, Core-Banking under Risk; none are top-5 spenders). The amber chip stays last before the Cost Center tail, so the row's landmark survives every reorder. The tail card never changes with the lens.
Ship with ?teamsBy= riding useUrlState (a Slack link lands someone in the triage view). Hover = the full stat sheet — all five numbers + people, so the lens picks what's comparable and the tooltip answers the follow-up. by_team rows carry an estimated bool — an asterisk on the $ value per estimated team beats the blanket caption.
$ comes from /api/costs.by_team (server-attributed); people/active/agents/risk come from a client teamRollups() — the natural sibling of userRollups() in fleet-rollups.ts, unit-tested the same way. The two "unassigned" sets can disagree at the margin (by_team's unknown bucket vs the rollup's NO_IDENTITY + unmapped) — build the chip list as the union keyed by team name, same accepted seam as the page's stat tiles. Optional, flagged: Risk-lens chip click could pre-apply the "risk: any open" roster filter.