aboutsummaryrefslogtreecommitdiff
path: root/todo.org
Commit message (Collapse)AuthorAgeFilesLines
* chore: archive completed tasks and close out the day's recordsCraig Jennings14 hours1-185/+5
| | | | The archive sweep moves the finished routing feature and the cancelled ntfy proposal into Resolved, todo.org carries the day's review stamps and dated build entries, and the session record lands under its dated name.
* chore(todo): finish the task review — full backlog now currentCraig Jennings14 hours1-9/+21
| | | | Eleven tasks reviewed: the ntfy two-way-comms proposal is CANCELLED (home tore that channel down on 07-04; the Signal pager task and agent-page are its living successors), the triage-intake phone-push task is re-pointed at agent-page so its send half is buildable now, coverage-summary's docs-only remainder gained quick and solo tags, and the rest were confirmed as-is. Zero top-level tasks remain unreviewed.
* feat(launcher): bare ai picks the agent before the projectsCraig Jennings14 hours1-0/+3
| | | | The interactive flow now opens with a runtime picker: claude first (Enter-Enter preserves the old two-keystroke habit), codex labeled as ChatGPT, and one local:<model> line per ollama model, queried live with a short timeout so a dead server just drops those lines. The pick feeds the existing runtime map, then the annotated project multi-select runs as before. --runtime and AI_RUNTIME skip the question, single-directory mode is unchanged, and --print-runtimes exposes the choice list for the two new bats tests.
* feat(launcher): wire the local runtime — codex --oss over ollamaCraig Jennings14 hours1-0/+3
| | | | ai --runtime local now launches codex against the machine's ollama (explicit --local-provider=ollama, model from AI_LOCAL_MODEL, default gpt-oss:120b). Verified end to end with a codex exec completion through the local model. The dependency check probes AGENT_BIN now that AGENT_CMD carries flags. This makes codex-over-ollama the de-facto answer to the runtime spec's first-supported-local-CLI blocker.
* chore(todo): record the verified local-inference stack on the model-floor taskCraig Jennings17 hours1-1/+3
| | | | ollama 0.31.2 with the Vulkan backend forced by systemd override (ROCm first-touch loads were unusable at under 25 MB/s), gpt-oss:120b and qwen3-coder:30b verified at 37.9 and 76 tok/s on 100% GPU, four legacy dense models dropped, the orphaned user store purged. The child's remaining work is purely the instruction-following evaluation.
* feat(pager): add agent-page, the runtime-neutral phone pagerCraig Jennings19 hours1-0/+6
| | | | The Signal pager reconcile found one pager identity, registered in velox's signal-cli, reachable from other machines only by hand-rolled ssh. agent-page wraps that: direct signal-cli on velox, ssh relay over the tailnet from everywhere else, a desktop-fallback hint when the relay fails, and the UUID target baked in so nobody pages the unregistered phone number again. Four bats tests stub ssh/uname/signal-cli to verify command construction; the real path was verified with a live phone push today. protocols.org's Paging Craig section now teaches both channels (notify for the desk, agent-page for the phone) and demotes signal-mcp to a velox-local nicety; page-me.org, work-the-backlog, and the INDEX carry the same two-channel story. Every project inherits on its next startup sync and make install.
* chore(todo): task-review batch of seven, plus the roam-capture filingsCraig Jennings20 hours1-2/+20
| | | | Signal pager re-graded C to B: the runtime-portability inventory showed the claude.ai-side signal-mcp is the only paging path, home currently has no live channel at all, and off-Claude agents have none, so the doc-and-reconcile task now gates real capability rather than tidiness. install-ai-on-PATH tagged quick and solo. The launcher-hardening task and the agent-switching fold-in came from today's roam capture. The other five reviewed tasks were confirmed as-is.
* docs(runtime): session plumbing assessed, no build neededCraig Jennings21 hours1-2/+2
| | | | session-context-path already carries a runtime segment, the anchor cycle is plain files, and self-inject is harness-agnostic with only its payload Claude-shaped. A codex auto-flush is a documented payload variant whose second injected line carries the resume instruction, replacing the SessionStart hook. Wire it when a codex session first wants it.
* feat(launcher): add ai --runtime for choosing the agent CLICraig Jennings21 hours1-2/+4
| | | | The ai launcher can now start codex sessions: --runtime claude|codex (or AI_RUNTIME), a runtime-to-CLI map with local reserved behind a clear error until the local-model evaluation picks a CLI, and a runtime-aware dependency check. A new --print-launch mode prints the pane launch command without touching tmux or fzf, and is the seam the six new bats tests drive. Both current CLIs take the opening line as a positional prompt, so only the command name varies.
* feat(runtime): add the thin-pointer AGENTS.md agent entry fileCraig Jennings21 hours1-3/+6
| | | | claude-templates/AGENTS.md points any harness at protocols.org, the rules locations, and the /name-to-file resolution rule, and tells it to degrade per each rule's documented fallback instead of skipping gates. make install links it to ~/.codex/AGENTS.md (new CODEX_DIR stanza) and install-ai.sh seeds a project-owned copy at bootstrap, never overwriting an existing one. The rulesets root carries a tracked symlink as dogfood. Five new bats tests cover the link idiom and the seeding. This resolves the generic-instruction-file blocker from the runtime spec, and velox picks up the global link on its next session's make install.
* docs(runtime): skill parity resolves to one bootstrap resolution ruleCraig Jennings23 hours1-2/+2
| | | | All 29 skill and command bodies are markdown, so a single sentence in the future non-Claude entry file (a /name reference resolves to the skill or command file, read and follow it) carries the whole library. Auto-invocation degrades to by-name, which the publish flow already uses. flush stays Claude-only, owned by the session-plumbing child.
* feat(runtime): complete the hook, MCP, and memory portability inventoriesCraig Jennings23 hours1-6/+12
| | | | The new inventories doc maps what's actually Claude-bound. Hooks: only PreCompact and Stop-teardown carry porting decisions, both now decided (prose downgrade, Codex notify or manual). MCP: everything ports mechanically except paging, since signal-mcp exists only claude.ai-side, so the Signal-pager task gains runtime portability as a second motivation. Memory: the KB is already the cross-agent store, and knowledge-base.md now tells agents without harness memory to capture into the session log. Three inventory child tasks closed as dated entries under the generic-agent-runtime parent.
* chore(todo): file runtime-portability child tasks and stamp a reviewCraig Jennings24 hours1-0/+28
| | | | Eight child tasks under the generic-agent-runtime parent decompose what's left to run a non-Claude agent (Codex-style or local LLM) in this system: instruction bootstrap, skill parity, hook parity, launcher flag, session plumbing, memory story, MCP portability, local model floor. Each names the spec blocker decision it feeds. Also stamps the build-to-prototype task's review.
* chore(todo): fold home's Signal-pager status into the pager doc taskCraig Jennings25 hours1-0/+3
|
* chore(todo): archive completed tasks, file build-to-prototype follow-upCraig Jennings3 days1-109/+6
|
* chore(todo): file three rulesets ideas from the roam inboxCraig Jennings3 days1-0/+18
|
* chore: file processed inbox handoffs and add two backlog tasksCraig Jennings3 days1-0/+18
|
* chore(todo): archive three audit-closed tasks to ResolvedCraig Jennings10 days1-183/+180
|
* chore(todo): close three tasks the audit confirmed doneCraig Jennings10 days1-21/+28
| | | | | | | | | | The audit found three tasks code-complete with only validation left, so I closed each and flipped its spec to IMPLEMENTED: - Docs-lifecycle convention: all four build phases plus the file-to-id link conversion had shipped. Manual validation and the org-agenda vNext moved out to their own tasks. - Wrap-up inbox/transcript routing: the recommendation engine, the route-candidate marker, the wrap-up router, and route-batch all shipped green. Manual end-to-end validation and transcript filing moved out. - Cross-machine memory sync: verified the sync round-trip live across velox and ratio (a probe made on one reached the other, its deletion propagated back, both clones on one HEAD, no conflicts). The work and unknown-project write-refusal checks moved out. I also stamped the audit marker.
* chore(todo): archive five completed tasksCraig Jennings12 days1-93/+88
| | | | Host-identity guard, the no-approvals speedrun, the inbox-send collision fix, page styling, and template-sync policy all moved to Resolved. The vNext agenda-view child keeps its deliberate [#D] under a :no-sync: tag.
* fix(page): pages are info-level, not alarm-redCraig Jennings12 days1-0/+18
| | | | | | Craig's verdict on the all-red page styling: it reads like the system is about to crash. page-me and the work-the-backlog end-of-set page now use notify info --persist, still persistent and audible, never crash-scary. status-check's success and fail notifications keep their types, since a job outcome isn't a page. The commit also carries the two loop-filed task records and the archive sweep counterpart from earlier tonight.
* docs(spec): flip autonomous-batch to IMPLEMENTED after the live trialCraig Jennings12 days1-5/+6
| | | | The first speedrun ran Craig's three-task set end to end: pre-flight Q&A once, three reviewed commits, one metrics record per task, one end-of-set page. He confirmed the run and granted :LOOP_MAY_COMMIT:, so the recurring loop may now commit here alongside the existing :COMMIT_AUTONOMY: waiver.
* feat(sync): never let untracked or gitignored files block template updatesCraig Jennings12 days1-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 Jennings12 days1-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 Jennings12 days1-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 Jennings13 days1-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 Jennings13 days1-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 Jennings13 days1-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 Jennings13 days1-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 Jennings13 days1-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 Jennings13 days1-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 Jennings13 days1-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 Jennings13 days1-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 Jennings13 days1-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 Jennings13 days1-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 Jennings13 days1-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 Jennings13 days1-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 Jennings13 days1-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 Jennings13 days1-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 Jennings13 days1-0/+3
|
* docs(spec): fix the five re-review findings in the docs-lifecycle specCraig Jennings13 days1-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 Jennings13 days1-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 Jennings13 days1-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 Jennings13 days1-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 Jennings13 days1-31/+4
| | | | five tests
* docs(todo): log validation evidence for wrap-teardown and agent-KB checksCraig Jennings13 days1-0/+6
|
* chore: file KB orphan-review task; stamp inbox-process markerCraig Jennings13 days1-0/+6
|
* chore: shed the Resolved backlog to task-archive.org on first aging runCraig Jennings2026-06-301-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 Jennings2026-06-301-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 Jennings2026-06-291-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.