| name | gtd-prioritization |
| description | This skill should be used when prioritizing tasks, building a daily plan, building a weekend plan, or ranking work across the task domains using the fixed priority ladder. |
GTD Prioritization Skill
Inputs
- Source files: glob
tasks/*.md relative to plugin root.
- Excluded file:
tasks/inbox.md โ excluded by basename match. Never read during planning.
- Domains: determined by filename stem. The authoritative domain list is in
tasks/domains.md (read it). Default domains: fulltime, parttime, side-projects, open-source, knowledge.
Task Line Grammar and Parsing
Only incomplete tasks are considered for planning.
Regex for incomplete tasks (applied per line):
^- \[ \] (.+)$
Lines matching - [x] (completed) and all comment lines or non-task lines are ignored.
Title extraction: the task title is the text BEFORE the first key:value tag.
Tag extraction: apply global regex (\w+):(\S+) to the full task line. All key:value pairs after the title are tags.
Recognized tag keys: prio, project, effort, impact, due, context, recurs, last, order
Normalization rules:
- effort โ minutes:
30m โ 30
2h โ 120
1.5h โ 90
- Integer with no unit โ treat as minutes
- Unparseable or missing โ
unknown (treated as large for filtering, sorts last in effort tiebreak)
- due โ ISO date (
YYYY-MM-DD):
- Valid ISO date โ kept as-is
- Unparseable or missing โ
no-due (sorted after tasks with due dates)
- Malformed due โ
no-due + warning added to output
- context โ comma-separated list, each element normalized to lowercase with leading
@ (e.g. @computer, @phone)
- prio: must match controlled vocabulary; unrecognized or missing โ rank 99 + warning
- order โ positive integer: within-rank manual tiebreak written by the dashboard drag-to-reorder. Unparseable or missing โ none (sorts after ordered tasks within the same prio rank, treated as Infinity in comparator).
- recurs โ interval in days (marks a standing/recurring task):
Nd โ N days (e.g. 3d โ 3)
Nw โ Nร7 days (e.g. 1w โ 7, 2w โ 14)
- keywords:
daily โ 1, weekly โ 7, biweekly โ 14, monthly โ 30
- Unparseable โ ignore
recurs (treat as a normal one-shot task) + warning
- last โ ISO date (
YYYY-MM-DD): the date the task was most recently completed. Only meaningful alongside recurs. Unparseable or missing โ treated as never done.
Recurring Tasks
A task carrying a recurs: tag is a standing review, not a one-shot next-action. It is never "completed" permanently; it comes due again every interval.
- Effective due (used everywhere a normal task's
due would be โ ranking proximity, overdue detection):
recurs + last present โ effective_due = last + interval (in days).
recurs present, last absent (never done) โ effective_due = today (surfaces immediately).
- A plain
due: tag is ignored when recurs: is present; if both appear, emit a warning and use the recurrence-derived effective due.
- Eligibility (planning filter): a recurring task is eligible only when
effective_due <= today. If effective_due > today it is dropped from the plan with reason recurs-not-due and listed under Deferred / filtered out (it is simply not due yet). Eligible recurring tasks still pass through the effort/context/energy filters normally.
- Ranking: an eligible recurring task ranks exactly like any other task, using its
effective_due for the due-proximity tiebreak (so an overdue standing review sorts early).
- Completion semantics (see
/clear-tasks): marking a recurring task DONE does not flip it to - [x]. It stays - [ ] and its last: is set/updated to the completion date โ which rolls the next effective_due forward by one interval. Only WON'T FIX retires a recurring task (flips to - [-], stopping the recurrence).
- Weekly Review sweep: recurring tasks are flagged
[OVERDUE] by effective_due < today. They are NEVER counted as "stale" (a cadence is an update signal) and are NOT flagged for a missing due (their due is derived from recurs/last).
Priority Rank Map
| prio value | rank |
|---|
| fulltime | 1 |
| parttime | 2 |
| trust | 3 |
| side | 4 |
| long | 5 |
| short | 6 |
| tedious | 7 |
| missing or invalid | 99 (sorts last; emits warning) |
The rank is NEVER overridden by any other field. This ladder is strict.
Ranking Algorithm (strict tiebreak order)
Apply these criteria in order until a winner is determined:
- prio rank ascending โ rank 1 before rank 7; rank 99 always last. NEVER overridden.
- manual order ascending โ tasks with
order:N sort before tasks without an order tag within the same prio rank. Tasks without order: are treated as Infinity (sort last within the rank). The order: value NEVER crosses prio-rank boundaries; rank is never overridden.
- due-date proximity โ earlier due date first;
no-due tasks sort after all dated tasks. For recurring tasks (recurs: present), use the effective due (last + interval) here.
- effort ascending โ smaller effort first;
unknown effort sorts last.
- domain order (tiebreak): read
tasks/domains.md and sort domains by their daily_order column (ascending) for daily mode, or weekend_order column for weekend mode. Default daily order: fulltime(1) < parttime(2) < side-projects(3) < open-source(4) < knowledge(5). Default weekend order: side-projects(1) < open-source(2) < knowledge(3) < parttime(4) < fulltime(5). In weekend mode, step 5 is REPLACED by the weekend_order column values. Steps 1โ4 and 6 are identical in both modes.
- alphabetical by title โ ensures total order (case-insensitive, ascending).
Daily Mode (GTD Engage โ filter THEN rank)
Arguments: hours (default: 8), energy (default: med), context (default: any)
Filter steps (applied before ranking):
0. Recurrence filter: for any task with a recurs: tag, compute its effective due (last + interval, or today if never done). Drop it when effective_due > today (reason: recurs-not-due); keep it when effective_due <= today. Non-recurring tasks skip this step.
- Effort filter: drop any task whose effort in minutes > remaining hours converted to minutes. If effort is
unknown, treat as large (assume 240m for filtering unless hours param makes it obviously too large).
- Context filter: if a context argument is given, drop tasks whose
context tag does not intersect the requested context list. Tasks with no context tag pass through when no context filter is active.
- Energy filter:
energy:low โ drop tasks with prio:fulltime or prio:parttime AND drop tasks with large effort (โฅ120m or unknown). Prefer prio:tedious and small effort tasks (โค30m).
energy:med โ no additional drops.
energy:high โ no drops (all tasks eligible).
After filtering, rank survivors using the algorithm above.
Greedy fill: iterate ranked list, accumulate effort minutes. Include tasks that fit within hours * 60 total minutes. Tasks that exceed remaining time go to "Deferred / filtered out" section.
Tasks filtered out (by context/energy/effort) AND tasks that didn't fit in hours both appear in ## Deferred / filtered out.
Weekend Mode (GTD Reflect + weighting)
Arguments: hours (default: 12)
Step (a) โ Weekly Review sweep FIRST:
Before building the plan, emit ## Weekly Review sweep listing:
- Overdue tasks: tasks with
due < today (ISO comparison). Flag with [OVERDUE]. For recurring tasks, compare effective_due < today.
- Stale tasks: tasks with no updates detected (heuristic: no due date and no project tag โ flag as potentially stale). Recurring tasks (
recurs: present) are NEVER stale โ exclude them.
- Missing/invalid-metadata tasks: tasks lacking
prio, effort, or due. List each with the specific missing fields. Do NOT flag a recurring task for a missing due (its due is derived from recurs/last); a recurring task missing recurs parse or last may be noted instead.
The recurrence eligibility filter (effective_due โค today) also applies to the weekend ranked plan, identically to daily mode Step 0.
Step (b) โ Weekend domain tie-break (reverses daily order):
Domain priority for weekend is determined by the weekend_order column in tasks/domains.md. Default order: side-projects(1) < open-source(2) < knowledge(3) < parttime(4) < fulltime(5)
(i.e., fulltime sorts last in domain tiebreak; side-projects most favored for weekend)
Step (c) โ Fulltime sectioning:
- Non-overdue
prio:fulltime tasks โ placed in a separate ## Full-time (optional this weekend) section.
- Overdue
prio:fulltime tasks โ remain in the main ranked list, flagged [OVERDUE].
Primary prio ordering is identical to daily (rank 1โ7, 99 last).
Output Formats
Daily Plan
# Daily Plan โ YYYY-MM-DD
1. [rank] Title โ domain ยท effort ยท due ยท context
2. [rank] Title โ domain ยท effort ยท due ยท context
...
## Deferred / filtered out
- Title โ domain (reason: over-time | low-energy | context-mismatch | recurs-not-due)
...
## Warnings
- [file:task] Missing prio โ assigned rank 99
- [file:task] Malformed due date: "<value>"
...
Weekend Plan
# Weekend Plan โ YYYY-MM-DD
## Weekly Review sweep
### Overdue
- [OVERDUE] Title โ domain ยท due:<date>
### Stale (no due + no project)
- Title โ domain
### Missing or invalid metadata
- Title โ domain ยท missing: prio, effort
...
## Weekend Plan (ranked)
1. [rank] Title โ domain ยท effort ยท due ยท context
2. [rank] Title โ domain ยท effort ยท due ยท context
...
## Full-time (optional this weekend)
- Title โ fulltime ยท effort ยท due ยท context
...
## Warnings
- [file:task] Missing prio โ assigned rank 99
- [file:task] Malformed due date: "<value>"
...
Week Mode (day-bucketed planning)
Used by /plan-week. Builds a 7-day plan (today through today+6) using the same ranking logic as Daily mode, applied per day.
Day bucketing rules (applied before per-day ranking):
- Recurring tasks: effective due must fall โค today+6 to be included; tasks with effective due > today+6 are Deferred (
recurs-not-due).
- Overdue tasks (effective due < today): bucket โ Today.
- Due within window (today โค effective due โค today+6): bucket โ the exact matching day.
- Due after window end: excluded, Deferred (
out-of-window).
- No due date, non-recurring: bucket โ Today (user-confirmed default).
Per-day fill: apply the six-level tiebreak ranking within each day's bucket; greedily fill up to hours-per-day * 60 minutes. Overflow โ Deferred with reason over-time <date>. Tasks are NEVER auto-pushed to the next day.
Ranking algorithm: identical to Daily mode (prio rank โ manual order ascending โ due proximity โ effort โ domain order โ alphabetical). No special day-level weighting.
GTD Pillar Mapping
- Capture: raw items go to
tasks/inbox.md; domain files hold clarified tasks.
- Clarify: Triage agent converts inbox items to concrete next-action lines with proper tags.
- Organize: tasks are filed in domain files with full metadata; priority ladder provides the organizational backbone.
- Reflect: Weekend mode's Weekly Review sweep surfaces overdue, stale, and under-specified tasks.
- Engage: Daily mode filters by hours/energy/context and produces a greedy-filled ranked action list.
Missing-Prio Degradation
Any task missing a prio: tag, or with an unrecognized prio value, is assigned rank 99. It sorts after all valid-prio tasks. A warning is emitted in ## Warnings naming the source file and task title:
## Warnings
- [tasks/knowledge.md: "Read chapter 4"] Missing prio โ assigned rank 99
- [tasks/fulltime.md: "Fix thing"] Malformed due date: "next-friday"
Same rule applies to malformed due values: normalize to no-due and emit a warning.