Temporal task types
Deadline task Flexible completion by a due date/time. Mana is spent on the day it is completed.
Scheduled task Fixed event on a specific date/time. Mana is effectively committed to that day.
Horizon window
The horizon window determines how early a temporal task starts surfacing.
baseCost = relativeCost x durationMinutes x personalCoefficient x 0.5
typicalPool = 30-day median of poolEwma
horizonDays = clamp(ceil(baseCost / (typicalPool x 0.30)), 2, 7)
Task cost as % of typical pool Horizon window < 30% 2 days 30-60% 2-3 days 60-90% 3 days 90-120% 4 days 120-180% 4-5 days 180%+ 6-7 days
When inside horizon window:
Task becomes visible regardless of remaining pool
Card uses horizon framing copy
Scheduled tasks contribute to pre-warning logic
Cost preview framing
Future-day previews always use axis factor = 1.0:
“On a typical day this costs about [X] mana.”
This prevents false precision for unknown future states.
Deadline copy in horizon window
Days remaining Copy 3+ days ”This needs to happen by [Day] - on a typical day it costs about [X] mana.” 2 days ”This needs to happen by [Day] - on a typical day it costs about [X] mana.” 1 day ”This needs to happen by tomorrow - on a typical day it costs about [X] mana.” 0 days, in pool ”This is due today - on a typical day it costs about [X] mana.” 0 days, over pool ”This is due today and costs more than today’s mana. It may need to be your priority.”
“DUE” is not used as all-caps urgency language in user copy. Preferred phrasing is “needs to happen by” and “due today”.
Surfacing logic
Deadline tasks
if timingType == 'deadline':
if today >= dueDatetime - horizonDays:
always surface (pool exemption)
else:
standard surfacing (cost <= remainingPool)
Scheduled tasks
if timingType == 'scheduled':
if today == dueDatetime:
surface as active/completable
elif today >= dueDatetime - horizonDays:
surface with horizon framing, not completable
else:
hidden
Scheduled copy in horizon window
Days remaining Copy 2+ days ”You have [Task Name] on [Day] - on a typical day it’ll use about [X] mana.” 1 day ”You have [Task Name] tomorrow - on a typical day it’ll use about [X] mana.” 0 days Standard task card; horizon copy removed
Day-before pre-warning
For scheduled tasks, show a quiet contextual note if significant load is coming.
Single-task trigger:
baseCost > typicalPool x 0.20
Multi-task conflict escalation:
sum(baseCost on dueDatetime) > typicalPool x 0.85
Lookahead runs across 7 days so warnings can appear early enough for planning.
UI differentiation
Type Icon Date label Deadline outline diamond by Thursday Scheduled solid calendar dot Thursday Scheduled with time solid calendar dot Thursday, 2:00pm
Deadline iconography should feel softer/flexible; scheduled should feel fixed.
Recurring tasks
Storage model
Root Task stores recurrence rule (RRule) and timing type
TaskOccurrences stores canonical per-instance due/state rows
Future recurring due slots are generated at query time, then matched against persisted rows
Runtime query shape:
dueSlots = generateFromRRule(rule, queryStart, queryEnd)
occurrences = merge(dueSlots, persistedRows)
activeOccurrence = nearest unresolved future dueDatetime
Only nearest unresolved future occurrence is surfaced. Missed recurring cycles are skipped automatically.
Recurrence setup UI
Two-step interaction:
Frequency type: every few days, weekly, every few weeks, monthly
Refinement: interval/day toggles depending on choice
Complex edge patterns are intentionally excluded to reduce cognitive burden.
Recurrence setup nudge
If baseCost > typicalPool x 0.25, show once during recurrence setup:
“This task costs about [X] mana on a typical day - on recurrence days, it’ll take a meaningful part of your budget.”
Informational only; never blocks setup.
Post-deadline state
State Meaning Source completeddone user action misseddue date/time passed without completion automatic cancelledwill not happen / called off user action
cancelled is available for all task types.
Read next