aboutsummaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
* feat(sync-check): canonical/mirror drift detection + pre-commit hookCraig Jennings2026-05-285-1/+182
| | | | | | | | | | | | | | | | | | | | | | | | | | scripts/sync-check.sh diffs claude-templates/.ai/{protocols.org, workflows,scripts} against the .ai/ mirror. Exits 0 when clean, 1 with a diff report on drift, 2 outside a rulesets-shaped repo or git checkout. --fix mode rsyncs canonical -> mirror and re-checks, then prompts to re-stage. githooks/pre-commit wraps the script. Commits abort on drift so the issue surfaces at publish time, not at the next session's startup rsync. Two new Makefile targets: - make sync-check [FIX=1] runs the script (FIX=1 passes --fix through). - make install-githooks sets core.hooksPath=githooks (idempotent). scripts/tests/sync-check.bats holds 8 tests covering clean, drift-per-path, --fix, extra-file removal, missing canonical, and outside-git. All eight pass. This catches the exact drift I had to fix manually during this morning's audit pass. The mirror's open-tasks.org PROPERTIES drawer sat below a sub-heading because the mirror commit was older than canonical.
* feat(open-tasks): archive-done sweep at start of Phase ACraig Jennings2026-05-283-3/+34
| | | | | | | | | | | | | | | | | | open-tasks.org Phase A now runs `emacs --batch -q -l .ai/scripts/todo-cleanup.el --archive-done todo.org` as a pre-step before the parallel read batch. A level-2 task that completed during the session sits as ** DONE under Open Work until something archives it, which means Next Mode would surface it as a "what's next" candidate between cleanups. The pre-step ensures Phase A's read of todo.org reflects current state. The pre-step skips only in an explicit read-only or dry-run context. Default is always to sweep. Common Mistake #13 records "recommending a freshly-DONE task" with the pointer back to the pre-step. The proposal came from a pearl handoff on 2026-05-28.
* feat(workflows): add process-inbox.org with value-gate disciplineCraig Jennings2026-05-286-18/+350
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Generic process-inbox workflow at claude-templates/.ai/workflows/ and mirror. Owns inbox discipline across every project: items are ideas to evaluate, not orders to execute, and earn a place in todo.org or git history only when they pass a three-question value gate. The gate (Phase B): - Advances an existing TODO (look up by topic). - Improves how the project works (architecture, workflows, tooling, rule hygiene). - Serves the project's stated mission (read from notes.org Project-Specific Context). One yes accepts. Three nos reject. Per-source rejection flow (Phase D): - From Craig: state in chat, wait for override. - From another project: write a response via inbox-send naming which gate question failed plus any reconsideration condition. Silent rejection on a handoff is worse than no reply. - From a script or automated system: just delete. Phase B.1 gates filing on priority-scheme presence. If todo.org has a scheme at the top, file with cookie + mandatory type tag + optional effort/autonomy tags. If not, surface a one-sentence nudge to adopt one (or to skip grading and flag the gap in the commit). Phase D within accepts splits implement-now / fold-into-existing / file-as-TODO so the inbox doesn't default to inflating todo.org for every item that passes the gate. Phase E stamps :LAST_INBOX_PROCESS: in notes.org Workflow State if the section exists. startup.org Phase C step 2 now delegates here instead of inlining the inbox-processing language. INDEX entry under Tasks and planning lists the full set of trigger phrases.
* chore(intake): triage codex backlog into 5 actionable TODOs + dispositionsCraig Jennings2026-05-282-12/+109
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Walked the 14-item codex enhancement backlog with Craig and recorded dispositions in docs/design/2026-05-28-rulesets-enhancement-backlog.org under a new "Triage Dispositions" section. The triage TODO closed. Accept (filed below as TODOs): - Item #8 .aiignore for agent inventory exclusions ([#C] :chore:) - Item #10 Workflow test harness for drift and integrity tests ([#C] :feature:) Pilot or scope-limit (filed below): - Item #5 Token-tier pilot on startup.org and triage-intake.org ([#C] :feature:) - Item #7 Canonical/mirror drift detection via pre-commit hook or make sync-check ([#C] :feature:quick:solo:). Rejected the wholesale dedupe. The dual source is a feature. - Item #12 make status only ([#C] :feature:quick:solo:). Rejected the rest of #12. Convention, not tracked: - Item #11 script interface normalization (adopt as scripts are touched) - Item #13 ADR layer (watch-and-wait on growth signal) Reject with rationale (recorded in the backlog doc): - Item #1 broader runtime-neutral arc. Heavy infrastructure for marginal payoff at current use. - Item #3 INDEX.org compression. Already token-efficient. Parallel layer adds drift risk. - Item #4 universal catalog.json. Looks valuable on paper, rots fast in practice. - Item #6 install manifest JSON. Current Makefile pattern works. Data layer adds indirection. - Item #9 project-facts.org. Duplicates notes.org's role. - Item #14 local model profiles. Premature without a real use case. Item #2 (per-agent live session files) was already filed earlier today as the Codex Phase 1 [#B] TODO, slicing the broader item #1 arc.
* chore(intake): file codex enhancement backlog as docs/design + triage TODOCraig Jennings2026-05-283-80/+448
| | | | | | | | | | | | | | | | | | Codex left a 14-item enhancement backlog for rulesets at inbox/enhancements.org overnight. Moved it to docs/design/2026-05-28-rulesets-enhancement-backlog.org as the canonical reference and filed a single [#C] :spec: TODO to walk the items and decide accept-as-TODO, fold, defer, or reject for each. Two of the 14 already have homes: item #1 (runtime-neutral core) aligns with the existing Generic agent runtime support spec (#16), and item #2 (per-agent live session files) is exactly the Codex Phase 1 [#B] TODO filed earlier today. The triage focuses on the remaining 12. Also cleared the last-session PROCESSED-prefixed inbox file (open-tasks-hybrid-friction-cascade). The cascade+friction restructure it tracked landed in this morning's open-tasks.org edits, so the reference is no longer needed.
* feat(workflows): promote no-approvals.org to template, merge pearl framingCraig Jennings2026-05-286-176/+262
| | | | | | | | | | | | | | | | | | | | | | | Pearl independently built its own no-approvals workflow (handoff in this morning's inbox) and asked rulesets to take the best from both. That's cross-project signal that the workflow earns a place at the template tier. Promoted from =.ai/project-workflows/= to =claude-templates/.ai/workflows/= with a mirror under =.ai/workflows/=. INDEX entry added under "Tools and meta" listing the full set of trigger phrases. Merged from pearl's draft: the prominent "What's Suspended" / "What Stays On" split (same content as the prior "Contract" section, easier to scan), wider trigger phrases (the project-only version had fewer), the mode-resets-when-Craig-switches-topics guard, an explicit destructive-action carve-out as its own bullet rather than buried in the "real question" section, and a subagent-review-gate callout. Kept from the rulesets version: the Session Log update emphasis between items, the real-question include/exclude lists, and the don't-auto-wrap-up guard. A History section at the bottom records the merge for future archaeology.
* fix(todo): move task #15 PROPERTIES drawer above sub-headingsCraig Jennings2026-05-281-4/+4
| | | | | | | | The dated sub-entry added in the audit pass left the LAST_REVIEWED line below the first level-3 heading, where the staleness checker can't see it (it scans only between the level-2 heading and the next heading of any depth). The fix moves the PROPERTIES drawer to its standard org-mode placement, immediately after the level-2 heading.
* chore(audit): task-audit pass + pearl intake from 2026-05-28 morningCraig Jennings2026-05-288-198/+175
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | All 16 open tasks bucketed and updated. 14 received autonomous Phase C edits (13 type-tag additions per the new scheme plus #15's body refresh for the accumulating pearl signal). Phase D adjudicated two priority bumps and the morning's inbox spillover. Phase E stamped :LAST_AUDIT: in notes.org Workflow State. Autonomous Phase C: - Tagged tasks 1-11 and 13-14 with their type tag (:feature:, :chore:, :spec:), bumped LAST_REVIEWED to 2026-05-28. Tasks 12, 15, 16 already carried type tags. - Refreshed task #15 body to reference the four pearl pattern-catalog notes now in docs/design/ (six worked patterns total). Phase D adjudication: - #15 (cross-project pattern catalog) bumped [#C] to [#B]. Pearl shipped 6 worked examples plus a synthesizing principle and is asking for spec-review iterations. Design questions still open but evidence is past the tipping point. - Filed new [#B] :feature: TODO for the codex Phase 1 race-fix (AI_AGENT_ID + session-context.d/<id>.org), lifted from the broader runtime spec (#16). Phase 1 alone is low-risk and fixes a real correctness issue under simultaneous agents. Pearl intake (4 inbox files from this morning): - Moved 0155 (patterns 4-5) and 0303 (pattern 6) into docs/design/ alongside the prior two pattern-catalog notes. Referenced from #15. - Filed new [#C] :chore:quick:solo: TODO for pearl 0138's --archive-done sweep at the start of open-tasks.org Phase A. - Filed new [#C] :feature:solo: TODO for pearl 0226's spec-review.org Phase 6 implementation-task enumeration. - Deleted 0124. Already implemented this session as the audit-warranted pre-step plus the LAST_AUDIT stamp now live in the workflow files.
* feat(workflows): audit-warranted pre-step + priority and tag enforcementCraig Jennings2026-05-284-20/+158
| | | | | | | | | | | | | | | | | | | Two changes land together because each is broken without the other. open-tasks.org gains a new Phase A.1, evaluated only in Next Mode. The phase reads :LAST_AUDIT: from notes.org and walks five state signals (reminder/task mismatch, passed scheduled date, "waiting on X" matches a shipped X, dead file: link, sub-task >75% DONE coverage). If the temporal threshold of 14 days trips, or any signal fires, Next Mode offers a task-audit run before producing the recommendation. Item 1 in the offer is "run task-audit first" per the recommendation-at-item-1 convention. task-audit.org gains two pieces. Phase C now enforces priority and type-tag presence per the project's legend, applies the [#A] dating rule from that legend, and re-assesses :quick: and :solo: from reconciled facts. Unambiguous calls land autonomously. Ambiguous ones flag NEEDS-USER instead of being guessed. A new Phase E stamps :LAST_AUDIT: on completion.
* docs(todo): add priority and tag schemeCraig Jennings2026-05-282-0/+35
| | | | | | | | | | | | | | | | Adds an explicit [#A]-[#D] legend at the top of todo.org defining what each priority level means in practice. Type and effort tag conventions live alongside, since task-audit enforces both. [#A] now requires a SCHEDULED or DEADLINE date. A task that can't be dated isn't really [#A]. It belongs at [#B]. Tags split two ways. Type tags (:feature:, :chore:, :spec:, :bug:) are mandatory. Effort and autonomy tags (:quick:, :solo:) are optional and orthogonal. Both can apply to the same task. Seeds a Workflow State section in notes.org for the :LAST_AUDIT: marker that open-tasks.org Next Mode reads to decide whether to offer a task-audit run. The marker starts unset. The first task-audit run populates it.
* chore(ai): archive session recordCraig Jennings2026-05-281-0/+38
|
* chore(session): snapshot WIP, session-context, and inbox arrivalsCraig Jennings2026-05-288-16/+623
| | | | | | | | | | Bundles end-of-session state across three concerns. claude-templates/.ai/workflows/open-tasks.org: in-flight restructure of Next Mode into a two-question output (cascade + friction filter), +62 lines. Separate from the iteration-history work that landed in 55adf6e and 684b273. .ai/session-context.org: live session record covering startup through the iteration-history backfill. Captures the no-approvals mode and the full spec-review/spec-response cycle on the working draft. inbox/: five new arrivals from this session: four pearl notes (pattern catalog, prompts-ux, spec-review implementation, prompt collapse) plus one .emacs.d note (whats-next + task-audit). A sixth file, PROCESSED-prefixed, represents mid-handling state on the open-tasks friction-cascade suggestion from earlier in the session.
* feat(workflows): backfill iteration history in spec workflowsCraig Jennings2026-05-285-1/+90
| | | | | | Closes the org-drill backfill TODO. Both workflow files now carry a bottom "Review and iteration history" section with four entries: Draft 1 (linear-emacs origin, 2026-05-23, placeholder timestamp), Review-and-Fold (commit 7f2aea1, 2026-05-23), Requirement addition (commit 55adf6e, 2026-05-28), and this backfill commit. Canonical and mirror updated together. Working directory working/spec-workflows-iteration-history-backfill/ removed on this commit. The spec-response cycle on the working draft (two Codex reviews, three rulesets responses) validated the entry-shape and the content before splice. Codex caught file-history conflation that would have made per-file provenance inaccurate. Craig's direct rationale on the Iteration 1 and Iteration 3 Why lines replaced the original INFERRED markers.
* feat(workflows): add iteration-history requirement to spec workflowsCraig Jennings2026-05-284-16/+86
| | | | | | Specs reviewed under either workflow now carry a bottom =Review and iteration history= section. Each entry is an org subheading with a compound id (timestamp, contributor, role) plus What/Why/Artifacts body fields. The id is opaque. Timestamp, contributor, and role concatenate without implying any decision ordering. spec-review.org adds the gate item, the entry-shape spec, and a "Preserve iteration provenance" principle. spec-response.org adds the matching Phase 4 step and a "history explains provenance" principle. Canonical and mirror updated together.
* docs(todo): clarify what blocks the iteration-history backfill TODOCraig Jennings2026-05-281-1/+1
| | | | The earlier body listed two reasons to wait: a file-conflict block (correct, since spec-review.org and spec-response.org have uncommitted edits) and a guess that the entry-shape spec might still change (inference without evidence). The revised dependency drops the guess. The read-only research portion can run in parallel without touching the files.
* chore(intake): file org-drill iteration-history backfill as TODOCraig Jennings2026-05-281-0/+17
| | | | The org-drill inbox asks rulesets to backfill =Review and iteration history= sections on spec-review.org and spec-response.org. It lands as a follow-up TODO because the requirement itself is still being established in uncommitted WIP.
* chore(intake): file pearl pattern-catalog and codex runtime spec as TODOsCraig Jennings2026-05-284-0/+613
| | | | Moved three inbox notes into docs/design/ so the task body links survive: pearl's two pattern-catalog handoffs and codex's v0 generic-agent-runtime spec. Added two corresponding TODOs under Rulesets Open Work, both [#C].
* docs(rules): add recommendation-at-item-1 convention to interaction.mdCraig Jennings2026-05-281-0/+10
| | | | Numbered choice lists put the recommended option at item 1 so the common case collapses to one keystroke. Skip when the question is free-form, when a directive's already been issued, or when no option is clearly better. Say so plainly in that case.
* feat(workflows): add no-approvals.org project workflowCraig Jennings2026-05-281-0/+78
| | | | Captures the no-approvals mode contract: Craig gives up per-commit approval gates and routine check-ins, Claude keeps /review-code and /voice personal on every commit plus all engineering discipline. Stop only on a real question (recommendation as item 1) or when the planned work is done.
* chore(ai): archive session recordCraig Jennings2026-05-261-0/+97
|
* feat(commands): let the agent invoke codify, refactor, and ↵Craig Jennings2026-05-263-3/+0
| | | | | | respond-to-cj-comments I dropped disable-model-invocation from these three commands, the same one-line change I made to start-work. They were user-only, so the agent couldn't run them as a workflow step. Now the agent can invoke them through the Skill tool and I can still type the slash command. The remaining flagged commands stay user-only for now.
* feat(start-work): let the agent invoke it, not just the userCraig Jennings2026-05-261-1/+0
| | | | I dropped disable-model-invocation from start-work's frontmatter. The flag made it user-only, so the agent couldn't run it as a workflow step and I had to type /start-work by hand every time. Removing the line makes it invocable by the agent through the Skill tool while /start-work still works for me. Its description already carries strong "Do NOT use for..." triggers, so the auto-invoke risk stays low. The other 16 commands still carry the flag.
* feat(hooks): hard-deny the AskUserQuestion popup machine-wideCraig Jennings2026-05-262-0/+13
| | | | | | The no-popup-menus rule in interaction.md was too easy to forget, so the popup kept slipping back into choice prompts. I added a PreToolUse hook on AskUserQuestion that denies the call outright and returns the rule as the reason, which routes choices back to inline numbered lists. Since ~/.claude/settings.json symlinks to this repo's .claude/settings.json, the hook is machine-wide and version-controlled across machines. I documented it under the rule in interaction.md, including the consequence: the deny is unconditional, so the old "use the popup for this one" exception now needs the hook disabled via /hooks first.
* docs(protocols): gate credential-leak warnings on project type, not the ↵Craig Jennings2026-05-262-0/+4
| | | | | | | | | | credential A session false-alarmed on a leak risk when restoring a credentials doc into a tracked .ai/ file. The reasoning was wrong: a tracked secret is only a public-leak risk where the repo can reach a public remote, which means code projects on public GitHub, the ones that already gitignore .ai/. Personal and documentation projects push to a private single-user repo on cjennings.net, so tracked credentials in their .ai/ files are fine and expected. I added the rule next to the existing "should .ai/ be committed?" decision in protocols.org, since it's a direct corollary of the same code-vs-personal split. The "is this a leak?" question now resolves on which kind of project and remote it is, not on the mere presence of a credential in a tracked file. Origin: an elibrary session raised the false alarm and Craig corrected it.
* chore(inbox): clear processed lint follow-upsCraig Jennings2026-05-261-3/+0
|
* docs(protocols): document .ai/project-scripts/ for project-owned scriptsCraig Jennings2026-05-264-2/+6
| | | | | | | | A project script dropped into .ai/scripts/ gets wiped on the next startup, because that dir syncs from the template with rsync --delete. There was no documented home for a project's own scripts, the script-side counterpart to .ai/project-workflows/. I added .ai/project-scripts/ to the Directory Architecture table and noted in startup.org that it sits outside the synced set, like project-workflows/. A script a workflow imports lives there. Naming: a Python module imported via sys.path needs an importable name (underscores), while a CLI-invoked script can stay kebab-case like the template tooling. No mechanism change. Startup Phase A only rsyncs protocols.org, workflows/, and scripts/, so project-scripts/ is already sync-safe. This just documents it.
* feat(voice): add prose mode for Craig-authored prose + strengthen em-dash, ↵Craig Jennings2026-05-262-34/+51
| | | | | | | | | | | | fragments, formatting The personal voice patterns only ran for commits and PRs, so the emails and documents I author never got my actual writing voice. General mode deliberately skips them. I added a third mode, prose, that applies my voice patterns to prose I write or send without dragging in the publish-artifact mechanics that misfire on free text. The modes now nest. General (#1-31) handles anyone's prose, prose adds my voice patterns (em-dash zero-tolerance, contractions, semicolons to periods, sentence-split, felt-experience cut, fragment rewrite, terse-cut, no-emphasis-formatting), and personal adds the three artifact-mechanics patterns on top (first-person rewrite, public-artifact scope flag, praise/correction asymmetry). Those three stay personal-only because they assume a commit or PR: a document is legitimately third-person, a journal has no public-scope concern, and praise/correction asymmetry is a PR-review rule. Three gaps closed along the way. #13 (em-dash) was "use fewer". It's now zero-tolerance in prose and personal modes, and the rule holds inside examples and quoted text, not just running prose. #37 (every prose sentence needs a subject and a verb) was locked to personal mode. It now applies to my prose too. And #41 is new: I make points with words, not bold or italics or underscores, so emphasis markup gets rephrased so the stress lives in the wording. I updated commits.md to match. The publish flow still uses personal mode, but the pattern count is now 41 and the personal-only set is the three artifact-mechanics patterns.
* chore(todo): full review pass — re-stamp, drop stale schedules, refresh ↵Craig Jennings2026-05-261-20/+19
| | | | | | daily-prep task Walked all 14 open tasks. Re-stamped LAST_REVIEWED to 2026-05-26, dropped the past SCHEDULED dates from the research-writer and Skill-Seekers wait-for-trigger tasks, tagged the Makefile consolidation :quick:solo:, and refreshed the daily-prep delegation task to reflect the triage-intake engine/plugin split.
* feat(notify): default page notifications to --persistCraig Jennings2026-05-266-16/+24
| | | | | | I default page notifications to --persist so a page that fires while I'm away from the desk waits for me instead of auto-dismissing after a few seconds. page-me and status-check already persisted every page. I added --persist to the rest: the alarm, reminder, and meeting-alert examples in protocols.org, the long-running-process completion ping, and the cross-agent-watch message notification. I documented --persist as the default for any page meant to get attention, with a low-value informational ping as the only exception.
* refactor(workflows): split triage-intake into engine + source pluginsCraig Jennings2026-05-2614-182/+962
| | | | | | | | The triage-intake workflow had every source baked into one file, so adding or changing a source meant editing the workflow itself. I replaced it with a source-agnostic engine plus per-source plugins named triage-intake.<source>.org. The engine carries the anchor/sentinel logic, the four-bucket model, the Phase A-D orchestration, the todo.org persistence convention, and the exit criteria. Each source's scan, classify, render, and action knowledge moved into its own plugin. Four general plugins ship in the template: personal-gmail, personal-calendar, cmail, and github-prs. Project-specific sources live in the project's .ai/project-workflows/ and are never synced. Phase 0 globs both directories so a project source can't silently drop out of the sweep. I taught INDEX.org and the startup workflow-discovery drift check the namespace. A file matching <engine>.*.org is a plugin of that engine, not an orphan, and gets no trigger entry of its own. A "run the triage-intake workflow" request routes to the engine, never to a plugin.
* fix(inbox-send): preserve dots in copied filenamesCraig Jennings2026-05-264-2/+110
| | | | | | send_file ran filenames through slugify(), which flattens dots to hyphens. That corrupts the engine.plugin.org plugin-namespace convention: triage-intake.personal-gmail.org arrived as triage-intake-personal-gmail.org, which breaks the engine's triage-intake.*.org glob and the routing that depends on the first dot. I added slugify_filename() for filename stems. It keeps dots, hyphens, underscores, and case, collapses only whitespace runs to hyphens, and truncates on a separator boundary. The prose --text path still uses slugify().
* chore(ai): archive session record + regen lint follow-upsCraig Jennings2026-05-252-0/+77
|
* fix(elisp): add themes/ to the validate-el.sh load pathCraig Jennings2026-05-251-0/+2
| | | | | | The PostToolUse hook byte-compiles each saved .el with -L for the project root, modules/, and tests/, but not themes/. A theme file that requires a sibling under themes/ then fails byte-compile with "Cannot open load file", a false VALIDATION FAILED even though the file loads fine at runtime. I added -L themes/ to both the byte-compile and test-runner blocks. Adding a load-path entry for a directory that doesn't exist is harmless to Emacs, so it stays unconditional, matching how modules/ and tests/ are already added without an existence guard.
* chore(todo): add coverage-summary language-bundle taskCraig Jennings2026-05-251-0/+29
|
* docs(skills): add voice pattern 40, praise/correction asymmetryCraig Jennings2026-05-252-11/+33
| | | | | | Voice gains pattern #40: strip the "why" from praise on an approve, since the author already knows why their change is good and the justification reads as flattery. Always keep the why on a finding or change-request, delivered gently. Behavior only changes when the reason lands. review-code now runs a praise/correction gate before posting any summary, and its inline-comment guidance is tightened so the why-it-matters survives the brevity cuts. The reviewer states the stakes (a user hits a 500, a screen reader announces nothing), not just the mechanism.
* fix(elisp): gitignore the full Claude tooling footprintCraig Jennings2026-05-252-3/+46
| | | | | | The bundle tracked .claude/rules, CLAUDE.md, and githooks/, ignoring only the personal overrides. For a code project, especially a third-party package checkout, the whole Claude footprint should stay local: install and sync deliver it, so it shouldn't land in the project's history. gitignore-add.txt now ignores .claude/, CLAUDE.md, and githooks/ next to the elisp build artifacts. I also added install-lang.bats, which the bundle had no test for. It covers the landed footprint and the gitignore set.
* chore(todo): review and stamp ten stale tasksCraig Jennings2026-05-251-3/+33
| | | | Re-grade /research-writer to [#C] (deferred until a real research-writing task triggers it) and tag the two MCP tasks :solo:quick:. The rest confirmed as-is.
* chore(inbox): clear processed lint follow-upsCraig Jennings2026-05-251-5/+0
| | | | Both entries were non-actionable: a verbatim-marker false positive in a DONE task body, and a recurring staleness note now resolved by a review pass.
* docs: keep chat output plain text to avoid reverse-videoCraig Jennings2026-05-252-11/+29
| | | | | | Craig's terminal renders Markdown bold and inline-code spans as reverse video, which is hard to read. I added a rule to interaction.md: in conversational output, write command names, paths, and key chords as plain text, and lean on headers, dashes, parentheses, and quotes for structure. It governs chat output only, not the Markdown source of the rule and spec files he reads in an editor. I also made the keybinding-display example plain text so the convention shows the format the way it should appear in chat, with a pointer to the new rule.
* docs: add the keybinding-display conventionCraig Jennings2026-05-251-0/+38
| | | | I added a rule for how to present a keymap's bindings when asked to show them. The format is a bulleted list grouped by prefix level: a General header at the top that lists the sub-prefixes leading into each category, then one section per category. Every bullet carries the full chord, the bound command, and the which-key label, so the written view matches what which-key shows on screen.
* chore(ai): archive session record, regen lint follow-ups, fix dangling todo linkCraig Jennings2026-05-243-1/+190
| | | | The claude-memory clone was removed this session, so the todo entry's file: link to it would dangle — switched to plain text.
* chore(todo): reopen memory-sync task after reversing the migrationCraig Jennings2026-05-241-2/+4
|
* docs(verification): add a manual-verification handoff formatCraig Jennings2026-05-241-0/+27
| | | | When a verification gap needs the user's hands or eyes — interactive UI a script can't drive, a live service, visual rendering — describing the steps in prose isn't enough. I added a section to verification.md that says to write them as a "Manual testing and validation" task: one sub-header per test, each with a descriptive title, what we're verifying, the steps as a bullet list, and the expected result. If a test fails, the user writes the actual behavior, flips the header to a TODO, and promotes it, so a failed check becomes a tracked bug in one step.
* chore(inbox): clear recurring lint follow-upsCraig Jennings2026-05-231-15/+0
|
* chore(todo): close cross-machine memory sync via dedicated repoCraig Jennings2026-05-231-3/+7
| | | | I closed the memory-sync task. Memory now lives in a dedicated private claude-memory.git on cjennings.net, with each project's memory dir symlinked into a local clone so new memory lands in the working tree and a push syncs it. I settled on that over stow/dotfiles and over keeping it in rulesets, since rulesets sits on every session's startup-pull path and memory churn would dirty it. The task's dated entries carry the decision and the shipped details.
* chore(ai): resync workflow and script mirror with canonicalCraig Jennings2026-05-235-2/+376
| | | | The .ai/ mirror lagged claude-templates/.ai/ for three workflows (task-audit, task-review, triage-intake) and two scripts (screenshot.py and its test) — earlier commits updated the canonical copies without resyncing the mirror in the same commit. The startup rsync caught it up; this commit tracks the result so the two stay identical.
* feat(workflows): add spec-review and spec-response workflow pairCraig Jennings2026-05-236-0/+706
| | | | | | | | These two workflows form a reviewer side and an author side for taking a design spec to implementation-ready. spec-review judges a spec against a readiness gate, reads the code before critiquing, evaluates across dimensions, assigns a rubric (Ready / Ready-with-caveats / Not-ready / Needs-research), and writes a <spec>-review.org file when it isn't ready. spec-response consumes that file: it decides accept / modify / reject for every recommendation, weaves the accepts into the spec body, records the modifies and rejects with reasons in a "Review dispositions" section, and reconciles tensions when coupled specs get reviewed together. The review file is the contract between them. Both were validated by a real run on 2026-05-23 before landing here. I then reviewed them against established practice and tightened five things. The readiness gate now covers security/privacy and observability, since a spec shouldn't pass with those undefined. Phase 1 is a fast triage and Phase 3 is the authoritative gate after the code read. Finding severity maps to blocking power. A rejection goes back to the reviewer instead of standing as a unilateral call. And the response loop has an explicit termination condition. I added both to INDEX.org under a new "Specs and design" section with trigger phrases, cross-linked as a pair, and kept the canonical and mirror copies identical.
* docs: add :solo: tag handling to the task workflowsCraig Jennings2026-05-232-1/+9
| | | | | | The task-review and task-audit workflows already assess :quick:, an effort estimate. I added :solo: alongside it: a task Claude can finish end-to-end without Craig's input, gated on bounded scope, no design or preference call, and local verifiability. In task-review.org I added a tagging subsection paralleling :quick:, a mention in the close-out summary, and a common-mistake entry against over-tagging. task-audit.org now re-assesses both tags during content reconciliation, since a resolved dependency can make a stuck task newly solo-able. It points at task-review.org for the definitions rather than restating them.
* fix(workflows): use mu --fields='l' for path in triage mark-readCraig Jennings2026-05-221-1/+4
| | | | The mark-read step extracted message paths with mu --fields='p', but 'p' is the priority field (returns "normal"), not the path. Every path came back as "normal" and the flag manager errored on all of them. 'l' is the file-location field. Caught during a live triage on 2026-05-22.
* docs(deepsat): make Linear state moves manual, add post-merge routingCraig Jennings2026-05-221-4/+17
| | | | | | The Linear/GitHub integration doesn't advance ticket state. Two chores merged today (SE-286, SE-399) sat in Dev Review until I moved them to Done by hand. I made the overlay say that plainly instead of implying the integration keeps tickets in sync. I added the after-merge step the overlay was missing. A bug or feature with PM-reviewable functionality or UI goes to PM Acceptance, and a chore, test, or infra change the PM can't review goes straight to Done. I also dropped the two claims that the integration auto-cross-links, since the reliable cross-link is the PR-URL comment we already post on create.