Adaptive baselines
InRoots learns what normal looks like for each person and each team, then judges change against that, not against a fixed rulebook. A night owl’s normal is normal.
Late is late for you
There is no fixed late hour unless you set one. Each person’s threshold is their own rolling 30-day average sign-in plus a buffer (signin.late_threshold_minutes). Someone who normally arrives at 09:00 is late after 09:30; someone who normally arrives at 11:00 is late after 11:30. Until five sign-ins exist in the window nobody is flagged, and the dashboard says the threshold is not yet established.
- A late finish earns a later start: after less than 11 hours of rest since the previous sign-off, the next day’s threshold moves to the earliest fair start, up to 3 hours later (attendance.min_rest_hours, attendance.max_rest_grace_hours).
- Flexible sign-in per team skips the deadline entirely and grades on hours.
- A late finish in work-health terms is one past the configured hour and at least 90 minutes past that person’s own median finish, so a later shift is never counted as overwork.
Learned networks
Home, office and on-the-go are learned per person from recurrence, not looked up online. A stable single-user address that keeps recurring is a fixed line, even on a carrier that also sells mobile. An address shared by two or more people is an office. Residential IPv6 is grouped by its /64 so a rotating address still reads as one network, and carrier-grade NAT is exempt from the shared-means-office rule. The person’s own sign-in label always overrides the guess.
Drift, against your own baseline
People signals compare the recent 14 days with the 42 days before them, both windows tunable. Two suppression rules guard the classic false positives: a post-leave grace suspends output and availability drifts when three or more leave days overlap the recent window, and schedule-change detection recognises that hours conforming to a newly changed expected schedule are a transition, not a drop.
neural.drift_recent_days neural.drift_baseline_days
Team-relative benchmarks
- The goal benchmark is the team’s own median efficiency over recent weeks, one figure per employee, excluding the person being viewed, and only over weeks scored under the same rubric.
- Targets resolve user, then team, then global, then default, and every goal payload says who set the bar and where.
- Work-health thresholds, presence weights, scoring weights and most other settings are per-team overridable, so a support team on late shifts is judged on its own line.
Outages are not misconduct
- When more than half of a person’s peers are late on the same day, the neural engine suppresses every lateness-flavoured action.
- When 80% or more of a team is absent on a working day, a company holiday is proposed to admins for confirmation; it is never applied automatically.
- A window with fewer than five worked days returns no work-health reading rather than a confident number; a week mostly on leave is drawn as a gap in the trend, not as a score.
What changes, what does not
Changing a target changes the verdict beside a score, never the score. Changing scoring weights invalidates cached scores and they are recomputed under the new signature. Changing working days affects detection going forward only; past days stay as recorded.