aboutsummaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
* chore(metrics): record the first loop cycle's two task outcomesCraig Jennings14 hours1-0/+2
|
* fix(page): pages are info-level, not alarm-redCraig Jennings14 hours6-30/+102
| | | | | | 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.
* fix(inbox-send): never overwrite on filename collisionCraig Jennings14 hours4-4/+188
| | | | Two sends in the same minute whose text starts with the same phrase derived identical filenames, and the second silently replaced the first. A message was lost this way in the wild. An existing target now gets a -2/-3 stem suffix, extension preserved, on both the text and file paths. Four red-first tests reproduce the loss with a fixed timestamp so the same-minute case is deterministic.
* docs(spec): flip autonomous-batch to IMPLEMENTED after the live trialCraig Jennings14 hours3-7/+10
| | | | 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.
* chore(metrics): record the first speedrun's three task outcomesCraig Jennings14 hours1-0/+3
|
* feat(sync): never let untracked or gitignored files block template updatesCraig Jennings14 hours5-5/+12
| | | | | | 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 Jennings14 hours4-1/+44
| | | | | | 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 Jennings15 hours2-87/+37
| | | | | | 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 Jennings18 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(flush): add auto mode with self-injected /clear for unattended runsCraig Jennings18 hours8-5/+371
| | | | | | Long autonomous sessions bloat or hit auto-compaction because /clear is a prompt keystroke no tool call can execute. Auto mode closes that gap: after the write-verified checkpoint, the agent derives its own tmux pane, arms self-inject.sh through tmux run-shell -b, and ends the turn so /clear and a resume line land at an idle prompt. The server-owned arm is load-bearing: a detached child of a tool call dies at the turn boundary. The pane must be derived before arming because ancestry detection can't work under the tmux server. self-inject.sh joins the synced scripts with a six-test bats suite, tmux stubbed at the boundary. work-the-backlog now auto-flushes between tasks when context grows heavy, and its speedrun preset gained the per-item disposition rule: feature-level work gets a spec, unguessable decisions get a VERIFY, well-defined tasks get implemented. The mechanism was proven live in another project's session and its design note is preserved under docs/design/.
* feat(backlog): add the metrics synthesis step to org-roamCraig Jennings18 hours5-4/+30
| | | | | | "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 Jennings18 hours3-8/+74
| | | | | | 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 Jennings18 hours3-10/+40
| | | | | | | | 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 Jennings18 hours4-8/+39
| | | | | | 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 Jennings19 hours9-14/+86
| | | | | | | | 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 Jennings19 hours7-12/+304
| | | | | | 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 Jennings19 hours2-2/+31
| | | | 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 Jennings19 hours10-8/+826
| | | | | | | | | | 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 Jennings19 hours4-6/+30
| | | | | | | | 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 Jennings19 hours7-28/+65
| | | | 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 Jennings20 hours5-2/+2338
| | | | | | | | 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 Jennings20 hours10-12/+125
| | | | | | 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 Jennings20 hours2-2/+38
| | | | 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 Jennings20 hours2-2/+11
|
* docs(spec): fold in verify-pass nits on the docs-lifecycle specCraig Jennings21 hours1-4/+5
| | | | Scope the zero-id-links acceptance check to links the sort actually rewrote (prose mentions of the syntax already exist and would false-positive a naive grep), add untracked-copy cleanup to the mid-apply recovery recipe, and refresh two stale prose spots (nudge skip condition, bats case list).
* docs(spec): fix the five re-review findings in the docs-lifecycle specCraig Jennings21 hours2-18/+48
| | | | 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): flip docs-lifecycle spec to READY after verify passCraig Jennings21 hours1-3/+34
| | | | The original reviewer re-checked all nine fixes against its findings: all held, verdict ready. Two minors folded in first — a refinement note under Decision 2 and a nudge probe that also fires on stray docs-root specs.
* docs(spec): fix all nine dual-review findings in the docs-lifecycle specCraig Jennings21 hours2-14/+101
| | | | 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 Jennings22 hours2-1/+218
| | | | 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 Jennings22 hours6-6/+44
| | | | | | 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 Jennings22 hours1-31/+4
| | | | five tests
* docs(todo): log validation evidence for wrap-teardown and agent-KB checksCraig Jennings22 hours1-0/+6
|
* chore: file KB orphan-review task; stamp inbox-process markerCraig Jennings22 hours2-1/+7
|
* feat(spec-review): add operational-panel UI-traps dimensionCraig Jennings22 hours2-0/+2
| | | | | | Six checks for specs covering a user-facing panel or control surface: name each list item's source, don't gate immediately-showable data behind a scan, don't ask users to retype discovered values, tense-correct destructive confirmations, review diagnostics/repair affordances as one flow, and make popups visually belong to their launcher. Conditional — non-UI specs skip it. Promoted from archsetup's Waybar network-panel review (2026-06-30 handoff).
* fix(sweep): treat the bare cjennings ssh-alias remote as privateCraig Jennings22 hours2-1/+17
| | | | The public-reachability check excluded only the literal cjennings.net host, so a remote addressed through the ~/.ssh/config alias (git@cjennings:repo.git) read as public and drew a false WARN on rulesets itself.
* fix(sweep): recognize anchored /.ai/ style; warn on publicly reachable toolingCraig Jennings22 hours4-9/+119
| | | | | | | | sweep-gitignore-tooling.sh decided gitignore-mode with an exact unanchored match on `.ai/`, so a project using the anchored `/.ai/` form was misclassified as track-mode and silently skipped — which left .emacs.d's tracked tooling on a public GitHub mirror until its 2026-06-30 scrub. Both forms now count for mode detection and per-pattern presence, and appended lines follow whichever style the file already uses. Track-mode projects also get a new check: tracked tooling paths combined with a non-cjennings.net remote draw a loud WARN, since a track-mode repo on a public host is the exposure the convention exists to prevent. The convention itself is now written down in protocols.org: a non-cjennings.net remote means the tooling set is gitignored, a deliberate team-shared config being the only explicit exception, and a private remote is not proof of privacy because a server-side mirror hook republishes invisibly. From the .emacs.d handoff (2026-06-30 tooling-exposure broadcast).
* feat(task-audit): add Phase C.6 — retire completed parents, promote stragglersCraig Jennings22 hours2-0/+38
| | | | | | A parent whose child tasks are all resolved closes (DONE/CANCELLED + CLOSED) and archives on the next --archive-done; a parent with one or two open children gets those promoted to standalone level-2 tasks first. Carries the leaf-with-notes carve-out (a task whose only descendant is a dated design note is unstarted work, not a finished container — flag NEEDS-USER, never close) and a warning to verify open-child counts against a real subtree scan, not a fragile regex. Depends on --convert-subtasks running first so the counts are accurate. From the .emacs.d handoff (2026-07-01 task-audit note).
* feat(todo-cleanup): add --convert-subtasks dated-rewrite modeCraig Jennings22 hours17-22/+916
| | | | | | | | Rewrites every level-3+ DONE/CANCELLED/FAILED heading into a dated event-log entry from its CLOSED cookie, enforcing the todo-format depth rule that interactive closes and --archive-done (level-2 only) leave unapplied. A new lint-org checker (subtask-done-not-dated) flags stragglers, and the clean-todo, wrap-up, open-tasks, and task-review workflows now run the converter before archiving. Removing the CLOSED cookie keeps a DEADLINE or SCHEDULED cookie that shares its planning line, rather than dropping the whole line. From the .emacs.d handoff (2026-07-01 convert-subtasks bundle).
* chore: set fable as project default modelCraig Jennings23 hours1-0/+1
|
* chore: shed the Resolved backlog to task-archive.org on first aging runCraig Jennings2 days3-1670/+1767
| | | | 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 Jennings2 days2-6/+6
| | | | | | | 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.
* chore: stamp inbox-process markerCraig Jennings2 days1-1/+1
|
* feat(lint-org): add four structural heading checkers org-lint missesCraig Jennings2 days5-0/+437
| | | | | | org-lint validates links, drawers, blocks, and babel, but not heading well-formedness. These four catch hand-edit defects it stays silent on: an indented heading demoted to body text (the task vanishes from the agenda and never archives), bare stars with no title, a malformed priority cookie org rejected, and a level-2 DONE/CANCELLED with no CLOSED line. All judgment-only and regex-based, wired in after the existing dated-header check. The last one pairs with the new aging step, which archives an undated completed task immediately. I tightened the indented-heading check to two-or-more stars. The proposed one-or-more-stars regex flagged indented single-star lines, but an indented single * is a valid plain-list bullet, not a lost heading, so it false-positived on legitimate lists (confirmed: three valid bullets flagged). A ** is never a bullet, so an indented one is unambiguously a demoted heading. Added a test that a single-star list stays silent.
* feat(todo-cleanup): age the Resolved section out to a tracked archiveCraig Jennings2 days5-28/+922
| | | | | | A project's in-file Resolved section grew without bound: --archive-done only moved closures from Open Work into Resolved, same file. .emacs.d's todo.org reached 768KB that way. So --archive-done now has a second step: a Resolved subtree closed longer ago than tc-archive-retain-days (default 7), or with no parseable CLOSED date, moves out to archive/task-archive.org beside the todo file. Only the last week of closures stays in the file. The step honors --check, and tc-archive-retain-days nil disables it. I added a guard the proposal lacked: the archive inherits the todo file's gitignore status. gitignore-mode projects gitignore todo.org, so without this the aging step would shed previously-private task history into a tracked archive, a leak on any public repo. When the todo file is gitignored and the archive isn't, the script adds the archive path to .gitignore before the first write. Track-mode projects leave both tracked. Covered by two tests in a temp git repo, one per branch.
* docs: reframe daily-drivers around direct tailscale reachCraig Jennings2 days2-4/+33
| | | | | | The rule claimed the agent can't reach the other daily driver, so the only move was to flag the drift. That's false: both machines are on the same tailnet, and this session repaired ratio's dotfiles over tailscale ssh. So the rule now says reach the other box directly to sync, verify, or repair, with flag-it kept as the fallback for when tailscale is down. I added a section on the connection mechanics: tailscale status lists the nodes, the tailscale IP and MagicDNS name always resolve, a bare hostname only resolves when MagicDNS is configured locally, and the first connection needs StrictHostKeyChecking=accept-new.
* docs: add a green-baseline-before-work gate to verification and start-workCraig Jennings2 days3-5/+100
| | | | | | A red test suite at the start of work poisons every later "did I break this?" check: you can't tell your own regressions from pre-existing noise, and the end-of-work green bar stops being readable. verification.md now asks for a clean suite run before work begins, not only before commit. start-work runs it as Pre-work step 0.3 against the reconciled base. I added two carve-outs the original proposal lacked: a project with no suite has nothing to baseline, and a suite that can't run is the existing "When You Cannot Verify" case rather than a blocker. The step lands after the reconcile, so the baseline reflects the base the work is cut from. The Phase 4 TDD red is called out as expected, distinct from a baseline failure.
* chore: prune dangling bin symlinks, point paging at signal-mcpCraig Jennings2 days3-0/+27
| | | | | | The install bin loop linked every script under claude-templates/bin but never pruned orphans, so a deleted script left a dangling ~/.local/bin symlink. page-signal hit exactly this: the wrapper was removed 2026-06-12 but its symlink stayed, resolving to a dead target on the daily drivers. I added a prune step that drops symlinks pointing into claude-templates/bin whose target is gone, so any removed script self-cleans on the next install. I also added a protocols section naming the two paging channels: notify --persist at the machine, and the signal-mcp send_message_to_user tool when away from it. The pager account was never deregistered (only the page-signal script went away), so the live path is the MCP tool, and the section retires the script for good.
* docs: revise and ratify the no-approvals speedrun specCraig Jennings4 days5-95/+263
| | | | | | 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 Jennings4 days2-1/+279
|
* chore(todo): reconcile tasks and cluster the flashcard toolingCraig Jennings4 days2-25/+29
| | | | 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.