BehavioralMetrics type, but they leave BehaviorSessionSummary.behavioralMetrics set to null.
Window
The runtime computes each metric over a window of behavior events (a session or an HSI window). Flutter’scalculateMetricsForTimeRange(...) returns only raw
counts and context for a time range, not these metrics.
When the window contains no events, every metric returns 0.0 and lists return empty.
The canonical 12
interactionIntensity
interruption_events = notification_events + call_events + app_switch_events. Range [0, 1]. Anchored so ~10 events/min reads as full intensity.
taskSwitchRate
Exponential saturation:
taskSwitchCost
BehavioralMetrics.taskSwitchCost is the millisecond form (raw int); flux internally also exposes a normalised [0, 1] version.
idleTimeRatio
activeTimeRatio
1 − idle_time_ratio — task-switch cost is also subtracted.
notificationLoad
Exponential saturation:
burstiness
Barabási burstiness over inter-event gaps:
0.0 = perfectly regular (Poisson-like), 0.5 = random / no data, 1.0 = very bursty. Flux returns 0.5 when the session has no inter-event gaps yet.
behavioralDistractionScore
Weighted composite, fixed weights:
focusHint
focusHint + distractionScore = 1.0. (Flux’s test test_focus_hint_is_inverse_of_distraction enforces this.)
fragmentedIdleRatio
1.0 on very short sessions; flux clamps at the encoding step before HSI export.
scrollJitterRate
deepFocusBlocks
Engagement segments lasting at least DEEP_FOCUS_MIN_DURATION_SEC = 120 seconds (2 minutes), fixed in flux. Each block in the SDK shape:
Typing metrics (extension)
Typing metrics are derived from typing events (formulas live in flux’s typing module). Each SDK’s typing event carries per-burst timing in itsmetrics map (for example typing_speed, typing_tap_count); the session-level aggregates below are computed by the runtime. The SDKs’ TypingSessionSummary is null.
A few are defined as composite ratios:
typing_interaction_intensity = w₁ · typing_speed_norm + w₂ · (1 − typing_gap_ratio) + w₃ · typing_cadence_stability(weights set in the runtime feature deriver).clipboard_activity_rate = (copy + paste + cut) / (typing_taps + clipboard_actions).correction_rate = (backspace + delete) / (typing_taps + backspace + delete).
NotificationSummary
Numerical stability
Flux clamps:- All bounded outputs are wrapped in
.clamp(0.0, 1.0)(or per-field bounds for raw mileage values liketask_switch_cost_mscapped at 10000). - Empty input (no events, zero duration, no scrolls, etc.) returns the safe fallback (
0.0for ratios,0.5for burstiness).
Related
- Behavior Overview — full SDK surface.
- Model Card — motion state, separate from these metrics.
- Threat Model — what’s collected and what’s not.