<feed xmlns='http://www.w3.org/2005/Atom'>
<title>rulesets/.claude/commands, branch main</title>
<subtitle>Claude Code skills, rules, and language bundles
</subtitle>
<id>https://git.cjennings.net/rulesets/atom?h=main</id>
<link rel='self' href='https://git.cjennings.net/rulesets/atom?h=main'/>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/rulesets/'/>
<updated>2026-06-21T03:28:47+00:00</updated>
<entry>
<title>feat(lint-org): flag level-2 dated headers as a completion defect</title>
<updated>2026-06-21T03:28:47+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-21T03:28:47+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/rulesets/commit/?id=f6dde4e0fe21022966196e19d535f2bb7abcfcdb'/>
<id>urn:sha1:f6dde4e0fe21022966196e19d535f2bb7abcfcdb</id>
<content type='text'>
A `** &lt;YYYY-MM-DD&gt; …` heading carries no keyword, so todo-cleanup's --archive-done can never archive it and task-review drops it from selection. The new level-2-dated-header check (custom, like org-table-standard) emits a judgment item per offending heading so the wrap-up sweep routes it to the next morning's review. Judgment-only, never auto-fixed: the repair needs a DONE-vs-CANCELLED call and the original heading text. Three ERT cases cover it (flagged at level 2, clean for DONE+CLOSED, clean for a level-3 dated entry).
</content>
</entry>
<entry>
<title>docs: level-2 VERIFY completes task-shaped, not as a dated header</title>
<updated>2026-06-21T03:12:02+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-21T03:12:02+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/rulesets/commit/?id=8a50088b063a7e0e7a79e8f7aa799ee6185fd814'/>
<id>urn:sha1:8a50088b063a7e0e7a79e8f7aa799ee6185fd814</id>
<content type='text'>
The old rule dated a resolved VERIFY at every depth, including the top level. A level-2 dated header carries no keyword, so todo-cleanup's --archive-done can never archive it and task-review drops it from selection. Now a top-level VERIFY closes like any other top-level task (DONE/CANCELLED + CLOSED:), and dated rewrites are reserved for level 3 and deeper. Updated the rule and the three places that encoded the old behavior: todo-format.md, respond-to-cj-comments.md, and process-inbox.org. Also repaired two pre-existing level-2 dated headers.
</content>
</entry>
<entry>
<title>feat(commands): /update-skills syncs forks with upstream via 3-way merge</title>
<updated>2026-06-11T22:05:03+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-11T22:05:03+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/rulesets/commit/?id=da93ffd91dea133963ffceaff24d41bc76b8ff93'/>
<id>urn:sha1:da93ffd91dea133963ffceaff24d41bc76b8ff93</id>
<content type='text'>
Upstream releases fixes worth pulling into the forks (arch-decide, playwright-js, playwright-py) without losing our local modifications. Each fork now has a manifest at upstreams/&lt;name&gt;/ plus a committed baseline snapshot that is the 3-way merge base. scripts/update-skills.py classifies each file's drift and merges to stdout. The command owns per-file confirmation, per-hunk conflict prompts, and every target write.

I centralized manifests under upstreams/ instead of per-skill dotfile dirs because arch-decide is now two flat files in commands/ and can't carry one. A "files" map in its manifest handles the upstream rename of SKILL.md to arch-decide.md.

