aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-06-02 23:07:48 -0500
committerCraig Jennings <c@cjennings.net>2026-06-02 23:07:48 -0500
commitfe3bd8fb20094ed4ebfea499fad6f551bc1e1800 (patch)
tree94dd1814b7e6e85c8d625127604baa5cbb293be4
parentac693a6b7fa7abe88f7778f8e793d5ddfd32f24e (diff)
downloadrulesets-fe3bd8fb20094ed4ebfea499fad6f551bc1e1800.tar.gz
rulesets-fe3bd8fb20094ed4ebfea499fad6f551bc1e1800.zip
chore(ai): archive session record
Promoted the flush workflow into rulesets as a /flush skill plus a canonicalized SessionStart(clear) hook, then ran the four open :solo: tasks: start-work Justify and Approach gate additions, a task-review chain on task-audit, and lint-org follow-ups reconcile-on-write.
-rw-r--r--.ai/sessions/2026-06-02-23-06-flush-promotion-and-solo-task-batch.org58
-rw-r--r--todo.org58
2 files changed, 85 insertions, 31 deletions
diff --git a/.ai/sessions/2026-06-02-23-06-flush-promotion-and-solo-task-batch.org b/.ai/sessions/2026-06-02-23-06-flush-promotion-and-solo-task-batch.org
new file mode 100644
index 0000000..5a92e52
--- /dev/null
+++ b/.ai/sessions/2026-06-02-23-06-flush-promotion-and-solo-task-batch.org
@@ -0,0 +1,58 @@
+#+TITLE: Flush Promotion + Autonomous :solo: Task Batch
+#+AUTHOR: Craig Jennings & Claude
+#+DATE: 2026-06-02
+
+* Summary
+
+** Active Goal
+
+Process the flush handoff from the work project (promote it into rulesets), then run all four open :solo: tasks autonomously in no-approvals mode. Ten commits, all pushed to origin/main.
+
+** Decisions
+
+- *Flush promoted as a /flush skill, not a project-workflow doc.* The post-clear hook was already global, so packaging the pre-clear checkpoint half as a skill makes both halves callable from any project with no per-project sync. Hook canonicalized to hooks/session-clear-resume.sh with the ~/.claude/hooks/ symlink; settings.json + settings-snippet.json wired so fresh machines get it on make install-hooks.
+- *Preserve substantive handoff bundles — don't delete after implementing.* Craig flagged that deleting the flush bundle after implementing was wrong. The implement-now "just delete" disposition is for noise, not validated design history. Restored the rationale + original flush.org into docs/design/2026-06-02-flush-promotion.org and saved a feedback memory. Later re-sends of the bundle were deduped against the implemented + preserved work and cleared.
+- *Flush refinement: read notes.org before the anchor on resume.* A second work handoff, implemented the same evening. The anchor carries session state; notes.org carries standing knowledge (code paths, conventions, contacts) a resumed session needs. Runtime-guarded on notes.org presence.
+- *no-approvals for the :solo: batch.* Craig curated the set by tagging four tasks :solo:, then said "do all the :solo: tasks in no-approval workflow mode" + "commit and push everything." Interaction gates dropped; review-code / voice / tests / reconcile / logging stayed on.
+- *lint-org follow-ups: append-log → converged-per-file-state.* Reconcile-on-write rewrites the current file's section from the current run, so resolved findings drop, re-runs dedupe, and entries key on content (checker + msg) rather than line number. Flagged the semantics change for Craig to revisit if he'd rather keep an append log.
+
+** Data Collected / Findings
+
+- The live ~/.claude/hooks/session-clear-resume.sh was a real file (not canonical) and byte-identical to the inbox artifact; canonicalized into hooks/ and symlinked.
+- open-tasks.org does not invoke task-review (it routes "task review" away), so chaining task-review onto task-audit had no consistency constraint to honor.
+- lint-org.el (410 lines) appended a dated section per run with line-keyed entries — the exact source of the followups drift. Reconcile rewrite is TDD'd: 27/27 ERT green, 5 followups tests (record-by-content, dedupe, drop-on-resolve, preserve-other-files, plus the existing noop/check-mode).
+- Two minor voice slips in commit bodies (an em-dash in 2cff51e, a semicolon/comma-splice elsewhere). Left in git log; not worth a force-push.
+
+** Files Modified
+
+- flush/SKILL.md (new), hooks/session-clear-resume.sh (canonicalized + notes.org-before-anchor), hooks/settings-snippet.json, .claude/settings.json — flush promotion + refinement (526df6d, 2433e74).
+- docs/design/2026-06-02-flush-promotion.org (new) — preserved handoff bundle + refinement record (3bebb54, refinement appended in 2433e74).
+- .claude/commands/start-work.md — Justify gate "reasons not to do this" (8ab5ec1); Approach gate spec-prerequisite check (2cff51e).
+- claude-templates/.ai/workflows/task-audit.org (+ mirror) — Phase F chains task-review; Phase C reaps dead-link entries (2911038, ac693a6).
+- claude-templates/.ai/scripts/lint-org.el (+ mirror) + tests — reconcile-on-write (ac693a6).
+- todo.org — 4 :solo: tasks DONE, task-review stamps, :quick: tags, new start-work Approach task filed.
+- Memory: feedback_preserve_substantive_handoff_bundles.md + MEMORY.md pointer.
+
+** Next Steps
+
+- *Pattern catalog [#B]* is the one open high-priority task, gated on Craig reviewing the spec at docs/design/2026-06-02-pattern-catalog-spec.org. Pearl available for iterations.
+- Open [#C]s: memories-synced-across-machines (needs a direction decision), create-documentation skill, and the rotation batch (update-skills, research-writer, etc.).
+- The lint-org follow-ups semantics change (append → converged) is worth a second look if Craig wants it to stay an append log with just dedupe.
+- First real adopters of the new /flush skill, the task-audit Phase F chain, and the start-work gate additions are the live tests — all verified locally but not yet exercised on a consuming project.
+
+* Session Log
+
+** 2026-06-02 — startup + flush handoff
+Clean startup (no crash anchor). Inbox carried a three-file flush handoff from work + a lint-followups staleness note. Processed the flush handoff: authored /flush skill, canonicalized the hook, wired settings + snippet. Committed 526df6d; filed the start-work Approach task (47a8a4e).
+
+** 2026-06-02 — preserve-the-bundle correction
+Craig flagged the deleted flush bundle should have been kept. Restored it as docs/design/2026-06-02-flush-promotion.org (3bebb54), saved a feedback memory. Two later re-sends from work were deduped against the implemented + preserved work and cleared.
+
+** 2026-06-02 — task review
+Walked the 7-oldest-unreviewed batch: all Keep, stamped :LAST_REVIEWED:, :quick: on the two start-work tasks (656f11d). Staleness >7d dropped from 3 to 0.
+
+** 2026-06-02 — flush refinement
+Implemented the notes.org-before-anchor resume refinement from a second work handoff (2433e74); verified all three hook branches.
+
+** 2026-06-02 — no-approvals :solo: batch
+Craig tagged four tasks :solo: and invoked no-approvals. Shipped in order: start-work Justify "reasons not to do this" (8ab5ec1), start-work Approach spec-prerequisite check (2cff51e), task-audit Phase F task-review chain (2911038), lint-org reconcile-on-write + task-audit dead-link reaping (ac693a6, TDD 27/27). Each committed + pushed with review + voice + full suite green.
diff --git a/todo.org b/todo.org
index 0c2daf3..248c900 100644
--- a/todo.org
+++ b/todo.org
@@ -34,37 +34,6 @@ Tags are assigned and refreshed by =task-audit=; =task-review= keeps them honest
* Rulesets Open Work
-** DONE [#C] task-review pass at end of task-audit :chore:solo:
-CLOSED: [2026-06-02 Tue]
-:PROPERTIES:
-:LAST_REVIEWED: 2026-06-02
-:END:
-Have the =task-audit= workflow chain a =task-review= pass as its final phase, so a freshly-audited list also gets the lighter staleness/honesty sweep without a second invocation. The legend already notes the division of labor — task-audit assigns and refreshes tags, task-review keeps them honest in passing — so running task-review at the tail of task-audit closes the loop in one pass. Edit =claude-templates/.ai/workflows/task-audit.org= (and the synced mirror) to add the final phase; check whether =open-tasks.org= already invokes task-review so the chaining stays consistent.
-
-** DONE [#C] lint-followups drift — reconcile-on-write + audit dead-link reaping :feature:solo:
-CLOSED: [2026-06-02 Tue]
-:PROPERTIES:
-:LAST_REVIEWED: 2026-06-02
-:END:
-From an .emacs.d handoff (2026-06-02): running task-audit against a large todo.org proved several =.ai/lint-followups.org= entries stale (four dead-link flags pointed at docs that now exist; three near-duplicate dated lint runs had piled up). Two fixes, scoped separately.
-
-1. =lint-org= workflow/script (the real fix): reconcile-on-write. Before appending a run, drop entries whose finding no longer reproduces (dead link now resolves, flagged block/timestamp now clean) and dedupe against the prior run instead of re-logging. Key entries by content/finding rather than line number, so they survive edits to the target file (line numbers go stale immediately).
-2. =task-audit.org= (small, narrow): in the Phase C link-hygiene step, when fixing/verifying a =file:= link, also reap any matching dead-link entry in the project's lint-followups file so the two artifacts don't drift. Scope explicitly to dead-link entries — do NOT pull general lint cleanup into the audit; that mixes two concerns and slows the audit.
-
-** DONE [#C] start-work Justify gate: explicit "reasons not to do this" item :feature:quick:solo:
-CLOSED: [2026-06-02 Tue]
-:PROPERTIES:
-:LAST_REVIEWED: 2026-06-02
-:END:
-From a work handoff (2026-06-02, surfaced running /start-work on a clean low-risk refactor). The Phase 2 Justify gate has "Downsides" and "Alternatives considered" but no forced devil's-advocate verdict on "should we even do this?" Add a "top reasons not to do this" item: surface the top three objections if any exist; when none rise to a real objection, state one line instead of manufacturing three (e.g. "Nothing material argues against this; no reason to defer or drop it"). Building the case against the work before committing is cheapest exactly at this gate, which is its purpose. Edit the start-work skill's Justify-gate phase.
-
-** DONE [#C] start-work Approach gate: spec-needed check :feature:quick:solo:
-CLOSED: [2026-06-02 Tue]
-:PROPERTIES:
-:LAST_REVIEWED: 2026-06-02
-:END:
-From Craig (2026-06-02). The Approach phase should consider whether the work needs a spec when one doesn't already exist. For a big task, this isn't a silent skip — the pre-confirmation summary must explicitly report why a spec isn't needed, so the decision is visible and challengeable at the gate rather than assumed. Small tasks can pass without comment. Edit the start-work skill's Approach-gate phase to add the spec-needed consideration and the big-task report-why-not requirement.
-
** TODO [#B] Cross-project pattern catalog :spec:thinking:
:PROPERTIES:
:LAST_REVIEWED: 2026-06-02
@@ -2501,3 +2470,30 @@ If GV registration is still pending when this task runs, block here and surface
*** Why this matters
=page-signal= is the fast path (a hook, a script, a make recipe can call it without an MCP round-trip). The MCP server is the smart path. When Claude wants to send and then *react to the reply*, the CLI can't do that — only the MCP server can. The two complement each other; this task adds the second half.
+** DONE [#C] task-review pass at end of task-audit :chore:solo:
+CLOSED: [2026-06-02 Tue]
+:PROPERTIES:
+:LAST_REVIEWED: 2026-06-02
+:END:
+Have the =task-audit= workflow chain a =task-review= pass as its final phase, so a freshly-audited list also gets the lighter staleness/honesty sweep without a second invocation. The legend already notes the division of labor — task-audit assigns and refreshes tags, task-review keeps them honest in passing — so running task-review at the tail of task-audit closes the loop in one pass. Edit =claude-templates/.ai/workflows/task-audit.org= (and the synced mirror) to add the final phase; check whether =open-tasks.org= already invokes task-review so the chaining stays consistent.
+** DONE [#C] lint-followups drift — reconcile-on-write + audit dead-link reaping :feature:solo:
+CLOSED: [2026-06-02 Tue]
+:PROPERTIES:
+:LAST_REVIEWED: 2026-06-02
+:END:
+From an .emacs.d handoff (2026-06-02): running task-audit against a large todo.org proved several =.ai/lint-followups.org= entries stale (four dead-link flags pointed at docs that now exist; three near-duplicate dated lint runs had piled up). Two fixes, scoped separately.
+
+1. =lint-org= workflow/script (the real fix): reconcile-on-write. Before appending a run, drop entries whose finding no longer reproduces (dead link now resolves, flagged block/timestamp now clean) and dedupe against the prior run instead of re-logging. Key entries by content/finding rather than line number, so they survive edits to the target file (line numbers go stale immediately).
+2. =task-audit.org= (small, narrow): in the Phase C link-hygiene step, when fixing/verifying a =file:= link, also reap any matching dead-link entry in the project's lint-followups file so the two artifacts don't drift. Scope explicitly to dead-link entries — do NOT pull general lint cleanup into the audit; that mixes two concerns and slows the audit.
+** DONE [#C] start-work Justify gate: explicit "reasons not to do this" item :feature:quick:solo:
+CLOSED: [2026-06-02 Tue]
+:PROPERTIES:
+:LAST_REVIEWED: 2026-06-02
+:END:
+From a work handoff (2026-06-02, surfaced running /start-work on a clean low-risk refactor). The Phase 2 Justify gate has "Downsides" and "Alternatives considered" but no forced devil's-advocate verdict on "should we even do this?" Add a "top reasons not to do this" item: surface the top three objections if any exist; when none rise to a real objection, state one line instead of manufacturing three (e.g. "Nothing material argues against this; no reason to defer or drop it"). Building the case against the work before committing is cheapest exactly at this gate, which is its purpose. Edit the start-work skill's Justify-gate phase.
+** DONE [#C] start-work Approach gate: spec-needed check :feature:quick:solo:
+CLOSED: [2026-06-02 Tue]
+:PROPERTIES:
+:LAST_REVIEWED: 2026-06-02
+:END:
+From Craig (2026-06-02). The Approach phase should consider whether the work needs a spec when one doesn't already exist. For a big task, this isn't a silent skip — the pre-confirmation summary must explicitly report why a spec isn't needed, so the decision is visible and challengeable at the gate rather than assumed. Small tasks can pass without comment. Edit the start-work skill's Approach-gate phase to add the spec-needed consideration and the big-task report-why-not requirement.