A Disruption is an entry saying life got in the way, from when to when: a party, a work trip, the flu. The days it touches are on hold. On a day on hold the app stops judging and keeps the data: a streak neither breaks nor grows, an unanswered question is not an issue, an empty day is No Data rather than none, and whatever was logged reads exactly as it was logged, so a 02:00 bedtime after a party is on the chart and in the average. The point is a tracker that holds over the normal disruptions of a life instead of punishing them: a habit is often given up when keeping to it rigidly costs more than living normally does.
Which days are on hold
- A day a Disruption touches, if it covers any part of it: a party from Saturday 20:00 to Sunday 02:00 holds both days. A Disruption with no start holds the day of its end.
- One still running holds every day through today, however long it has been open. An open hold is never dropped quietly; after 30 days open it is also an issue, asking for its end. One planned ahead holds its future days.
- An Untracked day: a day after your first entry and before today on which you logged nothing at all. Entries logged for you (a day’s weather, a schedule’s) do not count as you logging (Logged for You). A day counts by when its entries happened, not when they were written down, so an entry backfilled for a day makes it a logged day.
In packages/core/src/hold.ts, disruptedDays keeps, for each disrupted day, the entries that touch it, so a calendar can say what the day was; untrackedDays finds the Untracked ones; daysOnHold is the union of the two, and the renderer’s useDaysOnHold works out the same union beside each day’s words.
What a day on hold changes
- Streaks and achievements carry a run across it: a day on hold that meets the rule still counts, and one that does not neither breaks the run nor adds to it. Every streak reads through the same runs (
runsEndingandstreaksinpackages/core/src/streak.ts,liveRunandrunningDaysinday-folds.ts), so a card’s flame, a trackable’s streak, a headline’s days and every achievement skip them alike. The streak of Logged anything carries across disrupted days only, since an Untracked day is exactly what it counts against. - Issues: a trackable the Rundown asks raises no Not answered issue on a day on hold (Issues).
- Empty days: a trackable whose empty day means none reads an empty disrupted day as No Data, so an unlogged drink on safari is not a dry day. The derived evaluator and the renderer’s day series (
dailyValues) both read empty days throughanswerableDays: the days something was logged, less those a Disruption touches (Readings). - What was logged is untouched everywhere. A weigh-in on safari is still a weigh-in.
- Analysis keeps days on hold by default and leaves them out of every series when a visualization says so (Days on hold,
skipOnHold, saved with it). - Calendars and timelines mark a disrupted day with what it was: the heatmap, the month grid, the week grid and the Timeline notch it, with “On hold: Party” taken from the Disruption’s own text, else its note, else its trackable’s name.
Any trackable can hold days
Holding is a setting, capture.holds, shown in the trackable form’s Cadence section as “Puts days on hold”. The Disruption module makes one such trackable: Disruption, a record of a Time interval (From and To, dated by its start, an end that can be days later or still to come) and a What text field, asked nowhere in the Rundown, since you log one when it happens. Setup offers the module, and Settings › Modules adds it later. Nothing about the module’s trackable is special: the app knows the setting, not the name.
A Disruption has no switch for whether to keep reading the data (a business trip you log through against a safari you do not): once the judging is held, the only difference left is how an unlogged trackable reads, and No Data is the honest reading on a disrupted day either way.
Code
packages/core/src/hold.ts:holdsDays,disruptedDays,untrackedDays,daysOnHold,answerableDays.packages/core/src/streak.ts,packages/core/src/day-folds.ts: runs carried across held days.packages/core/src/modules.ts:disruptionModule.apps/renderer/src/hooks/useDaysOnHold.ts: the days on hold and each disrupted day’s words, for the renderer.
Related
Achievements · Capture Model · Derived Trackables · Readings · Issues · Glossary