| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|
|
|
|
|
|
|
| |
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.
|
| |
|
|
|
|
|
|
|
|
| |
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.
|
| |
|
|
| |
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.
|
| | |
|
| |
|
|
|
|
|
|
| |
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
|
| |
|
|
|
|
|
| |
- 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
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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.
|
| |
|
|
| |
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.
|
| |
|
|
|
|
| |
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.
|
| |
|
|
|
|
| |
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.
|
| |
|
|
| |
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.
|
| |
|
|
| |
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.
|
| |
|
|
| |
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.
|
| |
|
|
| |
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.
|
| |
|
|
| |
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.
|
| |
|
|
|
|
|
|
| |
--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.
|
| |
|
|
| |
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.
|
| |
|
|
| |
Pull in the latest maildir-flag-manager.py and cross-agent-comms doc updates from the claude-templates source.
|
| |
|
|
|
|
| |
Strip leading ".." sequences instead of stripping all leading dots,
so dotfiles like ".gitignore" are preserved while still preventing
directory traversal via "../foo" style names. ```
|
| | |
|
| |
|
|
|
|
|
|
| |
Add cmail-action.py for IMAP triage operations against Proton Mail
Bridge (list-unread, read, mark-read, star, unstar, trash, send,
folders) mirroring the Gmail MCP workflow. Also add comprehensive
tests for cmail-action, gmail-fetch-attachments, and
maildir-flag-manager scripts.
|
| |
|
|
| |
scripts
|
| |
|
|
| |
Sweep Dev-Review tickets assigned to Craig before the wrap-up commit. Any whose linked PR has merged gets proposed for Done (chores, refactors, test backfills, dead-code removal) or PM Acceptance (real fixes or features users can verify). Tickets stuck in Dev Review after the PR merges hide real in-progress work. The step is idempotent and skips when Linear is not in use.
|
| |
|
|
|
|
|
|
| |
Voice skill consolidates the prose-quality passes (humanizer plus universal good-writing rules plus personal-style) into one /voice invocation with two modes. General mode for arbitrary writing. Personal mode for commit messages, PR descriptions, and PR review comments. The standalone humanizer skill is retired.
make doctor verifies ~/.claude/ live state matches the repo and settings.json. Eight checks covering skills, rules, hooks, settings.json hook references, plugins, MCP server registrations, and dangling symlinks.
The MCP install pipeline now bundles Google Docs OAuth tokens alongside the GCP keys, so a fresh machine boots fully connected after make install-mcp without requiring a manual OAuth dance per profile.
|
| |
|
|
|
|
|
|
| |
I deleted humanizer/SKILL.md now that all three callers (commits.md, respond-to-cj-comments.md, start-work.md) invoke /voice instead. The 25 humanizer patterns live on as patterns 1-25 in voice/SKILL.md. Same source (Wikipedia's Signs of AI writing), same prose, same examples — just renumbered alongside the universal good-writing additions and the personal-only patterns.
I also updated .ai/notes.org and .ai/workflows/wrap-it-up.org to reference /voice personal instead of the old humanizer + manual-passes flow. The wrap-it-up change landed upstream in claude-templates first so it survives the next startup rsync.
todo.org gets the matching update: the voice TODO is marked DONE with a "Built and shipped" timestamp, the publish-mode terminology is renamed to personal-mode throughout, the V1 scope checklist is ticked, the open questions are resolved with the answers we landed on during implementation, and the migration section records the delete-not-alias decision.
|
| |
|
|
|
|
| |
I added a "Shell aliases (=ls= → =exa=)" note to protocols.org so future sessions know to use \ls when capturing ls output programmatically. exa prints nothing to non-TTY pipes, so the symptom looks like an empty directory. I hit this earlier in the session when a sweep came back blank for a directory I knew was populated.
I also fixed three stale ~/projects/career/ examples in cross-agent-comms/ docs that didn't get updated when career was renamed to work, and the daily-prep.org path leak from last session (~/code/deepsat/... → ~/projects/work/deepsat/code/...). The authoritative edits live in claude-templates. These rulesets snapshots landed via the standard rsync from upstream.
|
|
|
Replace the seed notes.org with project-specific context (layout, install modes, task tracker location, recent inflection point). Bring in the synced template surfaces (protocols, workflows, scripts, references, retrospectives, someday-maybe) as tracked content for this content/documentation project.
|