Living Document Notice
Published 2026-09-17. The evolving architecture, revisions, and connected notes for this dispatch live in the Stax Digital Garden.
Recurring Action Rules and Recurrence Expansion
Summary
Generating hundreds of future task files for recurring chores pollutes file systems and breaks search indexes. Trice implements iCalendar RFC 5545 recurrence rules that expand dynamically at runtime while preserving monotonic completion logs.
The Flaw of Pre-Generated Recurring Tasks
Many productivity applications handle repeating tasks (e.g., ‘Weekly Backup Audit’ or ‘Monthly Tax Ledger Reconciliation’) by generating 52 individual markdown files for the coming year. This pattern produces immediate problems:
- Vault search queries are flooded with identical future tasks.
- Modifying a task’s checklist requires batch-updating dozens of future files.
- Skipped intervals leave orphaned, incomplete files scattered across directory trees.
Trice implements a single-file recurrence model governed by RFC 5545 Recurrence Rules (RRULE).
+-------------------------------------------------------------+
| Trice Dynamic Recurrence Cycle |
| |
| +-----------------------------------------------------+ |
| | Base Task: TRC-1007: Monthly Storage Wear Audit | |
| | RRULE:FREQ=MONTHLY;BYMONTHDAY=1;INTERVAL=1 | |
| +-----------------------------------------------------+ |
| │ |
| v |
| [Operator Checks Box: "Mark Completed"] |
| │ |
| v |
| +-----------------------------------------------------+ |
| | 1. Append Completion Timestamp to Completion Log | |
| | 2. Evaluate RRULE -> Next Target Date: 2026-10-01 | |
| | 3. Reset Task State to Pending | |
| | 4. Clear Temporary Action Checkboxes | |
| +-----------------------------------------------------+ |
+-------------------------------------------------------------+
Recurrence Frontmatter Schema
A recurring task defines standard recurrence parameters in its frontmatter:
---
title: "TRC-1007: Monthly Storage Wear Audit"
task_state: "pending"
recurrence_rule: "FREQ=MONTHLY;BYMONTHDAY=1"
last_completed_at: "2026-09-01T10:00:00Z"
next_scheduled_at: "2026-10-01T00:00:00Z"
completion_history:
- "2026-08-01T09:15:00Z"
- "2026-09-01T10:00:00Z"
---Runtime Expansion and State Reset
When the operator completes the task, Trice parses the recurrence_rule using a deterministic parser:
pub fn advance_recurrence(current: &mut TaskMetadata) -> Result<(), String> {
let now = chrono::Utc::now();
current.completion_history.push(now);
current.last_completed_at = Some(now);
// Calculate next occurrence
let rrule = rrule::RRule::new(¤t.recurrence_rule)?;
let next = rrule.after(now).next().ok_or("Recurrence expired")?;
current.next_scheduled_at = Some(next);
current.task_state = TaskState::Pending;
Ok(())
}By retaining a single physical file on disk, Trice preserves the full historical completion record while keeping the vault’s file count lean and clean.
- Directus Target: trice
- Garden Source Reference: MOC - Bosun PKM Tools, MOC - Fleet Operations
- Garden Source Reference: [TRC-1007 - Recurring Action Rules and Recurrence Expansion](TRC-1007 - Recurring Action Rules and Recurrence Expansion)