Skip to main content

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 poolHorizon 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:
  1. Task becomes visible regardless of remaining pool
  2. Card uses horizon framing copy
  3. 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 remainingCopy
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 remainingCopy
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 daysStandard 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

TypeIconDate label
Deadlineoutline diamondby Thursday
Scheduledsolid calendar dotThursday
Scheduled with timesolid calendar dotThursday, 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:
  1. Frequency type: every few days, weekly, every few weeks, monthly
  2. 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

StateMeaningSource
completeddoneuser action
misseddue date/time passed without completionautomatic
cancelledwill not happen / called offuser action
cancelled is available for all task types.