/// Configurable limits with sane defaults. These are the dials the user is /// allowed to turn — everything else about enforcement is fixed. class Thresholds { /// Hard cap on unresolved overdue items. static const int maxOpenOverdue = 5; /// After this, a task cannot be deferred again — only completed or /// explicitly abandoned. static const int maxDeferralsPerTask = 2; /// Minimum excuse length. Free text, no template buttons; the friction is /// the point. static const int minExcuseLength = 15; /// Standing thresholds on the debt score. static const double warnedThreshold = 12; static const double groundedThreshold = 30; static const double lockdownThreshold = 60; /// Missed non-negotiables that force Grounded regardless of score. static const int nonNegotiableMissesForGrounded = 3; /// Amnesty tokens granted per month. static const int amnestyTokensPerMonth = 3; /// Capacity check headroom — plan against 85% of what you historically get /// done, not 100%. static const double capacityHeadroom = 0.85; /// Days after which an untouched elective auto-archives. static const int electiveArchiveDays = 21; /// Snooze tax: each snooze shortens the next interval instead of extending /// it, and the third becomes a full-screen alarm. static const List snoozeLadderMinutes = [10, 5, 2]; /// Minutes a push can go unacknowledged before SMS fallback fires. static const int smsFallbackMinutes = 20; }