diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d3577c2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +# Personal sidenote parking file (see /sidenote) — never committed +.claude/sidenotes.md diff --git a/README.md b/README.md index 9fdfe5b..e2efb45 100644 --- a/README.md +++ b/README.md @@ -198,7 +198,7 @@ Then `/scalable` (tests the current direction) or `/scalable ` to park one, or `/sidenote` to see what's parked. The notes land in `.claude/sidenotes.md` — add it to `.gitignore` if you'd rather not track it. +Then `/sidenote ` to park one, or `/sidenote` to see what's parked. The notes land in `.claude/sidenotes.md`, a personal parking file kept out of git (this repo's `.gitignore` already excludes it) — so it's per-checkout scratch, not shared history. > **No slash commands?** For agents that read a rule file but have no `/` commands (Cursor, Codex, Copilot…), the same contract works as a plain-text convention: prefix the message with `SIDENOTE:` and the agent parks it instead of acting. Add one line to your rule file so it's honored reliably — see [`commands/sidenote.md`](./commands/sidenote.md) for the exact contract. diff --git a/commands/sidenote.md b/commands/sidenote.md index 1cb6a6d..5c75e74 100644 --- a/commands/sidenote.md +++ b/commands/sidenote.md @@ -13,9 +13,17 @@ Park this thought — **$ARGUMENTS** — as a sidenote. A sidenote is a *later-t **Persist it so it survives this session** (context gets compacted; memory doesn't count as "logged"): -1. Append one bullet to `.claude/sidenotes.md` at the project root — create the file (and `.claude/`) if missing. -2. Format: `- [] `. Don't paraphrase or "improve" it — capture what was said. +1. Append one entry to `.claude/sidenotes.md` at the project root — create the file (and `.claude/`) if missing. +2. Format — an open checkbox, the verbatim thought, then a one-line **anchor** so the note still makes sense when another session or agent reads it cold (the verbatim thought alone is full of "this / here / it" that dangles without the moment that produced it): + + ``` + - [ ] [] + ↳ · · @ + ``` + + - **Thought — verbatim.** Don't paraphrase or "improve" it; capture what was said. + - **Anchor — coordinates you already hold, not a research task.** Fill it only from what's already in front of you: the task in progress, the file/area currently in focus, the current branch and short SHA (already in your session's git context). **Do not open files, grep, or investigate the note's subject to complete it** — that would break the park contract. Any field you don't already know, omit. The anchor records where you were standing; it never sends you looking. Then: **one-line acknowledgement** (e.g. `Parked in .claude/sidenotes.md — continuing.`) and **resume exactly where you left off**, as if the note had never arrived. -**If `$ARGUMENTS` is empty** (a bare `/sidenote`), there's nothing to park — treat it as a *flush*: read `.claude/sidenotes.md` and list the currently-open sidenotes back to me so I can decide what to pick up. Change nothing, act on nothing, then resume. +**If `$ARGUMENTS` is empty** (a bare `/sidenote`), there's nothing to park — treat it as a *flush*: read `.claude/sidenotes.md` and list the **open** entries back to me so I can decide what to pick up. Open means *not checked off* — every entry except the ones marked done (`- [x]`), so older bullets without a checkbox still count. Change nothing, act on nothing, then resume. (Checking an item off to `- [x]` happens when it's actually handled — not part of parking or flushing.)