From fdbe168ad8535f4aa9c208723cd0c18953f3eebc Mon Sep 17 00:00:00 2001 From: Bastien Chanot Date: Thu, 16 Jul 2026 13:29:54 +0200 Subject: [PATCH 1/4] =?UTF-8?q?chore(memory):=20BDR-067=20=E2=80=94=20v1.0?= =?UTF-8?q?.0=20first=20public=20release=20(versioning=20reset)=20+=20jour?= =?UTF-8?q?nal=20+=20TODO?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .claude/memory/decisions.md | 8 ++++++++ .claude/memory/journal.md | 2 ++ .claude/tasks/TODO.md | 7 +++++++ 3 files changed, 17 insertions(+) diff --git a/.claude/memory/decisions.md b/.claude/memory/decisions.md index 9a0639c..228113c 100644 --- a/.claude/memory/decisions.md +++ b/.claude/memory/decisions.md @@ -992,3 +992,11 @@ rules: - **Wave 3 (2026-07-15/16, user directive)**: split the last two inline execution-carrying agents like /feat. /bugfix: investigation+diagnosis+contract inline behind the gate; bugfixer = sonnet EXECUTOR (fix + regression test from a closed FIX PLAN; no Agent/AskUserQuestion; BUGFIX-EXEC REPORT). verify+secure loop stays in main loop, executor = its re-dispatched dev (verify-secure-loop.md intro now: BOTH consumers dispatched, no inline branch). FINISHES reversing the "split bugfix rejected" carve-out (hotfix went wave 2, bugfix now) — investigation↔fix coupling accepted, mitigated by structured DIAGNOSIS + verify loop. /code-clean: PHASE-1 audit + validation gate inline (reflection); code-cleaner = sonnet PHASE-2 EXECUTOR (delete approved dead code, inline-load refactorer, re-audit) — refactor NOW on sonnet (inline-load pin was inert on big model). exported-symbol per-item consent stays AT THE GATE. Consumer-staleness swept: hotfix deeper-bug escalation → /bugfix skill (not bare agent); onboard STEP 6 + tour Phase B read-only-audit → general-purpose/analyzer (big model, NEVER the sonnet executor — audit stays big). Both skills STAY gated. Also: Explore built-in kept inheriting session (search feeds reflection = big deserved; custom sonnet override created then reverted — built-in already inherits + no owned prompt). census 36→42, loops-light repointed 35/0. - **Wave 4 (2026-07-16)**: client-handover doc-gen → sonnet, REDACTION-ONLY (user flipped from whole-writer after the full read). Key finding: nested audits (/seo,/harden,/web-validate — gated wave 1) must run BIG either way → whole-writer = ~7 extra gate-yields + resumable state machine on a CLIENT deliverable for ~0 extra sonnet work. Design: client-handover-writer TRIMMED to ship pipeline (STEP 1-8, all interactive gates native on big, nested audits inherit big) + doc-gen orchestration (resolve questions/NAP/precheck/overwrite/client-name inline → PACKAGE) → dispatches NEW sonnet handover-doc-writer (STEP 9-16: reads memory+git, synthesizes 6-chapter doc, word-count/skill-leak/anchor gates, renders HTML+PDF; GATE-FREE, no AskUserQuestion/Agent). client-handover JOINS gated group (orchestrates audits = reflection); its opus pin dropped (inherits big via inline-load). census 42→46. Branch feature/client-handover-dispatch (off develop, waves 1-3 merged first). - **Reference**: spec `docs/superpowers/specs/2026-07-15-model-routing-design.md` + plan `docs/superpowers/plans/2026-07-15-model-routing.md` (transient, BDR-065 lifecycle), branches `feature/model-routing` (waves 1-3, merged), `feature/client-handover-dispatch` (wave 4). + +## BDR-067 — first public release: versioning reset to v1.0.0 (override "never restart at v1.0.0") — 2026-07-16 +- **Decision**: first PUBLIC release cut as **v1.0.0**, treating internal v1.0.0→v4.0.0 as pre-release history. version.txt 4.0.0→1.0.0; CHANGELOG: new `[1.0.0] — Initial public release` on top (= former `[Unreleased]` content), old 1.0-4.0 lineage moved UNCHANGED under a `## Pre-release (internal history)` banner (provenance). Tag v4.0.0 DELETED (local+origin), v1.0.0 tagged on main. Repo goes public on THIS Gitea (user flips visibility separately — not a git op). +- **Why**: launching publicly at v4 misrepresents (implies missed v1-3 to newcomers); v1-4 were private dev. First public impression should be v1.0.0. User directive. +- **Overrides**: BDR-055-era release-candidate rule "never restart at v1.0.0 — desyncs tag↔CHANGELOG lineage". That guards ACCIDENTAL mid-lineage restart; a DELIBERATE public-launch reset is the sanctioned exception. **CONSEQUENCE for next release**: continue from public 1.0.0 (→ 1.0.1 / 1.1.0 / 2.0.0), NEVER back to the old 4.x. The [Unreleased]-BREAKING(CLAUDE.global.md) folds into 1.0.0 harmlessly (first release = breaking vs nothing). +- **Safety (git cherry)**: found a STALE abandoned `release/1.0.0` (July-4 prep, 227 commits behind develop, pushed to origin). `git cherry develop release/1.0.0` + content checks confirmed all its real changes (rtk PATH fix, drop-AI-attribution settings backstop, find-skills drop, BLK-016/LRN-098/LRN-101/EVAL-015, all features) ALREADY in develop → nothing orphaned → deleted it (local+origin). Cut fresh v1.0.0 from CURRENT develop, not the stale branch. +- **Method**: release-candidate skill gates honored (when-to-release, push) but PREP done manually — backward version (4.0.0→1.0.0) + CHANGELOG restructure exceed the sonnet release-executor's forward-bump assumption (reflection, stays big). LRN candidate: a version RESET is editorial, not mechanical — don't dispatch the forward-only executor for it. +- **Status**: SHIPPED. origin main=dc4f78b, develop=6c23d6f, tag v1.0.0 sole tag; v4.0.0 + stale release/1.0.0 removed from origin. diff --git a/.claude/memory/journal.md b/.claude/memory/journal.md index 799cddf..bee038c 100644 --- a/.claude/memory/journal.md +++ b/.claude/memory/journal.md @@ -390,3 +390,5 @@ rules: - wave-4 FINAL REVIEW (opus whole-branch): all 7 deliverable invariants hold, child gate-free, PACKAGE complete. Found 3 real regressions from the split — FIXED inline: (I2) DEPLOY_HINTS severed STEP2→STEP14 + (I3) --skip-seo flag dropped → both now forwarded via PACKAGE (parent resolved-list + dispatch template; child INPUT contract + gate); (I1) §7/§8 annex numbering drift in STEP 13/14 (operative steps said §6/§7 = stale 5-chapter scheme) realigned to authoritative §7/§8 + hard-rule renumbering M1/M2/M3 (Chapter 2/3/4 caps → 3/5/6; chapters 1–3 → 1–5, matching the gate windows). census lock added: lacks 'Agent(' on child (M5). census 47/0, shellcheck clean. Branch NOT merged (awaiting human signal). - waves 1-4 MERGED to develop (d8917bf). LRN-126/127 added. - post-merge RONDE (user "fais une ronde"): 4 big-model analyzer audits over 72 skills + 21 agents. Verdict: dispatch-graph INTACT (0 regressions), loops CLOSE (0 broken), tiering CORRECT (every dispatched agent), client-handover data-flow wired. The refactor preserved/improved everything it touched. NOTE: darwin-skill is a skill-PROMPT optimizer (mutates SKILL.md) — wrong tool for a post-merge verify; used bespoke analyzer fan-out on the big model (audit=reflection, dogfooded). Ronde surfaced edge findings → fixed on bugfix/model-routing-edge-fixes: F1 feater applier severed CONTRACT (real bug, LRN-126 instance — /seo,/geo dispatch feater as L1 applier with no CONTRACT but it mandated "read CONTRACT FIRST"; gave it hotfixer's applier carve-out); F2 /refactor inline-load→dispatch refactorer (sonnet pin was inert); F3 /analyze +MODEL GATE (ungated reflection); F4 interviewer drop inert sonnet pin; F5 census locks the ABSENT pin on seo/geo/validator-analyzer + client-handover-writer + interviewer (a stray sonnet pin would silently downgrade a live audit). census 47→57. Branch NOT merged. +- edge-fixes branch MERGED to develop (5f159f3). develop pushed to origin. +- FIRST PUBLIC RELEASE **v1.0.0** (BDR-067). Versioning RESET: internal v1-4 → pre-release history, public launch = 1.0.0 (override "never restart at v1.0.0" — deliberate public reset = sanctioned exception; NEXT release continues from 1.0.0, not 4.x). Deleted v4.0.0 tag + a STALE abandoned release/1.0.0 branch (July-4 attempt, 227 behind; `git cherry` confirmed nothing orphaned — all real work already in develop). Cut fresh from develop. PUSHED: origin main=dc4f78b, develop=6c23d6f, sole tag v1.0.0. User flips Gitea repo visibility to public separately. Prep done manually (backward version + CHANGELOG restructure beyond the forward-only sonnet release-executor). diff --git a/.claude/tasks/TODO.md b/.claude/tasks/TODO.md index 042ad35..db02814 100644 --- a/.claude/tasks/TODO.md +++ b/.claude/tasks/TODO.md @@ -1,5 +1,12 @@ # TODO +## 2026-07-16 — SHIPPED v1.0.0 first public release (BDR-067) +- [x] versioning reset 4.0.0→1.0.0, CHANGELOG pre-release-history banner +- [x] deleted v4.0.0 tag + stale release/1.0.0 branch (git-cherry: nothing orphaned) +- [x] merged to main + develop, tagged v1.0.0, pushed origin (main=dc4f78b) +- [ ] USER: flip Gitea repo visibility to public (repo → Settings) — not a git op +- [ ] NEXT release continues from 1.0.0 (→ 1.0.1 / 1.1.0), NEVER back to 4.x (BDR-067) + ## 2026-07-16 — model-routing edge fixes (bugfix/model-routing-edge-fixes) Post-merge ronde (4 big-model audits: dispatch-graph INTACT, loops CLOSE, tiering CORRECT, data-flow client-handover wired). Fixing the edge findings From c41aac69751208e64224db541b821813b67184dc Mon Sep 17 00:00:00 2001 From: Bastien Chanot Date: Thu, 16 Jul 2026 13:37:43 +0200 Subject: [PATCH 2/4] =?UTF-8?q?chore(memory):=20LRN-128=20LRN-129=20EVAL-0?= =?UTF-8?q?23=20=E2=80=94=20close=20ritual?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .claude/memory/evals.md | 9 +++++++++ .claude/memory/journal.md | 1 + .claude/memory/learnings.md | 12 ++++++++++++ .claude/tasks/TODO.md | 2 +- 4 files changed, 23 insertions(+), 1 deletion(-) diff --git a/.claude/memory/evals.md b/.claude/memory/evals.md index fb0482e..f6dd959 100644 --- a/.claude/memory/evals.md +++ b/.claude/memory/evals.md @@ -220,3 +220,12 @@ rules: - **output**: review M5 flagged "no EVAL trace of the BDR-060 pin smoke-test." Traced: `.claude/tasks/TODO.md` job9 PART 1 GATE P1 DID record it — verifier `CONFORME`, security-auditor `BLOCK(2)`, plugin-advisor `ACTION REQUIRED`, verdict grammar intact, mode honored, no revert. The pins (verifier/security-auditor/plugin-advisor → sonnet, ea6c126/1c270e6/5ab6c21) WERE dispatch-smoked; the only gap was that the record lived in TODO, not evals.md. - **method**: cross-read TODO PART 1 against the M5 finding; no re-run (recorded verdicts conclusive, pins unchanged since). - **action**: keep — record backfilled here, no re-smoke required. + +## EVAL-023 — post-merge ronde on the model-routing refactor (BDR-066) — clean, 5 edge gaps found + fixed + +- **Date**: 2026-07-16 +- **output**: model-routing reflection/execution split (BDR-066, waves 1-4, 4 merged branches — the whole session's refactor). +- **method**: 4 parallel BIG-MODEL analyzer audits (dispatch-graph/consumer-staleness, model-tier, loop-integrity, dispatch data-flow) + full test suite (13 suites, 57-check census). Audit on big model (audit=reflection, dogfoods BDR-066). NOT darwin-skill (that = a skill-PROMPT optimizer, wrong tool for refactor-regression verification). +- **verdict**: dispatch graph INTACT (0 regressions), all loops CLOSE (0 broken), tiering CORRECT (every DISPATCHED agent), data-flow client-handover wired. Refactor preserved/improved everything it touched. +- **anomalies**: 5 edge gaps the census DIDN'T catch — F1 (REAL bug: /seo,/geo dispatch feater as L1 applier without CONTRACT, but feater mandated "read CONTRACT FIRST"; hotfixer had the carve-out, feater didn't), F5 (audit-agents' ABSENT pin unguarded → a stray sonnet pin would silently downgrade a live audit), F2/F3/F4 (BDR-066 consistency: /refactor over-powered inline-load, /analyze ungated reflection, interviewer inert sonnet pin). F1 lesson: census locks STRUCTURE (shape); catching a severed data-path needs a data-flow READ ([[LRN-126]]). +- **action**: keep — all 5 fixed (bugfix/model-routing-edge-fixes, merged 5f159f3); census 47→57 now locks each. diff --git a/.claude/memory/journal.md b/.claude/memory/journal.md index bee038c..7b5cac7 100644 --- a/.claude/memory/journal.md +++ b/.claude/memory/journal.md @@ -392,3 +392,4 @@ rules: - post-merge RONDE (user "fais une ronde"): 4 big-model analyzer audits over 72 skills + 21 agents. Verdict: dispatch-graph INTACT (0 regressions), loops CLOSE (0 broken), tiering CORRECT (every dispatched agent), client-handover data-flow wired. The refactor preserved/improved everything it touched. NOTE: darwin-skill is a skill-PROMPT optimizer (mutates SKILL.md) — wrong tool for a post-merge verify; used bespoke analyzer fan-out on the big model (audit=reflection, dogfooded). Ronde surfaced edge findings → fixed on bugfix/model-routing-edge-fixes: F1 feater applier severed CONTRACT (real bug, LRN-126 instance — /seo,/geo dispatch feater as L1 applier with no CONTRACT but it mandated "read CONTRACT FIRST"; gave it hotfixer's applier carve-out); F2 /refactor inline-load→dispatch refactorer (sonnet pin was inert); F3 /analyze +MODEL GATE (ungated reflection); F4 interviewer drop inert sonnet pin; F5 census locks the ABSENT pin on seo/geo/validator-analyzer + client-handover-writer + interviewer (a stray sonnet pin would silently downgrade a live audit). census 47→57. Branch NOT merged. - edge-fixes branch MERGED to develop (5f159f3). develop pushed to origin. - FIRST PUBLIC RELEASE **v1.0.0** (BDR-067). Versioning RESET: internal v1-4 → pre-release history, public launch = 1.0.0 (override "never restart at v1.0.0" — deliberate public reset = sanctioned exception; NEXT release continues from 1.0.0, not 4.x). Deleted v4.0.0 tag + a STALE abandoned release/1.0.0 branch (July-4 attempt, 227 behind; `git cherry` confirmed nothing orphaned — all real work already in develop). Cut fresh from develop. PUSHED: origin main=dc4f78b, develop=6c23d6f, sole tag v1.0.0. User flips Gitea repo visibility to public separately. Prep done manually (backward version + CHANGELOG restructure beyond the forward-only sonnet release-executor). +- /close ritual: LRN-128 (version reset = editorial, not the forward-only executor) + LRN-129 (git cherry proves nothing orphaned before a branch delete) + EVAL-023 (post-merge ronde on the model-routing refactor — clean, 5 edges fixed) capitalized; checked 1 TODO done (Gitea public, user-confirmed). BDR-066/067 + LRN-125/126/127 already logged inline this session (dropped as dup). Index drift (learnings 118-129, evals 020-023) flagged for /prune-memory. diff --git a/.claude/memory/learnings.md b/.claude/memory/learnings.md index 8e560f7..669aa54 100644 --- a/.claude/memory/learnings.md +++ b/.claude/memory/learnings.md @@ -1261,3 +1261,15 @@ rules: - **pattern**: a wave-4 fix-subagent ran `git checkout -- settings.json`, believing the model-value diff was a "test side-effect." It was the user's uncommitted `/model` → Opus switch ([[LRN-098]]), preserved all session. The checkout DISCARDED it — settings.json reverted to committed `claude-fable-5[1m]`. Implementer had no task-reason to touch settings.json; it acted on a file outside its diff. - **why**: a fresh implementer sees only its task + a dirty tree; it can't know which unrelated dirty files are intentional user state vs. cruft. Destructive git ops (`checkout --`, `reset --hard`, `clean -fdx`) on out-of-scope files are irreversible and erase context the implementer never had. - **future application**: dispatch briefs for SDD implementers / fix-subagents MUST bar destructive git ops outside the named task files. If the tree is dirty with unrelated changes, leave them — flag to controller, never revert. Controller owns cross-file git state; the executor touches only its own paths. Pairs with [[LRN-125]]/[[LRN-126]] as the "executor stays in its lane" family. + +## LRN-128 — a version RESET (backward bump) is editorial reflection, not the forward-only release-executor + +- **pattern**: first public release cut as v1.0.0 from an internal 4.x lineage = backward version.txt (4.0.0→1.0.0) + CHANGELOG restructure (new public `[1.0.0]` on top, old 1.0-4.0 lineage under a `## Pre-release (internal history)` banner) + tag swap (delete v4.0.0, tag v1.0.0). The sonnet `release-executor` (release-candidate skill's mechanical prep span) assumes a FORWARD semver bump — its prep = `[Unreleased]`→`[X.Y.Z]` move + version increment. Cannot derive a backward reset, the CHANGELOG restructure, or the existing-`[1.0.0]`-collision handling. +- **why**: a reset is a JUDGMENT act (what's public vs pre-release, how to frame the launch, what to do with the old lineage) = reflection tier, not the executor's mechanical forward move. +- **future application**: version RESET or any non-standard release → do PREP MANUALLY inline (big model), use `gitflow.sh` only for branch mechanics (start/finish), KEEP the skill's human gates (when-to-release, push). Don't dispatch the forward-only executor for it. [[BDR-067]] [[BDR-066]] + +## LRN-129 — `git cherry` (patch-id) proves a stale/divergent branch has nothing orphaned before you delete it + +- **pattern**: a stale pushed `release/1.0.0` (abandoned July-4 prep) sat 227 commits behind develop. Before deleting it, `git cherry -v develop release/1.0.0` → `+` = unique by patch-id, `-` = equivalent patch already in develop. Content-checked each `+` (rtk PATH fix, drop-AI-attribution settings, find-skills drop, BLK-016/LRN-098/101, EVAL-015, features) → all present in develop → safe to delete, nothing orphaned. +- **why**: `git rev-list develop..branch` counts by SHA — a feature merged into BOTH branches shows as "unique" (distinct merge commit) though its CONTENT is in develop. `git cherry` uses patch-id, so `-` = "same change already here". The `+` set still needs a CONTENT check (patch-id misses re-applied/squashed changes). +- **future application**: before abandoning/deleting a divergent branch, `git cherry -v ` then content-verify the `+` commits. This is HOW you prove the [[LRN-117]] fork-orphans-code risk is absent. [[LRN-116]] diff --git a/.claude/tasks/TODO.md b/.claude/tasks/TODO.md index db02814..bd3ceb5 100644 --- a/.claude/tasks/TODO.md +++ b/.claude/tasks/TODO.md @@ -4,7 +4,7 @@ - [x] versioning reset 4.0.0→1.0.0, CHANGELOG pre-release-history banner - [x] deleted v4.0.0 tag + stale release/1.0.0 branch (git-cherry: nothing orphaned) - [x] merged to main + develop, tagged v1.0.0, pushed origin (main=dc4f78b) -- [ ] USER: flip Gitea repo visibility to public (repo → Settings) — not a git op +- [x] USER: flip Gitea repo visibility to public (repo → Settings) — done (user confirmed) - [ ] NEXT release continues from 1.0.0 (→ 1.0.1 / 1.1.0), NEVER back to 4.x (BDR-067) ## 2026-07-16 — model-routing edge fixes (bugfix/model-routing-edge-fixes) From 096418c3e7c80e5ed6fa2f4076ab10eee9a3aa35 Mon Sep 17 00:00:00 2001 From: Bastien Chanot Date: Thu, 16 Jul 2026 13:51:15 +0200 Subject: [PATCH 3/4] feat(capitalize): auto-persist memory to develop on /close + /capitalize (STEP 5C, BDR-068) --- .claude/memory/decisions.md | 8 ++++++ .claude/tasks/TODO.md | 6 ++++ lib/gitflow-aiguillage.md | 7 +++-- skills/capitalize/SKILL.md | 57 +++++++++++++++++++++++++++++++------ 4 files changed, 67 insertions(+), 11 deletions(-) diff --git a/.claude/memory/decisions.md b/.claude/memory/decisions.md index 228113c..4038bfc 100644 --- a/.claude/memory/decisions.md +++ b/.claude/memory/decisions.md @@ -1000,3 +1000,11 @@ rules: - **Safety (git cherry)**: found a STALE abandoned `release/1.0.0` (July-4 prep, 227 commits behind develop, pushed to origin). `git cherry develop release/1.0.0` + content checks confirmed all its real changes (rtk PATH fix, drop-AI-attribution settings backstop, find-skills drop, BLK-016/LRN-098/LRN-101/EVAL-015, all features) ALREADY in develop → nothing orphaned → deleted it (local+origin). Cut fresh v1.0.0 from CURRENT develop, not the stale branch. - **Method**: release-candidate skill gates honored (when-to-release, push) but PREP done manually — backward version (4.0.0→1.0.0) + CHANGELOG restructure exceed the sonnet release-executor's forward-bump assumption (reflection, stays big). LRN candidate: a version RESET is editorial, not mechanical — don't dispatch the forward-only executor for it. - **Status**: SHIPPED. origin main=dc4f78b, develop=6c23d6f, tag v1.0.0 sole tag; v4.0.0 + stale release/1.0.0 removed from origin. + +## BDR-068 — /capitalize + /close auto-persist memory (finish→develop + push); scoped LRN-069 exception — 2026-07-16 +- **Decision**: when /capitalize (or /close = --ritual) writes entries AND the aiguillage branched a `chore/` off develop THIS run, new STEP 5C auto-finishes that branch → develop + pushes origin/develop. Default ON. `--no-push` holds it on the chore branch (pre-BDR-068 behavior). WORKING branch (memory rides feature/bugfix) or rc-3 commit-fail → 5C skips. push-fail → merge already local, report + manual push (no retry/reset). +- **Why**: memory's value = cross-session persistence; a ritual commit stranded on an unmerged chore branch is INVISIBLE to the next session on develop → the ritual defeats itself (user-identified gap). Memory = append-only/low-risk; the human-gated MERGE (aiguillage) is a CODE safeguard, and LRN-069's push-gate guards surprise CODE/release pushes — neither applies to an end-of-session memory persist. +- **Scope**: /capitalize + /close ONLY. /prune-memory + /reconcile stay fully human-gated (curation/report may want review before landing). NEVER auto-finish a branch the run did not create. +- **Amends**: [[LRN-069]] (push needs explicit go) — scoped exception for memory-only ritual persist; `gitflow-aiguillage.md` "never gitflow finish" — carved for capitalize/close. +- **Files**: skills/capitalize/SKILL.md (STEP 5C + aiguillage branch-capture + STEP 6 outcomes + Rules + arg-hint `--no-push`), lib/gitflow-aiguillage.md (exception note). Tests unaffected (run-deterministic covers memory-commit.sh surgical scope, not the persist step). +- **Status**: implemented on feature/close-auto-persist, UNMERGED (human gate). diff --git a/.claude/tasks/TODO.md b/.claude/tasks/TODO.md index bd3ceb5..feee292 100644 --- a/.claude/tasks/TODO.md +++ b/.claude/tasks/TODO.md @@ -1,5 +1,11 @@ # TODO +## 2026-07-16 — /close auto-persist memory (feature/close-auto-persist, BDR-068) +- [x] STEP 5C: auto-finish chore→develop + push when capitalize/close branched off develop +- [x] --no-push escape hatch; WORKING-branch + rc-3 skip; graceful push-fail +- [x] aiguillage exception note + BDR-068 +- [ ] merge feature/close-auto-persist → develop (human gate) + ## 2026-07-16 — SHIPPED v1.0.0 first public release (BDR-067) - [x] versioning reset 4.0.0→1.0.0, CHANGELOG pre-release-history banner - [x] deleted v4.0.0 tag + stale release/1.0.0 branch (git-cherry: nothing orphaned) diff --git a/lib/gitflow-aiguillage.md b/lib/gitflow-aiguillage.md index 617bd1d..a51f0d8 100644 --- a/lib/gitflow-aiguillage.md +++ b/lib/gitflow-aiguillage.md @@ -33,8 +33,11 @@ with no code branch to follow. That is the leak it closes: the `.claude/**` hook exemption still lets a *manual* memory commit through on a protected base, but a skill-driven one now branches to `chore/*` first. -**Never run `gitflow finish`** — these flows commit, they do not merge. Integration -is a separate, human-gated step (the `gitflow` skill). +**Integration is human-gated by default** — these flows commit, they do not merge. +EXCEPTION: `/capitalize` + `/close` auto-persist their memory-only commit (finish → +develop + push) when THEY branched a `chore/*` off develop this run (BDR-068 — a +scoped [[LRN-069]] exception; see the capitalize skill's STEP 5C). `/prune-memory` ++ `/reconcile` stay fully human-gated: never run `gitflow finish` from them. Note: `hotfix` branches off **main** (prod) even when invoked from `develop` — that is the gitflow definition of a hotfix. For a dev-scoped small fix, use `/bugfix` diff --git a/skills/capitalize/SKILL.md b/skills/capitalize/SKILL.md index e2352b0..547e91b 100644 --- a/skills/capitalize/SKILL.md +++ b/skills/capitalize/SKILL.md @@ -9,7 +9,7 @@ description: | Triggers: "capitalize", "before clear/compact", "flush memory", "don't lose this", "avant de clear/compact", "capitalise ce qui manque", "close", "fin de journée", "checkpoint memory". -argument-hint: "[--ritual] (scans conversation + git + TODO against .claude/memory/; --ritual adds the 3-question reflection)" +argument-hint: "[--ritual] [--no-push] (scans conversation + git + TODO against .claude/memory/; --ritual adds the 3-question reflection; --no-push holds memory on the chore branch instead of the default auto-merge+push)" allowed-tools: - Read - Edit @@ -51,7 +51,10 @@ mark-superseded). It only appends. Before STEP 4 writes anything, follow `$HOME/.claude/lib/gitflow-aiguillage.md` — this skill's TYPE = `chore`. On `main`/`develop` it branches to `chore/` off develop, so the memory commit lands on a branch, never direct on a protected -base; on a working branch it proceeds in place. Never `gitflow finish` (human-gated). +base; on a working branch it proceeds in place. **Record whether it branched this +run** (PROTECTED → a fresh `chore/` was created off develop; remember +``) — STEP 5C uses that to auto-persist. Do NOT `gitflow finish` here; the +finish is STEP 5C's job, after the commit, and only for a branch THIS run created. ## STEP 0 — PRECHECK @@ -308,6 +311,33 @@ journal-only example. Surgical scope is the helper's (stages ONLY `.claude/memory` + `.claude/tasks`, changed-paths-filtered, never `git add -A`). Do NOT hand-roll git here. +## STEP 5C — AUTO-PERSIST THE MEMORY (finish + push) + +Memory's value is cross-session persistence — a commit stranded on an unmerged +`chore/` branch is invisible to the next session sitting on develop, so the +skill closes the loop itself. This is a SCOPED exception to the human-gated merge ++ [[LRN-069]] push rule: it fires ONLY for this memory-only commit, ONLY on a +`chore/` branch THIS run created off develop (BDR-068). + +Fire only when ALL hold — else SKIP (STEP 6 prints the manual-merge note, the +pre-BDR-068 behavior): +- STEP 5B committed cleanly (`rc 0`), AND +- the aiguillage BRANCHED this run (PROTECTED → `chore/`; on a WORKING + branch the memory already rides feature/bugfix — never auto-merge it), AND +- `--no-push` was NOT passed (the hold escape hatch). + +Then, from the `chore/` branch: + + bash "$HOME/.claude/lib/gitflow.sh" finish chore # merge → develop, delete branch + git push origin develop + +- **finish + push OK** → surface `develop pushed` in STEP 6. +- **push fails** (offline / rejected) → the merge to develop ALREADY happened + locally; report `merged to develop, push FAILED — push manually`. Do NOT retry + or reset the merge. +- **`--no-push` / WORKING branch / rc 3** → skip this step; the commit stays where + it is. STEP 6 prints the manual-merge note. + ## STEP 6 — FINAL OUTPUT + HANDOFF ``` @@ -319,18 +349,22 @@ CAPITALIZE COMPLETE — () TODO.md : checked , added journal.md : +1 line under ## committed : (chore(memory): …) | ⚠️ NOT committed (rc 3 — see closing line) + persisted : develop pushed | on chore/, not merged (--no-push) | merged, push FAILED dropped as already-captured: LRN-023, BLK-006 ignored as noise: push/tag release ``` -Then the mode-specific closing line: +Then the closing line — pick by the STEP 5C persist result (`` = `Context +flushed` for pre-wipe, `Session closed` for ritual): -- **pre-wipe flush** → `✅ Context flushed + committed . Safe to /clear or /compact now.` -- **session-close ritual** → `✅ Session closed + committed . Next session: read .claude/memory/ at startup.` -- **commit skipped (rc 3)** → keep the ✅ on the FLUSH but make the gap loud, never - buried: `✅ Context flushed — ⚠️ NOT committed (); entries safe on disk, commit manually.` - The ✅ covers the write (entries on disk); the ⚠️ marks the commit gap so it is - not read as "all committed". +- **auto-persisted (default — branched off develop, pushed)** → `✅ + persisted to origin/develop (). Next session: read .claude/memory/ at startup.` +- **--no-push (held on branch)** → `✅ + committed on chore/, NOT pushed (--no-push). Merge + push when ready.` +- **push failed after merge** → `✅ + merged to develop — ⚠️ push FAILED (); merged locally, push manually.` +- **WORKING branch (rode a feature branch)** → `✅ + committed on . Integrates when the branch merges.` +- **commit skipped (rc 3)** → keep the ✅ on the WRITE but make the gap loud, never + buried: `✅ — ⚠️ NOT committed (); entries safe on disk, commit manually.` + The ✅ covers the write (entries on disk); the ⚠️ marks the gap so it is not read + as "all done". The closing line matters — confirm the wipe is safe (default) or the session is checkpointed (ritual), AND whether the memory was committed (5B) or left for a @@ -358,6 +392,11 @@ manual commit (rc 3). approved entries is automated via `lib/capitalize-commit.md` (BDR-034 contract). The journal always writes → memory is always pending at 5B, so a successful run always produces a commit; only an unsafe git state (rc 3) skips it. +- **Auto-persist the flush (STEP 5C, BDR-068)** — a memory-only commit on a + `chore/` branch THIS run created off develop auto-finishes → develop + + pushes; a scoped exception to LRN-069. `--no-push` holds it on the branch; a + WORKING branch (memory rides feature/bugfix) or rc 3 skips it. NEVER auto-finish + a branch the run did not create. - **Skip trivial** for the 4 ID registries; journal excepted. - `.claude/memory/` missing → STOP at STEP 0, do not create the structure here. From 0543dafa2d7c7b2ecd8643917ea76f89256f19bf Mon Sep 17 00:00:00 2001 From: Bastien Chanot Date: Thu, 16 Jul 2026 13:56:02 +0200 Subject: [PATCH 4/4] =?UTF-8?q?chore(release):=201.1.0=20=E2=80=94=20versi?= =?UTF-8?q?on.txt=20+=20CHANGELOG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 5 +++++ version.txt | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9705c4b..2d6bc80 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,11 @@ Format follows [Keep a Changelog](https://keepachangelog.com/). ## [Unreleased] +## [1.1.0] — 2026-07-16 + +### Added +- `/close` + `/capitalize` now auto-persist the memory they write. When the ritual branches a `chore/*` branch off develop, it finishes that branch into develop and pushes `origin/develop` automatically (new STEP 5C), so capitalized decisions / learnings / evals reach the next session instead of stranding on an unmerged branch. Scoped to memory-only ritual commits: a `--no-push` flag holds the commit on the branch instead; a run on a feature branch (where the memory already rides the work) or an unsafe git state skips the auto-persist; and a failed push leaves the local merge intact with a manual-push note. Recorded as BDR-068, a deliberate scoped exception to the push-needs-an-explicit-go rule (which guards surprise code/release pushes, not an end-of-session memory persist). + ## [1.0.0] — 2026-07-16 — Initial public release First public release of claude-config. The feature set below is the diff --git a/version.txt b/version.txt index 3eefcb9..9084fa2 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.0.0 +1.1.0