Methodology
Every number on the dashboard and in Board Pack exports comes from the definitions below. Thresholds match the classifier code used in production.
The four stages
For hook tools (Claude Code, Codex, Cursor), each actor is classified once per ISO week at their highest stage. Copilot uses daily aggregates with the same stage labels (see provenance).
-
1 · Activated
Activated
At least one real session in the week, not a hello-world test.
Shows the seat did real work.
-
2 · Habitual
Habitual
Real sessions on 3+ distinct days in the week.
One-off tryouts stop looking like adoption.
-
3 · Deep
Deep
Habitual, and agentic (≥1 subagent or ≥5 tool calls), and the week includes a commit outcome.
Depth without shipping still is not Deep.
-
4 · Multiplying
Multiplying
Deep, plus a multiplying signal (shared command, AGENTS.md, hooks adopted, or an explicit multiplying flag).
Means patterns others can reuse, not only personal depth.
The three gaps
Gaps show where coaching should focus. An actor can hold a stage and still carry a gap (for example Deep with a poor-quality week).
-
Not using
Zero real sessions in the week (seat paid, idle for this tool).
Detected when session count for real sessions is 0.
-
Using shallowly
Activated but not yet Habitual, or Habitual without agentic depth and a commit outcome.
Detected as gap shallow when the week is active but not Deep+.
-
Using poorly
Tool failure rate ≥ 40%, or ≥ half of real sessions abandoned/errored.
Detected as gap poor; best stage reached is still reported.
Session scanners (the “why”)
Four metadata-only scanners explain a poor or shallow week without changing its stage or gap. They read the same session/tool metadata already collected under metadata_only — never prompt text. Up to 2 scanner cues show on /me per period, environment errors first.
-
retry_loop
Retry loop
Metadata-only flag from consecutive same-tool `tool_use_failure` events. Signals a workflow habit — stop and change approach instead of repeating the call.
Threshold: 3+ consecutive same-tool failures.
-
tool_env_errors
Environment errors
Only raised when failure `meta.error` text matches an environment pattern. Empty or missing error text skips this flag rather than guessing (never inferred from a blank field).
Empty or missing failure error text ⇒ this flag is skipped, not guessed.
-
depth_without_commit
Depth without commit
Agentic = ≥1 subagent or ≥5 tool calls, with no commit outcome. Explains a shallow/habitual gap without changing the stage or gap enum.
Threshold: ≥1 subagent or ≥5 tool calls, no commit outcome.
-
early_abandon
Early abandon
Outcome is abandoned/error with 2 or fewer tool calls — work stalls before it starts, distinct from a poor week with many failed attempts.
Threshold: abandoned/error outcome with ≤2 tool calls.
Overlapping sessions (work pattern)
A sweep-line over each session's [started_at, ended_at] window — never Polymath-style 'steering' or engaged time, which would need prompt/turn timing. Sessions with no recorded end count as a single active minute at their start, not excluded. Always visible on /me; the org person page shows only a coarse rollup, and only if you turn on share-work-pattern.
Concurrency is a deterministic sweep-line over each session's [started_at, ended_at] window: minutes are bucketed by how many sessions were active at once, the peak per calendar day is tracked separately, and the "typical work window" reports the UTC hours where the 10th/50th/90th percentile of active minutes fall. This always shows in full on /me; the org person page only ever shows a coarse "often overlaps N sessions" line, and only when the actor has turned on sharing work pattern to the org.
Engaged time (prompt cadence)
A gap of 5 minutes or less between consecutive prompt_submit events counts as still engaged; a gap over 15 minutes is a break. Painted as 10-minute slots on /me. This is a cadence proxy from metadata timestamps only — never prompt content, never typed speed/WPM from prompt_length, and never Polymath-style 'flow' or 'steering', which need transcript-derived turn timing this proxy does not have. Hidden when you have no prompt_submit events in the period.
This is a weak proxy built only from prompt_submit timestamps. It does not use prompt content or turn prompt_length into typed speed or word count. It is not a flow or steering score; those need transcript turn timing this proxy does not have. The section only appears on /me when the actor has at least one prompt_submit event in the selected period.
How you work (opt-in)
Optional local grades for six adoption criteria (scores 1–5 or null): recovery, landing, steering, delegation, leverage, and clarity. Null stays null on most routine sessions. Scores are for personal coaching. We do not rank people or use hire-ladder language.
- Recovery — Change strategy after failure instead of blind retry.
- Landing work — Drive toward a verifiable done state (commit, tests, explicit done).
- Steering agents — Set goal, constraints, and acceptance bar — then course-correct.
- Delegation fit — Let the agent run rote work; hold judgment-heavy calls.
- Tool leverage — Use available depth (subagents, parallel, hooks) when the task warrants it.
- Clarity under ambiguity — Name the fork and choose when the path is unclear.
Run cliqq me-how-you-work on your machine. Results stay on /me until you turn on share-how-you-work. Leaders who see a shared summary never receive quotes or transcript text.
How “Needs attention” ranks teams
Teams are ranked by a severity weight built from the three gaps: severity = not-using × 3 + poor × 2 + shallow × 1. A team enters the attention list when severity ≥ 3 (one idle seat, or poor + shallow use, or three shallow users), or when it has any gap and its count of people in gaps grew versus the prior period.
A team must have at least 3 actors and a concrete stall reason to appear; smaller or non-qualifying teams with gaps roll into the “Everything else” row. The weight is internal ranking machinery — the UI reports people counts, not the score.
How the Overview verdict is chosen
When any team qualifies for Needs attention, the verdict names how many need attention this period. When none qualify, it reports the strongest positive signal: the change in actors at Deep or Multiplying versus the prior period (same filters).
How the team × week heatmap is built
Each actor counts once per ISO week at their best stage across tools. The cell for a team-week is the modal of those unique-actor stages — the stage held by the most people. Ties break toward the higher ladder stage (Multiplying beats Deep beats Habitual, and so on).
Single-week period filters expand to a recent Monday window so movement stays visible. The grid caps at 8 week columns.
How nudge outcomes are counted
Each recorded playbook nudge stores a team (or actor) and the week it was sent. At +2 and +4 weeks we compare the target’s best (actor) or modal (team) adoption stage to the nudge week. “Moved up” means a higher ladder rank. Aggregate counts only — no individual coach notes leave the privacy floor.
The headline count prefers the 4-week window when that horizon has elapsed; otherwise it uses 2-week. Window sentences omit any horizon that is not yet eligible.
Data provenance
Session-level — Claude Code, Cursor, and Codex hooks emit per-session metadata (timing, tool calls, models, outcomes). Stages and gaps for those tools are built from session aggregates.
Daily aggregate — GitHub Copilot arrives as one row per user per day (source_granularity=daily). On those rows, “session count” means active days in the ISO week, not CLI sessions.
Measured vs estimated — adoption stages and gaps are measured from metadata. Spend and some local personal-dashboard depth signals are estimated when token/cost fields are incomplete. Where a number is an estimate, the UI labels it as one.
metadata_only (default collection policy) keeps session and tool metadata and strips denylisted content fields (prompt bodies, messages, transcripts, tool inputs/results, and similar). Prompt text is never required to compute stages or gaps.
Spend proxies
The Spend view rolls up cost_usd from actor-week rows (by tool and team) and from session (plus Copilot daily) model rows for the model table. Totals are always shown with an Estimated label because token/cost fields are incomplete for some tools — notably Copilot daily metrics.
Unused-seat and shallow spend cards sum the same cost_usd on actor-weeks stuck at not-using / idle or gap shallow. Cost per Deep user divides period spend by actors at Deep or Multiplying (null when there are none — we do not divide by zero).
What we do not compute
- Self-reported time-saved or ROI dollar models — those figures are easy to game and not backed by our metadata.
- Prompt-content quality scoring as a default metric — under metadata_only we never see prompt bodies; quality dimensions that need prompts stay locked until an org explicitly chooses prompts_allowed.
- Individual productivity rankings or leaderboards — we show gaps and coaching targets. We do not rank individuals against each other.
Visibility policy
Individual names on Champions and person drill-downs appear only when show_individuals is on and visibility_policy is not aggregate_only. Otherwise the UI shows anonymous aggregates and a names-hidden explainer — gap counts still work.
Collection policy (what is stored) is separate from visibility (who can see names). Leaders configure both under Settings. Champions live under Teams (/teams?view=champions); the same gate applies.