<feed xmlns='http://www.w3.org/2005/Atom'>
<title>rulesets/docs/design/2026-05-28-generic-agent-runtime-spec.org, 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-12T07:47:22+00:00</updated>
<entry>
<title>docs(spec): close the helper-spec review cycle on the second pass</title>
<updated>2026-06-12T07:47:22+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-12T07:47:22+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/rulesets/commit/?id=006711142e4a23da4fc990dc1371807d6200a74e'/>
<id>urn:sha1:006711142e4a23da4fc990dc1371807d6200a74e</id>
<content type='text'>
The re-review confirmed every disposition with no new high or medium findings: Phase 1.5 stands at Ready with caveats, phases 2-5 stay parked behind the decisions fence. The response is correspondingly small — the accepted editorial rename of the Emacs subsection (its "open issue / blocks readiness" heading outlived the body, which is now an integration contract) and the second-pass note in the dispositions section. The updated review file and its history and task-tracking edits ride along.
</content>
</entry>
<entry>
<title>docs(spec): fold the Codex review into the agent-runtime spec</title>
<updated>2026-06-12T07:24:01+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-12T07:24:01+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/rulesets/commit/?id=22e19c21e6aabe0319d4b09a862f4a3705c92509'/>
<id>urn:sha1:22e19c21e6aabe0319d4b09a862f4a3705c92509</id>
<content type='text'>
The review's top finding was that one Not-ready label hid an implementable slice. Status now splits by arc: Phase 1.5 helper instances are READY WITH CAVEATS (the three-ring gate and the manual drills are binding, and the ai-term.el work is a coordinated .emacs.d handoff with an exact artifact), while phases 2-5 stay NOT READY behind a decisions-required section and a Phase 5 reverification prerequisite that demotes the model table to a recommendation.

The remaining findings hardened the slice: per-ring rollback actions including the half-propagated-sync case, the review's test inventory adopted as normative, a message contract for stale helper files, and explicit roster-unavailable behavior on unsupported platforms. All recommendations accepted except the document split, modified to a dual rubric in one document. The review file and dispositions table ride along.
</content>
</entry>
<entry>
<title>docs(spec): record the three confirmed helper-design decisions</title>
<updated>2026-06-12T04:09:38+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-12T04:09:38+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/rulesets/commit/?id=c6fd73441ef0b683abb859863dcd0d48377a4838'/>
<id>urn:sha1:c6fd73441ef0b683abb859863dcd0d48377a4838</id>
<content type='text'>
</content>
</entry>
<entry>
<title>docs(spec): unify the helper section after the day's five revisions</title>
<updated>2026-06-12T04:05:56+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-12T04:05:56+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/rulesets/commit/?id=6f42f3c0ec5253d12182c0ad9f3d4efcca049420'/>
<id>urn:sha1:6f42f3c0ec5253d12182c0ad9f3d4efcca049420</id>
<content type='text'>
The detection and identity subsections were authored under one design and patched under two others. They're now three pieces: the roster as the single detection primitive, two spawn paths (deterministic launcher, startup safety net) sharing the same three steps, and identity plus the role contract, with helper-mode.org named the single home of the helper rules.

Verified ai-term.el's launch mechanics in code: the startup instruction is embedded in the tmux new-session command string, so env injection is a prefix on that string, and the -A flag means one session per project, so the helper path needs its own session and buffer names. Added ai-term recommendations to ride the same handoff (roster-derived badges, agent-exit visibility, one source for opener strings) and reconciled the v0 session-context symlink question with the Phase 1.5 answer.
</content>
</entry>
<entry>
<title>docs(spec): correct the Emacs launch surface to ghostel + ai-term.el</title>
<updated>2026-06-12T02:51:22+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-12T02:51:22+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/rulesets/commit/?id=deea1d5821e6f52b8417a1d50cdfe53cad1022cd'/>
<id>urn:sha1:deea1d5821e6f52b8417a1d50cdfe53cad1022cd</id>
<content type='text'>
The first draft of the Emacs open issue assumed eat/vterm and invented an ai --no-tmux mode for a tmux-less path that doesn't exist. Verified against the actual config: the terminal is ghostel (native emulator over libghostty-vt), and ai-term.el is already the Emacs AI launch surface, creating project-named aiv- tmux sessions with liveness badges and crash recovery.

Emacs-born agents are therefore tmux-parented like shell launches, so detection is uniform across surfaces. The remaining design is integration, not a new surface: ai-term.el's session-create learns the roster, export, and opener steps, the picker gains a [helper] badge, and the launchers share only the agent-roster script since ai-term owns its own session naming and window placement.
</content>
</entry>
<entry>
<title>docs(spec): hold helper instances as not-ready behind Emacs surface and test gating</title>
<updated>2026-06-12T01:09:21+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-12T01:09:21+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/rulesets/commit/?id=53cfd886d3594c60aaa14b07a3077c124c756ba5'/>
<id>urn:sha1:53cfd886d3594c60aaa14b07a3077c124c756ba5</id>
<content type='text'>
Two gaps block implementation. Sessions are also born from Emacs terminal buffers, where roster detection works (the scan matches process cwd, and eat/vterm shells are children of emacs) but the deterministic spawn path doesn't exist; the open issue weighs an elisp command against shelling out to ai with a no-tmux mode, leaning to the latter so the logic lives once.

