aboutsummaryrefslogtreecommitdiff
path: root/todo.org
Commit message (Collapse)AuthorAgeFilesLines
* docs: revise and ratify the no-approvals speedrun specHEADmainCraig Jennings11 hours1-11/+12
| | | | | | Recast the speedrun eligibility criteria as checkable gates, not adjectives: dropped the task-size gate so large tasks decompose into per-commit chunks, replaced the act-vs-file rule with a four-item defer checklist keyed on whether the failing test is writable from the task text, and added a pre-flight step that front-loads a run's decisions so it proceeds unattended after. Define :solo: and :quick: precisely enough to enforce in task-review and task-audit. Also record the spec storage and lifecycle-status decision (org-keyword authoritative, drop the filename suffix) and the requirement to retrofit existing docs across projects.
* chore: archive session record + fix dead links in resolved taskCraig Jennings23 hours1-1/+1
|
* chore(todo): reconcile tasks and cluster the flashcard toolingCraig Jennings25 hours1-24/+28
| | | | Task audit. I folded two of Craig's cj decisions: coverage-summary.el stays a local-only helper (reframed from bug to chore, docs work only), and the flashcard-stats refutation exemption goes generic, a header-declared check-exemption that supersedes the old two-option fix. I noted that the unattended-cron task's v1 precondition has landed, so it's buildable now rather than blocked. And I grouped the three flashcard tasks (apkg converter, refutation mode, multi-tag reconcile) under one parent, since they all edit the same two scripts and want building together.
* feat(scripts): add wrap-up routing recommendation engineCraig Jennings25 hours1-2/+2
| | | | I added route_recommend.py, a pure recommend(item, projects) → (destination, confidence). It has strong, weak, and none tiers, word-boundary literal matching that also handles dot-stripped name aliases, and a deterministic tie-break that downgrades an ambiguous top-tier tie to weak. An empty candidate list yields none. The CLI reuses inbox-send's discover_projects, so the candidate set is the same project universe inbox-send already knows. This covers Phases 1 and 3 of the wrap-up routing spec. The marker and router sub-tasks call it next.
* chore(todo): task review — restamp stale tasks, downgrade generic-runtime ↵Craig Jennings26 hours1-4/+4
| | | | spec to [#D]
* chore: archive session record + todo cleanupCraig Jennings5 days1-38/+34
| | | | | | Wrap of the task-audit / blocked-deps / Anki-fix / wrap-teardown-unblock session. Archives the record and applies todo hygiene (Anki and the cancelled Morning-ops subtree archived to Resolved, one table reflowed to 120 cols). Claude-Session: https://claude.ai/code/session_017PtX1nt1rtYVATuzmzBS4f
* refactor(tasks): use a :blocker: tag, not a :BLOCKS: propertyCraig Jennings5 days1-2/+3
| | | | :BLOCKS: rulesets: was a malformed org tag, and the property form (:BLOCKED_BY: / :BLOCKS: carrying <project>: <what>) was more structure than the dependency needs. The blocking side now carries a plain :blocker: tag, mirroring :blocked: on the waiting side, with the which-project detail in the task body rather than a property. open-tasks.org reads the body for the blocking/requesting project; the scheme, the todo-format convention, and the inbox blocking-dependency handoff all move to the two-tag form. No property anywhere.
* chore(todo): unblock wrap-teardown — .emacs.d companion landedCraig Jennings5 days1-2/+4
| | | | | | The three ai-term companion functions (cj/ai-term-quit, -live-count, -shutdown-countdown) are now in .emacs.d/modules/ai-term.el, double-checked against the contract. Dropped the :blocked: tag and :BLOCKED_BY: property — the build dependency is resolved, only the manual end-to-end validation remains. With the Stop hook wired and the companion present, the feature is live: the next bare "wrap it up" now tears the session down. Claude-Session: https://claude.ai/code/session_017PtX1nt1rtYVATuzmzBS4f
* chore(todo): close the Anki deck-name taskCraig Jennings5 days1-1/+6
| | | | | | Marks the #+TITLE deck-name fix DONE (060a938) and adds a note on the flashcard multi-tag task that its preserved 2026-06-17 to-anki.py now predates this fix, so it must be re-derived against the current canonical rather than copied wholesale. Claude-Session: https://claude.ai/code/session_017PtX1nt1rtYVATuzmzBS4f
* chore(todo): adopt the :blocked: tag and close both task-workflow tasksCraig Jennings5 days1-5/+16
| | | | | | Registers :blocked: in the rulesets priority scheme, tags wrap-teardown :blocked: with a :BLOCKED_BY: emacsd property as the live example (it's genuinely stalled on the .emacs.d companion), and closes the two now-implemented tasks: the cross-project dependency surfacing and the task-audit consolidation phase. Claude-Session: https://claude.ai/code/session_017PtX1nt1rtYVATuzmzBS4f
* docs(todo): file two task-management ideas from the roam inboxCraig Jennings5 days1-85/+105
| | | | | | Inbox-zero claimed two rulesets-prefixed roam captures and filed them as [#C] tasks: surface cross-project dependencies first in the what's-next workflow (a blocked-by tag plus decision-tree binding, spec-shaped), and have the task-audit workflow consolidate adjacent or related tasks into a merge or a parent-with-children grouping. Claude-Session: https://claude.ai/code/session_017PtX1nt1rtYVATuzmzBS4f
* chore: task-review pass — stamp 12 tasks, tag two quick+soloCraig Jennings5 days1-2/+14
| | | | | | Walked the 12 never-reviewed open tasks (the audit's Phase F). All kept as-is — every one is a recent, factually-current idea, no kills or re-grades. Stamped LAST_REVIEWED on all twelve, clearing the unreviewed backlog. Tagged the Anki deck-name bug and the flashcard multi-tag reconcile :quick: :solo: — both are scoped, Claude-verifiable, and decision-free (the Anki fix already has a validated script + test). Claude-Session: https://claude.ai/code/session_017PtX1nt1rtYVATuzmzBS4f
* docs(todo): resolve helper-instance dependency questionCraig Jennings6 days1-3/+6
| | | | | | The helper-instance VERIFY was parked on whether it depends on the generic-runtime refactor. Craig's call: it's independent. The concurrency-safety wiring (two Edit writers on one shared file) is orthogonal to which LLM runtime launches; the one overlap is the ai --helper launcher, which the generic-runtime arc also plans to touch. Flipped VERIFY to TODO — now a buildable task behind its own three-ring gate. Claude-Session: https://claude.ai/code/session_017PtX1nt1rtYVATuzmzBS4f
* chore: task audit — reconcile open work against realityCraig Jennings6 days1-3/+9
| | | | | | Audited the 23 open tasks against the git log, recent sessions, and file state. 19 are current. Two were stale: the agent-source task gets a dated note that the agent-neutral wording sweep (6ad0442) and the .emacs.d multi-LLM thread landed, with naming and shared-source extraction still open; the wrap-up-routing marker sub-task is repointed from the deleted process-inbox.org to inbox.org process mode after the 2026-06-23 consolidation. Stamped LAST_AUDIT. Claude-Session: https://claude.ai/code/session_017PtX1nt1rtYVATuzmzBS4f
* chore: archive session record + todo cleanupCraig Jennings6 days1-14/+15
| | | | | | Wrap of the inbox-consolidation / chime-fix / wrap-teardown / roam-sync session. Archives the session record, stamps the inbox-process marker, and applies todo hygiene (2 completed subtrees archived, one table reflowed to the 120-col standard). Claude-Session: https://claude.ai/code/session_017PtX1nt1rtYVATuzmzBS4f
* feat(wrap): add session teardown and shutdown to wrap-it-upCraig Jennings6 days1-1/+35
| | | | | | | | | | | | A bare "wrap it up" now tears the session down after the valediction: it kills the ai-term buffer and the aiv-<project> tmux session (which takes claude with it) and restores geometry. "wrap it up with summary" or "and summarize" keeps the buffer. "wrap it up and shutdown" gates on this being the only live ai-term session, then powers the machine off through an abort-able Emacs countdown. Teardown can't run inline because it kills the session claude runs in, so the valediction would never flush. Step 6 instead drops a basename-keyed sentinel after commit+push is verified, and a new Stop hook (ai-wrap-teardown.sh) does the teardown when the response ends, by which point the valediction has rendered. The hook is a no-op on every normal stop because the sentinel only exists after a teardown wrap. The runtime lives in .emacs.d/modules/ai-term.el (cj/ai-term-quit, cj/ai-term-live-count, cj/ai-term-shutdown-countdown), and the rulesets side calls it via emacsclient. I routed that companion to .emacs.d, so the feature is end-to-end once it lands. The hook has 8 bats tests. The live teardown and shutdown paths are a manual checklist in todo.org. Built from the proposal. I went with both summary qualifiers, the Emacs-timer countdown, and the live-count gate. Claude-Session: https://claude.ai/code/session_017PtX1nt1rtYVATuzmzBS4f
* feat(inbox): consolidate three inbox workflows into one engineCraig Jennings6 days1-4/+6
| | | | | | | | | | | | I merged process-inbox, monitor-inbox, and inbox-zero into one inbox.org engine. A shared core (value gate, skeptical review, disposition ladder, reply discipline, capture-guard, priority-scheme check) holds the logic that used to be duplicated and cross-referenced across the three files. Each mode (process, monitor, roam) references the core by name instead of restating it. Every trigger phrase still works, now routing to a mode, so there's nothing to relearn. I added the interactive auto inbox zero mode: ask for an interval, run roam mode on /loop, acknowledge-only on an empty cycle, surface a find to a queue gated on a yes. The fully-unattended /schedule pass stays vNext, tracked separately. I repointed every live caller (INDEX, protocols, startup Phase C, wrap-up Step 3, triage-intake, broadcast) at inbox.org and its modes, then deleted the three old files. triage-intake and no-approvals stay separate by design. The value gate, dispositions, capture-guard, and reply discipline all behave as before. Built from the Ready spec. Workflow-integrity and sync-check pass on both the canonical and mirror trees, the stale-reference grep is clean, and the full suite is green. Claude-Session: https://claude.ai/code/session_017PtX1nt1rtYVATuzmzBS4f
* docs: inbox-consolidation spec + backlog filingsCraig Jennings6 days1-4/+33
| | | | | | The inbox-workflow consolidation reached a Ready spec — one inbox.org engine with process/monitor/roam modes, plus "auto inbox zero" as the interactive recurring roam check (the fully-unattended cron pass deferred to vNext). Files the backlog surfaced while triaging the inbox: the wrap-it-up teardown proposal, the agent-source improvements, the consolidation task itself, and the deferred unattended-cron pass.
* feat(languages): add bash/shell bundleCraig Jennings6 days1-1/+4
| | | | | | | | Shell-heavy projects had no bundle that fit. archangel and archsetup are bash repos, and installing elisp or python gave them the wrong language rules. I added languages/bash on the go bundle's shape. The bundle ships bash.md and bash-testing.md rules, a PostToolUse hook that runs shellcheck on edited shell files and blocks on a violation, a shellcheck pre-commit githook, settings.json wiring, gitignore-add.txt, and a "Bash/shell project" CLAUDE.md. The hook covers .sh, .bash, and extensionless files with a shell shebang, since the CLI tools that fill a shell repo carry no extension. shellcheck is the gate. shfmt stays out of the blocking path because shell has no canonical formatting style, and forcing tabs-vs-spaces would impose a contested choice. Both the hook and the githook are shellcheck-clean against their own rule. I extended the Makefile test target to discover languages/*/tests/*.bats, so the bundle's 8 hook tests run with the rest of the suite. The README bundle table was stale, listing elisp only. I corrected it to the five bundles now shipping.
* feat(install-lang): seed a neutral CLAUDE.md when a bundle ships noneCraig Jennings6 days1-0/+6
| | | | | | | | | | install-lang only seeded CLAUDE.md if the chosen bundle shipped one. elisp and go do, python and typescript don't. A project installing a template-less bundle got no CLAUDE.md, and a multi-bundle install inherited whichever bundle shipped one. A bash project that installed elisp and python ended up headed "Elisp project," worse than no header. I added a language-neutral default (languages/default-CLAUDE.md) that names no language, so single-language, multi-bundle, and wrong-bundle installs all get an accurate "fill this in" header instead of a false one. Per-bundle templates still win where present. The seed-on-first-install, no-overwrite logic is unchanged. I hardened the Makefile LANGUAGES glob to directories only so the new template file doesn't show up as a selectable language. lint covers the default. The install-lang tests cover the fallback, the bundle-wins branch, and no-overwrite. A bash bundle is still the real gap for shell-heavy projects, filed as a backlog task.
* docs: file flashcard, host-identity, and coverage-location backlog tasksCraig Jennings8 days1-0/+36
| | | | Files the remaining inbox proposals as prioritized rulesets tasks, with their design docs preserved under docs/design: the Anki #+TITLE deck-name bug (edited code ready), the apkg to org-drill converter, flashcard-stats refutation mode, an archsetup host-identity guard, the coverage-summary install-location question, and an optional tooling-path enumeration hook.
* chore: archive completed tasks to ResolvedCraig Jennings8 days1-32/+27
|
* chore: break wrap-up routing into implementation tasksCraig Jennings9 days1-1/+24
|
* docs: spec-response wrap-up routing — redesigned to inbox-send delivery, ReadyCraig Jennings9 days1-6/+3
| | | | Folded the spec-review in. The router now delivers each routable keeper to the destination's inbox via inbox-send and lets that project's own process-inbox file it, instead of a new atomic cross-repo todo.org move. Superseded D2 (move helper) and D3 (hand-stamped provenance, now inbox-send's for free); added D7 (inbox-send delivery), D8 (ROUTE_CANDIDATE marker stamped at process-inbox file time), D9 (local source removal with the reject flow as undo). Rewrote summary, goals, mechanics, phases, and acceptance to match. Decisions [9/9], status Ready. Review file consumed and removed.
* chore: record KB-contribution feature as shippedCraig Jennings9 days1-3/+4
|
* docs: level-2 VERIFY completes task-shaped, not as a dated headerCraig Jennings9 days1-3/+6
| | | | 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.
* docs: capture ntfy, flashcard, and triage phone-push proposalsCraig Jennings9 days1-8/+21
| | | | 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.
* chore: reorder rulesets open-work tasksCraig Jennings13 days1-36/+36
|
* chore: park ai-launcher dotfiles-discovery change for reviewCraig Jennings14 days1-0/+10
| | | | 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.
* docs: spec autonomous-batch execution and KB contributionCraig Jennings14 days1-117/+133
| | | | | | 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.
* chore: triage inbox (park Phase E proposal, file KB-encouragement task)Craig Jennings14 days1-0/+20
| | | | 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.
* chore: task audit (reconcile open work, demote 2 skill designs)Craig Jennings14 days1-12/+12
| | | | 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.
* chore: process inbox (file fix-speedrun task, clear pearl acks)Craig Jennings14 days1-0/+12
| | | | 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.
* feat(triage): add auto mode for unattended monitoringCraig Jennings14 days1-0/+2
| | | | | | | | | | 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.
* chore(todo): file spec storage + lifecycle-status proposal as a taskCraig Jennings2026-06-151-0/+20
| | | | | | 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.
* chore(ai): archive session record, note helper-instance resume planCraig Jennings2026-06-151-8/+9
|
* chore(todo): checkpoint helper-instance — detection+contract done, wiring nextCraig Jennings2026-06-151-0/+18
|
* feat(ai): add agent-roster detection script with testsCraig Jennings2026-06-151-1/+1
| | | | | | | | 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.
* feat(hooks): title sessions host-project with a hyphen, no spaceCraig Jennings2026-06-131-2/+3
| | | | 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.
* chore(todo): file session-title-format task routed from roam inboxCraig Jennings2026-06-131-0/+7
|
* docs(design): resolve wrap-up routing spec decisions (Reading B)Craig Jennings2026-06-131-2/+2
| | | | | | | | 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.
* docs(design): draft wrap-up routing specCraig Jennings2026-06-131-11/+3
| | | | | | | | 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.
* docs(design): capture wrap-up inbox/transcript routing proposalCraig Jennings2026-06-131-0/+17
| | | | | | 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.
* chore: file the cancelled archive-done task to ResolvedCraig Jennings2026-06-121-9/+8
|
* chore: cancel the archive-done count bug as cannot-reproduceCraig Jennings2026-06-121-8/+5
| | | | | | 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.
* chore: conform the task list to the Priority Scheme headerCraig Jennings2026-06-121-7/+10
| | | | 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.
* chore: archive session record, file done work, and log a cleanup bugCraig Jennings2026-06-121-109/+115
| | | | 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.
* chore: resolve the new-projects-as-areas question in the task listCraig Jennings2026-06-121-2/+4
|
* docs(spec): close the helper-spec review cycle on the second passCraig Jennings2026-06-121-1/+4
| | | | 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.
* chore: record memory-sweep results and file overnight handoffsCraig Jennings2026-06-121-0/+6
|