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:
parent
8e76ef0fa1
commit
774cb44a4a
1 changed files with 89 additions and 5 deletions
|
|
@ -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:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue