aboutsummaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
* feat(commands): /update-skills syncs forks with upstream via 3-way mergeCraig Jennings9 days19-0/+3492
| | | | | | | | Upstream releases fixes worth pulling into the forks (arch-decide, playwright-js, playwright-py) without losing our local modifications. Each fork now has a manifest at upstreams/<name>/ plus a committed baseline snapshot that is the 3-way merge base. scripts/update-skills.py classifies each file's drift and merges to stdout. The command owns per-file confirmation, per-hunk conflict prompts, and every target write. I centralized manifests under upstreams/ instead of per-skill dotfile dirs because arch-decide is now two flat files in commands/ and can't carry one. A "files" map in its manifest handles the upstream rename of SKILL.md to arch-decide.md. I seeded baselines from today's upstream HEADs, so pre-existing local modifications classify as local-only from here on. git merge-file signals hard errors as exit 255, which subprocess reports as positive. The guard treats anything 128 and up as an error so a binary-file failure isn't misread as a conflict.
* feat(workflows): session-harvest monthly promotion-mining passCraig Jennings9 days4-0/+212
| | | | | | session-harvest runs a monthly pass over recent session summaries across every AI project and proposes promotion candidates in four lanes: patterns catalog, KB facts, rule refinements, workflow learnings. Capture already happens continuously. This adds the batched review cadence that turns it into curated promotion. The window filter reads each session filename's date prefix instead of mtime. Clones and syncs reset mtime, which let 2025 sessions pass a recency filter. The run also aggregates the KB receipt lines from session summaries, so it doubles as the 30-day KB metrics readout.
* fix(triage): correct telegram mark-read verbs and crash guidanceCraig Jennings9 days2-24/+86
| | | | The documented mark-read verb telega-chat--mark-read never existed in telega. I replaced it with the verified telega--viewMessages form (plus mentions and reactions), noted that telega-chat-toggle-read toggles and needs an unread guard, and added the delete-join-notice sweep Craig approved (first run deleted 41 chats). The SEGFAULT gotcha now reflects reality: the dockerized server crashes spontaneously (memory corruption, 11 coredumps since 2026-06-09), the verbs were never the trigger, so action batches check the server first and treat a death as retryable.
* chore: archive session record, reflow todo table, file done workCraig Jennings9 days2-40/+145
| | | | The wide voice-pass table in todo.org reflows to the 120-column standard (the new lint check's first real catch), and the two tasks closed today move to Resolved.
* fix(scripts): lint-org resolves wrap-org-table from its own directoryCraig Jennings9 days4-0/+70
| | | | Consumers load lint-org with a bare -l and no load-path flag, so the new require of wrap-org-table failed everywhere outside make test's -L. lint-org now adds its own directory to load-path first. lint-org-cli.bats locks the bare-load contract for both scripts.
* feat(org): table standard as a rule, reflow helper, and lint checkCraig Jennings9 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 Jennings9 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 Jennings9 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 Jennings9 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 Jennings9 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 Jennings9 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 Jennings9 days8-57/+552
|
* feat: insights follow-ups — empirical-first debugging, staging guard, ↵Craig Jennings9 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 Jennings10 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 Jennings10 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 Jennings10 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 Jennings10 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 Jennings10 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 Jennings10 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 Jennings10 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 Jennings10 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 Jennings10 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 Jennings10 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 Jennings10 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 Jennings10 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 Jennings10 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 Jennings10 days1-1/+2
|
* feat(voice): expand skill to 45 patterns with attestation receipts and ↵Craig Jennings10 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 Jennings10 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 Jennings10 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 Jennings10 days3-49/+114
|
* chore: task review — kill stale Skill Seekers trial, regrade c4-* to D, ↵Craig Jennings10 days1-6/+16
| | | | tag meeting-prep solo
* docs(verification): flag that enumerated lint/test gates skip new filesCraig Jennings10 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 Jennings10 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 Jennings10 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 Jennings10 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 Jennings10 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 Jennings11 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 Jennings11 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 Jennings11 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 Jennings11 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 Jennings11 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 Jennings11 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 Jennings11 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 Jennings11 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 Jennings12 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 Jennings13 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 Jennings2026-06-062-1/+46
|
* feat(workflows): promote reusable spec-review checks from emacs-d review passesCraig Jennings2026-06-063-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 Jennings2026-06-062-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.