aboutsummaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
* chore: archive session record + todo cleanupHEADmainCraig Jennings12 hours2-38/+109
| | | | | | 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 Jennings14 hours6-43/+40
| | | | :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.
* feat(tasks): make cross-project dependencies bidirectionalCraig Jennings14 hours5-6/+60
| | | | | | | | The :blocked: tag only marked the waiting side, so a blocker could stay unaware it was holding up another project: the dependency was visible to the one project that couldn't act on it and invisible to the one that could. This closes that gap. Setting :blocked: now requires a reciprocal inbox-send to the blocker, which files the work with a :BLOCKS: <project>: <what> property on its side. open-tasks.org surfaces :BLOCKS: tasks first, since clearing one unblocks another project (the highest-leverage pick), the mirror of pulling :blocked: tasks out of the cascade. Inbox process mode recognizes the blocking-dependency handoff shape, and the convention documents the resolution flow (drop :BLOCKS:, notify the waiter, who lifts :blocked:). This works for any project pair, since the convention (todo-format.md) and the surfacing (open-tasks.org) live in the shared rule and workflow layer, not in one project. Claude-Session: https://claude.ai/code/session_017PtX1nt1rtYVATuzmzBS4f
* chore(todo): unblock wrap-teardown — .emacs.d companion landedCraig Jennings14 hours1-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 Jennings15 hours1-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
* fix(flashcard): name the Anki deck from #+TITLE, not the filenameCraig Jennings15 hours6-460/+90
| | | | | | | | | | flashcard-to-anki.py's default_deck_name returned the input basename, so a deck built through flashcard-sync (which passes no --deck) was named after the file slug (refutation-drill) instead of the curated #+TITLE the phone deck should read (Refutations). flashcard-review.org already documented the #+TITLE behavior, and the script never matched it. default_deck_name now scans for a #+TITLE line (case-insensitive, trimmed) and falls back to the basename when there's none. Five new tests cover title-drives-name, trimming, case-insensitivity, and the two basename fallbacks. The two old tests that asserted basename-always are replaced. The pre-staged script and test (validated 2026-06-21) applied cleanly red-to-green; their redundant copies are removed and the rationale doc kept. Migration: deck IDs derive from the name, so decks previously built without --deck land as new decks on the next import. Old basename-named decks keep their history and can be deleted by hand. Claude-Session: https://claude.ai/code/session_017PtX1nt1rtYVATuzmzBS4f
* chore(todo): adopt the :blocked: tag and close both task-workflow tasksCraig Jennings15 hours1-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
* feat(task-audit): consolidate related tasks into a merge or parentCraig Jennings15 hours2-0/+30
| | | | | | Reconciliation keeps each task honest on its own, but a single effort fragmented across several tasks (the agent-agnostic work, say) is hard to see and finish as a whole. Adds Phase C.5: read the open-task set, spot semantic clusters by judgment rather than a brittle keyword match, and propose per cluster either a merge (fold same-work members into one) or a parent-with-children grouping (related-but-distinct members). Proposes, never applies, until Craig picks; broader than Phase C's exact-duplicate fold. Claude-Session: https://claude.ai/code/session_017PtX1nt1rtYVATuzmzBS4f
* feat(tasks): surface cross-project dependencies in what's-nextCraig Jennings15 hours3-2/+53
| | | | | | A task can be blocked by work owed by another project, and today it keeps getting recommended as "next" even though it can't move, while the blocker sits at low priority over there and the dependency stalls silently. Adds a :blocked: tag plus a :BLOCKED_BY: <project>: <what> property (todo-format.md) to mark the dependency, and teaches open-tasks.org Next Mode to pull :blocked: tasks out of the cascade pick and surface them in a dedicated "Blocked on other projects" section that names each blocker and offers an inbox-send nudge. Distinct from VERIFY, which waits on Craig rather than another project. Claude-Session: https://claude.ai/code/session_017PtX1nt1rtYVATuzmzBS4f
* docs(todo): file two task-management ideas from the roam inboxCraig Jennings15 hours1-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
* feat(inbox): poll-and-retry the capture-guard instead of bouncingCraig Jennings16 hours6-48/+192
| | | | | | | | | | When a roam edit hits a live org-capture, the guard used to bounce the caller right away (surface to the user, or skip the cycle) even though the capture is usually a few seconds of mid-finalize that clears on its own. capture-guard gets a --wait poll mode: it re-checks every ~10s up to a budget (default 30s, each sleep capped so a short --wait never overshoots), returns the instant the capture clears, and reports blocked only at the deadline. The no-capture common case still returns instantly without sleeping. Roam mode now uses --wait on every write, and the per-caller fallback fires only after the wait: an interactive run surfaces, the auto /loop defers to the next cycle (the loop cadence is the retry), wrap-up skips and self-heals. Surfaced live this session: a transient capture blocked a roam reconcile and had cleared a minute later. Covered by three new bats cases (instant-when-safe, timeout-when-blocked, target-after-flag). Claude-Session: https://claude.ai/code/session_017PtX1nt1rtYVATuzmzBS4f
* chore: task-review pass — stamp 12 tasks, tag two quick+soloCraig Jennings16 hours1-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
* feat(wrap): end the valediction with a "session wrapped." signoffCraig Jennings21 hours2-2/+10
| | | | | | The wrap-up valediction now always ends with "session wrapped." on its own line — a consistent, unmistakable end-of-session marker, since it's the last user-facing output before Step 6's silent teardown. Craig's request via the roam inbox. Claude-Session: https://claude.ai/code/session_017PtX1nt1rtYVATuzmzBS4f
* docs(rules): add a daily-driver machine-sync ruleCraig Jennings21 hours1-0/+49
| | | | | | Craig runs two daily drivers, ratio and velox, that need to stay in sync. The rule prompts every project session to consider whether an important machine-level change (dotfiles, a synced repo's clone or timer, a global config, a one-time bootstrap) needs to reach the other box, and to name the manual step when nothing carries it automatically. It carries the current open instance: the roam.git KB clone plus its roam-sync timer is confirmed on velox and still needs verifying on ratio. Claude-Session: https://claude.ai/code/session_017PtX1nt1rtYVATuzmzBS4f
* docs(todo): resolve helper-instance dependency questionCraig Jennings21 hours1-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 Jennings21 hours2-4/+10
| | | | | | 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 Jennings21 hours3-15/+101
| | | | | | 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
* fix(inbox): stop pulling the roam repo during triageCraig Jennings21 hours4-22/+36
| | | | | | | | | | The roam repo's working tree is dirty most of the time (Craig captures into it constantly, and roam-sync only commits every 15 minutes), so roam mode's pull --ff-only failed on nearly every run and blocked triage. The auto inbox zero loop hit it every cycle. Roam mode now never pulls. The scan reads the working-tree file directly, since that's already the latest local state, and the rare write removes the claimed items in place and then triggers roam-sync to commit and push. roam-sync already commits-first-then-rebases, so it handles the dirty tree, and the ownership partition (only this project touches its own prefixed lines) means its rebase can't conflict on the edit. Trade-off: the roam-repo commit carries roam-sync's generic auto-sync message instead of a descriptive one. The provenance for routed tasks lives in the project's todo.org and session log anyway. Claude-Session: https://claude.ai/code/session_017PtX1nt1rtYVATuzmzBS4f
* feat(wrap): wire the ai-wrap-teardown Stop hook in settings.jsonCraig Jennings22 hours1-0/+10
| | | | | | The hooks/settings-snippet.json doc carried the Stop block, but the live tracked .claude/settings.json (symlinked to ~/.claude/settings.json) needed it too for the teardown to actually fire. Activates next session, when the harness reads hooks. Claude-Session: https://claude.ai/code/session_017PtX1nt1rtYVATuzmzBS4f
* feat(wrap): add session teardown and shutdown to wrap-it-upCraig Jennings22 hours8-5/+324
| | | | | | | | | | | | 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
* fix(elisp): cd to tests/ before the Phase 2 test loadCraig Jennings22 hours1-0/+1
| | | | | | | | Phase 2's plain `-l` load ran emacs from PROJECT_ROOT, so test files that resolve test-bootstrap.el with `(expand-file-name "test-bootstrap.el")` against default-directory couldn't find it and failed with "Cannot open load file". Phase 1 escaped this because byte-compile-file rebinds default-directory to the source file's dir. The cd restores the tests/ working directory the tests/Makefile already runs from. Restores b2e9038, dropped when a consuming project's .claude refreshed to the rulesets canonical, which never carried the fix. Claude-Session: https://claude.ai/code/session_017PtX1nt1rtYVATuzmzBS4f
* feat(inbox): consolidate three inbox workflows into one engineCraig Jennings22 hours29-979/+1023
| | | | | | | | | | | | 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 Jennings23 hours5-6/+515
| | | | | | 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.
* refactor(rules): use agent-neutral language in shared rulesCraig Jennings24 hours4-7/+7
| | | | | | A non-Claude agent (Codex, a local model) reading the shared rules gets told it's "Claude" in prose that's really about whatever agent is running. I replaced the agent-as-actor references — "how Claude communicates," "when Claude needs the user to pick," a "wrong-context Claude session" — with "the agent." Left untouched: file and path names (CLAUDE.md, .claude/, claude-rules/), and every reference in commits.md, which names Claude and Anthropic on purpose as the things never to attribute a commit to. Neutralizing those would invert the rule.
* feat(inbox-zero): sweep empty roam entries on triageCraig Jennings24 hours2-14/+16
| | | | | | An aborted org-capture can leave a heading with no title and no body (just stars and maybe a TODO keyword). Those belong to nobody and were piling up in the shared roam inbox. inbox-zero now buckets them as empty in Phase B and removes them in Phase D in the same edit as the claimed items. An empties-only run still enters Phase D and commits, so the sweep runs on every triage, not only when this project owns something. A heading with any title or body is never touched.
* feat(languages): add bash/shell bundleCraig Jennings24 hours12-5/+542
| | | | | | | | 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 Jennings24 hours7-4/+150
| | | | | | | | | | 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.
* feat(inbox-zero): guard roam-inbox writes against live org-captureCraig Jennings24 hours8-6/+377
| | | | | | | | | | Editing the roam inbox on disk while Emacs has an indirect org-capture buffer cloned from it reverts the base buffer under the capture: the capture can't finalize with C-c C-c, and a freshly-typed item can be lost. inbox-zero Phase D edits that file, which Craig captures into constantly, so the collision recurs every session. I added a capture-guard helper that asks the running daemon whether any CAPTURE buffer's base buffer visits a given file (file-equal-p, so symlinks and path spelling don't matter), exiting non-zero with the names when so. No reachable Emacs or no capture means exit 0, so it never blocks a write that was safe. Phase D calls it before the pull, not only before the remove, because the ff-only pull also rewrites the file on disk and would wedge a capture the same way. On a collision an on-demand run stops and asks Craig to finalize or abort. The wrap-up sub-step skips the roam reconcile without blocking the wrap, since the items are already filed and the next run reclaims them. emacs.md gains the inverse of the reload rule: don't yank a file out from under the daemon's live buffers.
* docs: file flashcard, host-identity, and coverage-location backlog tasksCraig Jennings3 days8-0/+765
| | | | 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.
* docs: extend commit rules to cover tooling-path enumerationCraig Jennings3 days3-3/+5
| | | | The no-attribution rules covered AI credit but not incidental mentions of tooling filenames in commit prose. The case that bit: a .gitignore commit naming .claude, CLAUDE.md, and .ai in its message leaks the tooling layer into a public log. Adds a tooling-path-enumeration ban with that gitignore case named, extends the Before-Committing scan, and adds the missing paths to the protocols keep-out list. Both carry the file-is-the-change and private-single-user-repo exemptions, so a rule edit or a rulesets commit can still name what it touched.
* test(elisp): cover coverage-summary source-file scan and under-dir filteringCraig Jennings3 days1-0/+27
| | | | Adds direct tests for cj/coverage-summary--source-files (non-recursive, subdirectories out of scope) and --under-dir (report entries outside the source dir dropped, survivors re-keyed relative to project root). Both were previously exercised only indirectly through the missing-file tests.
* fix(elisp): exclude generated package files from coverage source scanCraig Jennings3 days2-3/+25
| | | | | | cj/coverage-summary--source-files scanned SOURCE-DIR for *.el and treated every match as testable source. Build tools write NAME-autoloads.el and NAME-pkg.el into that dir, and undercover never instruments them, so the missing-file detection counted each as untested at 0% and dragged the file-weighted project number down. emacs-wttrin read 72.9% instead of 97.2% after eask wrote its autoloads file during a coverage run. seq-remove the generated files before returning. A genuinely untested source is still flagged. The new test asserts both.
* refactor: fold spec review findings into the spec itselfCraig Jennings3 days8-200/+146
| | | | | | | | The spec-review/spec-response pair wrote findings to a sibling <spec>-review.org file that spec-response deleted once processed. The deletion left the iteration-history Artifacts line dangling and dropped the verbatim review. Keeping the file instead collided with spec-response's file discovery and its "no review files remain" done-condition. Findings now live in the spec under a * Review findings section as TODO tasks with a [/] cookie, the same shape * Decisions already uses. The reviewer records findings there. The responder completes each in place (accept and modify finish DONE, reject finishes CANCELLED with the reason), and the readiness rubric gates on the cookie. A scope-expanding response re-runs the rubric and files any new obligation as a finding or decision before claiming Ready, because resolving every finding can still introduce unreviewed assumptions. Also folds in two reviewer-practice principles: keep review and response roles explicit, and cite the source for external-dependency facts in a finding. Updates spec-create.org and the workflow INDEX so the trio describes one convention.
* chore: sync inbox-zero.org mirror from canonicalCraig Jennings3 days1-10/+22
| | | | The canonical and mirror copies of inbox-zero.org were committed out of sync; the mirror lagged the canonical's two-inbox revision. Bring the mirror up to match.
* docs: have inbox-zero check project handoffsCraig Jennings3 days1-10/+22
|
* chore: archive completed tasks to ResolvedCraig Jennings4 days2-32/+137
|
* chore: break wrap-up routing into implementation tasksCraig Jennings4 days1-1/+24
|
* docs: spec-response wrap-up routing — redesigned to inbox-send delivery, ReadyCraig Jennings4 days3-219/+72
| | | | 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.
* docs: spec-review wrap-up routing — inbox-route supersedes direct-moveCraig Jennings4 days2-1/+178
| | | | Reviewed the approved wrap-up routing spec; rubric Not ready, two blocking findings. The central one: route keepers via the existing inbox-send path to the destination's inbox and let its own process-inbox file them, rather than the spec's new atomic cross-repo todo.org move. inbox-send already provides the provenance the direct-move design reinvents, the destination files through its own value gate, and a verified precondition (chime and yt-sync have inbox/ but no todo.org) reverses the spec's assumption. Second finding pins the candidate-set marking to a tag stamped at process-inbox file time. Review file carries the analysis and drop-in implementation tasks.
* chore: record KB-contribution feature as shippedCraig Jennings4 days1-3/+4
|
* feat(lint-org): flag level-2 dated headers as a completion defectCraig Jennings4 days5-0/+107
| | | | A `** <YYYY-MM-DD> …` 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).
* feat(kb): wire consult + contribute KB prompts into the workflowsCraig Jennings4 days9-9/+72
| | | | Recent session receipts read "promoted 0 / consulted no" across the board: the wrap-up KB-promotion check existed but fired too late, and nothing surfaced existing lessons to read. This adds the spec's four light prompts plus the read-side step it was missing. Startup gets two Phase C nudges (gated on the roam clone): a consult line listing project-relevant node titles, and a contribute line pointing at the best-practices node. Triage-intake and inbox-zero get a conditional end-of-flow capture reminder that fires only on real signal. Wrap-up gets an early reflection prompt at the top of Step 1 that feeds the existing receipt, so learnings are captured while fresh instead of reconstructed after the Summary. Ratifies the spec's five decisions and adds D6 (the read-side surfacing).
* docs: level-2 VERIFY completes task-shaped, not as a dated headerCraig Jennings4 days5-29/+46
| | | | 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 Jennings4 days7-8/+1202
| | | | 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.
* feat(ai): discover ~/.dotfiles in the launcher pickerCraig Jennings4 days3-48/+1
| | | | build_candidates() only scanned ~/.emacs.d, ~/code/*, and ~/projects/*, so ~/.dotfiles (a bootstrapped AI project living directly in $HOME) never showed in the launcher picker. I added it as an explicit candidate next to ~/.emacs.d. The maybe_add_candidate guard keys off .ai/protocols.org, so the line stays inert where ~/.dotfiles isn't bootstrapped.
* docs: approve wrapup-routing spec for implementationCraig Jennings8 days1-0/+4
|
* chore: reorder rulesets open-work tasksCraig Jennings8 days1-36/+36
|
* chore: drop pinned opus model from Claude configCraig Jennings8 days1-1/+0
|
* refactor: remove unused cross-agent-comms subsystemCraig Jennings8 days50-7916/+214
| | | | Nothing used the cross-agent message system (send/recv/watch/status/discover/halt/resume over the inbox/from-agents/ file-IPC protocol). Every cross-project handoff goes through inbox-send instead. I removed the scripts, READMEs, workflow, tests, INDEX entry, the three startup.org wirings, and the legacy bin symlinks, then repointed helper-mode's escalation to inbox-send and noted the removal in the generic-agent-runtime spec.
* chore: park ai-launcher dotfiles-discovery change for reviewCraig Jennings9 days3-0/+58
| | | | 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.