| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|
|
|
| |
Adds google-keep to mcp/servers.json using feuerdev/keep-mcp via uvx; env-var auth (GOOGLE_KEEP_EMAIL, GOOGLE_KEEP_MASTER_TOKEN) stored in mcp/secrets.env.gpg. Master token retrieved through Google's EmbeddedSetup browser flow plus gpsoauth.exchange_token, since password-based gpsoauth.perform_master_login is restricted now.
Invocation gotcha: keep-mcp declares an =mcp= entry-point script, but its dependency on the official =mcp= SDK ships a same-named script that wins resolution under uvx. The =uvx --from keep-mcp mcp= form from the README launches the SDK CLI instead of keep-mcp's server. Workaround: =uvx --from keep-mcp python -m server.cli= invokes keep-mcp's actual entry point directly, bypassing the collision.
|
| |
|
|
|
|
|
|
|
|
| |
Project .ai/ mirror catches up to two canonical updates already in claude-templates/:
- lint-org cj-comment block suppression (3fb4c80). The =#+begin_src cj: ...= annotation pattern triggered three lint categories (suspicious-language, empty-header-argument, wrong-header-argument) as false positives at todo.org:16 and todo.org:1291. lint-org.el now recognizes the opener and skips all three on those lines.
- LINT_ORG_FOLLOWUPS default flipped to =./inbox/lint-followups.org= (684891d). The previous hardcoded default routed every project's wrap-up findings into the work project's inbox.
Phase A startup rsync brought both into the project mirror this morning; bundled into one chore commit since neither delta is project-specific work.
|
| | |
|
| |
|
|
|
|
|
|
|
|
| |
org-lint emits three warnings for every `#+begin_src cj: comment ... #+end_src` annotation block: suspicious-language-in-src-block (the language `cj:` isn't a known Babel slug), wrong-header-argument (the trailing `comment` looks like a header arg without a colon), and empty-header-argument (that same `comment` has no value). All three are false positives. The cj-comment block is a Craig-specific annotation marker, not Babel src-block syntax.
I added a helper `lo--cj-comment-block-opener-p` that pattern-matches the opener line, then a short-circuit branch at the top of `lo--handle-item` that silently drops any of the three checkers when they fire on a cj-comment opener. No fix is counted, no judgment is emitted, and the warnings disappear.
Two new tests cover the change. The normal case is a solo cj-comment block, which should produce zero judgments and zero fixes with all three flagged checkers absent from the issue list. The boundary case is a cj-comment block alongside a real `#+begin_src markdown` block. The markdown warning still surfaces, which scopes the suppression to cj openers only — no leak into other src blocks.
Test count goes from 22 to 24, all green. I smoke-tested against rulesets/todo.org: judgment count drops from 7 to 1. Six cj-comment false positives at lines 16 and 1291 are gone, and the unrelated misplaced-heading at 2139 still surfaces correctly.
|
| |
|
|
|
|
|
|
|
|
| |
wrap-it-up's lint-org and date-coverage scans both defaulted LINT_ORG_FOLLOWUPS to `$HOME/projects/work/inbox/lint-followups.org`. The intent was to land findings where the next morning's daily-prep would pick them up. The bug: every project running wrap-up dumped its findings into the work project's inbox regardless of which project's todo.org was scanned. The fallback at `.ai/lint-followups.org` never fired because `$HOME/projects/work/inbox/` exists on every machine.
I found this morning that work's inbox/lint-followups.org had accumulated lint output from .emacs.d, rulesets, and work across multiple wrap-up runs on 2026-05-15 and 2026-05-16. I routed the foreign sections back to the right inboxes via inbox-send.
The fix changes the default to `./inbox/lint-followups.org` in the current project's cwd, with `.ai/lint-followups.org` as the fallback when the project has no `inbox/` directory. The env var still overrides for projects that want to route somewhere else.
I applied the same change to both bash blocks (lint-org sweep at line 137, date-coverage scan at line 173) and rewrote the prose paragraph that documented the old default, with a note explaining why hardcoding a single project's path was wrong.
|
| |
|
|
|
|
|
|
|
|
| |
todo.org bookkeeping for the night:
- Wrap-it-up github task moved to Rulesets Resolved by archive-done (CLOSED 2026-05-16 Sat). The fix shipped in 7121a88.
- New [#C] filed: wrap-it-up Step 3.5 assumes GitHub-family remote. Triggered by the same-file audit during tonight's start-work. Step 3.5 says "the project's GitHub remote — use gh pr list ..." which is generic GitHub (not github.com literal) but still bakes in a host-family assumption that would break on a future non-GitHub Linear project. Currently fine for DeepSat-on-GHE.
- Spec stubs added under DOING memory-sync and TODO /update-skills: placeholders for cj: comment blocks to fill in during the next session on each.
Date-coverage scan flagged 8 [#A] / [#B] tasks lacking DEADLINE or SCHEDULED; appended to lint-followups for morning review.
|
| |
|
|
|
|
| |
The Step 4 "Push to all remotes" parenthetical singled out "github.com + cjennings.net mirrors" as the canonical case. Accurate for rulesets and a few other repos, misleading for the rest. Most projects have git.cjennings.net as their sole remote, and DeepSat lives on deepsat.ghe.com. The push loop itself (for r in $(git remote)) is already remote-agnostic; the prose just needed to catch up.
New wording covers both the mirror case and the different-audience-per-remote case without naming any specific host.
|
| |
|
|
|
|
|
|
| |
Every Action item surfaced by Phase 3 sub-steps 3b/3d/3e/3f (email, Slack, Linear, PR Review) now becomes its own ** TODO in todo.org with :quick: + :reactive: tags plus sharp person/entity tags. The prep doc's * Day's Priorities section references each task as a thin link when it belongs in today's plan; otherwise the task stays in todo.org and surfaces on a later prep via the new sub-step 3a step 4 pull.
The grouped ** Email Response / ** Slack Response / ** Linear Response / ** PR Review sub-headings disappear from the prep doc. Source mix lives in the tags on each task. The Recommended Approach Pattern still applies. The analysis and draft response live in the task body, not in the prep doc.
Mirrors the convention adopted in the work-side triage-intake workflow on 2026-05-15. Closes the 2026-05-12 follow-up about rewording sub-steps 3b–3f.
|
| |
|
|
| |
The project mirror at .ai/scripts/ was missing the wrapper_type state machine and TestCjScanNestedFencesIgnored suite that landed in dc1661c. That commit only touched claude-templates/.ai/scripts/. Phase A's startup rsync brings the mirror back in line with the canonical.
|
| |
|
|
| |
Two arcs this session: closed two stale todo entries (/lint-org retroactively, pull-ordering doc proactively after writing the missing protocols.org paragraph), then built scripts/tests/audit.bats and scripts/tests/install-ai.bats covering the three deferred destructive edges from yesterday's fold-epic test plan. A dotemacs cross-project handoff for a cj-scan nested-fence bug landed during commit staging and shipped as its own commit, separate from the test-harness work. archive-done moved three DONE level-2 entries to Rulesets Resolved.
|
| |
|
|
| |
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.
|
| |
|
|
|
|
|
|
| |
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.
|
| |
|
|
|
|
| |
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.
|
| |
|
|
| |
/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.
|
| |
|
|
| |
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.
|
| | |
|
| | |
|
| |
|
|
|
|
| |
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.
|
| |
|
|
| |
child 5 awaits ratio
|
| |
|
|
|
|
|
|
| |
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.
|
| |
|
|
| |
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.
|
| |
|
|
|
|
|
|
| |
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/.
|
| |
|
|
|
|
|
|
| |
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.
|
| |
|
|
| |
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.
|
| |
|
|
| |
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.
|
| |
|
|
| |
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.
|
| |
|
|
|
|
| |
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.
|
| |
|
|
|
|
|
|
| |
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
|
| |\ |
|
| |
|
|
|
| |
git-subtree-dir: claude-templates
git-subtree-split: f1168885580e9197dcf57b57644eb576fdca2ab1
|
| |
|
|
| |
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.
|
| |
|
|
|
|
|
| |
- 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
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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).
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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.
|
| |
|
|
|
|
|
|
|
|
| |
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.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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.
|
| |
|
|
|
|
|
| |
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).
|
| |
|
|
|
|
|
|
| |
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.
|
| | |
|
| |
|
|
|
|
|
|
|
|
| |
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.
|
| |
|
|
| |
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.
|
| |
|
|
|
|
|
|
| |
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.
|
| |
|
|
| |
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.
|
| |
|
|
| |
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.
|
| |
|
|
| |
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.
|
| |
|
|
| |
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.
|
| |
|
|
|
|
| |
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.
|
| | |
|