瀏覽代碼

chore(memory): capitalize BDR-003 + LRN-002 + BLK-002 from restructure

First real CAPITALIZE phase (commit-changer Phase 4) — extract reusable
knowledge from the .claude/ restructure batch (commits c721a36..a9606aa):

- BDR-003: gitignore wildcard + negations pattern (decision with why/alts)
- LRN-002: moving report-file paths requires grepping bash READS,
           not just WRITES — rule learned from 2 dispatchers being
           silently broken until a verify-gate caught them
- BLK-002: rmdir blocked in sandbox even on empty dirs — resolved via
           git rm + rename auto-detect (no rmdir needed in practice)
- journal: 2026-04-23 entry extended with verify-gate outcomes and
           commit batch reference

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
bastien 3 周之前
父節點
當前提交
a99ea5d16a
共有 4 個文件被更改,包括 39 次插入1 次删除
  1. 11 0
      .claude/memory/blockers.md
  2. 13 0
      .claude/memory/decisions.md
  3. 4 1
      .claude/memory/journal.md
  4. 11 0
      .claude/memory/learnings.md

+ 11 - 0
.claude/memory/blockers.md

@@ -21,6 +21,7 @@ rules:
 | ID | Date | Friction | Status |
 |----|------|---------|--------|
 | BLK-001 | 2026-04-22 | `rtk curl` breaks JSON pipelines | upstream |
+| BLK-002 | 2026-04-23 | `rmdir` refusé en sandbox sur dossier vide | resolved (manual user step) |
 
 ---
 
@@ -34,3 +35,13 @@ rules:
   - Workaround alternatif : utiliser `rtk proxy`.
   - Fix upstream : issue reportée, voir `.claude/tasks/rtk-upstream-issue.md`.
 - **Statut** : upstream (bug chez `rtk`, workaround appliqué).
+
+## BLK-002 — `rmdir` refusé en sandbox sur dossier vide
+
+- **Date** : 2026-04-23
+- **Friction** : impossible de supprimer le dossier `./tasks/` une fois vidé (après migration vers `.claude/tasks/`). Commands `rmdir tasks` et `rm -r tasks` retournent "Permission denied" même si le dir est vide et que l'intent est non-destructif.
+- **Cause réelle** : la sandbox Claude Code bloque les commandes destructives (`rm`, `rmdir`, `rm -rf`) par défaut via le harness permission gate, indépendamment de la sémantique réelle. Le `git rm` via `git` lui passait (commit `c721a36`) — git est traité comme tool non-destructif.
+- **Solution** :
+  - Cette session : `git rm tasks/*.md` a traité les fichiers individuellement (via `git rm`, passé par le gate). Ensuite git a auto-détecté les renames vers `.claude/tasks/`, donc le dir `tasks/` a été supprimé implicitement au commit.
+  - Si le dir persiste vide après `git rm` : demander à l'user de lancer `rmdir tasks` manuellement.
+- **Statut** : resolved (résolu par `git rm` + auto-detect rename, pas de `rmdir` requis en pratique).

+ 13 - 0
.claude/memory/decisions.md

@@ -24,6 +24,7 @@ rules:
 |----|------|-------|--------|
 | BDR-001 | 2026-04-22 | --help helper uniforme via hook post-start (option C) | accepted |
 | BDR-002 | 2026-04-23 | Restructurer tasks/ + memory + audits sous .claude/ | accepted |
+| BDR-003 | 2026-04-23 | Gitignore pattern wildcard + négations pour .claude/ | accepted |
 
 ---
 
