Skip to main content

How ARIA decides today's task

Every time you open ClaudeLab, I run one function and produce one task. That function, get_today_task(), walks a fixed priority list against your data: failed milestone, carry-over, spaced-repetition due, current milestone, daily dose. First match wins. You see one card, not a menu. The choice is mine. This is the engine of the whole product. Try it at claudelab.me.

TL;DR

  • I pick today's task by walking a 14-level priority list. Higher priority always wins.
  • The list checks recovery first, then carry-over, then spaced repetition, then your current milestone.
  • The task regenerates on every foreground event, so opening the app twice in a day can give you a different verdict.
  • One task, not a list, because choosing what to study is harder than studying.
  • Skipping does not break the roadmap. The schedule shifts and readiness drops on a curve.

Why this is the most-called function in the app

get_today_task() runs on every AppState 'active' event. Foreground the app, switch back from another tab, unlock your phone with ClaudeLab open, and I run it again. The output is the Today's Task card. The card is always the freshest answer my data can give.

Inputs change constantly. You finish a session at lunch, your error backlog shifts. A spaced-repetition item crosses 3 days overdue, the engine flips. A milestone enters validation_ready, the card switches to milestone_test.

The function reads your roadmap status, active milestone, error backlog, spaced-repetition queue, schedule status, and readiness floor. It walks the priority list and returns one row. No fallback, no "would you like to choose." If nothing higher matches, you get a focus_session on the active milestone. "I have nothing to study today" is structurally impossible while a roadmap is active.

Recovery first: missed yesterday or failed a milestone

The first thing I check is whether you need a recovery beat instead of a normal session.

If your active milestone is in failed status, the engine returns retry_prep before any other check: 35 minutes on the gaps from your last failed validation, reading my restructure notes from when I rewrote the approach. The system refuses to let you walk back into a failed validation with the prep that did not work.

If behind_schedule_days >= 3, the engine returns recovery_session: 40 minutes aimed at closing the gap, weighted toward your weakest open errors. See Carry-over and recovery for what happens when I rewrite the roadmap entirely.

Recovery comes first because the cost of getting it wrong is the largest. A recovery user pushed into a generic focus session compounds the drift; a failed-milestone user pushed into the same test guarantees a second failure.

Carry-over: yesterday's task you didn't finish

If your task ended yesterday in pending status, I do not delete it. On the next foreground I stamp yesterday's task carried_over, set today's task to the same one, and show an amber Carried over pill on the card.

Carry-over is structurally a check, not a priority. It is data hygiene: roll over the unfinished task before asking "what should today's task be." If you completed yesterday's task, this step is a no-op.

The schedule clock keeps ticking. Your behind_schedule_days counter is expected_tasks - completed_roadmap_tasks. A carried-over task does not move either side. Two consecutive carry-overs and you are at slightly_behind. Five and you are at at_risk. Seven and recovery becomes the priority signal on its own.

Spaced repetition: error backlog due today

After recovery and carry-over, I check the spaced-repetition queue.

Every wrong answer is classified as misconception, confusion, attention, or knowledge_gap, with topic and domain written alongside. The SM-2 algorithm schedules each error for review at an interval that grows every time you re-answer correctly.

If a topic is overdue by 3+ days, the engine returns memory_lock. If a single topic has been wrong 3+ times, it returns topic_rescue. If unresolved errors exceed 5, it returns error_backlog. Full priority order on the task types page.

Spaced repetition is the trait that separates a tutor from a question generator. A generator hands you items on demand. I hand you the items you got wrong on Tuesday, on the day my model says you are about to forget them. You never manage a deck. The error dashboard shows the queue if you want to look behind the curtain.

Current milestone: the next ordered task

If nothing higher fired, I look at your active milestone. The default is a focus_session: about 30 minutes of Socratic practice on the milestone's topics, sequenced by where you have made the least progress. This is what most days look like for most users.

Two overrides sit above the default but below recovery. If your milestone status is validation_ready, the engine returns milestone_test: strict pass-or-fail, no hints, no second chances. If every milestone in the current phase is completed and the phase is still active, it returns phase_exam: the 45-minute final for the phase before the next one unlocks.

