Pages
Teams & Users — Ideas v7

Source: qdash /teams — c67 on real components, 2026-08-14

v5's four states rebuilt on the pantry: the roster is the layer's DataTable (heavy header rule, per-column slots, #details expand, column search, limit + footer), people are UxAvatar, danger and identity are UxPill, context chips are UxCode. The Teams section is v6's chip row, cherry-picked whole. What v5 hand-rolled in ~90 lines of table markup per state is now a column config per state — the state machine lives in data, which is the point.

State 1

First run

No table yet — the queue is the page. Unchanged from v5/v6 (with the v6 progress line); included so the set stays complete on one page.

Teams & UsersSpend, sensitive-data access, and risk per person.
8 identities observed — none mapped yet. Assign your first person below; teams are created as you type.
Map your identitiesobserved, not verified — assigning is evidence, not accessor connect your IdP — most of this maps automatically
3 of 8 assigned · $12 of $41 attributedwhen the queue empties, this page becomes your ledger
p
priya@meridian.devClaude Code · priya-mbp · first seen Tue$11Paymentscreate "Payments" ↵
m
marcus@meridian.devClaude Code + Cursor · marcus-mbp$9assign team…
c
ci-runner@meridian.dev3 agents · builds-04 · pipeline hours only$14assign team…
+ 5 more · autocomplete offers existing teams first, creates on enter

Teams

No teams yet — they appear here as you assign, with spend attribution from the first hour.
State 2

All clear — DataTable, plain rows

Spend-sorted ledger. No #details slot passed, so DataTable renders plain rows — the expandable/plain switch is just slot presence. Limit 3 + the #footer slot carries the tail.

Teams & UsersSpend, sensitive-data access, and risk per person — sorted by spend.
Nothing needs you. 14 people across 4 teams, fully mapped — $1,340/30d all attributed.
14people
across 4 teams
100%mapped
IdP not connected
$1,340attributed · 30d
of $1,340 — everything
0at risk
no open findings
Person
Team
Identity
Activity
Spend · 30d
p
priya
Paymentsorg ✓3 agents · 12m ago$169
m
marcus
Platformorg ✓3 agents · 48m ago$121
d
dana
Dataorg ✓3 agents · 1h ago$112
+ 1 more — show all · $938
100% mapped · IdP not connected —

Teams

State 3

Attention · 14 — DataTable with #details expand

The working state on the real component. Same DataTable, three more columns in the config, and a #details slot — which makes every row expandable inside the house ExpandRow card (close X included). Expand a person to see their agents: UxCode for the working-directory chips, UxPill for danger. Click a column header to sort.

Teams & UsersSpend, sensitive-data access, and risk per person — ranked by risk.
2 people and 4 identities need you — felix has an , sofia an , and $306/30d has no owner.
14people
+1 this week — chen
71%mapped
10 of 14 — 4 need assigning
$1,034attributed · 30d
of $1,340 — from /api/costs
2at risk
felix · sofia
3 of 14 people run on consumer keys — credential detail and risk live on /identity
Person
Team
Risk story
Identity
Activity
Spend · 30d
f
felixalias
Data1 Critical — undecided egress · Sunconsumer key2 agents · 31m ago$70
s
sofia
Platform1 Elevated — secrets.yaml read · Friorg ✓2 agents · 2h ago$98
p
priya
Paymentsokorg ✓3 agents · 12m ago$1692.4× median
c
chennew
okconsumer key1 agent · 19m ago$4
+ 10 more, all ok — show · $693
$306/30d unattributed — 4 identities · 3 have suggestions

Teams

click filters the roster · estimated · same /api/costs rollup Cost Center reads
State 4

Attention · 214 — column search, capped chips

At scale the search moves INTO the table — DataTable's search: true on the Person column wires the header search cell, replacing v5's hand-rolled search bar. Filter chips stay above for URL-backed scope. Chips cap at top 5 + unassigned.

Teams & UsersSpend, sensitive-data access, and risk per person — ranked by risk.
6 people and 61 identities need you — worst six below, and $4.1k/30d has no owner ·
214people
+9 this week
71%mapped
153 of 214 — 61 need assigning
$14.3kattributed · 30d
of $18.4k — from /api/costs
6at risk
2 Critical · 4 Elevated
risk: any open
team: all ▾search lives in the Person column header ↓
Team
Risk story
Spend · 30d
r
r.vance
Payments-EU2 Critical — undecided egress · plaintext secret$402
j
j.okaforalias
1 Critical — sensitive repo on unmanaged machine$261
a
a.lindqvist
ML-Infra1 Elevated — customer-data export · Thu$1,240
s
s.moreau
Data-Platform1 Elevated — credentials.json read · Mon$188
k
k.tanaka
Frontend-Web1 Elevated — egress to unlisted domain · 2d$95
d
d.adeyemi
SRE1 Elevated — session on shared runner · 4h$310
+ 208 more — search above, or sort by spend · $14.1k
$4.1k/30d unattributed — 61 identities · 44 have suggestions · 12 look like service accounts

Teams

Notes

What the component swap surfaced

The column config IS the state machine

All-clear, attention, and scale are the same DataTable with different column arrays and slot presence — exactly what the v6 matrix specified. The ship rewrite passes the config; no bespoke table code per state.

DataTable earned it, with two seams

The house ExpandRow card and column search came free. Seams: the footer slot is bottom-right (v5's tail was a full-width row — acceptable), and header sort is label-based so the risk-rank default relies on fixture order until a riskScore sort column is added.

Still hand-rolled, on purpose

Verdict line, toned stat sub-lines, the amber band, and the team share chip remain inline — they are the four confirmed layer gaps from the v6 audit. TeamChipRow is written as one local functional component so the extraction boundary is already drawn.

Qpoint Brand Style Guide