aboutsummaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
...
* feat(org): table standard as a rule, reflow helper, and lint checkCraig Jennings3 days10-2/+1237
| | | | | | | | | | Wide org tables overflow the page in exported PDF/docx, and hand-wrapping a cell into continuation rows is tedious and error-prone. The standard existed only as a work-project convention with nothing enforcing it. claude-rules/org-tables.md carries the generalized standard: 120-column budget measured at render width (a link counts as its visible label and is never split), over-budget cells wrap onto continuation rows, and a rule sits under the header and every logical row. wrap-org-table.el reflows a table to that shape mechanically. Columns shrink from natural width toward a floor of their widest atomic token, cells wrap link-safe, and rule-delimited continuation groups merge back into their logical row before re-wrapping, which makes the reflow idempotent. A table whose floors still exceed the budget reflows best-effort and stays flagged for restructuring. lint-org.el gains an org-table-standard judgment check: width overruns and missing rules surface during the sweep with a pointer to the helper. Conformant wrapped tables don't false-flag, since the check reuses the helper's continuation-group reading. The check is judgment-only by design: reflowing is a visible layout change the sweep shouldn't make silently.
* feat(hooks): title sessions "host project" for the remote session listCraig Jennings3 days4-0/+126
| | | | | | | | Remote sessions showed up on claude.ai/code and mobile under auto-generated names, so picking the right one meant guessing. Claude Code 2.1.152+ lets a SessionStart hook set the title via hookSpecificOutput.sessionTitle. hooks/session-title.sh emits "<uname -n> <project>" (ratio rulesets, velox work) on startup and resume. Project is the git-toplevel basename so a session started in a subdirectory still names the project, with the cwd basename as fallback. The hook stays silent when a title already exists, so a /rename or an earlier run isn't clobbered on resume. The harness ignores titles on clear and compact, so the settings matcher restricts to startup|resume. Wired in settings.json and the install-hooks snippet. As a default hook it reaches every machine through make install on the next session start.
* feat(install): adopt the statusline script into the managed setCraig Jennings3 days4-1/+83
| | | | | | An archsetup session added a statusLine entry to the tracked settings.json on 2026-06-11 (Craig's request), pointing at ~/.claude/statusline-command.sh, but the script itself lived outside the repo on one machine. This commits the settings entry and brings the script into .claude/, linked by make install like the rest of the config, so it reaches every machine on the next session. Two fixes over the original: uname -n instead of hostname (Arch doesn't ship hostname by default, so the host rendered empty with stderr noise), and the tilde replacement is escaped (unquoted, bash expands the replacement ~ straight back to $HOME, which defeated the abbreviation). scripts/tests/statusline-command.bats covers the format, branch handling, and the no-stderr contract.
* fix(install): link default hooks in make installCraig Jennings3 days5-8/+86
| | | | | | session-clear-resume.sh shipped 2026-06-02 with its settings.json entry, but make install didn't cover hooks and nothing re-ran install-hooks, so the symlink only existed on machines that had linked it by hand. Everywhere else the hook errored silently on every /clear. make install now links DEFAULT_HOOKS alongside skills, rules, config, and bin scripts, so the startup workflow's install step propagates new hooks machine-wide. Opt-in hooks stay manual. scripts/tests/install-hooks-link.bats covers the new section. The SessionStart-on-clear todo task closes with this: the hook feature already existed, and the gap was distribution.
* fix(scripts): keep screenshot --launch from crashing the compositorCraig Jennings3 days5-14/+176
| | | | | | | | An XWayland client launched by --launch could send a configure request while the script tore down the headless output. Hyprland's damage path then dereferenced the removed monitor and the compositor aborted (Hyprland 0.55.2, coredump analysis in docs/design/). The fix has two layers. --launch now forces the Wayland backend (DISPLAY unset, GDK and Qt steered to wayland) so no XWayland surface exists to race. Teardown also polls until the launched clients actually unmap before removing the output. X11-only apps fail to map under the default, and some emacs builds are X11-only. The new --x11 flag allows XWayland for them, protected by the unmap wait. The no-window error hints at the flag.
* feat(workflows): rewrite daily-prep to the strict three-section templateCraig Jennings3 days7-845/+478
| | | | | | | | From the template spec Craig wrote 2026-06-10 plus four refinements from his review of the first new-format prep. The doc is now exactly Heads-Up, Day's Priorities, and Meetings / Focus Blocks. Two run modes replace full-prep and standup-only: Create ends with a mandatory priorities review gate (disagreement there signals todo.org staleness), and Update refreshes a day when the world moves. Both run a triage-intake first when none ran in the last hour. It retires the separate Standup Briefs and Upcoming Deadlines sections, the Anchor Tasks handoff, and the thin-link convention. Priorities entries now mirror their todo.org task heading and carry links and context in the body. Briefs nest under the standup they're reported in, with Blockers: None explicit. Meetings carry what to contribute and get, likely questions with answers, linked prep docs, and day-before prep blocks for unanswered questions. Focus blocks are linked menus, created the day before and marked free. The spec and the decisions handoff land in docs/design/.
* chore(ai): archive session recordCraig Jennings3 days8-57/+552
|
* feat: insights follow-ups — empirical-first debugging, staging guard, ↵Craig Jennings3 days4-1/+37
| | | | | | | | invariants From the 2026-06-11 usage report. The debug skill gains a hypothesis-discipline contract (rank candidate causes by cheapest empirical test, run probes in parallel, report only confirmed findings) targeting the serial theory-cycling the report flagged. commits.md's pre-commit checklist gains a staged-files guard covering the untracked-set and canonical-vs-mirror conventions. A small tracked CLAUDE.md carries the rulesets mirror invariant at turn zero. Two [#C] pilots filed: a read-only morning ops orchestrator and a monthly session-harvest workflow. The report's 500-token-cap finding was a mislabel: the underlying transcripts show 529 Overloaded and stream-idle-timeout errors with no token cap configured anywhere, so nothing to change there.
* feat(workflows): transcript processing gains classification, extraction, ↵Craig Jennings3 days2-62/+84
| | | | | | exit gate Three changes from today's work session, closing the defect where the workflow could end at file hygiene with nothing landing in durable homes. Every recording is classified before transcription (this project / named other project / personal — unmatchable files ask Craig, never default), and cross-project files route per cross-project.md: labeled transcript plus an outcome note via inbox-send, recording to the owning project's meetings dir, nothing in local assets. A new mandatory Step 11 extracts action items to todo.org with owners and decisions to knowledge.org. The validation checklist becomes a hard exit gate: Step 13 (delete sources, the irreversible step) must not run until classification, extraction, and durable-home writes all hold.
* feat(rules): render-merge guard for inline numbered optionsCraig Jennings3 days1-0/+2
| | | | GFM renderers merge adjacent ordered lists and renumber them — a 1-3 content list followed by a 1-3 options list rendered as options 4-6, and the user's pick ("4") didn't exist in the author's numbering. Numerals now belong to the options list only, other enumerations in the same message use dashes or prose, and a prose lead-in sits directly above the options. An out-of-range pick is treated as a suspected render-merge, not an error.
* fix(triage-intake): Signal is Emacs-only — remove the standalone receive pathCraig Jennings3 days2-90/+64
| | | | Craig's ruling, correcting this morning's plugin: signel and standalone signal-cli share the same account config and device queue, so a standalone drain steals messages the Emacs client would otherwise show him. Step 0 now starts signel via cj/signel--ensure-started when it's down and leaves it running (a live signel is the steady state, so no teardown). signal-cli survives only for queue-untouching reads like listAccounts; the SCAN FAILED rule covers signel failing to start.
* docs(spec): record agent KB v1 implementation, close phase tasksCraig Jennings3 days2-15/+21
| | | | All five phases shipped today. The spec status flips to implemented with a history entry carrying the commit trail; the phase tasks become dated completion entries under the parent, which moves to DOING until the manual-testing checklist and the other machines' clone + timer setup land.
* feat(kb): monthly hygiene report for agent KB nodesCraig Jennings3 days4-0/+185
| | | | Phase 4 of the agent KB spec. kb-hygiene.sh inventories :agent: nodes, flags orphans (no id: link anywhere in the KB points at them), duplicate titles, and stray conflict files, then writes an org report into the rulesets inbox for the normal inbox flow to propose dispositions. Read-only by design — it never deletes. A monthly systemd user timer (Persistent=true) runs it; bats covers the counts, orphan detection, duplicates, conflict tally, and the missing-KB error path.
* feat(workflows): wrap-up promotes to the KB and records the usage receiptCraig Jennings3 days2-0/+26
| | | | Phase 3 of the agent KB spec. Step 1 of wrap-it-up gains a promotion check against knowledge-base.md's inclusion criteria, and every Summary now ends with a "KB: promoted N / consulted yes-no" line — the single grep-able input to the spec's 30-day success-metrics checkpoint. The validation checklist enforces the line.
* feat(rules): knowledge-base.md — the agent KB pointer ruleCraig Jennings3 days1-0/+60
| | | | Phase 1 of the agent KB spec. The rule carries the KB path and git discipline (pull before query, commit and push after write), the canonical rg commands, the one-node-per-fact write schema under agents/, the work-root denylist with the refusal contract, the inclusion criteria, and the capture-then-promote cadence. The existing Makefile RULES glob links it machine-wide; verified the link, a known-note query, and the conflict-file exclusion.
* feat(kb): roam-sync script + timer units, old roam path repointedCraig Jennings3 days11-9/+137
| | | | Phase 0 of the agent KB spec: the org-roam KB now lives at ~/org/roam as a git repo on cjennings.net. roam-sync.sh (bats-tested: commit, rebase, push, conflict-abort) runs from a 15-minute systemd user timer; canonical unit files live in scripts/systemd/. Live references to the old ~/sync/org/roam path (the task-list pointer, the journal workflow, the notes template) repoint to ~/org/roam, and a transition symlink at the old location covers stragglers.
* docs(spec): move agent KB to git and fold in migration, metrics, upkeepCraig Jennings3 days2-40/+115
| | | | | | The KB leaves the ~/sync/org Syncthing share for its own git repo on cjennings.net (new decision D8). A systemd timer auto-syncs Craig's edits, agents pull before query and commit+push after write, machines replicate by clone (the work machine doesn't), and agent writes land under an agents/ subdirectory. Syncthing's no-history, no-gate, conflict-fork costs were the design's weakest accepted risks, and the phone constraint dissolved: mobile stays on on-demand doc drops to the ~/sync/phone share. The amendment also folds in inclusion criteria plus a guided per-project memory sweep (Phase 1.5), a Success metrics section with a 30-day checkpoint, the seed node redefined as the KB's own documentation, and monthly hygiene automation (Phase 4). Phases renumbered 0-4. Implementation stays held pending the go-ahead.
* docs(spec): work-root denylist confirmed, agent KB spec now readyCraig Jennings3 days2-7/+12
| | | | Craig confirmed the denylist is complete at ~/projects/work alone (archangel is not work-scoped), which clears the spec's one remaining caveat. Phase 1 is unblocked, and implementation still awaits the explicit go.
* feat(triage-intake): loud scan-failure rule + messenger plugin reworkCraig Jennings3 days6-50/+256
| | | | | | The 2026-06-10 sweep shipped without Signal: a standalone signal-cli receive hung on the account lock while the signel daemon owned it, and the failure looked identical to a quiet source. The engine now renders any failed, hung, or skipped scan in a SCAN FAILED banner at the top of the summary. Quiet means the scan ran and found nothing. The signal plugin now detects which path owns the account before scanning: when the signel daemon is live it queries chat buffers through Emacs, and the standalone draining receive runs foreground-only when it isn't. The telegram plugin gets an at-a-glance lifecycle (docker-mode launch, scan, send, shutdown only if the scan started the server) and treats a real DM from a work contact as Action.
* feat(workflows): daily-prep carries execution links and join linksCraig Jennings3 days2-2/+32
| | | | | | A Day's Priorities entry now carries the URL the task is done through (payment portal, doc, PR, form), not just the thin link to its todo.org home. When that URL is missing from the todo.org body, the prep build finds it and adds it to both. Meeting lines in Meetings / Work Blocks get an org link to the join URL from the calendar event's conference data, so joining is one click from the prep doc. Both rules came out of working the 2026-06-10 prep doc, where paying an invoice meant a Gmail dig for the payment URL first.
* docs: finalize agent knowledge-base spec as ready with caveatsCraig Jennings3 days3-97/+284
| | | | | | I ratified all seven decisions: the org-roam KB is the shared agent substrate, the write boundary is read-shared write-scoped (work never writes), nodes are per-fact, agent writes land freely in the KB only, and harness memory stays as the ephemeral capture layer. The spec moves to docs/agent-knowledge-base-spec.org in spec-create format, superseding the 2026-06-05 draft. A work-root denylist classifier routes writes: personal projects write, work and unknown projects refuse and report the redacted fact. Implementation is broken into three phases and waits on confirming the denylist contents.
* chore(claude): pin model to fable in settingsCraig Jennings4 days1-1/+2
|
* feat(voice): expand skill to 45 patterns with attestation receipts and ↵Craig Jennings4 days6-60/+332
| | | | | | | | | | | | artifact budgets Two patterns kept failing in practice despite being documented (#40 praise asymmetry and the #38 terse cut), so I made the walk verifiable and closed the content gap behind tangled review text. The high-recurrence set (#13, #37, #38, #40, #42) now gets per-pattern attestation receipts. The anti-AI audit runs after the terse pass so the audited text is the text that ships. Short personal-mode artifacts get a compact output format, and a write-back step puts the voiced text in the file the publish flow posts from. Four patterns are new: #42 finding stems (one claim per sentence in review findings), #43 single-sentence paragraph cadence, #44 parenthetical asides, #45 declarative register marker. #37 exempts verdict formulas. #40 covers verification narration. #13 and #33 carry the self-discipline framing. A per-artifact budgets table makes terse a checkable budget instead of an adjective. The profile gains paired entries with the approved worked examples, and commits.md plus no-approvals.org drop hardcoded pattern counts so the next addition doesn't re-drift them.
* chore(ai): archive session recordCraig Jennings4 days2-8/+46
| | | | Meeting-prep promotion session. The completed task moved from Open Work to Resolved in the todo cleanup.
* feat(workflows): promote meeting-prep to a general templateCraig Jennings4 days8-6/+358
| | | | | | Meeting-prep was project-only. I generalized its project-specific references (transcript-home path, issue tracker, knowledge file, worked-example doc) to neutral terms and moved it into claude-templates so any project's .ai/ picks it up. The pre-wire supporting doc travels beside it as meeting-prep.pre-wire.org. I added the workflow entry and trigger phrases to INDEX.org. I flipped daily-prep's two conditional meeting-prep references, and its trailing changelog claim, to direct links now that the workflow ships as a template.
* chore(ai): archive session recordCraig Jennings4 days3-49/+114
|
* chore: task review — kill stale Skill Seekers trial, regrade c4-* to D, ↵Craig Jennings4 days1-6/+16
| | | | tag meeting-prep solo
* docs(verification): flag that enumerated lint/test gates skip new filesCraig Jennings4 days1-0/+8
| | | | A green check only covers the files the gate actually ran on. When a lint, test, or format gate uses a hand-maintained file list instead of a glob, a newly-added file is silently skipped and the gate still reports clean. Added a subsection naming the failure mode (a Makefile path list, a pre-commit files: regex, a CI matrix, a coverage include list) and the check it calls for: when you add a file, confirm each gate discovers it before trusting the green.
* docs(task-review): sharpen the :solo: tag definitionCraig Jennings4 days2-4/+20
| | | | | | Craig clarified what :solo: means. The old third gate ("the outcome is verifiable locally, no ... confirmation that the result is right") read literally disqualified every task, since Craig spot-checks everything regardless of the tag. It conflated "Craig will also check" with "only Craig can check." The three gates are now buildable, verifiable by Claude, and no upfront decision. The fix is decoupling Craig's routine spot-check from the determination: a task Claude builds and verifies itself, leaving a manual-testing reminder for the residual human-in-the-loop confirmation, is solo. The disqualifier is having no verification path of Claude's own, a result only judgeable by Craig's eyes. task-audit.org Phase C already defers here for the definition, so this is the one edit site.
* feat(install-ai): gitignore the full personal-tooling set, add backfill sweepCraig Jennings4 days6-8/+275
| | | | | | | | A gitignore-mode project only ignored .ai/. CLAUDE.md was left untracked but not ignored, so an accidental git add or a codify run could still commit a personal CLAUDE.md, the private rule copies under .claude/, or an AGENTS.md. install-ai now ignores the whole set (.ai/, .claude/, CLAUDE.md, AGENTS.md) at bootstrap, line-idempotent so an existing .gitignore isn't duplicated. .claude/ goes in the set because it's rulesets-owned (copies of claude-rules/*.md plus the language bundle's rules, hooks, and settings), re-synced from rulesets every startup, so git isn't how it travels. Ignoring it also keeps those private rule copies out of the repo, which ignoring CLAUDE.md alone would miss. The gate is unchanged: track-mode projects (personal/doc repos, team repos sharing config) keep tracking the set. sweep-gitignore-tooling.sh backfills the set across existing gitignore-mode projects, idempotent and skipping track-mode by design. It warns when a now-ignored path is already tracked, since the ignore won't untrack it. protocols.org states the policy once.
* chore: file meeting-prep promotion follow-upCraig Jennings4 days1-0/+5
| | | | Promoting meeting-prep to a template needs its project-specific references generalized first, so it's a follow-up rather than part of the daily-prep additions.
* feat(daily-prep): add 5-day look-ahead, daily big-ball, and decline gateCraig Jennings4 days2-8/+36
| | | | I folded in three additions from the Manager Tools prep research. Phase A now fetches the prep day plus the next 5 days, and a new Phase 1 sub-section scans that window for meetings that need prep, scheduling traps, and focus blocks to protect. It's a scan-and-flag pass that feeds Heads-up and Anchor Tasks, not a new prep-doc section. Phase 3 sub-step 3a pulls one important-but-not-urgent task per day for a 15-minute chunk, so strategic work lands in small daily pieces instead of getting displaced by the urgent. Phase 1 item 5 reframes "attend" as "contribute" and adds a send-regrets gate for meetings with no objective. The look-ahead's meeting-prep references stay conditional ("where the project has one") since meeting-prep is project-only for now.
* docs(create-workflow): document the supporting-document conventionCraig Jennings4 days4-2/+18
| | | | A workflow that outgrows its inline content stores the overflow in a sibling <workflow>.<suffix>.org, linked inline. This reuses the engine.plugin dot-glob, so the drift-check and discovery glob already treat the file as owned rather than an orphan. It also travels with the workflow on promotion. I extended the INDEX drift-check note to name supporting docs alongside source plugins.
* docs(spec-review): check generated config resolves where consumedCraig Jennings4 days2-2/+2
| | | | A generated config gets read in a different namespace than the one that wrote it. Build host, chroot, image runtime, target system, container, and VM are distinct, so a path valid where the config is generated can be absent where it's read. I added the check to the Architecture & maintainability dimension.
* chore: file SessionStart-hook and wide-org-table follow-upsCraig Jennings4 days3-1/+94
| | | | Two work-project handoffs filed as backlog tasks: a SessionStart-on-clear auto-resume hook (after /flush), and wide org-table handling via an auto-wrap helper, a width lint, or a tightened standard. Inbox-process marker updated.
* feat(workflows): generalize broadcast into announcement + situational modesCraig Jennings4 days10-296/+388
| | | | cross-project-broadcast handled tooling and rule announcements but had no shape for the situational case: a life or work event I want every project's agent to know, said once so none is missing context when I next talk to them. I renamed it to broadcast (helper and test alongside) and split it into two modes over the same fan-out plumbing. Announcement keeps the rigid capability template. Situational carries a general-not-comprehensive summary plus a fixed receiving-agent contract: record it in notes.org, hold it time-boxed or standing, apply on the project's own judgment, ask follow-ups at startup. The broadcasting agent does no per-project relevance analysis. Each receiving agent decides what the event means for its own work.
* feat(workflows): add spec-create, the author leg of the spec trioCraig Jennings4 days4-0/+398
| | | | spec-create is the front of the spec-create → spec-review → spec-response trio: the author writes a short design spec before non-trivial code, shaped to pass spec-review's readiness gate. It runs a when-to-spec proportionality gate first, then problem-first framing, design with forced alternatives and inline mini-ADR decisions, implementation phases with acceptance criteria and a readiness-dimensions menu, a terseness pass, and a hand-off self-check against the review rubric.
* docs(elisp): name eask as the build tool, not eldevCraig Jennings5 days1-1/+1
| | | | The real elisp packages drive eask in their Makefiles, but the bundle listed eldev as a build tool and left eask out, pointing a fresh session at the wrong tool.
* feat(review-code): gate deep-dive checks on a project review profileCraig Jennings5 days1-1/+77
| | | | | | The skill ran one flat criteria set on every change, so a concurrent, DB-backed service got the same review as a shell script, and the checks that matter for the service (concurrency, performance, auth, API compatibility) weren't in the set at all. Phase 3.5 splits the checks into a universal core that always runs plus nine modules that activate on the project's review profile. A project declares the profile with a "Review profile:" line in its CLAUDE.md. Absent that, the skill auto-detects from framework, ORM, concurrency, and manifest signals and recommends declaring one. The security and dependency modules defer their depth to /security-check.
* feat(triage-intake): add Telegram source pluginCraig Jennings5 days4-2/+398
| | | | | | | | I added a Telegram source plugin so the triage-intake sweep covers Telegram alongside Signal, cmail, Gmail, calendar, and PRs. Telegram is personal messaging, so it's a general plugin that syncs to every project. Unlike signal-cli, Telegram has no headless CLI here, so the plugin drives telega.el inside the running Emacs daemon over emacsclient. It records whether telega was already live and shuts it down only if the scan started it, leaving an active session alone. Two sharp edges are documented in the plugin: the tdlib server can SIGSEGV on the initial sync, where docker mode is the fix, and the scan reads the cached telega--chats hash so a dead server still reports unread state instead of going blank. I also added Telegram to the engine's general-plugin list.
* feat(triage-intake): add Signal source pluginCraig Jennings5 days4-2/+138
| | | | | | | | I added a Signal source plugin so the triage-intake sweep covers Signal alongside cmail, Gmail, calendar, and PRs. Signal is personal messaging, so it's a general plugin that syncs to every project. It needs no wrapper script, unlike cmail. signal-cli is already a full CLI, so the plugin drives receive and send directly. The scan filters signal-cli's JSON down to real messages and drops the sync, receipt, and typing noise. One sharp edge is documented in the plugin: signal-cli receive drains the server queue, so the triage gets one shot per message. Signal Desktop and the phone keep their own copies, so nothing's lost. I also added Signal to the engine's general-plugin list.
* fix(elisp-hook): show a compact test summary in the terminal on failureCraig Jennings7 days1-3/+13
| | | | validate-el.sh dumped the full ERT batch output to the terminal on a red test, every backtrace frame, flooding the pane. It now prints a short summary there: the run tally plus the failing test names and their file:line. Claude still gets the full backtrace through additionalContext. fail_json takes an optional fourth argument for the terminal echo. Paren and byte-compile failures stay short, so they still print in full.
* chore(ai): archive session recordCraig Jennings8 days2-1/+46
|
* feat(workflows): promote reusable spec-review checks from emacs-d review passesCraig Jennings8 days3-24/+186
| | | | | | I folded the reusable, product-neutral checks from two emacs-d review passes into the canonical spec-review.org, so they survive the startup rsync and reach every project instead of living only in a downstream copy. The additions cover package-readiness and Makefile scope, actionable error strings, observability and diagnostics, long-running performance and failure-mode research, defcustom surface, a documentation plan, architecture weak-point mitigation, simplicity controls, extension/plugin developer experience, comparable-product sentiment, terminal-state discovery, CLI-wrapper value, and rollout/rollback, plus three reviewer principles and a generalizable-question harvesting rule. The promotion is a pure superset. Every change adds or expands a generic check, nothing regresses. Project-specific findings stayed in the source spec. The handoff that asked for this is preserved under docs/design.
* feat(workflows): build implementation tasks on Ready in spec-responseCraig Jennings8 days2-0/+38
| | | | | | I added Phase 6 to spec-response: once the author confirms a spec is Ready, file the full implementation-task breakdown in todo.org rather than leave a Ready spec nobody can act on. The phase creates one task per implementation phase, runs a completeness pass against every acceptance criterion and principle rule, marks :solo: only where the agent can build and verify end to end, collects the rest under a Manual-testing task, and defers outward-facing publish steps until the user confirms. This is the author-side complement to spec-review's Phase 6, which emits the drop-in task block. Review produces the block, response files the work.
* docs(design): add org-roam knowledge-base spec for shared agent memoryCraig Jennings9 days4-25/+214
| | | | The spec adopts the existing ~/sync/org/roam/ KB (Syncthing-synced, 484 files) as the shared store agents read from and write to, so cross-machine memory sync comes for free instead of needing new infrastructure. It recommends the mechanics (queried as files, capture in harness memory then promote durable facts to the KB, a claude-rules pointer, an :agent: write schema) and leaves the work/personal write boundary for ratification. Supersedes the dedicated-repo and two-tier approaches for the storage-and-sync half.
* feat(patterns): add cross-project pattern catalog (six seed patterns)Craig Jennings9 days8-0/+309
| | | | | | | | | | A good interaction-design pattern surfaces in one project, then gets lost, so the next project re-derives it. Pearl shipped six worked examples and the principle they share, but they sat as four raw notes in docs/design/ with nothing making them reusable. I added a patterns/ directory, one file per pattern, each with frontmatter (name, principle, problem, tags, source, examples) and a Problem / Do / Anti-pattern / Applicability / Related body. The six seeds: one-prompt-picker-typed-prefix, transient-state-buttons, no-empty-input-as-meaningful, label-matches-behavior, default-most-common-friction-proportional, collapse-orthogonal-prompts. Patterns 3-6 cross-link as facets of one root principle: the choices the user has should all be on screen, accurately labeled, ordered by what they'll most often want, with friction sized to the cost of being wrong. The catalog lives in rulesets because every project's agent already pulls from here. A thin claude-rules/patterns.md pointer tells the agent the catalog exists and when to consult it, so it reads one pattern on demand instead of carrying all of them. The pointer auto-installs via the Makefile RULES glob. README.org holds the root principle, the frontmatter contract, and the capture-on-landing/promote-on-review intake cadence. The patterns are .org files with #+KEYWORD frontmatter. The pointer stays .md because the rules layer and the Makefile glob require it. Seed patterns keep their concrete Elisp examples. Generalize on the second caller, not up front.
* feat(startup): run make install in Phase A.0 to link new skillsCraig Jennings9 days2-0/+38
| | | | | | | | A skill added to rulesets and pushed reached each machine's files on the next pull, but not its ~/.claude symlink. make install only links what isn't already linked, and a git pull doesn't run it. So a new skill stayed silently uninstalled until someone re-ran make install by hand. The flush skill sat in that gap from 2026-06-02 until a manual install today. I added a make install step right after the Phase A.0 rulesets pull, the step that brings the skill's files in. It's idempotent: skips already-linked targets, links only what's new, and only writes symlinks under ~/.claude and ~/.local/bin. A grep keeps the all-skip case to one quiet line. Link, relink, and WARN lines get surfaced, and a new Phase C bullet handles them: a skill the harness already picked up mid-session is noted as available, one it didn't gets a restart prompt, a non-symlink collision goes to the user. Now "add a skill, commit, push" is enough to reach every machine on the next session. The step also covers a newly-added rule or script, since make install links those too. The canonical template and the .ai/ mirror both carry the change.
* fix(voice): make the terse cut a mandatory final passCraig Jennings9 days3-2/+8
| | | | | | | | Pattern #38 (omit needless words) was one of 41 walked mid-list, so it got glossed as a checkbox instead of the real "cut it in half" sweep. A commit message went out today needing two manual Orwell-walk requests before it read terse, even though /voice personal had run. The rule already said to cut hard. The gap was position. Buried in the middle of the walk, #38 lost to the categorical detectors that come back clean while the text still runs a third too long. I moved it to an explicit standalone last step in the SKILL.md Process, run after every other pattern and right before the draft is shown. Now the first draft the user sees is already terse, not terse only after they ask. Profile §38 gains an execution-position rule and a history entry. The commits.md publish gate points at #38 as the last pass.
* chore(ai): archive session recordCraig Jennings10 days2-1/+58
|