<feed xmlns='http://www.w3.org/2005/Atom'>
<title>rulesets, 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-13T18:49:21+00:00</updated>
<entry>
<title>chore: stamp 2026-06-13 inbox-process marker</title>
<updated>2026-06-13T18:49:21+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-13T18:49:21+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/rulesets/commit/?id=bbd07b6611fcb9bb5ea962adb02cea53a509c780'/>
<id>urn:sha1:bbd07b6611fcb9bb5ea962adb02cea53a509c780</id>
<content type='text'>
</content>
</entry>
<entry>
<title>feat(hooks): title sessions host-project with a hyphen, no space</title>
<updated>2026-06-13T18:49:21+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-13T18:49:21+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/rulesets/commit/?id=f537150ff3f67899d27a7f121bc302f61a307c1c'/>
<id>urn:sha1:f537150ff3f67899d27a7f121bc302f61a307c1c</id>
<content type='text'>
The SessionStart hook joined host and project with a space ("ratio rulesets"), which reads as two words in the claude.ai/code and mobile session lists. I changed the join to "$host-$project" ("ratio-rulesets") so the title is one token, and updated the three session-title-hook.bats expectations test-first.
</content>
</entry>
<entry>
<title>chore(todo): file session-title-format task routed from roam inbox</title>
<updated>2026-06-13T18:38:13+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-13T18:38:13+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/rulesets/commit/?id=25bde1f7e342cdf428dbb9468d0d14323be34db6'/>
<id>urn:sha1:25bde1f7e342cdf428dbb9468d0d14323be34db6</id>
<content type='text'>
</content>
</entry>
<entry>
<title>feat(workflows): add inbox-zero for routing the roam inbox by project</title>
<updated>2026-06-13T18:23:18+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-13T18:23:18+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/rulesets/commit/?id=651b65e25c2dd13a5a371f1de91e17a41d906a84'/>
<id>urn:sha1:651b65e25c2dd13a5a371f1de91e17a41d906a84</id>
<content type='text'>
The global roam inbox (~/org/roam/inbox.org) is one shared capture file every project can see, and nothing routed its items to the project that owns them. inbox-zero claims the items prefixed for the current project, files them into that project's todo.org per the process-inbox discipline, and removes them from the shared inbox. Foreign-prefixed and unowned items stay. Every scan reports the total item count plus how many appear related to this project.

This v1 is single-destination: it routes by explicit &lt;project&gt;: prefix only. The domain-aware mode that would guess every item's owner and empty the whole inbox in one run is deferred until the multi-project need is concrete.

Wired into both session ends so each project touches the inbox twice a session: startup surfaces a read-only count and offer, wrap-up Step 3 sweeps the claimed set before the cleanup scripts so imported tasks ride the wrap commit. INDEX carries the trigger phrases.
</content>
</entry>
<entry>
<title>fix(elisp): byte-compile cross-project .el edits against their own modules</title>
<updated>2026-06-13T18:08:25+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-13T18:08:25+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/rulesets/commit/?id=9e4c58029785c418ad6dbdbff3988a8582388c34'/>
<id>urn:sha1:9e4c58029785c418ad6dbdbff3988a8582388c34</id>
<content type='text'>
The validate-el hook only put the current project's roots on the load path, so editing an .el file from another project failed Phase 1 byte-compile on free-variable warnings: the file's own sibling modules weren't reachable. I added the edited file's directory and its parent to the load path. For in-project edits both are redundant (already covered by PROJECT_ROOT and its modules dir). They only do work when the file sits outside the current project root.

