Commitment Flow Score (CFS)
Definition
The composite team-health metric. The CFS rolls up three pillars — Reliability (Say-Do Ratio on delivered commitments, read as two gauges: Flow Score and Ghost Rate, because delivering more and ghosting less are not the same improvement and collapsing them would hide one behind the other), Reciprocity (the Lead's own Say-Do on rows where they are the assignee), and Sentiment (how the Knight felt at Handshake acceptance — display-only, never weighted into the score).
Role
The CFS is the headline number on the Garden — the Lead's reliability receipt for the team they manage. It exists to make the human side of commitments measurable without falling back to engagement metrics (open rates, time-on-page) that miss the point. The CFS only counts rows that received an explicit Handshake; nothing accumulates against a Knight who was never given the chance to consent.
Calculation lives behind the canonical computeCfs() engine in src/lib/metrics/cfs.ts and runs server-side on every CFS surface (home, activity, team, dossier, and the 7-point trend). The composite is presented as separate gauges rather than a single number so the failure mode is legible (high Ghost Rate + high Flow Score reads very differently from low Flow Score + low Ghost Rate) — Sentiment adds a fourth, unscored gauge on top: the same reliability numbers can hide a team that is quietly overloaded.
Lifecycle
Not a stateful concept — see cfs-rules for the precise inclusion rules. The CFS is recomputed on read; no row is "in" the CFS as a stored attribute.
The scored axes have distinct entry rules:
- Flow Score — enters denominator at
Pending_Handshake→Active. Enters numerator atActive→Completedifcompleted_at <= deadline. - Ghost Rate — enters numerator at
Pending_Handshake→RefusedorPending_Handshakeages out. - Reciprocity — same arithmetic as Flow Score, restricted to rows where the Lead is the assignee.
- Sentiment — not scored. Captured once, at
Pending_Handshake→Active, from the Knight's optional 4-chip choice (or a skip, stored asNULL); aggregated into a display-only distribution, never a numerator/denominator pair.
Related guides
Last updated: 7 July 2026