The variety rule is the only place a default task gets overridden by a non-priority signal. Three focus_session days in a row, day four becomes deep_dive: same milestone, single concept area in depth. Everywhere else, highest priority wins regardless of what you did yesterday.

Daily dose: how long today's task takes

The estimated-time pill is my honest estimate. The number depends on the type, not on you. A focus_session is about 30 minutes; weekly_pulse is 15; recovery_session is 40; phase_exam is 45.

The dose is calibrated against three signals: your exam window, your recent activity (sessions in the last 14 days), and current readiness. Exam 14 days out and 62% readiness, the engine biases toward recovery types. Exam 90 days out and 78% with steady activity, it sits on focus sessions and respects the variety rule.

I do not extend tasks beyond the listed ranges. Cert prep fails on consistency, not volume. A 30-minute session you actually finish beats a 90-minute one you bail on at minute 45.

Readiness floor: what the task can and can't be

Two task types are gated by a readiness floor. The Demo Test unlocks at 60%, the Gauntlet at 80%. The engine does not assign these; you launch them from the Study tab once unlocked. They shape what is possible as a daily task.

The floor exists because both modes are honest signals. Sitting the Demo Test at 35% gives a noisy result that tells you nothing new. Sitting the Gauntlet at 60% turns a high-cost session into morale damage without diagnostic value. ARIA refuses to assign work whose primary effect is to discourage you. The readiness and decay page covers how the score moves.

Why one task instead of a list

Choosing what to study is the hardest cognitive step before studying. Most prep apps hand you a content menu and call it self-direction.

A menu invites you to pick the comfortable thing: the domain you already half-know, the topic that feels productive but is the wrong frontier for your weakest area. Decision fatigue eats the energy you would have spent on the session, and the bias toward easy quietly accumulates. A week of self-directed study is often a week of patching strong domains while the weak ones rot.

One task removes the decision and replaces it with a verdict. The cost of resuming after a break is one tap; the cost of choosing is zero. This is why the two-lane roadmap exists: roadmap tasks advance milestones, free play does not. Free play is fine for a Saturday extra hour, but cannot substitute for the assigned beat, because the assigned beat is the one informed by your full data.

What happens when you skip

Nothing breaks. The schedule shifts.

Your task carries over. Your readiness retention factor drops by 3 points per day since your last completed session, floored at zero on day 34. Your behind_schedule_days counter advances. Once you cross seven days behind, I recalculate the roadmap against your real velocity, set recalculation_reason to behind_schedule_auto, and recompute the estimated completion date. Completed milestones are preserved.

When you come back, the engine returns recovery_session first, then biased focus sessions on the widest gaps. The recovery message I generate is honest about where you are, what changed, and whether the pass guarantee is still achievable. The number on your dashboard is not punishment; it is the retention curve your future test self is running on, shown while you can still respond to it.

Common questions

Why only one task instead of a list?

Choosing what to study is the hardest step before studying, and you are not equipped to do it well. A list invites you to pick the easy thing. One task removes the choice and replaces it with a verdict.

What if I want to study something else today?

You can. Free play is always available from the Study tab. The catch is that free play does not advance milestones and does not count toward your streak. Your assigned task waits as a carry-over.

How often is today's task regenerated?

On every AppState 'active' event. Every foreground runs the engine against fresh data, and you see any change immediately.

Can the task switch types mid-day?

Yes, if a higher-priority signal fires while you are away. If a validation finished as failed on another device or a spaced-repetition item crossed the 3-day overdue line, the next foreground swaps your card.

What happens if I keep skipping?

Tasks accumulate as carry-overs and your schedule status drifts from on_track to slightly_behind to at_risk to off_track. Cross seven days behind and the roadmap recalculates against your real velocity instead of the optimistic plan from day one.

Try the engine yourself

The whole system runs on one principle: measurement first, plan second, daily verdict third. The diagnostic measures where you are; the roadmap sequences the work; the Today's Task card is the output. Open the app and follow the verdict.

Start a free evaluation at claudelab.me. The companion piece on the wider tutoring layer is AI tutor for certifications. One task per day. The right one. That is the contract.