aboutsummaryrefslogtreecommitdiff
path: root/todo.org
Commit message (Collapse)AuthorAgeFilesLines
* feat(sync): never let untracked or gitignored files block template updatesCraig Jennings33 hours1-1/+4
| | | | | | Projects were falling behind on templates because somebody sent them a task: an untracked inbox drop read as a dirty tree to the stricter gates. The policy is now stated where the gates live: dirty means tracked modifications only, and untracked or gitignored files never block a template pull, a fast-forward, or a monitoring gate. The audit found one offender. The inbox monitor's precondition used bare porcelain, counting the very drops it exists to process. It now checks tracked changes only, which is safe because the per-item commit already stages explicitly. The rsync WIP-guard keeps counting untracked files inside the synced source paths on purpose, since a half-written template is exactly the WIP it holds back.
* feat(rules): add the host-identity guard rule and startup probeCraig Jennings33 hours1-1/+4
| | | | | | A tracked or synced doc asserting "this machine is X" is false on every machine but its origin, and an agent trusting it reasons backwards all session. It happened live: a stale "ratio" claim steered a session running on velox. The new rule bans fixed identity claims in tracked/synced docs and requires the runtime derivation instead (uname -n, since the hostname binary is often absent). Describing the fleet stays legal. Claiming the current member doesn't. startup gained a read-only probe that greps CLAUDE.md and notes.org for the pattern and surfaces hits as a judgment flag, never a block. Fixture-verified under bash and zsh.
* feat(docs): convert spec-target file links to id formCraig Jennings33 hours1-87/+34
| | | | | | All 13 file:docs/specs/ links lived in todo.org. Eleven converted directly. The two carrying a Review-findings search target now point at a new :ID: minted on that heading, since the id index scans whole files and heading-level ids stay rename-safe. The residue grep is zero and every id resolves to its target's :ID:. The commit also carries the routine archive sweep of freshly-closed tasks and the speedrun pre-flight answer stamps.
* chore(tasks): file two roam items and ungate the id-link conversionCraig Jennings37 hours1-2/+10
| | | | The id-conversion task's gate cleared: the org-id index for docs/specs landed upstream and a live org-id-find resolves the docs-lifecycle spec. Filed from the roam inbox: template sync passing gitignored-only changes, and the wrap-it-up summary keep-or-cut think-through.
* feat(backlog): add the metrics synthesis step to org-roamCraig Jennings37 hours1-2/+2
| | | | | | "synthesize backlog metrics" reads the JSONL union across personal projects and computes the per-run rollups, the trends, and the corrections signal (a later revert or fix touching an autonomous commit's files within ~14 days, a flag for review rather than a conviction). It writes one :agent:metrics: KB node linking back to prior synthesis nodes. Work and unknown projects are excluded by the denylist classification and reported per the refusal contract. The step is read-only over the logs plus the single KB write. It never mutates the JSONL, todo.org, or any project tree.
* feat(backlog): add the per-task JSONL metrics recordCraig Jennings37 hours1-2/+2
| | | | | | One record per task at outcome time, appended to the project's .ai/metrics/work-the-backlog.jsonl. The field table follows the spec, with commit_sha called out as the corrections-signal key and comma-separated when a task decomposes into several commits. A failed append warns in the run summary but never blocks or aborts the run. I added the "failed" outcome the spec's error-handling section required but its enum missed: a mid-implementation failure leaves the tree working, gets surfaced, and the run continues.
* feat(backlog): flesh the defer mechanics, pre-flight Q&A, and pageCraig Jennings37 hours1-2/+2
| | | | | | | | The defer checklist gained its filing mechanics. A deferral VERIFY now dedups against an existing sibling before filing, since the deferred task stays TODO and every later run would otherwise re-file. Placement, heading, and body follow the todo conventions. A quick-question gap routes to the pre-flight Q&A only under the speedrun preset, and only for one-line factual or preference picks. Three or more questions means the task is underspecified and files instead. The data-loss item never routes to the Q&A. The batch-ask is one message with recommendation-first numbered options, and answers land as dated lines in the task bodies before the run starts. The page fires exactly once, on set-done or cap-hit, via notify --persist.
* feat(backlog): pin the commit-autonomy waiver and its degrade contractCraig Jennings37 hours1-2/+2
| | | | | | The waiver is now a machine-read marker: ":COMMIT_AUTONOMY: yes" in notes.org's Workflow State, with ":LOOP_MAY_COMMIT: yes" as the separate grant for the unattended loop. An absent or non-yes marker reads as no, and the read is a fresh grep each run, never memory. A caller requesting autonomous-commit without the marker degrades to file-only, surfaced in both the run intro and the summary. I stamped rulesets' own :COMMIT_AUTONOMY: and left :LOOP_MAY_COMMIT: ungranted. Letting the recurring loop commit unattended is a separate trust decision.
* feat(backlog): wire the two callers into work-the-backlogCraig Jennings37 hours1-2/+2
| | | | | | | | inbox.org's auto mode regains its "run this batch next?" ask, now chaining into work-the-backlog as an explicit second step after routing: the eligibility query over the queued batch, file-only, paging off, cap 1. Startup and wrap-up still never execute. The no-approvals speedrun lands as the named preset: an explicit ordered list run under autonomous-commit + always-push + paging-on, every approval front-loaded into the seven-step pre-flight. Any phrase containing "speedrun" routes to the preset, with disambiguation notes in no-approvals.org and the index. The finer Q&A mechanics land with Phase 4. I scoped the chain's task set to the queued batch rather than all of todo.org. The ask is "run this batch next?", and a batch-yes running an unrelated higher-priority task would be surprising.
* feat(backlog): extract the execution loop into work-the-backlog.orgCraig Jennings37 hours1-2/+2
| | | | | | work-the-backlog.org now owns the autonomous execution loop: the mechanical eligibility gate, the four-item defer checklist, the per-task quality bar, and the run-cap kill switch, fed a task set, session mode, and cap by its callers. I stubbed the pre-flight Q&A, waiver read, end-of-set page, and metrics record with pointers to their phases. inbox.org's auto mode drops its execute step. Per-cycle item 3 routes and queues only, so the loop has one home. This is Phase 1 of the autonomous-batch execution spec.
* docs(spec): decompose the speedrun build into phase tasks; flip to DOINGCraig Jennings38 hours1-0/+28
| | | | spec-response pass on the autonomous-batch execution spec: the build parent carries the :SPEC_ID: binding, Phases 1-6 are broken out as tasks alongside the live-trial validation and the flip-to-IMPLEMENTED task, and the spec's status heading is DOING with the Metadata mirror updated.
* feat(routing): wire the wrap-up cross-project router end to endCraig Jennings38 hours1-8/+2
| | | | | | | | | | This closes the build half of the wrap-up routing spec: Phases 2 and 4 here, with the engine and discovery already shipped. inbox.org's "File as TODO" disposition now runs route_recommend on each keeper and stamps :ROUTE_CANDIDATE: <destination> on strong and weak matches, so the wrap-up router has a candidate set without ever scanning the standing backlog. wrap-it-up.org Step 3 gains the optional router after the inbox sanity check, with the gate-vs-optional split named in the prose: surface the batch with destinations and confidence labels, then go or skip. An empty set stays silent. The go path is mechanical rather than prose-driven: the new route-batch helper lists candidates read-only, and on go extracts each subtree (children ride along, markers stripped, headings promoted), delivers it via inbox-send for provenance, and removes the local copy only after a successful send, rewriting todo.org per send so a crash never strands an already-sent task locally. Overlapping candidate spans (a tagged child inside a tagged parent) are a loud conflict, left in place with a non-zero exit, because routing either span would silently take the other along. A 13-test bats suite covers list/backlog exclusion, empty-set silence, delivery with provenance and children, promotion, drawer pruning, the no-todo.org destination, failed-send recovery with the marker intact, the nested-candidate conflict, and duplicate-marker dedupe. cross-project.md notes the router as a sanctioned cross-project write path.
* feat(startup): add the spec-sort nudge; notify .emacs.d the convention is liveCraig Jennings38 hours1-2/+2
| | | | | | | | The Phase A batch gains a read-only probe that prints one line when a project has an unsorted docs pile (a docs/design/ or stray docs/*-spec.org files) and no :LAST_SPEC_SORT: marker. Phase C surfaces the "run spec-sort" offer when the probe fired and stays silent otherwise. The stray-root check uses find instead of the spec's compgen sketch: compgen is bash-only and zsh aborts on an unmatched glob, so the original snippet false-negatived on stray root specs under zsh. The spec's snippet is updated with a note, and the probe is fixture-verified in both shells across the four project shapes. I also fixed startup.org's reference to the encourage-kb-contribution spec's pre-pilot path and sent .emacs.d the convention-live note with the id-index ask.
* docs(specs): pilot the spec-sort retrofit on rulesets' own pileCraig Jennings38 hours1-14/+14
| | | | Five specs moved to docs/specs/ with confirmed lifecycle keywords: agent-knowledge-base IMPLEMENTED (with the stated reason in its history line), inbox-workflow-consolidation READY, autonomous-batch-execution READY, encourage-kb-contribution READY, and wrapup-routing DOING. spec-sort recomputed twelve todo.org links and the moved specs' own outbound links, and stamped :LAST_SPEC_SORT:. The status board now answers "what's live" in one grep. The four -spec.org-named files in docs/design without a spec spine stay put as notes.
* feat(spec-sort): add the docs-pile retrofit helperCraig Jennings38 hours1-2/+2
| | | | | | | | spec-sort is Phase 2 of the docs-lifecycle build. It proposes the sort (spine-predicate classification, an evidence panel per candidate, a conservative keyword proposal) and a human confirms every move with --confirm/--skip. Terminal states need an explicit --reason, recorded in the status history. --apply is fail-safe. It refuses a dirty worktree, validates then writes from a recorded plan file, names applied and not-applied work with a git restore recovery recipe on mid-apply failure, and exits non-zero on post-apply residue. Moves land in docs/specs/ with the -spec.org suffix, a status heading carrying :ID: and a dated history line, and the two-sequence keyword header. file: links across the project-owned roots are recomputed, including a moved doc's own outbound links. Session archives and synced template paths are reported, never rewritten, with the canonical claude-templates file named. A successful run stamps :LAST_SPEC_SORT: in .ai/notes.org. The 33-test bats suite is glob-discovered by make test. A dry run against rulesets' own pile matches the expected five candidates.
* feat(docs-lifecycle): add the lifecycle rule and wire the spec workflowsCraig Jennings39 hours1-2/+2
| | | | | | Phase 1 of the docs-lifecycle build. claude-rules/docs-lifecycle.md captures the shape: formal-vs-notes location split (docs/specs/ vs docs/design/), an authoritative org-keyword status heading with dated history and an :ID: UUID, the two-sequence keyword header that keeps decision cookies computing, named owners for every transition, and the one-grep status board. The four workflows each take their piece: spec-create emits into docs/specs/ and stamps DRAFT in the template; spec-review checks location (legacy spots stay reviewable until :LAST_SPEC_SORT: is stamped) and owns the DRAFT-to-READY flip plus the demote path; spec-response owns READY-to-DOING at decomposition, stamps :SPEC_ID: on the build parent, and always emits the flip-to-IMPLEMENTED task; task-audit reconciles DOING specs against their bound parent's keyword.
* docs(spec): decompose docs-lifecycle build into phase tasks; flip to DOINGCraig Jennings39 hours1-0/+35
| | | | The build parent carries the :SPEC_ID: binding, one task per phase plus the id-conversion follow-up, the tracked flip-to-IMPLEMENTED task, and a manual-testing child — the first live exercise of the spec's own transition-ownership table.
* docs(spec): record reviewer READY flip on the docs-lifecycle specCraig Jennings39 hours1-0/+3
|
* docs(spec): fix the five re-review findings in the docs-lifecycle specCraig Jennings40 hours1-0/+6
| | | | Canonical placement contract for every synced artifact of the feature; a :SPEC_ID: property binds a spec to its build parent so task-audit can police DOING specs by the parent's keyword; spec-sort --apply gains a fail-safe contract (clean-tree preflight, validate-then-write from a recorded plan, named recovery); id-link conversion is staged behind the executable .emacs.d id-index mechanism so no unclickable-link window exists; status confirmation is evidence-based with terminal states requiring a stated reason. Status stays DRAFT pending reviewer sign-off.
* docs(spec): fix all nine dual-review findings in the docs-lifecycle specCraig Jennings40 hours1-0/+9
| | | | Two independent reviews converged on the same blocker: the lifecycle keyword line replaced TODO/DONE, silently breaking the decision-task cookies — the spec's own [5/5] was hand-faked. The header is now two collision-free sequences and org computes the cookies. Also fixed: every status flip has a named owner (spec-response emits a tracked flip-to-IMPLEMENTED task, task-audit reconciles as the safety net), one classification predicate, spec-sort renames to -spec.org, an explicit relink data-safety contract, the .ai/notes.org marker + startup probe contract, a legacy-location grace rule so no spec is unreviewable mid-transition, the org-id resolution prerequisite, and the three-line transition definition.
* feat(docs): draft the docs-lifecycle spec from the settled decisionsCraig Jennings40 hours1-1/+4
| | | | Location split (docs/specs/ vs docs/design/), org-keyword status on a prepended top-level status heading (DRAFT READY DOING | IMPLEMENTED SUPERSEDED CANCELLED), org-id cross-doc links, a general docs-lifecycle rule, and a confirmed spec-sort retrofit with a startup nudge. The spec is the first resident of docs/specs/ and carries its own status heading. Status DRAFT pending review.
* feat(tags): hard :solo:/:quick: definitions + mandatory review/audit assessmentCraig Jennings40 hours1-0/+3
| | | | | | Phase 0 of the autonomous-batch (speedrun) build. todo-format.md now carries fixed cross-project definitions: :solo: is the autonomy/eligibility tag (buildable, agent-verifiable, no design deliberation — at most one or two quick upfront-answerable decisions, which the speedrun pre-flight Q&A batches), and :quick: is a ≤30-minute effort hint that never gates eligibility. task-review and task-audit now treat the tag assessment as mandatory — a pass that skips it is incomplete. task-review's :solo: gate 3 also moves from "no upfront decision" to the no-deliberation form: the stricter wording predated the pre-flight Q&A decision and would have wrongly excluded tasks with a quick answerable question.
* docs(todo): close wrap-teardown feature — manual validation passed all ↵Craig Jennings40 hours1-31/+4
| | | | five tests
* docs(todo): log validation evidence for wrap-teardown and agent-KB checksCraig Jennings41 hours1-0/+6
|
* chore: file KB orphan-review task; stamp inbox-process markerCraig Jennings41 hours1-0/+6
|
* chore: shed the Resolved backlog to task-archive.org on first aging runCraig Jennings3 days1-1670/+0
| | | | The new --archive-done aging step's first run on this repo moved 58 closed subtrees older than seven days out of todo.org's Resolved section into archive/task-archive.org, leaving the last week in-file. Confirms the feature end to end: this repo tracks its todo file, so the archive is tracked and no gitignore entry was added.
* docs(daily-drivers): mark cross-machine roam-sync confirmed on both driversCraig Jennings3 days1-1/+4
| | | | | | | Verified ratio over tailscale: the roam clone and roam-sync timer are live and syncing, matching velox. That closes the one-time per-machine setup, so the standing open-instance note is cleared. The memory-sync task's only remaining item is its manual-validation child, which needs a live cross-project session.
* docs: revise and ratify the no-approvals speedrun specCraig Jennings4 days1-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 Jennings5 days1-1/+1
|
* chore(todo): reconcile tasks and cluster the flashcard toolingCraig Jennings5 days1-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 Jennings5 days1-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 Jennings5 days1-4/+4
| | | | spec to [#D]
* chore: archive session record + todo cleanupCraig Jennings9 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 Jennings9 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 Jennings9 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 Jennings9 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 Jennings9 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 Jennings9 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 Jennings9 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 Jennings10 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 Jennings10 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 Jennings10 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 Jennings10 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 Jennings10 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 Jennings10 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 Jennings10 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 Jennings10 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 Jennings12 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 Jennings12 days1-32/+27
|
* chore: break wrap-up routing into implementation tasksCraig Jennings13 days1-1/+24
|