|
| 1 | +# `kind: annotation` signal + topic system — design synthesis |
| 2 | + |
| 3 | +## The gap |
| 4 | + |
| 5 | +The existing 6 signal kinds (gap, fact, question, insight, done, actor) represent things noticed about the world or the project. None represents a structural annotation about the graph itself — grouping entries into topics, assigning labels, recording cross-cutting relationships. |
| 6 | + |
| 7 | +Using `kind: insight` for topic clustering was considered but rejected: insights appear in the catch-up narrative as actionable items. Structural annotations should be invisible to the catch-up — present only for querying and rendering. |
| 8 | + |
| 9 | +## Proposed: `kind: annotation` |
| 10 | + |
| 11 | +A 7th signal kind — purely mechanical, excluded from catch-up narrative items. Never appears as a numbered item in the catch-up. Queryable for clustering, ranking, and rendering. |
| 12 | + |
| 13 | +### Frontmatter: typed edge bundles |
| 14 | + |
| 15 | +Each annotation carries a bundle of typed edges. Each edge has its own type and payload; multiple edge types can coexist in one bundle: |
| 16 | + |
| 17 | +```yaml |
| 18 | +edges: |
| 19 | + - type: topic |
| 20 | + label: "catch-up/performance" |
| 21 | + members: [20260504-100323-s-cpt-8tu, 20260505-153647-d-tac-kv5, 20260505-153654-d-tac-qom] |
| 22 | + - type: topic |
| 23 | + label: "CLI/UX" |
| 24 | + members: [20260428-125737-d-tac-kud, 20260505-163757-d-tac-07q, 20260505-162047-d-tac-y9q] |
| 25 | +``` |
| 26 | +
|
| 27 | +Current known edge type: `topic`. Future types (e.g. `priority`, `external-reference`) can be added without schema changes. The body carries narrative: why this grouping was made, what the topic means, what session produced it. |
| 28 | + |
| 29 | +## Two-level topic assignment |
| 30 | + |
| 31 | +**Primary path (capture time):** Entries carry an inline `topics:` field in frontmatter, assigned at creation. The agent suggests matching labels from existing annotations in the graph. No extra entry needed — zero ceremony for the common case. |
| 32 | + |
| 33 | +```yaml |
| 34 | +topics: ["catch-up/performance", "CLI/UX"] |
| 35 | +``` |
| 36 | + |
| 37 | +**Secondary path (post-capture):** Annotation signals handle entries that predate the topic system, bulk reorganizations, and corrections. One annotation signal can assign topics across many entries at once. |
| 38 | + |
| 39 | +The in-memory model builds the topic index as a union of both sources. |
| 40 | + |
| 41 | +## Hierarchical topics via path labels |
| 42 | + |
| 43 | +Labels follow a path convention: `"UX/CLI"` implies membership in `"UX"` by prefix. The renderer does a prefix match — no extra entries needed for parent topics. Inspired by s-cpt-s43's Zettelkasten hierarchical tags proposal. |
| 44 | + |
| 45 | +## Label stability |
| 46 | + |
| 47 | +Topic labels are stable identifiers, not display names — same principle as canonical participant names. Once used, a label is permanent. To restructure: add new annotation signals with correct labels, supersede old ones. Active cluster membership migrates forward; historical entries retain old labels. This avoids the "rename all backlinks" mess of tools like Logseq. |
| 48 | + |
| 49 | +## Edge mutation: additive union model |
| 50 | + |
| 51 | +- **Adding members**: new annotation signal with same label — no supersession needed |
| 52 | +- **Removing members**: supersede the specific annotation signal that added them |
| 53 | + |
| 54 | +Topic membership = union of all non-superseded annotation signals sharing that label + inline `topics:` fields on entries. No negative edges needed; no ordering dependencies. |
| 55 | + |
| 56 | +## Connection to lightweight catch-up |
| 57 | + |
| 58 | +With annotation signals providing pre-computed topic clusters and in-degree + heat-decay providing ranking (s-cpt-rwd), the lightweight catch-up can select and present top-N entries under topic headers using verbatim summaries — no synthesis required. |
| 59 | + |
| 60 | +## Type system impact |
| 61 | + |
| 62 | +Extends signal kinds from 6 to 7, touching the type system contract (d-cpt-ygn). Requires a conceptual decision before implementation. Companion to the `kind: focus` decision proposal (s-cpt-ke6). |
0 commit comments