Phase 1
Teams & Users

Source: c89 teams-sessions-listings — header treatment iteration on phase1/teams.vue (PRO-20), matching the Users & Devices coverage-ring / named-attention-list pattern (reference: bob-wire c21, other-designer-in-progress work)

fixture state

19 people known to Okta, 16 covered by a sensor — 3 unaccounted for.

3 without a sensor (Alexis Romero holds a seat — investigate) · Wes Okafor started 21d ago with no sessions

30 of 32
installs with an owner
2 installs with no identity — attribution debt, Inventory →
Needs attention
✓ Okta connected✓ Jamf connected19 people known to Okta22 devices known (16 via Jamf, 5 via Okta, 1 manual)

Teams

click scopes the verdict, band and roster · spend by team lives on Cost Center

People

one row per person · ranked uncovered first, then the stalled joiner, then by tokens · 30d
Team
Devices
Agents
Intensity
Tokens · 30d
Last active
Coverage
AR
Alexis Romero
Backend engineer
Engineering
○alexis-mbp
none
▯▯▯ none0neveruncovered
holds a seat — investigate
MT
Miguel Torres
SDR
GTM
○miguel-mbp
none
▯▯▯ none0neveruncovered
no sensor, nothing observed
OH
Omar Haddad
Finance
Ops
○omar-mbp
none
▯▯▯ none0neveruncovered
no sensor, nothing observed
WO
Wes Okafornew · 21d
Engineer (new)
Engineering
●wes-mbp
Claude Code
1 install
▯▯▯ none0nevercovered
TB
Tyler Brooks
Staff engineer
Engineering
●tyler-mbp
Claude Code
Codex
2 installs
▮▮▮ heavy58M3h agocovered
KR
Kamal Reddy
Senior engineer
Engineering
●kamal-mbp
○kamal-win-01win
Claude Code
Codex
Gemini
3 installs
▮▮▮ heavy52M4h agopartial
1 of 2 · Windows gap
DW
Dana Whitfield
Account executive
GTM
●dana-mbp
Codex
2 installs
▮▮▮ heavy42M2h agocovered
MC
Marcus Chen
Platform engineer
Engineering
●marcus-mbp
Claude Code
Codex
Grok
3 installs
▮▮▯ moderate34M7h agocovered
RC
Rob Castellano
Solutions lead
GTM
●rob-mbp
○rob-win-01win
Claude Desktop
Codex
Gemini
3 installs
▮▮▯ moderate26M5h agopartial
1 of 2 · Windows gap
PN
Priya Natarajan
Frontend engineer
Engineering
●priya-mbp
Claude Code
Codex
2 installs
▮▮▯ moderate24M5h agocovered
KN
Kai Nakamura
Head of operations
Ops
●kai-mbp
○kai-win-01win
Claude Desktop
Grok
2 installs
▮▮▯ moderate22M8h agopartial
1 of 2 · Windows gap
DR
Devon Reyes
Platform engineer
Engineering
●devon-mbp
Claude Code
Claude Desktop
Codex
3 installs
▮▮▯ moderate18M2h agocovered
HL
Hana Lindqvist
Product engineer
Engineering
●hana-mbp
Claude Code
1 install
▮▯▯ light12M3h agocovered
JF
Jonah Fitz
Tooling engineer
Engineering
●jonah-mbp
Claude Code
Hermes
2 installs
▮▯▯ light9.0M8h agocovered
EW
Erin Walsh
Product marketing
GTM
●erin-mbp
Codex
1 install
▮▯▯ light8.0M27h agocovered
LG
Leah Goldman
IT administrator
Ops
●leah-mbp
Codex
Gemini
2 installs
▮▯▯ light7.0M6h agocovered
SA
Sofia Alvarez
Field marketing
GTM
●sofia-mbp
Claude Desktop
1 install
▮▯▯ light6.0M7h agocovered
NP
Natalie Pierce
Office & facilities
Ops
●natalie-mbp
Claude Desktop
1 install
▮▯▯ light5.0M27h agocovered
BA
Ben Ashworth
Customer success
GTM
●ben-mbp
Claude Desktop
1 install
▮▯▯ light4.0M4h agocovered

19 people · zero-usage rows stay visible — who is not using AI is still interesting to management. ● sensor installed · ○ no sensor · dimmed agent mark = detected-only or never run · tokens are the measured 30-day total; dollars are estimates and live on Cost Center. Last active = last session on record, else the latest monitored heartbeat when 30-day usage exists, else never. Coverage is a fraction of the Okta/Jamf denominator, not of what the sensor happens to see.

Composition notes

  • c89 header delta: the "people covered" and "devices sensored" claims move from Phase1StatBlock fractions to DataDonutChart rings — the same two numbers (band.covered/band.people, band.devicesSensored/band.devices), re-derived nowhere. A ring reads "how much of the whole" faster than a fraction string at header scale, matching the Users & Devices pattern another designer is establishing; the filter-button behavior (click scopes the roster) rides along unchanged so nothing regresses. "Using AI · 30d" and "installs with an owner" stay plain stat blocks — not every number needs a ring, and a header with four rings would be noisy without a matching gain in clarity.
  • Named attention list: the band's uncovered/investigate counts already named nobody — the c89 rationale is that a manager acting on this page needs specific people, not just "3 uncovered". The list pulls band.investigate first (holds a seat, zero telemetry — the more urgent story), then fills to 5 from band.uncovered, reusing the exact phrasing the roster's own Coverage column already uses ("holds a seat — investigate", "no sensor, nothing observed") so the header and the table never say the same fact two different ways. All-clear states it plainly. This is a one-off composition, not a promoted shared component — if a second page wants the same idiom (Sessions does, see sessions.vue), it's a candidate to extract then.
  • Question, verdict, team strip, roster, and expand are unchanged from phase1/teams.vue — see that page's composition notes for the full reasoning (amber ruling, team-filter-in-place, the person expand card, derivation sources). This page exists to isolate the header treatment for review, per c89's scope.
  • Open: whether the ring should keep its click-to-filter behavior or a header ring reads as "just a stat" to most users (StatBlock's active ring affordance is subtle on a donut); whether "using AI" deserves a ring too once there's a natural second denominator for it (there isn't one today — it's a plain count against people, already a fraction in its value string).

Qpoint Brand Style Guide