From 774cb44a4afde26f877a2d5f9f68aeb4e86413ee Mon Sep 17 00:00:00 2001 From: Padreug Date: Sun, 24 May 2026 15:41:51 +0200 Subject: [PATCH] docs(spec): add sidequest kind + 5-level priority scale MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two vocabulary additions from real Ariège use: - !sidequest as a distinct kind alongside task/journal/remind. Same lifecycle as tasks but renderers surface separately so the "wouldn't it be cool to…" backlog doesn't clutter day-to-day operations. - 5-level priority scale (urgent/crucial/important/future/ frequent-ongoing) mapping to RFC 5545 VTODO PRIORITY 1/3/5/7/9. Level 5 is a v1 shorthand for recurring obligations until a proper RRULE-equivalent lands; flagged in §11 open questions. Per-community priority shortcuts (!urgent, !chores) reuse the existing per-community shortcut mechanism — no special-casing. Adds worked examples §8.2a (sidequest+priority) and §8.2b (priority shortcuts + frequent/ongoing semantics). Co-Authored-By: Claude Opus 4.7 (1M context) --- docs/community-organizer-spec.md | 94 ++++++++++++++++++++++++++++++-- 1 file changed, 89 insertions(+), 5 deletions(-) diff --git a/docs/community-organizer-spec.md b/docs/community-organizer-spec.md index 68f6d74..4cb14ad 100644 --- a/docs/community-organizer-spec.md +++ b/docs/community-organizer-spec.md @@ -136,12 +136,21 @@ configured shortcut) or `!add we need milk` (LLM-classified into |---|---|---| | `!add ` | Frictionless inbox capture; classifier sorts later | 31922 with `["t", "unclassified"]` initially; tag mutated on classification | | `!task [#tag…]` | Record an actionable task | 31922 (date-based) or 31923 (timed) with `["t", "task"]` + user tags | +| `!sidequest [#tag…]` | Record an optional / passion-project item, distinct from the community's core tasks | 31922 with `["t", "sidequest"]` + user tags | | `!journal ` | Past-tense log entry; append-only; never "done" | 31922 with `["t", "journal"]` | | `!remind ` | Time-bound prompt that fires a chat ping at `due_at` | 31923 with `["t", "remind"]` + `start` tag | -| `!done ` | Close a task | 31925 status event with `accepted` / equivalent | +| `!done ` | Close a task or sidequest | 31925 status event with `accepted` / equivalent | | `!list [type] [#tag…]` | Query recent items in current community | read-only | | `!setup` | Per-community configuration (verb shortcuts, publish posture, etc.) | writes to community config (see §6) | +**Note on `!sidequest`:** Sidequests are intentionally separate from +tasks — they're the passion-project / experimental / "if-you-have-time" +items a community wants to track without cluttering the core task list. +Same lifecycle as tasks (open → done) but renderers SHOULD surface them +in a distinct view and exclude them from default `!list task` results. +Lets communities keep day-to-day operations clean while still capturing +the "wouldn't it be cool to…" backlog. + ### 3.2 Lifecycle states Aligned with RFC 5545 VTODO `STATUS` values: @@ -158,21 +167,49 @@ Journal entries do NOT participate in this lifecycle — they're append-only. `!done` on a journal entry is undefined behavior; implementations SHOULD reject it. +Sidequests use the same lifecycle as tasks. + ### 3.3 Tag conventions NIP-52 events use `["t", ""]` tags for free-form categorization. This spec uses: -- A **kind tag** (exactly one): `task`, `journal`, `remind`, - `unclassified` — identifies the entry's role in the lifecycle. +- A **kind tag** (exactly one): `task`, `sidequest`, `journal`, + `remind`, `unclassified` — identifies the entry's role in the + lifecycle. - **Domain tags** (zero or more): `buy`, `steward`, `kitchen`, `animals`, `harvest`, etc. — community-specific categories. -- A **priority tag** (zero or one): `priority:low`, `priority:high`. +- A **priority tag** (zero or one): see §3.3.1. - A **classification-source tag** (exactly one): `src:explicit`, `src:shortcut`, `src:rules`, `src:llm`, `src:manual`. Records how the entry was bucketed; useful for audit and for tuning the classifier. +#### 3.3.1 Priority scale + +Five colloquial levels for everyday capture, RFC 5545 VTODO +`PRIORITY` compatible (VTODO is `1..9` with `1` highest): + +| Tag | Label | Meaning | VTODO PRIORITY | +|---|---|---|---| +| `priority:1` | **urgent** | Drop everything; time-critical | 1 | +| `priority:2` | **crucial** | Critical importance; do this week | 3 | +| `priority:3` | **important** | Matters; do when possible | 5 | +| `priority:4` | **future** | Backlog; someday/maybe | 7 | +| `priority:5` | **frequent/ongoing** | Recurring obligation that's never permanently "done" | 9 | + +Renderers MAY surface labels instead of numbers; the on-the-wire tag +is `priority:N` for sort stability. + +**Note on `priority:5` (frequent/ongoing):** This level is a v1 +shorthand for items that recur on a cadence (daily chicken feeding, +weekly market run, monthly equipment check). A proper recurrence +model (RFC 5545 `RRULE` equivalent) is in §11 open questions. +Until then, `!done` on a `priority:5` item is permitted but treated +as "done for this cycle" — the user re-captures next time. Renderers +SHOULD surface these in a distinct "recurring" view so they don't +mask urgent work. + Example complete tag set for a `!buy door handles` typed via the `buy` shortcut configured for the room: @@ -190,10 +227,16 @@ universal verb + tags. Example (Ariège): ```yaml verbs: buy: { kind: task, tags: [buy] } - steward: { kind: task, tags: [steward, priority:low] } + steward: { kind: task, tags: [steward, priority:4] } kitchen: { kind: task, tags: [kitchen] } + urgent: { kind: task, tags: [priority:1] } # shortcut for a priority level + chores: { kind: task, tags: [priority:5] } # recurring/ongoing items ``` +Priority shortcuts (`!urgent fix the leak`) expand to +`!task #priority:1 fix the leak`. Same per-community config +mechanism — no special-casing of priority verbs. + A bakery co-op's config might declare `harvest`, `market`, `brewery` instead. **The spec mandates the universal verbs; per-community shortcuts are configuration, not protocol.** This means a renderer @@ -456,6 +499,47 @@ Same room has `!buy` configured as a shortcut. User types: Bot expands to `!task #buy door handles from Laura` and publishes the same shape as §8.1 but with `["t", "src:shortcut"]`. +### 8.2a Capture: priority + sidequest + +``` +!sidequest #priority:3 build a chicken-tractor prototype from the old pallets +``` + +Bot publishes: + +```json +"tags": [ + ["d", "cdf-animals:01HXXJ9PK2Q"], + ["title", "build a chicken-tractor prototype from the old pallets"], + ["t", "sidequest"], + ["t", "priority:3"], + ["t", "src:explicit"], + ["a", "34550::cdf-animals"], + ["author", "@alice:matrix.example"] +] +``` + +Bot replies: `🎯 Sidequest recorded (priority: important). React with +❌ to delete.` + +### 8.2b Capture: priority shortcut + frequent/ongoing + +Room has `urgent` and `chores` configured per §3.4 example. + +``` +!urgent the alpaca fence is down by the south paddock +``` + +Expands to `!task #priority:1 the alpaca fence is down…` — the bot +SHOULD also notify the room (urgency-level escalation hook). + +``` +!chores brush the goats +``` + +Expands to `!task #priority:5 brush the goats`. Renderers surface +this in the "recurring" view, not the urgent-action queue. + ### 8.3 Capture: freeform with rules classification User types: