docs(spec): add sidequest kind + 5-level priority scale

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) <noreply@anthropic.com>
This commit is contained in:
Padreug 2026-05-24 15:41:51 +02:00
commit 774cb44a4a

View file

@ -136,12 +136,21 @@ configured shortcut) or `!add we need milk` (LLM-classified into
|---|---|---|
| `!add <text>` | Frictionless inbox capture; classifier sorts later | 31922 with `["t", "unclassified"]` initially; tag mutated on classification |
| `!task <text> [#tag…]` | Record an actionable task | 31922 (date-based) or 31923 (timed) with `["t", "task"]` + user tags |
| `!sidequest <text> [#tag…]` | Record an optional / passion-project item, distinct from the community's core tasks | 31922 with `["t", "sidequest"]` + user tags |
| `!journal <text>` | Past-tense log entry; append-only; never "done" | 31922 with `["t", "journal"]` |
| `!remind <when> <text>` | Time-bound prompt that fires a chat ping at `due_at` | 31923 with `["t", "remind"]` + `start` tag |
| `!done <id-or-recent>` | Close a task | 31925 status event with `accepted` / equivalent |
| `!done <id-or-recent>` | 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", "<tag>"]` 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:<owner-pk>: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: