aboutsummaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
...
* docs(ai): point template references at in-repo claude-templates/Craig Jennings2026-05-156-34/+38
| | | | | | | | Canonical .ai/ source moved from ~/projects/claude-templates/ to ~/code/rulesets/claude-templates/ via subtree merge. Phase A.0's "Refresh claude-templates" step is now "Refresh rulesets" since there's only one repo to pull. Updates: - startup.org Phase A.0: rsync sources point at the in-repo path - protocols.org and cross-agent-comms.org: workflow-promotion target paths updated
* Merge commit '69c5e4ace81586c05dea6a9a3afd54dafa61a73b' as 'claude-templates'Craig Jennings2026-05-1588-0/+17181
|\
| * Squashed 'claude-templates/' content from commit f116888Craig Jennings2026-05-1588-0/+17181
| | | | | git-subtree-dir: claude-templates git-subtree-split: f1168885580e9197dcf57b57644eb576fdca2ab1
* docs(todo): start consolidate .ai/ template infra epicCraig Jennings2026-05-151-12/+125
| | | | Parent task at todo.org:1774 umbrellas five children: fold claude-templates into rulesets, build make audit + make install-ai, test plan, ratio migration. Existing [#B] fold and audit tasks demoted as children, promoted to [#A]. Parent marked DOING.
* chore(ai): sync scripts and workflows from claude-templatesCraig Jennings2026-05-158-13/+1296
| | | | | | | - todo-cleanup.el: :no-sync: tag now inherits down the outline tree - task-review.org: completion procedure scoped to top-level entries - cj-scan.py + cj-remove-block.py: helpers for cj-comment block handling - inbox-send.py: cross-project messaging via inbox directories
* docs: codify depth-based completion rule + DRY the skill referenceCraig Jennings2026-05-152-10/+57
| | | | | | | | | | | | | | | Todo-format.md gets a "Completion — depth-based" section that codifies what was implicit before: top-level (* and **) DONE tasks stay task-shaped (DONE + CLOSED line), sub-tasks (*** and deeper) flip to dated event-log entries, and VERIFY is the documented exception (always dated-rewrite regardless of depth). The section includes worked examples and the rationale for depth-based over keyword-based. The cj-comments skill's completion section now references the canonical rule instead of restating the depth-based rules inline. The three-bullet recap in the skill stays as a quick scan, but the details and examples live in one place.
* docs(cross-project): prefer inbox-send for handoff dropsCraig Jennings2026-05-151-0/+10
| | | | | | | | | | | | | | | | The cross-project boundary rule already prescribes dropping a handoff file in the target project's inbox/ when option 1 ("do it from here") is chosen. The change adds a paragraph pointing at the new inbox-send script as the preferred tool for the drop. The script handles project discovery, source-project provenance in the filename, slug derivation, and timestamping in one call, replacing the hand-constructed filenames and guessed project paths the rule used to require. Filename convention is unchanged (YYYY-MM-DD-HHMM-from-<source>-<slug>.<ext>); the script just generates it instead of me typing it out. Fallback to Write/Edit is documented for cases where the script isn't installed (e.g. a freshly-cloned project before the first startup-rsync).
* docs: simplify cj-comments skill + add VERIFY placement/completion rulesCraig Jennings2026-05-152-67/+218
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Rounds of simplification on the cj-comments skill: converged on source-block-only in org files, dropped the non-org parsing entirely, factored out the mechanical parts into helper scripts (added separately in another repo), and codified the VERIFY placement + completion rules in a canonical rule file so the conventions stop being implicit. Skill (.claude/commands/respond-to-cj-comments.md): - Drop the file-type comment-marker table and the non-org multi-line continuation rule. The skill now recognizes only the org source-block form (#+begin_src cj: ... #+end_src). Craig's yasnippet keeps typing cost flat. - Defensive parsing for legacy inline cj annotations in older org files (back-compat). - Prefer the new helper scripts: step 1 calls cj-scan for structured detection; step 4 sub-step 6 calls cj-remove-block for validated removal. Both have explicit fallback paths to grep+Read / Edit. - Completion rules now split by keyword: TODO/DOING at *,** stay task-shaped (DONE + CLOSED); deeper TODO/DOING flip to dated headings; VERIFY at any depth flips to a dated heading with body replacement. - New VERIFY-answer pattern: when a cj's parent_heading_chain ends with VERIFY, the cj is the answer to that VERIFY. Lift its body into the dated rewrite (or execute the instruction first if indirect), then delete the cj. - New placement rule for new VERIFYs: sibling of the trigger heading, not a child. Climb to *** when the trigger is buried at ****+. This is the active force that keeps todo.org flat. - Rename "cj: comment" to "cj comment" in prose; preserve the literal cj: token in code examples and grep targets. Canonical rule (claude-rules/todo-format.md): - New "VERIFY tasks" section with four subsections: Placement (** or *** only), Creating a new VERIFY (sibling of trigger), Completion (dated rewrite + body replacement at any depth), Don't leave stale placeholders. - Worked before/after examples for both top-level and first-level VERIFYs.
* docs(todo): start memory-sync investigation, bump audit prioritiesCraig Jennings2026-05-142-47/+160
| | | | | | | | | | | | | | | | | | Memory-sync [#A] TODO flipped to DOING. Added a dated work-log subheader recording what's on disk under ~/.claude/projects/ (plain files, no symlinks, no git) and the proposed fix (stow ~/.claude/projects via archsetup/dotfiles/common/). Added a VERIFY child awaiting approval on the stow approach before any moves. Side effect of the wrap-up's --sync-child-priority pass: 43 [#B] children of the [#A] "Review pass: tighten skills and rulesets after 2026-05-04 audit" parent bumped to [#A] to match the parent. Tag any of them :no-sync: if they should stay at [#B]. Archived 2026-05-14-21-43-lint-org-build-and-memory-sync-investigation to .ai/sessions/. The day shipped /lint-org as a four-commit feature across claude-templates and rulesets, then this short follow-on pass processed the line-11 src-block via /respond-to-cj-comments.
* docs(workflow): add date-coverage scan to the wrap-up flowCraig Jennings2026-05-141-0/+33
| | | | | | | | | | New sub-step under Step 3 surfaces [#A] and [#B] tasks in todo.org that have neither DEADLINE: nor SCHEDULED: directly under the heading. Candidates land in the same lint-followups.org the next morning's daily-prep merges in, so the operator reviews them at the start of the day instead of discovering the drift later. Why both timestamp shapes matter: DEADLINE is external (RFP cutoffs, partner-announced dates, regulatory). SCHEDULED is social (a commitment to surface to the team). The asymmetry drives the promotion rule — DEADLINE inside 7 days auto-promotes to [#A], SCHEDULED passing surfaces for re-eval without auto-promoting. High-priority work carrying neither is suspicious; the scan flags it, the operator decides whether to add a date, drop the priority, or confirm no-date-by-intent. Inline awk does the scan (no new script). Output appends to the follow-ups file under a dated heading; if no candidates, no append. Conservative: surfaces every candidate, expects false positives to be cheap dismissals. Counterpart to the DEADLINE-vs-SCHEDULED practice section just added to todo.org's '* Work Priority' header on the work side.
* feat(lint-org): add /lint-org command + file design specCraig Jennings2026-05-143-0/+356
| | | | | | | | | | | | | | | A new /lint-org command at .claude/commands/lint-org.md orchestrates the elisp script: invokes it, parses the stdout plist stream, walks each judgment item with the user via inline numbered options (per interaction.md, no popup), and reports pre/post-pass deltas. Two modes: interactive (default, walks judgments now) and mechanical-only (defers them to a follow-ups file via --followups-file). The spec at .ai/specs/lint-org-skill-spec.md is the design doc that motivated this work, captured from yesterday's manual 55→1 lint pass on todo.org. todo.org gains a [#A] entry pointing at the spec.
* chore(ai): sync lint-org script and wrap-it-up from claude-templatesCraig Jennings2026-05-143-0/+863
| | | | | | | Byte-identical pull of .ai/scripts/lint-org.el, .ai/scripts/tests/test-lint-org.el, and the new Step 3 lint section in .ai/workflows/wrap-it-up.org. Upstream: claude-templates 138f35f (feat) and 4eba98c (docs).
* fix(todo-cleanup): read priority via org-heading-components, not regexCraig Jennings2026-05-142-5/+31
| | | | | | | | The first take walked the heading line with a plain `\[#\([A-Z]\)\]` regex, which matched any cookie-shaped substring anywhere in the line. Dated-log headings can carry that shape inside the title — e.g. "Reprioritized children =[#D]= → =[#B]= to match parent" quotes earlier and new priorities verbatim, and the script read =[#D]= as if it were the heading's own priority cookie. `(nth 3 (org-heading-components))` only returns a priority when the cookie sits in canonical position (right after the stars or the optional TODO keyword), which is the only place org itself recognizes it. That's the right primitive here. Surfaced via smoke-testing --check-child-priority against ~/projects/work/todo.org: 10 candidates dropped to 9 once the dated-log heading inside the Whisper parent stopped getting flagged. New ert test tc-sync-ignores-cookie-shaped-text-in-title covers the case directly.
* chore(inbox): remove sync-child-priority spec — implementedCraig Jennings2026-05-141-69/+0
|
* feat(todo-cleanup): add --sync-child-priority mode for drifted childrenCraig Jennings2026-05-143-14/+373
| | | | | | | | | | When a parent task in todo.org gets reprioritized, its children frequently keep their original (lower) priority cookies, which then mismatches the parent's new importance. The new mode walks every heading with a priority cookie and bumps any direct child whose own cookie is lower (D ranks below A in org's default scheme). Down-only: parents are never bumped up to a child's priority. Priority-less parents and priority-less children are both left alone — sync does not invent priorities. Children opt out by carrying the :no-sync: literal tag, useful for Follow-up:/Spike: sub-tasks that are deliberately deprioritized. The tag match is literal regex against the heading line rather than going through org-get-tags, because org's default tag character class excludes hyphens — :no-sync: would not be parsed as a real tag in batch mode without a custom org-tag-re. org-map-entries visits headings in document order, so a multi-level chain [#A] → [#B] → [#D] collapses to the top priority in one pass: the middle bumps to [#A] before the walk reaches the leaf. wrap-it-up.org Step 3 now invokes --sync-child-priority after --archive-done. --check-child-priority is the report-only alias (--sync-child-priority --check) for previewing before applying. Default cadence is auto-apply, same as --archive-done.
* docs(start-work): default to bundled test + feat commits per sub-taskCraig Jennings2026-05-141-3/+3
| | | | Phase 3 commit-decomposition guidance + Phase 4 step 3 both now default to a single feat(scope): X with tests commit per sub-task rather than separate test: + feat: commits. Test + the code under test belong together for review — a reviewer sees the contract and the satisfaction in one diff instead of paging back and forth. Split into separate commits only when the test work is its own substantial review surface (characterization tests, fixture infrastructure, a new harness) or when the failing test serves as a deliberate bug-report artifact in a fix: narrative.
* docs(respond-to-cj-comments): add no-cj-token-in-replies rule + ↵Craig Jennings2026-05-142-0/+70
| | | | | | | | child-priority-sync spec Skill update: refer to processed items as "cj comments" in chat replies, summaries, and todo.org entries — never write the literal token in my output. The reason is search hygiene: Craig greps his files for the token to find pending annotations, and noise from my replies clutters that. Spec drop into inbox/: child-priority-sync-todo-cleanup.md captures the implementation recommendation for adding --sync-child-priority to todo-cleanup.el plus four open questions (sync direction, opt-out mechanism for deliberately-lower children, auto-apply vs --check, no-priority-parent edge case) Craig needs to answer before wiring it in.
* docs(respond-to-cj-comments): drop cj: placeholder under VERIFY tasksCraig Jennings2026-05-141-4/+5
| | | | A well-named VERIFY heading carries the question on its own. The empty cj: <fill-in> placeholder underneath is noise — Craig adds his own cj: annotation (inline or src-block) when he's ready to answer, and that arrival is the signal to come back and process the response.
* docs(respond-to-cj-comments): recognize org src-block cj: formCraig Jennings2026-05-141-1/+24
| | | | The skill now recognizes #+begin_src cj: ... #+end_src as a valid cj: comment shape, matching the multi-line paragraph pattern Craig uses in todo.org for longer instructions. Removal at cleanup deletes both fences plus the body.
* docs(rulesets): rename STALLED to VERIFY across skill + workflowCraig Jennings2026-05-132-8/+8
| | | | Renamed the org TODO keyword STALLED to VERIFY in respond-to-cj-comments.md (skill) and daily-prep.org (workflow). VERIFY reads as the next step rather than as a stuck state; the meaning is unchanged — items needing Craig's input.
* docs(review-code): frame code review as a coaching channelCraig Jennings2026-05-131-4/+52
| | | | Coaching guidance was buried under Inline Comment Voice at the bottom of the skill, where it read as a tone afterthought rather than the skill's purpose. This change threads it through Intent, Strengths, the Important-issue shape, Critical Rules, and Anti-Patterns so each step reads as mentoring with audit as the method.
* build(deps): install pdftools so every project can edit PDFsCraig Jennings2026-05-131-1/+20
| | | | | | poppler (pdftoppm/pdftotext) plus a dedicated Python venv at ~/.local/venvs/pdftools with pypdf, reportlab, and pillow. Every project session can now stamp checkboxes, dates, and text overlays onto flattened PDFs through that venv, without each project re-wiring the toolchain. The package name for poppler diverges across distros (poppler-utils on Debian/Ubuntu, poppler on Arch and Homebrew), so the install branch handles each manager inline rather than going through install_pkg. PDFTOOLS_VENV is overridable via env if a machine needs a different path.
* chore(settings): enable remoteControlAtStartupCraig Jennings2026-05-131-1/+2
|
* feat(workflows): thin-link Day's Priorities + auto-sync after triageCraig Jennings2026-05-132-2/+37
| | | | | | In daily-prep, Day's Priorities entries are now thin links to todo.org tasks rather than copies of their content. The substance — descriptions, drafts, research, sub-tasks, STALLED asks, recommended-approach blocks — lives in the matching todo.org task that Phase 3 creates or updates. Completed-today entries still convert to dated log headings as the day's record. Phase 3's Linear action-item step also gets a comment-as-child-header pattern: paste the @mention or comment inline rather than referencing it, so the reply can be drafted in the prep doc. In triage-intake, mbsync -a now runs at the end of every triage by default — no more "ask before syncing" — and a Synced line in the summary records the run.
* feat(protocols): add cross-project boundary and signature image rulesCraig Jennings2026-05-131-0/+23
| | | | | | Cross-Project Boundary tells the session to stop and ask before acting on a file or task scoped to a different project's .ai/, then write a handoff file at the target project's inbox/ if confirmed. Signature Image documents the location of the transparent signature PNGs in the archsetup stow tree and limits stamping to explicit per-document requests — never signing on initiative.
* docs(todo): track pull-before-project ordering rule for protocols.orgCraig Jennings2026-05-131-0/+19
|
* chore: updating todo.org fileCraig Jennings2026-05-131-0/+4
|
* fix(respond-to-cj-comments): keep top/second-level tasks as DONECraig Jennings2026-05-131-2/+7
| | | | Only third-level and deeper tasks get the dated-heading rewrite. Top and second-level stay task-shaped so they remain visible in the agenda.
* feat(rules): add todo-entry format (terse heading, optional body)Craig Jennings2026-05-131-0/+58
|
* feat(rules): cross-project boundary rule + cj-comments preflightCraig Jennings2026-05-132-0/+98
| | | | | | | | | | | | New `claude-rules/cross-project.md` codifies the per-project `.ai/` scope boundary. Stop-and-ask when a request targets another project's files, inline numbered options, handoff-file convention when the user opts to do it from here. `/respond-to-cj-comments` gains a section-0 preflight (boundary check before reading the target file) and a section-7 handoff step (writes the carry-forward file in the target project's `inbox/` when the boundary crossing was approved).
* feat(respond-to-cj-comments): replace /tmp summary with STALLED-task patternCraig Jennings2026-05-131-4/+11
| | | | | | | | When the run leaves something needing Craig's input (a blocker, an open question, a draft awaiting sign-off), the skill now files a STALLED task in todo.org under the relevant parent — phrased so Craig can answer inline with a cj: comment — rather than writing a long summary to /tmp and opening it in emacsclient. The STALLED task lives next to the work, surfaces in his agenda, and gets resolved inline. The chat summary still gets written as the FYI recap; the STALLED task is the durable home for action items. Also documents the DONE→dated-heading convention: when a cj:-handled TODO completes, rewrite the heading itself into a "** YYYY-MM-DD Day @ HH:MM:SS -ZZZZ <desc>" event-log entry rather than advancing to DONE. This is Craig's standing convention for todo.org and his daily-prep docs — finished tasks turn into a dated log automatically. The description block at the top of the file got a small rewrite to match: STALLED-task language replaces the /tmp-summary phrasing, and the DONE→dated-heading rule is mentioned in the org-mode-handling clause.
* fix(commits): correct PR-review notification channel IDCraig Jennings2026-05-131-1/+1
| | | | Step 8 of the publish flow referenced C0AM2MWHCJU as the channel for the Slack PR-author ping. That ID is actually a 3-person mpdm (Craig/Vrezh/Kostya), not the intended 4-person PR-review group. Corrected to C0B1B0NH2N5 (Craig/Eric/Vrezh/Kostya) and added a clarifying note that the 3-person mpdm is not an "#ai" channel despite older references calling it that.
* chore: Claude Code settings — keep bypassPermissions default; ↵Craig Jennings2026-05-121-2/+6
| | | | | | notification/UI toggles Working copy had drifted permissions.defaultMode to "auto"; reset to "bypassPermissions" to match HEAD. Other tweaks: awaySummaryEnabled false, terminalProgressBarEnabled false, inputNeededNotifEnabled true, skipAutoPermissionPrompt true, skillListingBudgetFraction moved to top.
* chore(ai): session record for start-work pre-work + triage-intake fixesCraig Jennings2026-05-111-0/+71
| | | | Added a Phase 0 pre-work block to /start-work (fetch-and-reconcile against the base branch, plus a source-code check that the problem the ticket describes still exists). Reviewed and fixed triage-intake.org: Phase 3 now marks all unread INBOX mail across gmail/dmail/cmail, the Overview no longer contradicts the calendar source, and the Linear sweep got a non-GitHub-remote guard. Both shipped in earlier commits this session; this record archives the work.
* chore(ai): sync triage-intake workflow from claude-templatesCraig Jennings2026-05-113-2/+124
| | | | New on-demand triage-intake workflow. It scans every inbox source (the three mail accounts, Slack, Linear, open PRs, both calendars, recent todo.org edits), surfaces what moved, runs the Linear Dev-Review sweep, and marks all unread INBOX mail plus every touched Slack conversation read. Also registered in INDEX.org, and the stale triage-intake reference dropped from wrap-it-up.org.
* docs(todo): plan daily-prep delegation to triage-intakeCraig Jennings2026-05-111-0/+11
|
* docs(start-work): add Phase 0 pre-work (reconcile + source check)Craig Jennings2026-05-111-2/+51
| | | | | | | | Phase 0 was a single eligibility gate. Two gaps: the skill cut new branches from whatever HEAD happened to be, and trusted the ticket's premise without checking the tree. Two new sub-sections fix both before any state change. 0.2 fetches and fast-forwards the base branch, surfacing dirty or diverged state instead of auto-resolving. 0.3 reads the source, not git log, to confirm the problem the ticket describes still exists, with three dispositions for "the problem isn't there" findings: close, dig harder, or proceed with reduced confidence flagged at the Justify gate. Two matching anti-patterns added: skipping the reconcile, and taking the ticket's word for it.
* chore(ai): session record for todo-cleanup --archive-done + clean-todo workCraig Jennings2026-05-111-0/+75
| | | | todo-cleanup.el gained --archive-done (level-2 DONE/CANCELLED subtrees move to "Resolved"), with a 13-test ERT suite wired into make test. The wrap-up flow now runs both the hygiene pass and --archive-done, and clean-todo is the on-demand entry point.
* docs(workflows): add clean-todo workflowCraig Jennings2026-05-112-0/+60
| | | | clean-todo is the manual entry point for tidying todo.org: it runs the hygiene pass, then --archive-done (relocate completed level-2 subtrees into "Resolved"), then summarizes what changed and leaves the diff uncommitted for review. The wrap-up flow already does both passes at session end; clean-todo runs them on demand. It's listed in INDEX.org under the usual trigger phrases.
* docs(workflows): run todo-cleanup --archive-done in wrap-upCraig Jennings2026-05-111-3/+21
| | | | The wrap-up flow already runs the hygiene pass on todo.org; it now also runs --archive-done, which relocates completed level-2 subtrees from "Open Work" to "Resolved". Both passes are idempotent and skip cleanly when the file lacks the named sections, and any moves land in the wrap-up commit's diff for review before push.
* docs(todo): mark --archive-done task doneCraig Jennings2026-05-111-11/+13
|
* feat(todo-cleanup): add --archive-done mode with ERT test suiteCraig Jennings2026-05-114-30/+575
| | | | | | | | --archive-done moves every level-2 subtree whose TODO state is DONE or CANCELLED out of the "Open Work" section into the "Resolved" section of the same org file, subtree intact. Sections match on a unique level-1 heading containing "Open Work" (case-insensitive) and one containing "Resolved"; a missing or ambiguous section skips the file with a message rather than crashing. Only direct level-2 children move. A DONE entry nested under an open parent stays put. Opt-in, never run by default, doesn't also run the hygiene passes; --check previews without writing. The CLI dispatch moved into tc-main behind a guard so the new ERT suite can require the file without firing it. Hygiene mode is unchanged. 13 ERT cases (the repo's first elisp tests) cover the move and the stay-put cases, EOF with no final newline, missing or ambiguous sections, lowercase headings, idempotency, and --check. tests/fixtures/todo-sample.org is the synthetic sample, and the Makefile test target now runs the ERT suites alongside pytest.
* docs(workflows): require every worktree leftover to be resolved at wrapCraig Jennings2026-05-111-4/+35
| | | | Replace the old "intentional carryover" default in wrap-it-up.org. End every session with an empty `git status`: classify each leftover as a runtime artifact, a forgotten change, or pre-existing dirt, apply a concrete resolution unless the user explicitly defers, and log any deferral in the valediction so the next session knows it was a choice, not a miss.
* docs(todo): add --archive-done task for todo-cleanup.elCraig Jennings2026-05-111-0/+11
|
* chore(ai): sync template updates from claude-templatesCraig Jennings2026-05-115-20/+85
| | | | Pull in the latest maildir-flag-manager.py and cross-agent-comms doc updates from the claude-templates source.
* docs(todo): add make-audit and claude-templates-fold tasksCraig Jennings2026-05-111-0/+39
| | | | I added two [#B] entries. The first folds the standalone claude-templates repo into rulesets/claude-templates/ via subtree merge, bridging the path change with a transitional symlink while every project picks up the updated startup.org. The second adds a make audit target that diffs each .ai/-using project against the canonical template source. Both are on hold for now — the entries just record the plan.
* docs(todo): nest entries under a "Rulesets Open Work" headingCraig Jennings2026-05-111-194/+199
| | | | Add a single top-level "Rulesets Open Work" heading and demote every entry one level so the file has one root section.
* docs(commits): add Step 0 pre-flight reconcile and pre-push checkCraig Jennings2026-05-101-1/+51
| | | | | | | | The publish flow had no fetch step before commit, PR creation, or push. Long sessions or multi-machine work could land local commits on a stale base, producing non-fast-forward push failures that you have to unwind under publish-step pressure. Step 0 fetches all remotes and checks the current branch against its upstream before Step 1's code review. If the branch is behind, the rule branches on tree state and divergence shape: clean fast-forward, surface dirty-tree behind, or surface a true divergence and ask before rebasing or merging. The Step 0 wording covers the new-branch case (no upstream → skip the divergence check, the first push sets it). The Pre-push reconcile bullet in Merge Strategy handles the smaller window between Step 0 and the actual push. Reviewing and drafting can take several minutes; another machine or teammate can push during that window. One more fetch immediately before push is cheaper than recovering after a failed push.
* fix(gmail): Improve safe_filename to handle .. prefixesCraig Jennings2026-05-081-2/+11
| | | | | | Strip leading ".." sequences instead of stripping all leading dots, so dotfiles like ".gitignore" are preserved while still preventing directory traversal via "../foo" style names. ```
* docs(workflows): Update DeepSat repo path in daily-prepCraig Jennings2026-05-081-1/+1
|