aboutsummaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
* feat(inbox): poll-and-retry the capture-guard instead of bouncingCraig Jennings8 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 Jennings8 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 Jennings13 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 Jennings13 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 Jennings13 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 Jennings13 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 Jennings14 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 Jennings14 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 Jennings14 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 Jennings14 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 Jennings15 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 Jennings15 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 Jennings15 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 Jennings16 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 Jennings16 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 Jennings17 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 Jennings17 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 Jennings17 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 Jennings3 days2-32/+137
|
* chore: break wrap-up routing into implementation tasksCraig Jennings3 days1-1/+24
|
* docs: spec-response wrap-up routing — redesigned to inbox-send delivery, ReadyCraig Jennings3 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 Jennings3 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 Jennings8 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.
* docs: spec autonomous-batch execution and KB contributionCraig Jennings8 days3-117/+650
| | | | | | 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 Jennings9 days4-0/+249
| | | | 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 Jennings9 days2-13/+13
| | | | 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 Jennings9 days3-1/+34
| | | | 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.
* fix(audit): exclude retired projects from the sync target listCraig Jennings9 days2-0/+21
| | | | The audit's project discovery uses find -maxdepth 3, which reaches ~/projects/.retired/<name>/.ai — one level deeper than a live project — so shelved projects were getting template syncs they should never receive. Skip any project under a .retired/ ancestor explicitly, so the exclusion holds regardless of the find depth.
* feat(triage): add a per-sweep timestamp to auto mode outputCraig Jennings9 days3-4/+18
| | | | | | Auto-mode sweeps now end with the date, time, and timezone on their own final line, so an away reader gauges each summary's freshness at a glance without computing it. The stamp prints on every sweep, including a quiet "no changes" one — there the stamp is the proof the loop ran. Same-day addendum to the work-project auto-mode proposal.
* feat(triage): add auto mode for unattended monitoringCraig Jennings9 days4-0/+201
| | | | | | | | | | 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.
* feat(inbox): define monitor-inbox as a 15-min loop with clean-tree gatesCraig Jennings9 days6-50/+116
| | | | | | | | | | Redefine "monitor the inbox" as the explicit behavior Craig wants: run one process-inbox pass now, then loop process-inbox every 15 minutes. The 15-minute loop was previously an opt-in background recipe; it's now the defined meaning of the phrase. Gate the workflow at both ends on a clean worktree and a green full-suite run. Starting on a dirty tree lets the per-item auto-commit sweep up unrelated changes; starting on a red suite hides whether the monitor broke anything. On a dirty tree, offer to commit in discrete batches; on a red suite, offer to investigate — never start until both are satisfied, and leave the tree clean and green when the loop stops. Add the no-approvals execute criteria: an accepted item self-applies only when agreed (passed the value gate and Skeptical Review), quick (under ~15 min including verification), and solo (no decision needed from Craig). All three commit and push at the end of the item; miss any and it files or, for shared-asset and convention changes, parks. Broaden the Skeptical Review to run on every arriving task and file, not only shared-asset proposals — a core right/complete/simpler pass on everything, with the cross-project battery added for changes that sync to consuming projects.
* chore(todo): file spec storage + lifecycle-status proposal as a taskCraig Jennings9 days2-0/+64
| | | | | | 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 Jennings9 days2-8/+70
|