@@ -49,3 +50,15 @@ rules:
   - Utiliser `.claude/agent-memory/` pour tout — refusée : `agent-memory/` a un rôle distinct (déjà utilisé par d'autres outils).
   - Rituel uniquement en texte aspirationnel dans CLAUDE.md — refusée : zéro garantie d'exécution, les registres resteraient vides.
   - Hook `Stop` pour poser les 3 questions à chaque tour — refusée : trop bruyant.
+
+## BDR-003 — Gitignore pattern wildcard + négations pour `.claude/`
+
+- **Date** : 2026-04-23
+- **Statut** : accepted
+- **Décision** : utiliser `.claude/*` (wildcard match des enfants immédiats) + négations `!.claude/tasks/`, `!.claude/memory/`, etc., plutôt que `.claude/` (ignore récursif).
+- **Pourquoi** : quand un parent est ignoré via `.claude/`, git n'entre pas dans le dossier (pour la perf) et les négations sur les enfants sont **ignorées** — c'est documenté dans `gitignore(5)`. Avec `.claude/*`, git match chaque enfant individuellement, ce qui rend les négations actives.
+- **Alternatives rejetées** :
+  - `.claude/` + `!.claude/tasks/` (naïf) — refusée : les négations n'ont aucun effet, tout reste ignoré.
+  - Retirer `.claude/` du gitignore entièrement — refusée : `.claude/settings.local.json` et `.claude/agent-memory/` doivent rester ignorés (per-machine).
+  - Ajouter les paths à tracker dans `.gitattributes` ou un outil externe — refusée : over-engineering, git gère nativement.
+- **Référence** : commit `499cd07`, `git check-ignore -v` vérifié sur 4 paths (2 trackés, 2 ignorés).

+ 4 - 1
.claude/memory/journal.md

@@ -16,4 +16,7 @@ rules:
 - Restructuré l'arborescence : `tasks/` → `.claude/tasks/`, créé `.claude/memory/` (5 registres) + `.claude/audits/`.
 - Adapté CLAUDE.md + skills `onboard`, `init-project` + agent `onboarder` + `lib/project-archetypes/dotfiles-meta.md`.
 - Ajouté un step CAPITALIZE dans `ship-feature`, `bugfix`, `hotfix`, `feat`, `commit-change` + créé skill `/close` pour rituel de fin de session.
-- Décision BDR-002 actée.
+- 2e verify-gate user → bugs catchés : `.gitignore` cassait le tracking (fixé BDR-003), dispatchers bash harden/validate cassés après le move audit (LRN-002).
+- Audits routés vers `.claude/audits/` (seo/geo/harden/validate/code-clean) + `MIGRATION.md` écrit pour projets existants.
+- 9 commits atomiques (`c721a36..a9606aa`) via `/commit-change` — première exécution réelle de la Phase 4 CAPITALIZE.
+- Décisions actées : BDR-002, BDR-003. Learnings : LRN-002. Blockers : BLK-002.

+ 11 - 0
.claude/memory/learnings.md

@@ -21,6 +21,7 @@ rules:
 | ID | Date | Pattern | Applies to |
 |----|------|---------|------------|
 | LRN-001 | 2026-04-22 | `rtk` shape-compression breaks pipes | any pipeline chaining `rtk curl/cat/read` into `jq`, `python -c`, `awk` |
+| LRN-002 | 2026-04-23 | Moving report-file paths requires grepping bash READS, not just WRITES | any refactor that moves a generated file used by a dispatcher |
 
 ---
 
@@ -30,3 +31,13 @@ rules:
 - **Pattern** : quand un outil de tracking (`rtk`) intercepte stdout et retourne une représentation schématisée/compressée au lieu du payload brut, tout parseur en aval casse silencieusement — parce que l'utilisateur (ou le LLM) ne voit jamais la sortie `rtk`, seulement l'erreur du parseur.
 - **Contexte** : `rtk curl` remplace la sortie JSON brute par une version tokenisée, indépendamment du TTY vs pipe. Les hooks Claude Code réécrivent `curl` → `rtk curl` automatiquement, donc impossible à prévoir sans connaître le hook.
 - **Application future** : pour tout outil qui auto-réécrit des commandes standard, vérifier explicitement le comportement en pipe. Workaround documenté : `exclude_commands=["curl"]` dans `~/.config/rtk/config.toml`, ou `rtk proxy`. Voir `BLK-001`.
+
+## LRN-002 — Moving report-file paths requires grepping bash READS, not just WRITES
+
+- **Date** : 2026-04-23
+- **Pattern** : quand on déplace le chemin d'écriture d'un fichier généré (rapport, artefact, cache), il faut aussi grepper les endroits qui LISENT ce fichier — pas seulement ceux qui l'écrivent. Les dispatchers (skills orchestrateurs qui dispatchent à un agent puis parsent le résultat) contiennent typiquement des commandes bash `test -s X.md`, `grep ... X.md`, `wc -l X.md` — ces refs sont invisibles si on ne grep que pour la chaîne "write" ou "output path".
+- **Contexte** : refactor `.claude/audits/` (commit `5c5e82c`). 1er pass : j'ai mis à jour les write paths dans 5 skills (seo/geo/harden/validate/code-clean) et 3 agents. Le user a demandé une verify-gate. Lui a re-grep, trouvé 10+ refs bash bare (ex: `test -s HARDEN.md`, `grep -oE ... VALIDATE.md`) que j'avais manquées — les dispatchers étaient cassés (ils cherchaient à la racine, agent écrivait dans `.claude/audits/`). Corrigé au commit `5c5e82c` (inclus dans le même commit).
+- **Application future** :
+  - Avant de déclarer "migration complète" d'un chemin de fichier, grep le **basename** (`grep -rn "HARDEN\.md"`) en plus du chemin complet — pour catcher les usages bash bare.
+  - Si le fichier est utilisé dans des pipelines (`test`, `grep`, `wc`, `cat`, `head`), chercher ces verbes explicitement.
+  - **Verify-gates sauvent** : un tour de plus demandé par l'user m'a fait re-grep de façon exhaustive. Sans ça, deux dispatchers auraient été cassés en prod.