I seeded baselines from today's upstream HEADs, so pre-existing local modifications classify as local-only from here on. git merge-file signals hard errors as exit 255, which subprocess reports as positive. The guard treats anything 128 and up as an error so a binary-file failure isn't misread as a conflict.
</content>
</entry>
<entry>
<title>docs(commands): trim two command descriptions under listing cap</title>
<updated>2026-06-03T18:21:15+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-03T18:21:15+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/rulesets/commit/?id=586c8f69b2f1e0498be7f8abecfd348aae12e5dd'/>
<id>urn:sha1:586c8f69b2f1e0498be7f8abecfd348aae12e5dd</id>
<content type='text'>
Both descriptions ran past Claude Code's per-entry listing cap (~1536 chars), so the menu blurb got truncated. start-work was 1680, respond-to-cj-comments 1568. I trimmed them to 1513 and 1518, compressing only descriptive prose. Every "Use when" and "Do NOT use" routing trigger stays verbatim, so triggering is unchanged.
</content>
</entry>
<entry>
<title>feat(start-work): add a spec-prerequisite check to the Approach gate</title>
<updated>2026-06-03T02:21:11+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-03T02:21:11+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/rulesets/commit/?id=2cff51e377c89e325ccbc10fae7c76b730a88571'/>
<id>urn:sha1:2cff51e377c89e325ccbc10fae7c76b730a88571</id>
<content type='text'>
The Approach gate planned tests, migration, and commits but never asked whether the work needs a design spec it does not yet have. Added item 5: a spec is warranted for large or wide-surface work, unresolved design questions, or a new interface others build on. For a big task it is never a silent skip — the approach summary must state why no spec is needed, so the call is visible and challengeable at the gate. Small contained tasks pass without comment.
</content>
</entry>
<entry>
<title>feat(start-work): add "reasons not to do this" to the Justify gate</title>
<updated>2026-06-03T02:20:07+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-03T02:20:07+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/rulesets/commit/?id=8ab5ec135a3846972f9eaad5ab67104b2ff19232'/>
<id>urn:sha1:8ab5ec135a3846972f9eaad5ab67104b2ff19232</id>
<content type='text'>
The Justify gate covered Downsides and Alternatives but had no forced verdict on whether the work should happen at all. Added item 9: surface the top three objections when real ones exist, or say so in one line when none rise to a genuine objection, rather than manufacturing three. Building the case against the work is cheapest at this gate.
</content>
</entry>
<entry>
<title>feat(commands): let the agent invoke codify, refactor, and respond-to-cj-comments</title>
<updated>2026-05-26T18:34:18+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-26T18:34:18+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/rulesets/commit/?id=f332b2169d47d0c7bb9847e4ecf299197803c860'/>
<id>urn:sha1:f332b2169d47d0c7bb9847e4ecf299197803c860</id>
<content type='text'>
I dropped disable-model-invocation from these three commands, the same one-line change I made to start-work. They were user-only, so the agent couldn't run them as a workflow step. Now the agent can invoke them through the Skill tool and I can still type the slash command. The remaining flagged commands stay user-only for now.
</content>
</entry>
<entry>
<title>feat(start-work): let the agent invoke it, not just the user</title>
<updated>2026-05-26T18:03:48+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-26T18:03:48+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/rulesets/commit/?id=fa4f8d62887325b49176e0a9bcc016b35678057d'/>
<id>urn:sha1:fa4f8d62887325b49176e0a9bcc016b35678057d</id>
<content type='text'>
I dropped disable-model-invocation from start-work's frontmatter. The flag made it user-only, so the agent couldn't run it as a workflow step and I had to type /start-work by hand every time. Removing the line makes it invocable by the agent through the Skill tool while /start-work still works for me. Its description already carries strong "Do NOT use for..." triggers, so the auto-invoke risk stays low. The other 16 commands still carry the flag.
</content>
</entry>
<entry>
<title>docs(commands): add timebox and fresh-sources rules to brainstorm</title>
<updated>2026-05-22T20:53:17+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-22T20:53:17+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/rulesets/commit/?id=b86b745b83a0d360b5d56dd439b743b13f8f96dd'/>
<id>urn:sha1:b86b745b83a0d360b5d56dd439b743b13f8f96dd</id>
<content type='text'>
Three audit fixes. Phase 1 gains a "Timebox the dialogue" rule, since one-question-at-a-time can run long: aim for the one-sentence restatement in roughly five to eight questions, then move to Phase 2 and park the rest as open questions. Phase 2 gains "Ground high-stakes claims in fresh sources" — check load-bearing claims about markets, regulations, tools, vendors, or current APIs against a current source, and mark what you couldn't verify as an assumption. The design-doc skeleton gains an Assumptions section that separates researched facts (with their source) from assumptions to confirm before building.
</content>
</entry>
<entry>
<title>docs(commands): make arch-evaluate findings honest about certainty</title>
<updated>2026-05-22T20:03:30+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-22T20:03:30+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/rulesets/commit/?id=8f14e8131d691b2026f6c82a13cfd10ccb350892'/>
<id>urn:sha1:8f14e8131d691b2026f6c82a13cfd10ccb350892</id>
<content type='text'>
Two audit fixes. Framework-agnostic findings (Claude reading import graphs) now carry a confidence level (High/Medium/Low) and how it was determined, with a required "not fully checked because" note when scale or dynamic imports cap certainty, so a partial read isn't presented as exhaustive. Unconfigured language tools are no longer skipped silently: each detected language whose tool didn't run gets an Info finding, so the audit shows what was and wasn't verified.
</content>
</entry>
</feed>
