Purvakalpa Studio

Docs / Tasker

Planning

The rule planner that always answers, the chain of optional AI providers in front of it, and how a ranked plan becomes a schedule around your calendar.

Tasker plans the day you have, not the list you wish you could finish. Planning is three layers: a deterministic planner that always answers, a router that can ask an AI provider first, and a time blocker that fits the result around your calendar.

What counts as available

Planning only considers tasks you can actually start. availableNow returns open tasks that are not deferred to a later date and not blocked by an unfinished dependency. Filters narrow it further by energy, kind, context or a maximum duration, which is how “I have 20 minutes, what can I do?” works. availableHere adds location: tasks pinned to a place near you.

The rule planner

DayPlanner is pure, deterministic and has no dependencies, so it is the floor everything else falls back to. It sorts the available tasks by:

  1. Overdue first.
  2. Higher priority.
  3. Earlier due date; tasks with no due date go last.
  4. A match with your preferred energy (quick, focused or deep work), if you set one.
  5. Then the order the tasks were created.

It then packs tasks greedily into your time budget using each task’s estimate (30 minutes when a task has none). Anything that does not fit is reported as overflow instead of being silently dropped, so the plan tells you when you are overcommitting.

Every slot carries a one-line reason that mirrors the signal that placed it: “Overdue”, “Critical priority”, “High priority”, “Due today”, “Due soon”, “Matches your focused energy” or “Fits your day”.

let plan = try await store.planDay(budgetMinutes: 180, preferredEnergy: .focused)
plan.scheduled          // ordered slots with minutes and a reason
plan.overflowIDs        // what didn't fit
plan.remainingMinutes   // budget left over

When no budget is given, the planner uses the free minutes in a calendar interval if one is supplied, otherwise a default eight-hour day.

The provider chain

An AI model can rank tasks with more nuance than fixed rules, but it can also be missing, offline or wrong. PlanRouter handles that:

  • It tries each DayPlanProvider in order. The first one that returns a usable ranking wins.
  • If every provider is unavailable or fails, the rule planner answers. A plan is always produced.
  • The router enforces the budget itself. Even if a model picks too much, the router packs the model’s order until the time runs out and overflows the rest, so a model cannot blow your day.
  • Any available task the model did not mention lands in overflow, never in a black hole.

In the app, the chain is built from your Intelligence settings, in this order:

OrderProviderWhere it runs
1A paired deviceAnother of your devices on the same Wi-Fi, such as a Mac with Apple Intelligence
2Apple IntelligenceOn this device, through the Foundation Models framework
3A local AI serverOllama, LM Studio or llama.cpp on your network; no key
4A cloud model with your keyOpenAI, OpenRouter, Groq, Together AI, Mistral, DeepSeek or any OpenAI-compatible endpoint
FloorThe built-in plannerAlways available, fully offline

A provider that cannot serve a request (no Apple Intelligence on this device, no paired device online, no key) steps aside, and the next one is asked.

What a provider sees

Providers never receive your tasks. They receive a PlanContext, a projection of each candidate down to what ranking needs:

{
  "budgetMinutes": 180,
  "preferredEnergy": "focused",
  "candidates": [
    { "id": "…", "title": "Draft Q3 report", "estimateMinutes": 90,
      "energy": "deep", "dueAt": "…", "priorityRank": 2, "isOverdue": false }
  ]
}

Notes, contexts, attachments and other free text are not part of the type, so they cannot leave the device even if a cloud provider is switched on. A paired device gets the same projection: a few kilobytes out, an ordering back.

Time blocking around your calendar

A ranked list is a shortlist. With calendar access, Tasker can turn it into a schedule:

  1. Read the busy events in the interval you want to plan, such as the rest of today.
  2. Compute the free windows between them, and use the total free minutes as the budget.
  3. Rank the available tasks with the planner.
  4. TimeBlocker walks the ranked slots in order and gives each one a start time in the first free window it fits.

A task that does not fit any remaining window keeps its place in the plan but gets no start time, so nothing disappears. PlanStyle.auto picks a schedule when calendar access is available and a shortlist when it is not.

Calendar sync is two-way. Dated tasks appear on your calendar, and moving an event moves the task.

Reviews and replanning

  • Daily review: overdue tasks, what is due today, tasks whose defer date has just passed, and what is available now.
  • Weekly review: stale tasks, projects with no next action, things you are waiting on, and projects that are behind.
  • Bulk replanning: reschedule or defer a batch at once, or move everything overdue to today.