<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-07-20T00:56:10+00:00</updated>
<entry>
<title>docs(start-work): catch open-ended tasks at the ticket-quality gate</title>
<updated>2026-07-20T00:56:10+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-07-20T00:56:10+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/rulesets/commit/?id=94df71eddec1e6f8366e9e5919aed5bf9327ee6c'/>
<id>urn:sha1:94df71eddec1e6f8366e9e5919aed5bf9327ee6c</id>
<content type='text'>
The Justify gate's ticket-quality check now names the absence-phrased open-ended goal as the specific case where acceptance criteria aren't concrete, and routes it to the measurable-acceptance conversion in todo-format.md before work starts rather than into an implementation with no definition of done.
</content>
</entry>
<entry>
<title>fix(scripts): stop org table helpers rewriting block content</title>
<updated>2026-07-14T06:27:17+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-07-14T06:27:17+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/rulesets/commit/?id=951b6fc63129577a80e1d46f46eeafff005fe636'/>
<id>urn:sha1:951b6fc63129577a80e1d46f46eeafff005fe636</id>
<content type='text'>
Both helpers treated any pipe-led line as a table row, so ASCII art in an example block got mangled into a bordered table (a work file took a 1949-line reformat on 2026-07-09). The scanners now track the open block's type and skip its content. Only the matching end marker closes a block, so a literal end_src quoted inside an example block can't re-expose it.

The deeper cause was wrap-org-table's load-time dispatch: it fired when lint-org merely required the library, running the reformatter over files lint-org was only asked to report on. It now dispatches only when named as the entry script. lint-org's CLI is also report-only by default now. Writes require --fix, and the wrap-up workflow and lint command pass it.
</content>
</entry>
<entry>
<title>docs: add a green-baseline-before-work gate to verification and start-work</title>
<updated>2026-06-30T17:27:24+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-30T17:27:24+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/rulesets/commit/?id=d0ab04751fe437b6c9509a2ff3217cda0f624edc'/>
<id>urn:sha1:d0ab04751fe437b6c9509a2ff3217cda0f624edc</id>
<content type='text'>
A red test suite at the start of work poisons every later "did I break this?" check: you can't tell your own regressions from pre-existing noise, and the end-of-work green bar stops being readable. verification.md now asks for a clean suite run before work begins, not only before commit. start-work runs it as Pre-work step 0.3 against the reconciled base.

I added two carve-outs the original proposal lacked: a project with no suite has nothing to baseline, and a suite that can't run is the existing "When You Cannot Verify" case rather than a blocker. The step lands after the reconcile, so the baseline reflects the base the work is cut from. The Phase 4 TDD red is called out as expected, distinct from a baseline failure.
</content>
</entry>
<entry>
<title>feat(refactor): add simplification scan mode</title>
<updated>2026-06-28T16:24:49+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-28T16:24:49+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/rulesets/commit/?id=b621914b3a748f42ddb6ae82c385e26174c982be'/>
<id>urn:sha1:b621914b3a748f42ddb6ae82c385e26174c982be</id>
<content type='text'>
I added a simplification mode for behavior-preserving clarity and size reduction: over-defensive guards, needless indirection, convoluted logic, redundant state, and legibility rewrites. It runs in the default full scan and on its own. For the lenses dead-code and duplication already own (identical-twin branches, plain deletion, repeated literals) it cross-references those modes instead of specifying detection twice. It's distinct from /simplify, which works the current diff. This sweeps existing code.
</content>
</entry>
<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>
</feed>
