How Compliance is Measured
Vibe Check doesn’t just fire reminders — it actively tracks whether you actually take the suggested breaks. This “compliance tracking” ensures the system adapts to your real behavior.The Tracking Flow
- Reminder fires — A micro-break, full break, or hydration reminder appears in your conversation
- Pending state created — The system marks this reminder as “pending” with a timestamp
- Gap measurement — On your next prompt, Vibe Check measures how long you were away
- Compliance check — If the gap exceeds the threshold for that break type, you’re credited with taking the break
- Timer reset — The corresponding timer resets to the current time
This system prevents “reminder spam” — if you take a break, you won’t get another reminder for that same activity right away.
Break Duration Thresholds
Each break type has a minimum duration threshold. You must be away from Claude for at least this long after a reminder to be credited with taking the break:| Break Type | Default Threshold | Configurable Via |
|---|---|---|
| Micro-break | 60 seconds (1 min) | VIBE_CHECK_MICRO_BREAK_DURATION |
| Hydration | 120 seconds (2 min) | VIBE_CHECK_HYDRATION_BREAK_DURATION |
| Full break | 300 seconds (5 min) | VIBE_CHECK_FULL_BREAK_DURATION |
The thresholds are intentionally shorter than the recommended break duration. A 60-second gap after a micro-break reminder suggests you at least stepped away, even if briefly.
How Tracking Works
The tracking logic lives in thecheck_reminder.py hook:
Key Behavior
- One-shot check — The pending state is cleared after checking once, whether you took the break or not
- Timer reset logic — Full breaks reset all timers; micro and hydration breaks only reset their own
- No penalties — If you don’t take a break, nothing happens — you’ll just get another reminder at the normal interval
Spontaneous Break Detection
Vibe Check automatically detects when you take breaks without a reminder prompt. If you’re away from Claude for 15 minutes or more (configurable viaVIBE_CHECK_GAP_THRESHOLD), the system assumes you took a spontaneous break and resets all timers.
Why This Matters
- Lunch breaks — Your lunch break resets all timers, so you don’t get a reminder immediately when you return
- Meetings — Stepping away for a 30-minute meeting prevents redundant reminders
- Context switches — Long gaps (15+ minutes) typically represent real breaks in work
Timer Reset Logic
Different break types reset different timers:Micro-Break
Resets only the micro-break timer:Hydration Reminder
Resets only the hydration timer:Full Break
Resets all three timers:Spontaneous Break
Also resets all three timers:This hierarchy reflects that a full break provides the benefits of shorter breaks, but a micro-break doesn’t substitute for hydration or full movement.
Cross-Session Persistence
Vibe Check maintains state across multiple Claude Code sessions using a shared JSON file at~/.claude/vibe-check-state.json.
State File Contents
Session Continuity
When you start a new Claude Code session:- Recent activity check — If
last_activeis within the last 60 minutes (configurable viaVIBE_CHECK_STALE_THRESHOLD), timers continue from where they left off - Stale session reset — If more than 60 minutes have passed, all timers reset (assumes you took a long break)
Multi-Window Support
Multiple Claude Code windows share the same state file:- File locking — The plugin uses lock files to prevent race conditions
- Deduplication — A 30-second dedup window prevents the same reminder firing in multiple windows
- Consistent tracking — Your break compliance is tracked regardless of which window you’re using
If you have two Claude Code windows open and a reminder fires in one, the other window won’t repeat it within 30 seconds.
Configuration
All tracking thresholds are configurable:Debugging Your Compliance
You can inspect your current state by reading the state file:last_micro/last_full/last_hydration— Unix timestamps of last resetspending_break— Current pending reminder (null if none)reminder_count— Total reminders fired this sessionlast_response_end— When Claude last finished responding (used for gap measurement)
Next Steps
- Learn about Micro-Breaks and what triggers them
- Explore Full Breaks and their timer reset behavior
- Understand Hydration Reminders and their priority
- Review Configuration to customize tracking thresholds