Second, template sync makes "live everywhere" the default failure mode for startup.org changes, so the test strategy gains three-ring gating: bats with sleeper processes and a byte-identical no-op guarantee, a disposable sandbox project for the corruption, orphaned-helper, and raw-launch drills, then a dormant-by-construction pilot through project-scripts before the template-wide release. The Status section carries the readiness checklist and the implementation task is blocked on it.
</content>
</entry>
<entry>
<title>docs(spec): deterministic helper spawn and session-end ordering rules</title>
<updated>2026-06-12T01:05:16+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-12T01:05:16+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/rulesets/commit/?id=65b99e86d570e489bcd91f377b71193cd7eaba44'/>
<id>urn:sha1:65b99e86d570e489bcd91f377b71193cd7eaba44</id>
<content type='text'>
The launcher becomes the spawn mechanism: a shell script runs the roster check, assigns the id, and launches with the helper instructions in order, where a model-followed startup instruction can skip a step. The in-session roster check stays as the safety net for raw launches and still splits a live anchor into crashed versus concurrent.

Session-end ordering was unhandled: a helper outliving the primary stranded a dirty worktree, since the helper may not commit and the agent allowed to is gone. The git ban on helpers is concurrency-scoped, so it lifts when the helper finds itself alone at wrap-up and the last agent out closes the door with the full wrap-up. The mirror case pauses too: a primary wrapping with live helpers stops at the commit and asks whether to sweep the helper's in-flight work, wait, or leave closing to the helper.
</content>
</entry>
<entry>
<title>docs(spec): detection-first helper routing, no operator action needed</title>
<updated>2026-06-12T01:02:18+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-12T01:02:18+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/rulesets/commit/?id=00fc6f10d132e61adde26613372cf845a5abe776'/>
<id>urn:sha1:00fc6f10d132e61adde26613372cf845a5abe776</id>
<content type='text'>
A second agent now discovers concurrency itself instead of being told: a stateless process scan (running agent processes, /proc cwd matched within the project root, own ancestry excluded) runs as the first action of every session, before any pull. Alone with no anchor is a fresh session, alone with an anchor is today's crash recovery, and not-alone skips startup and routes to helper-mode.org, the role-contract workflow. The scan also splits the previously ambiguous live-anchor signal into crashed versus concurrent primary.

Verified the signal live with four concurrent agents on this machine. The ai --helper launcher flag drops from mechanism to convenience. Known v1 limits recorded: sessions not running as local processes are invisible to the scan, and the match is process-cwd based.
</content>
</entry>
<entry>
<title>docs(spec): data-integrity rules for helper instances</title>
<updated>2026-06-12T00:53:38+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-12T00:53:38+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/rulesets/commit/?id=b405fff94d6ddcdd5b2278f20c327c583aad487d'/>
<id>urn:sha1:b405fff94d6ddcdd5b2278f20c327c583aad487d</id>
<content type='text'>
Four loss windows the scoped-edit discipline doesn't cover: a primary file-wide hygiene pass silently clobbering a helper's concurrent edit (gate on live session-context.d/ files before any such pass), a new primary misreading helper dirt as leftover mess (surface live helper files at startup), crash recovery for shared-file edits (helpers journal each edit before applying it), and MEMORY.md's anchor-less read-modify-write index (memory writes stay primary-only).

Backstop: every file-wide pass snapshots to /tmp before modifying. lint-org and wrap-org-table already conform; todo-cleanup — the pass that moves whole subtrees — does not, and Phase 1.5 brings it up to the invariant.
</content>
</entry>
<entry>
<title>docs(spec): add helper-instance slice to the agent-runtime spec</title>
<updated>2026-06-12T00:36:39+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-12T00:36:39+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/rulesets/commit/?id=f4b856b9eacc5a7ce8af3a031d72e7b7d6840305'/>
<id>urn:sha1:f4b856b9eacc5a7ce8af3a031d72e7b7d6840305</id>
<content type='text'>
The v0 draft covered identity and message targeting for concurrent agents but not spawn mechanics or write-safety for the shared files the session-context split doesn't isolate. I added a section for the motivating case (a second Claude in one project doing lookups and safe task updates): ai --helper spawn with automatic AI_AGENT_ID, a tiered read/write contract where helpers make scoped single-heading org edits and file-wide passes plus all git mutation stay primary-only, light helper startup, and helper wrap-up. Phase 1.5 sequences the slice independently of the runtime-neutral phases 2-6.
</content>
</entry>
</feed>
