aboutsummaryrefslogtreecommitdiff
path: root/claude-rules
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-05-15 12:58:24 -0500
committerCraig Jennings <c@cjennings.net>2026-05-15 12:58:24 -0500
commit236dc42fdd8ab471ca7b8df70e6b88ad46acfc8b (patch)
tree93a720afa8a57f3f36aa5454d7818242198f6772 /claude-rules
parent77eaaf814ace3fdb456d9683898d5693d402b3df (diff)
downloadrulesets-236dc42fdd8ab471ca7b8df70e6b88ad46acfc8b.tar.gz
rulesets-236dc42fdd8ab471ca7b8df70e6b88ad46acfc8b.zip
docs: simplify cj-comments skill + add VERIFY placement/completion rules
Rounds of simplification on the cj-comments skill: converged on source-block-only in org files, dropped the non-org parsing entirely, factored out the mechanical parts into helper scripts (added separately in another repo), and codified the VERIFY placement + completion rules in a canonical rule file so the conventions stop being implicit. Skill (.claude/commands/respond-to-cj-comments.md): - Drop the file-type comment-marker table and the non-org multi-line continuation rule. The skill now recognizes only the org source-block form (#+begin_src cj: ... #+end_src). Craig's yasnippet keeps typing cost flat. - Defensive parsing for legacy inline cj annotations in older org files (back-compat). - Prefer the new helper scripts: step 1 calls cj-scan for structured detection; step 4 sub-step 6 calls cj-remove-block for validated removal. Both have explicit fallback paths to grep+Read / Edit. - Completion rules now split by keyword: TODO/DOING at *,** stay task-shaped (DONE + CLOSED); deeper TODO/DOING flip to dated headings; VERIFY at any depth flips to a dated heading with body replacement. - New VERIFY-answer pattern: when a cj's parent_heading_chain ends with VERIFY, the cj is the answer to that VERIFY. Lift its body into the dated rewrite (or execute the instruction first if indirect), then delete the cj. - New placement rule for new VERIFYs: sibling of the trigger heading, not a child. Climb to *** when the trigger is buried at ****+. This is the active force that keeps todo.org flat. - Rename "cj: comment" to "cj comment" in prose; preserve the literal cj: token in code examples and grep targets. Canonical rule (claude-rules/todo-format.md): - New "VERIFY tasks" section with four subsections: Placement (** or *** only), Creating a new VERIFY (sibling of trigger), Completion (dated rewrite + body replacement at any depth), Don't leave stale placeholders. - Worked before/after examples for both top-level and first-level VERIFYs.
Diffstat (limited to 'claude-rules')
-rw-r--r--claude-rules/todo-format.md118
1 files changed, 118 insertions, 0 deletions
diff --git a/claude-rules/todo-format.md b/claude-rules/todo-format.md
index f8bc88f..24b5ca2 100644
--- a/claude-rules/todo-format.md
+++ b/claude-rules/todo-format.md
@@ -56,3 +56,121 @@ When adding a new task:
When restructuring an existing entry that's already sentence-shaped, split
it: keep the topic as the heading, move the rest to the body.
+
+## VERIFY tasks
+
+`VERIFY` is the keyword for "waiting on Craig's input" — open questions,
+pending decisions, drafts awaiting approval. The placement and completion
+rules below are stricter than normal TODO tasks because VERIFYs are
+open-question placeholders, not regular tasks.
+
+### Placement — top-level or first-level child only
+
+A VERIFY task lives at exactly one of two depths:
+
+1. **Top-level** under the relevant section (e.g., `** VERIFY ...` directly
+ under `* Work Open Work`).
+2. **First-level child** of a parent task (e.g., `*** VERIFY ...` under a
+ `** TODO` / `** DOING` parent).
+
+Never deeper. A VERIFY at `****` or below is buried — the agenda view
+collapses it under its grandparent and Craig stops seeing it. When you
+catch a VERIFY at `****+`, flatten it up to one of the two allowed depths.
+
+The goal is a flat, scannable task list: the parent task is the topic; its
+VERIFYs are the open threads under that topic; the dated history sits as
+log entries (which *can* be deeper).
+
+### Creating a new VERIFY — sibling of its trigger
+
+When you add a new VERIFY task, place it as a **sibling of the heading
+that triggered its creation** — not as a child of that heading.
+
+The trigger is whatever surfaced the open question:
+
+- A cj annotation that asks something or marks a pending decision →
+ trigger is the heading the annotation sits under.
+- A task body or sub-task that uncovered an unanswered question while you
+ were working it → trigger is that task.
+- A draft awaiting Craig's sign-off → trigger is the draft's parent task.
+
+Depth-wise, this means:
+
+- Trigger at `**` → new VERIFY at `**` (top-level sibling under the
+ section).
+- Trigger at `***` → new VERIFY at `***` (first-level-child sibling under
+ the same `**` parent).
+- Trigger at `****` or deeper → VERIFY can't follow it there (Placement
+ rule above). Climb the VERIFY up to `***` and surface the buried
+ trigger as a candidate to flatten.
+- Trigger at `*` (a top-level section) → VERIFY goes at `**` (top-level
+ task under the section).
+
+File placement: insert the new VERIFY *after* the trigger's entire
+sub-tree ends — i.e., after any sub-tasks, dated log headers, or draft
+sub-headings the trigger already contains. This keeps everything under a
+`**` parent flat: sub-tasks, dated logs, and VERIFYs all live as
+siblings at `***`, never burrowing deeper.
+
+The sibling rule is the active force that keeps `todo.org` flat. Without
+it, VERIFYs accumulate one level deeper than their trigger every time —
+turning a clean parent tree into a long pole of nested sub-headings.
+
+### Completion — dated rewrite + content replacement
+
+When a VERIFY resolves, **rewrite the heading and body together** at the
+same depth — regardless of whether the VERIFY is at `**` or `***`:
+
+1. **Replace the heading.** Drop the `VERIFY` keyword (and any priority
+ cookie / tags) and replace with a timestamp + short description:
+
+ *** 2026-05-15 Fri @ 14:00:00 -0500 <what was answered or done>
+
+ Generate the timestamp with `date "+%Y-%m-%d %a @ %H:%M:%S %z"`.
+ Match the original depth (a `**` VERIFY becomes `** YYYY-MM-DD ...`;
+ a `***` VERIFY becomes `*** YYYY-MM-DD ...`).
+
+2. **Replace the body.** Drop the original question/instruction prose and
+ replace with either:
+ - **The information Craig provided** (when the VERIFY was a question
+ — paste the answer, a quote, a link, whatever resolved it), or
+ - **A description of the action taken** (when the VERIFY was an
+ instruction or pending-decision marker — what was done, when, where
+ the artifact lives).
+
+The completed VERIFY becomes an in-place event log entry. The original
+question is preserved by the dated heading + body shape; anyone scanning
+the agenda or `git log` can see what was asked and what landed.
+
+**Note on the top-level case.** Regular `**` DONE tasks normally stay
+task-shaped with a `DONE` keyword + `CLOSED:` line (so they remain visible
+in the agenda). VERIFYs at `**` are the exception — they convert to dated
+log entries on completion because a resolved VERIFY isn't a "done task,"
+it's an answered question. The dated-rewrite rule wins for VERIFYs at all
+depths.
+
+### Don't leave stale placeholders
+
+A well-named VERIFY heading carries the question on its own. Don't append
+`cj: <fill in>` placeholder lines under the heading — Craig adds his own
+cj comment (a `#+begin_src cj: ... #+end_src` block) when he's ready to
+answer, and that's the trigger to process the response. Empty placeholders
+are noise that pollute his `cj:` greps.
+
+### Examples
+
+**Top-level VERIFY, before / after:**
+
+ ** VERIFY What's our position on the BBN NDA reciprocal-term length?
+
+ ** 2026-05-15 Fri @ 14:00:00 -0500 BBN NDA — standard 2-year reciprocal terms confirmed
+ Per Nerses 2026-05-15 (Slack DM D0AAAEW3BS4): DeepSat's standard NDA template uses 2-year reciprocal. Sent to BBN legal for sign-off.
+
+**First-level child VERIFY, before / after:**
+
+ ** DOING [#A] Kostya's contract :admin:kostya:
+ *** VERIFY Confirm Kostya's basis — part-time hr/week or full-time?
+
+ ** DOING [#A] Kostya's contract :admin:kostya:
+ *** 2026-05-15 Fri @ 14:00:00 -0500 Kostya basis — part-time, 20 hr/week
+ Nerses confirmed 5/15 13:30 CDT: Kostya runs at 20 hr/week part-time, mirroring Vrezh's structure. Plugged into Exhibit A § 2 of the contract draft.