| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|
| |
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.
|
| |
|
|
| |
Three contributions came in from the home and work projects: a proposal to promote the self-hosted ntfy phone channel into a general two-way agent-comms tool, a flashcard multi-tag tooling change to reconcile into the canonical scripts, and a triage-intake auto-mode phone-push delivery step. I preserved each as a design bundle under docs/design and queued the build/reconcile work, since all three change shared assets and need review before landing.
|
| | |
|
| |
|
|
| |
An archsetup handoff asks to add ~/.dotfiles to the ai launcher's project discovery, completing the dotfiles bootstrap from earlier. bin/ai is a synced asset and this arrived in a no-approvals loop, so it parks as a VERIFY with the prepared one-line diff rather than self-applying.
|
| |
|
|
|
|
| |
The parked Phase E proposal and the "fix speedrun" mode describe the same capability, so I reconciled them into one autonomous-batch spec: a dedicated work-the-backlog.org holds the execution loop, inbox-zero keeps its routing, and "fix speedrun" is a thin preset over it. The spec also designs an effectiveness-measurement trial (a per-task metrics log plus periodic org-roam synthesis articles). The second spec wires light KB-contribution prompts into four workflows plus a curated best-practices node.
Both tasks now carry a review VERIFY. The wrap-up-routing implementation stays open: it moves tasks between projects' todo.org files, so it needs a focused session with a data-loss checkpoint, not a tail-end rush.
|
| |
|
|
| |
I processed two .emacs.d handoffs and one roam item. The inbox-zero Phase E proposal (autonomous task execution in a synced template) arrived in a no-approvals session, so it parks as a [#B] VERIFY with the prepared diff under working/, not self-applied. The roam item to wire KB-contribution encouragement into four workflows is filed as a [#C] design task. I dropped its :next: tag because curating the best-practices content needs a decision, not a loop auto-implement.
|
| |
|
|
| |
I reconciled all 11 open tasks against session history and repo state and refreshed their review stamps. I corrected two stale preambles: helper-instance's shipped detection slices, and memories-sync's claim that work was pending when Phases 0-4 had already shipped. The create-documentation and research-writer skill designs drop to [#D]. Both are designed but unbuilt and wait on a real triggering task, so they shouldn't sit at [#C] against active work.
|
| |
|
|
| |
I filed the .emacs.d "fix speedrun" proposal as a [#C] spec task, with its content preserved in docs/design for spec-create later. The two pearl acks confirmed handoffs I'd already sent, so they needed nothing back.
|
| |
|
|
|
|
|
|
|
|
| |
Add an auto mode to the triage-intake engine: a self-running variant for when Craig is away but wants tight awareness. It runs the standard sweep on a short interval (default 20 min) as an in-session loop, accumulates findings instead of mutating state, and gates the mutations behind "close the triage" (flush the batch, keep looping) and "stop the triage" (flush, then stop).
A sweep advances nothing — no sentinel write, no todos, no mail actions, no commit. The scan window grows from the last close to the next, so nothing between sweeps is dropped, and the sentinel still means "everything before this timestamp has been scanned" — it just advances once per close. Each sweep reports deltas plus a running "responses awaiting your acknowledgment" list, the primitive an away user needs that a delta-only sweep loses.
The unacked list is durable in .ai/triage-intake-unacked.org so it survives a crash, a clear, or a restart — the away-from-desk case the mode exists for. Delivery is an in-session loop so MCP auth is inherited; a detached cron schedule stays out of scope and belongs to the morning-ops orchestrator, which can reuse this accumulate behavior as its triage limb.
Source proposal from the work project, design decisions ratified 2026-06-15.
|
| |
|
|
|
|
| |
File the .emacs.d spec-storage/lifecycle proposal as a [#C] :spec: task with the recommendation captured in the body, so the design thinking survives until the task is worked in priority order. Move the proposal out of the inbox into docs/design/ as the linked source.
The recommendation leans org-TODO keyword + Status field over a filename suffix for lifecycle status (renames break cross-doc links across a synced doc set), and org-id links either way. Flagged that the keyword lean diverges from the filename-suffix idea, so the mechanism stays an open decision.
|
| | |
|
| | |
|
| |
|
|
|
|
|
|
| |
agent-roster is the single detection primitive for concurrent same-project Claude sessions: pgrep -x claude, resolve each pid's cwd from /proc, keep those at or inside the project root, and drop the scanner's own ancestry. It exits 0 when alone, 1 when other agents are present (printed pid + cwd), and 2 when the roster can't run. Both the helper launcher and the in-session startup check will call this rather than re-scanning.
pgrep and /proc are the system boundary, so I made them injectable (ROSTER_PGREP, ROSTER_PROC, ROSTER_SELF_PID) and the bats exercise the real include/exclude logic against fixtures, no agents spawned. The unavailable paths (no /proc, or pgrep absent) report on stderr and exit 2 rather than a false "alone".
This is the first slice of the helper-instance task. Startup and ai --helper wiring follow.
|
| |
|
|
| |
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.
|
| | |
|
| |
|
|
|
|
|
|
| |
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.
|
| |
|
|
|
|
|
|
| |
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.
|
| |
|
|
|
|
| |
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.
|
| | |
|
| |
|
|
|
|
| |
The reported "0 subtree(s) moved while moving" is a second-run artifact, not a defect. open-tasks.org runs --archive-done after wrap-it-up already archived, so the second pass correctly reports 0 next to the first pass's diff. The counter increments inline with every move. The exact pre-archive state reports the right count.
Also drops the page-signal pager VERIFY.
|
| |
|
|
| |
Rename the "Priority and Tag Scheme" section to "Rulesets Priority Scheme" so the repo follows the convention it just documented. Refresh the review dates on the open tasks and drop a processed inbox note.
|
| |
|
|
| |
The archive pass moved four closed subtrees to Resolved while reporting zero moves; the relocation was correct and the reporting defect is filed as a [#D] bug.
|
| | |
|
| |
|
|
| |
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.
|
| | |
|
| |
|
|
|
|
| |
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.
|
| |
|
|
|
|
| |
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.
|
| |
|
|
|
|
|
|
| |
gating
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.
|
| |
|
|
|
|
| |
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.
|
| |
|
|
|
|
| |
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.
|
| |
|
|
|
|
| |
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.
|
| |
|
|
| |
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.
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| |
|
|
| |
The wide voice-pass table in todo.org reflows to the 120-column standard (the new lint check's first real catch), and the two tasks closed today move to Resolved.
|
| |
|
|
|
|
|
|
|
|
| |
Wide org tables overflow the page in exported PDF/docx, and hand-wrapping a cell into continuation rows is tedious and error-prone. The standard existed only as a work-project convention with nothing enforcing it.
claude-rules/org-tables.md carries the generalized standard: 120-column budget measured at render width (a link counts as its visible label and is never split), over-budget cells wrap onto continuation rows, and a rule sits under the header and every logical row.
wrap-org-table.el reflows a table to that shape mechanically. Columns shrink from natural width toward a floor of their widest atomic token, cells wrap link-safe, and rule-delimited continuation groups merge back into their logical row before re-wrapping, which makes the reflow idempotent. A table whose floors still exceed the budget reflows best-effort and stays flagged for restructuring.
lint-org.el gains an org-table-standard judgment check: width overruns and missing rules surface during the sweep with a pointer to the helper. Conformant wrapped tables don't false-flag, since the check reuses the helper's continuation-group reading. The check is judgment-only by design: reflowing is a visible layout change the sweep shouldn't make silently.
|
| |
|
|
|
|
| |
session-clear-resume.sh shipped 2026-06-02 with its settings.json entry, but make install didn't cover hooks and nothing re-ran install-hooks, so the symlink only existed on machines that had linked it by hand. Everywhere else the hook errored silently on every /clear.
make install now links DEFAULT_HOOKS alongside skills, rules, config, and bin scripts, so the startup workflow's install step propagates new hooks machine-wide. Opt-in hooks stay manual. scripts/tests/install-hooks-link.bats covers the new section. The SessionStart-on-clear todo task closes with this: the hook feature already existed, and the gap was distribution.
|
| | |
|
| |
|
|
|
|
|
|
| |
invariants
From the 2026-06-11 usage report. The debug skill gains a hypothesis-discipline contract (rank candidate causes by cheapest empirical test, run probes in parallel, report only confirmed findings) targeting the serial theory-cycling the report flagged. commits.md's pre-commit checklist gains a staged-files guard covering the untracked-set and canonical-vs-mirror conventions. A small tracked CLAUDE.md carries the rulesets mirror invariant at turn zero. Two [#C] pilots filed: a read-only morning ops orchestrator and a monthly session-harvest workflow.
The report's 500-token-cap finding was a mislabel: the underlying transcripts show 529 Overloaded and stream-idle-timeout errors with no token cap configured anywhere, so nothing to change there.
|
| |
|
|
| |
All five phases shipped today. The spec status flips to implemented with a history entry carrying the commit trail; the phase tasks become dated completion entries under the parent, which moves to DOING until the manual-testing checklist and the other machines' clone + timer setup land.
|
| |
|
|
| |
Phase 0 of the agent KB spec: the org-roam KB now lives at ~/org/roam as a git repo on cjennings.net. roam-sync.sh (bats-tested: commit, rebase, push, conflict-abort) runs from a 15-minute systemd user timer; canonical unit files live in scripts/systemd/. Live references to the old ~/sync/org/roam path (the task-list pointer, the journal workflow, the notes template) repoint to ~/org/roam, and a transition symlink at the old location covers stragglers.
|
| |
|
|
|
|
| |
The KB leaves the ~/sync/org Syncthing share for its own git repo on cjennings.net (new decision D8). A systemd timer auto-syncs Craig's edits, agents pull before query and commit+push after write, machines replicate by clone (the work machine doesn't), and agent writes land under an agents/ subdirectory. Syncthing's no-history, no-gate, conflict-fork costs were the design's weakest accepted risks, and the phone constraint dissolved: mobile stays on on-demand doc drops to the ~/sync/phone share.
The amendment also folds in inclusion criteria plus a guided per-project memory sweep (Phase 1.5), a Success metrics section with a 30-day checkpoint, the seed node redefined as the KB's own documentation, and monthly hygiene automation (Phase 4). Phases renumbered 0-4. Implementation stays held pending the go-ahead.
|
| |
|
|
| |
Craig confirmed the denylist is complete at ~/projects/work alone (archangel is not work-scoped), which clears the spec's one remaining caveat. Phase 1 is unblocked, and implementation still awaits the explicit go.
|
| |
|
|
|
|
| |
I ratified all seven decisions: the org-roam KB is the shared agent substrate, the write boundary is read-shared write-scoped (work never writes), nodes are per-fact, agent writes land freely in the KB only, and harness memory stays as the ephemeral capture layer. The spec moves to docs/agent-knowledge-base-spec.org in spec-create format, superseding the 2026-06-05 draft.
A work-root denylist classifier routes writes: personal projects write, work and unknown projects refuse and report the redacted fact. Implementation is broken into three phases and waits on confirming the denylist contents.
|
| |
|
|
| |
Meeting-prep promotion session. The completed task moved from Open Work to Resolved in the todo cleanup.
|
| | |
|
| |
|
|
| |
tag meeting-prep solo
|