aboutsummaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
* docs(todo): close test harness; file Phase A inbox-scan bugCraig Jennings2026-05-151-1/+12
| | | | Flipped the test harness task at line 1766 to DONE (work landed in 7ef200a). Filed a new [#B] for a fold side-effect surfaced during the publish flow: Phase A's inbox check at startup.org:107 only looks at the project root, so it never scans claude-templates/inbox/ (the canonical's inbox, now in-repo after the subtree merge). This session received a cross-project handoff there at startup and missed it entirely; the drift surfaced only during commit staging.
* test(scripts): add bats harness for audit + install-ai edge casesCraig Jennings2026-05-153-1/+249
| | | | | | | | Adds scripts/tests/audit.bats (6 tests) and scripts/tests/install-ai.bats (5 tests) covering the three destructive edge cases that the fold-epic test plan deferred yesterday: audit --apply --force clobbering a tracked dirty .ai/, audit's loop continuing past a missing-.ai/ project, and install-ai's interactive fzf-pick form. The first two go alongside happy-path sanity (clean sweep, drift detection, --apply convergence, dirty-skip); install-ai gets happy-path with explicit PROJECT, --track gitkeep stubs, refusal on existing .ai/, and notes.org placeholder substitution. Strategy: redirect HOME to a per-test mktemp dir, scaffold synthetic project trees under HOME/code/, and run the real scripts against them. The canonical source stays the real one (resolved relative to each script's own location), so tests exercise the production rsync paths without copying canonical content. Use PATH stubs for fzf and find to cover the interactive and race-condition edges. Makefile test: target extended with a bats stanza; description updated to "Run all test suites (pytest + ERT + bats)". make test now runs 352 green (296 pytest + 22 lint-org ERT + 23 todo-cleanup ERT + 6 audit bats + 5 install-ai bats), up from 341.
* fix(cj-scan): suppress detection inside nested non-cj begin_* blocksCraig Jennings2026-05-153-0/+167
| | | | | | cj-scan.py matched =#+begin_src cj:= / =#+end_src= line-by-line without awareness of enclosing block scopes. A cj fence embedded inside =#+begin_example= (typical when documenting what the <cj yasnippet emits) or =#+begin_src snippet= (the yasnippet definition itself) was misclassified as a live cj annotation. Two false positives surfaced from a /respond-to-cj-comments run against an org file with yasnippet docs. Track an active wrapper_type. When the scanner sees =#+begin_<type>= for any type other than cj: (the cj-open regex is checked first), enter a wrapper state where every line is content until the matching =#+end_<type>= closer fires. Inside a wrapper, both fence patterns and legacy inline cj: lines stay suppressed. Added the TestCjScanNestedFencesIgnored class with 6 tests: nesting inside example, src <other-lang>, and quote; regression guards for clean wrapper close and unclosed-wrapper non-swallow. Canonical pytest: 302 passed, 1 skipped.
* docs(todo): close /lint-org and pull-ordering doc tasksCraig Jennings2026-05-151-18/+10
| | | | /lint-org at line 1292 shipped on 2026-05-14 but never got flipped. The pull-ordering doc task at line 36 shipped partially earlier (Phase A.0 wired in the 2026-05-15 fold) and just got its protocols.org paragraph in the previous commit. This commit rewrites the body to reflect what actually landed and flips it to DONE.
* docs(protocols): add startup pull-ordering ruleCraig Jennings2026-05-152-0/+16
| | | | The 2026-05-15 claude-templates fold wired the rulesets-first-then-project ordering into startup.org Phase A.0, but the rule itself never landed in protocols.org. This adds a Startup Pull Ordering subsection under IMPORTANT - MUST DO with the ordering, the ff-only guardrail, and the no-auto-stash / merge / rebase rule. Mechanics stay in startup.org; the rule lives in protocols.org because it governs the first action of every session.
* chore(ai): wrap fold-claude-templates + audit/install-ai + ratio migrationCraig Jennings2026-05-152-175/+352
|
* docs(todo): close consolidate .ai/ template infra epic; ratio migratedCraig Jennings2026-05-151-2/+4
|
* docs(start-work): encode follow-up filing placement rulesCraig Jennings2026-05-152-1/+9
| | | | | | Phase 4 step 5's "Disposition for each candidate" now spells out where to file a "file a ticket" follow-up in todo.org: siblings for epic-style parents (level-2 with level-3 children), new level-2 entries for standalone tasks. Both cases require a "Triggered by:" line so a future reader sees the origin. The placement rule lived in project memory but didn't propagate across projects. Encoding in start-work makes it cross-project default behavior.
* docs(todo): mark fold-epic children 1-3 done (audit, install-ai, fold), ↵Craig Jennings2026-05-151-3/+6
| | | | child 5 awaits ratio
* feat(make): add catchup-machine target for cross-machine .ai/ syncCraig Jennings2026-05-153-1/+61
| | | | | | | | scripts/catchup-machine.sh runs the four steps that bring a machine in sync with rulesets canonical: git pull, make install (symlink refresh), make audit APPLY=1 (rsync .ai/ across all projects), and make doctor (verify). Idempotent, safe to re-run any time. Built for the post-fold ratio migration but applies generally: after a fresh rulesets clone on a new machine, or whenever the canonical source has advanced since last sync. Handles dirty working trees by skipping the pull and surfacing a warning; user commits or stashes before re-running.
* docs(todo): close fold-epic test plan, file edge-case follow-upCraig Jennings2026-05-151-1/+16
| | | | Audit and install-ai both pass their core test paths (report-only, --apply convergence, idempotency, fresh install, refusal-on-existing, GITIGNORE mode, doctor 36/0/0, pytest 296+1 skipped). Three destructive edge cases (--force on dirty, missing .ai/ FAIL, install-ai fzf-pick form) were deferred to a [#C] sibling task that proposes a self-contained test harness rather than running them against real projects.
* feat(make): add install-ai target for bootstrapping .ai/ in fresh projectsCraig Jennings2026-05-153-1/+172
| | | | | | | | scripts/install-ai.sh copies canonical .ai/ content from claude-templates/ into a fresh project. Rsyncs protocols.org, workflows/, scripts/, someday-maybe.org as-is; templates notes.org with project-name and date placeholders substituted; creates empty sessions/, references/, retrospectives/ dirs. Two tracking modes: TRACK=1 adds .gitkeep files inside otherwise-empty dirs so they survive in git history; GITIGNORE=1 appends .ai/ to the project's .gitignore so session records stay local. Prompts interactively if neither flag is set. Refuses if PROJECT/.ai/ already exists with a message pointing to `make audit APPLY=1` for sync of existing installs. Without a PROJECT argument, fzf-picks from ~/code/* + ~/projects/* git checkouts that don't already have .ai/.
* feat(make): add audit target for cross-project .ai/ drift detectionCraig Jennings2026-05-153-1/+239
| | | | | | | | scripts/audit.sh walks every .ai/-using project under ~/code/, ~/projects/, and ~/.emacs.d/, compares each .ai/ against the canonical source at claude-templates/.ai/, and reports drift per project. Default mode is report-only; APPLY=1 rsyncs detected drift into each project (no auto-commit). FORCE=1 also rsyncs into projects with uncommitted .ai/ changes (default: skip with a warning). Uses diff -rq for content comparison rather than rsync --itemize-changes to avoid false positives on attribute-only drift (mtime, permissions). Skips the rulesets repo itself, the in-repo canonical source, and the legacy standalone ~/projects/claude-templates/ during the fold transition. Output mirrors make doctor: per-project ok/drift/applied/skipped/FAIL lines, summary tally, exit 0 when all ok. Runs make doctor as the final check by default; NO_DOCTOR=1 skips.
* docs(todo): file start-work follow-up filing rule taskCraig Jennings2026-05-151-0/+15
| | | | Top-level [#B] task captures a gap in /start-work Phase 4 step 5: the "file a ticket" disposition doesn't say where to file, so follow-ups land ad-hoc. Proposed rules in the task body — siblings for epic parents, new top-level for standalone tasks. Triggered by today's fold-epic session surfacing the gap.
* docs(todo): file Makefile redundancy as fold-epic siblingCraig Jennings2026-05-151-0/+11
| | | | After the bin/ai fold (commit 2d645fc), claude-templates/Makefile still has install/uninstall/list/test-scripts targets, and its bin/ai install logic duplicates rulesets/Makefile. [#C] sibling task captures the cleanup options (delete, strip down, leave) without gating the parent epic's DONE state.
* docs(commits): document slack-deepsat MCP payload formatCraig Jennings2026-05-151-0/+11
| | | | The MCP's `conversations_add_message` tool takes the raw mrkdwn body in `payload`, not a Slack API JSON envelope. Wrapping the body in `{"text": "..."}` posts the literal JSON to the channel — `<@>` mention strips, escaped `\n` renders as a literal `n`, and the `text:` key prefix shows up in the post. Step 8 now documents the format + mrkdwn list so PR-review notifications don't garble.
* chore(make): fold bin/ai launcher install into rulesetsCraig Jennings2026-05-151-0/+29
| | | | | | The ai launcher's install/uninstall logic lived in claude-templates/Makefile when claude-templates was a separate repo. After the fold, that Makefile still works locally but rulesets' make install is the single entry point. Add ai-launcher targets to rulesets/Makefile so `make install` covers it alongside skills, rules, commands, and Claude config. Install detects an existing symlink pointing at a stale source (e.g. ~/projects/claude-templates/bin/ai from before the fold) and relinks to the new canonical path under ~/code/rulesets/claude-templates/bin/ai.
* 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.