I left Phase 2's test runner alone. It discovers tests by stem under PROJECT_ROOT/tests, so a cross-project file's tests aren't found regardless of load path.
</content>
</entry>
<entry>
<title>chore: capture spec-decisions convention, skeptical-review gate, and wrapup routing spec</title>
<updated>2026-06-13T06:42:33+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-13T06:42:33+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/rulesets/commit/?id=d22e74762125b2b308e9259b6f606ae7eaa2ba21'/>
<id>urn:sha1:d22e74762125b2b308e9259b6f606ae7eaa2ba21</id>
<content type='text'>
</content>
</entry>
<entry>
<title>docs(design): resolve wrap-up routing spec decisions (Reading B)</title>
<updated>2026-06-13T06:38:42+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-13T06:38:42+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/rulesets/commit/?id=62cd707c2b78508e35177f553b72258ac6114198'/>
<id>urn:sha1:62cd707c2b78508e35177f553b72258ac6114198</id>
<content type='text'>
All six decisions resolved. The router's input is filed keepers that belong to another project, not raw inbox files (Reading B). That keeps it a separate sub-step from the inbox gate (D1) and distinct from the defer-and-stage router (D5). Transcript routing is deferred to vNext (D4).

I reworked the design to match: the input definition, a candidate-set note bounding the router to session-filed keepers rather than the standing backlog, and Phase 3. The cookie reads [6/6] and the Status moved to ready for review.

The A-vs-B input ambiguity was the root under D1 and D5. Reading B keeps the inbox gate, the router, and defer-and-stage each simple instead of entangling all three.
</content>
</entry>
<entry>
<title>docs(design): draft wrap-up routing spec</title>
<updated>2026-06-13T06:26:17+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-13T06:26:17+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/rulesets/commit/?id=7b65b2dd04d97c2dc34e5afa715a07ce14b851ae'/>
<id>urn:sha1:7b65b2dd04d97c2dc34e5afa715a07ce14b851ae</id>
<content type='text'>
A spec for the optional wrap-up step that routes inbox items (and, vNext, transcripts) to the project they belong to. Three decisions settled from grounding (reuse todo-cleanup's Open Work matcher as the destination anchor, move atomically through one helper, keep cross-project writes visible with a provenance note); three left open for Craig (separate router step vs merged into the inbox sanity check, transcript scope and trigger, reconciling with the defer-and-stage router). Five implementation phases, acceptance criteria, readiness dimensions.

Status stays draft while decisions are open. The todo task moves to DOING and links the spec.

From the archsetup handoff 2026-06-13.
</content>
</entry>
<entry>
<title>docs(design): capture wrap-up inbox/transcript routing proposal</title>
<updated>2026-06-13T06:18:11+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-13T06:18:11+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/rulesets/commit/?id=049aafb512e735dc04b77274c2167a67eec4f99f'/>
<id>urn:sha1:049aafb512e735dc04b77274c2167a67eec4f99f</id>
<content type='text'>
A wrap-up router that surfaces outstanding inbox items, recommends a destination project for each, and batch-moves task items into that project's todo.org, with a parallel transcript-filing step. I captured it as a design source and filed a spec-bound feature task rather than building it now: the work clears the spec bar, with design uncertainty (merge or stay separate from the inbox sanity check, recommendation-engine confidence, an unresolved transcript source-location dependency) and overlap with this session's defer-and-stage router to reconcile.

From the archsetup handoff 2026-06-13.
</content>
</entry>
<entry>
<title>docs(rules): manual-verification code steps go in org src blocks</title>
<updated>2026-06-13T05:40:25+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-13T05:40:25+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/rulesets/commit/?id=e8d1640dcb853fc71be4df7e3f149ec19f4b4fe0'/>
<id>urn:sha1:e8d1640dcb853fc71be4df7e3f149ec19f4b4fe0</id>
<content type='text'>
A checklist step that is code the user runs (verification setup, bug repro, walkthrough wiring) now goes in an org src block instead of a list bullet, so the user executes it in place with C-c C-c and reads the result in the buffer rather than copy-pasting. Manual actions, prose context, and Expected lines stay as bullets between the blocks.

I scoped the Steps bullet in the same edit: it had said "one action per item" with the command as a bullet, which the new rule would contradict. It now names manual actions as the bullet case and points code steps at the src block.

From the smoke handoff 2026-06-12, worked out on its manual-verification walkthroughs.
</content>
</entry>
</feed>
