| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|
|
|
| |
tmux's default new-window placement chooses the lowest free index, which can land between existing windows when the session's window indexes have gaps. The -a flag plus the :{end} target makes it explicit: insert after the existing last window, every time.
The change only touches create_window. The two tmux new-session sites (single_mode and multi_mode first window) create fresh sessions; the first window's position is whatever base-index dictates, and there's nothing to append after.
|
| |
|
|
|
|
|
|
|
|
| |
The ai launcher used to send claude a fixed instruction string ('Read .ai/protocols.org and follow all instructions.'). Every window opened the same way, with no signal in the conversation about which machine or project it belonged to. That's fine when there's one window, less fine when an ai-session has 5+ windows across two machines.
The new build_instructions helper formats the opener per project: "This is <host> <name> project. Follow all instructions in .ai/protocols.org." Host comes from uname -n (POSIX, no dependency on the hostname binary which isn't installed by default on Arch). The project name distinguishes windows; the .ai/ prefix on the path stays so claude resolves the file reliably on first read.
The three send-keys call sites all use the helper now (create_window, single_mode new-session, multi_mode first-window). Smoke-tested with rulesets, .emacs.d, jr-estate basenames.
Also fixes the stale Source/Install header comments. They still pointed at ~/projects/claude-templates/bin/ai, the pre-fold path the subtree merge replaced.
|
| |
|
|
|
|
| |
I added claude-rules/working-files.md as the canonical convention. In-progress task artifacts live in working/<task-slug>/ under the project root. On task completion the files get renamed individually with a YYYY-MM-DD-<slug>-<descriptor> shape and moved flat into assets/ (or the area-specific assets/). Never rename the directory as a substitute for filing, since that loses the flat-searchable property of assets/.
claude-templates/.ai/protocols.org gained a short reference to the rule so it propagates to every project's .ai/protocols.org on the next startup rsync.
|
| |
|
|
|
|
|
|
| |
The "If this session crashed right now..." heuristic was the trigger. It pushes the decision onto the agent every turn, and the agent's bias is to defer when no obvious milestone just happened. Four recent sessions in the work project showed the same drift. The pattern: substantive work, no mid-session writes, a wrap-time reconstruction afterward.
The new primary trigger is mechanical. A turn that called any state-modifying tool (Edit, Write, Agent dispatch, MCP write, or Bash that mutates state) writes to the Session Log before the closing user-facing message. Pure-read turns (Read, Glob, Grep, read-only Bash) don't trigger. The existing high-loss bullets stay as elaboration. They aren't the trigger.
The 5-turn safety net remains. The judgment heuristic is gone. The primary trigger replaces it.
|
| | |
|
| |
|
|
|
|
|
|
| |
Step 1 told the agent to run /review-code but didn't say what to do when the skill exists on disk yet isn't in the session's available-skills list. The list covers plugin-installed skills only. User commands under ~/.claude/commands/ are routable as slash-commands but don't appear in it, so the agent could declare /review-code unavailable and fall through to the trivial-one-liner exception in Step 2.
The new Discovery check tells the agent to verify both ~/.claude/commands/review-code.md and ./.claude/commands/review-code.md on disk before declaring the skill unavailable, and surface the mismatch rather than auto-skipping.
Also drops three absorbed or stale inbox files: the skill-discovery handoff (signal absorbed by this edit), the missing-inbox-dir handoff (already resolved by 470085f), and a stale date-coverage scan output (deferred until the task-review habit lands).
|
| | |
|
| | |
|
| |
|
|
|
|
| |
The `[ ] && echo` shortcut propagates the test's exit status out of the
while loop, which can muddy the pipeline's overall exit. The `if` form
keeps the loop body's status decoupled from the filter check.
|
| |
|
|
| |
Records today's task-review spec + google-keep MCP install work. Lint-followups carries one misplaced-heading judgment (line 2153, false positive — `**` inside `=...=` verbatim) and a 9-entry date-coverage list, both deferred per the task-review spec's plan to retire the date-coverage scan once implemented.
|
| |
|
|
|
|
| |
docs/design/task-review.org captures the brainstorm output for a daily 5-min keystroke-driven review habit that walks 7 oldest-unreviewed top-level [#A]/[#B]/[#C] tasks per session, rotating through the list over ~12 days. Replaces wrap-it-up.org's date-coverage scan once implemented; the watchdog flips from "do all priorities have dates?" to "is the review habit happening?" with a 30-day threshold.
todo.org gets a [#A] entry at the top of Rulesets Open Work pointing at the spec, so the implementation work isn't lost. Six components in the spec's Next Steps: extract task-review-staleness.sh, replace the wrap-up section, author task-review.el in archsetup, author the workflow file plus INDEX entry, add the startup nudge, smoke test.
|
| |
|
|
|
|
| |
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).
|