Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude/skills/adjoint-secretary/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,7 @@ Un BLOCKED honnête est un livrable valide (le gate rend rc=3) ; ne jamais écri
- **Une ré-exécution lancée sans le paramètre de référence écrase le run qu'elle prétend reproduire.** Si un notebook piloté par un flag papermill (`FORCE_RETRAIN`, `USE_CACHE`) est rejoué avec la valeur par défaut, ses sorties sont valides mais relèvent d'un autre régime : poids chargés du cache au lieu d'un entraînement. Tous les organes restent verts. Avant `domain: pass`, comparer `metadata.papermill.parameters` entre la base et la tête. Mesure fondatrice : #17521, réserve 🔴 5796278027.
- **Une règle déjà livrée par une PR sœur se voit dans l'arbre de merge.** Deux PRs de harnais sur la même issue peuvent écrire la même prescription à deux endroits. `git merge-tree --write-tree origin/main <tête>` donne l'arbre qui résulterait du merge : y chercher la section ajoutée et son équivalent déjà présent sur main. Mesure fondatrice : #17289 contre #16879 (issue #16878), `git-workflow.md` l.43-52 contre l.61-80, réserve 🟡 5796479941.
- **Un `[OVERRIDE]` d'ai-01 posté après un dossier BLOCKED appelle un re-stamp, et personne ne le signale.** Pour repérer ces cas en masse, une requête GraphQL paginée suffit. Elle relève, sur les PRs ouvertes, `reviews(last:5, author:"myia-ai-01")` et les derniers commentaires ; on compare ensuite la date du dernier OVERRIDE à celle du dernier `[ADJOINT PREFLIGHT]`. Un OVERRIDE posé par l'auteur de la PR ne compte pas : il faut alors une re-review de la persona. Mesure fondatrice du 23/09 : #17257 et #17213 sont redevenues READY sur re-stamp à tête inchangée. #16735 est une PR d'ai-01 : son OVERRIDE ne lève pas la réserve NanoClaw.
- **Un heredoc non quoté exécute les backticks qu'il contient.** Un corps de commentaire contenant `` `papermill …` `` et écrit dans `<<EOF` lance la commande. Toujours écrire `<<'EOF'`. Mesure fondatrice : c.50, un corps de commentaire rédigé dans un heredoc non quoté a exécuté ses backticks au lieu de les poster.
- **Un heredoc non quoté exécute les backticks qu'il contient.** Un corps de commentaire contenant `` `papermill …` `` et écrit dans `<<EOF` lance la commande. Toujours écrire `<<'EOF'`. Mesure fondatrice : un corps de commentaire rédigé dans un heredoc non quoté a exécuté ses backticks au lieu de les poster.

28. **Figure, jumelles, levées : quatre relevés.**
- **Une courbe tracée ne prouve pas un modèle qui apprend.** Une lane sans vision peut établir qu'une figure n'est pas un cadre vide (en comptant les pixels colorés), mais pas ce que la figure montre. Le secrétaire la **regarde** (`Read` sur le PNG extrait par `git show <tête>:<chemin>`), puis la croise avec les métriques imprimées. Trois signes concordants désignent un prédicteur constant : des courbes plates, une `Correlation: nan` (variance nulle des prédictions pour `np.corrcoef`) et une analyse par quantile vide. Dans ce cas, l'exactitude affichée est la fréquence de la classe majoritaire. Si la prose annonce une plage (« 0.02-0.08 »), c'est un point de merge : soit la prose déclare la limite, soit la cause est corrigée. Mesure fondatrice : #17521 `f3f2d90ba2`, ré-entraînement de 13 epochs, validation figée à 0,5736, main à `Correlation 0.0160`.
Expand Down
14 changes: 7 additions & 7 deletions .claude/skills/coordinate-adjoint/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ Restent réservés à `myia-ai-01:CoursIA` :

Chaque `[ADJOINT PREFLIGHT]`, `[ADJOINT VERIFIED]` et `[ADJOINT CLOSE]` publié est AUSSI journalisé comme observation `[OBS]` via le CLI — jamais dérivé à la main (l'`observation_id` dérive du contenu par le CLI ; une dérivation maison casse l'idempotence silencieusement).

### Schéma réel (vérifié firsthand c.8)
### Schéma réel (vérifié firsthand sur `debt_ledger.py`)

- **Ledger unique** : `issue-debt` (le seul déclaré dans `LEDGERS`). **Pas de `pr-actions`** — la forme de cette section évolue quand la phase B (#16575) ajoute éventuellement d'autres `LEDGERS`.
- **Fields autorisés** (rejet bruyant sinon) :
Expand Down Expand Up @@ -81,20 +81,20 @@ python scripts/coordination/debt_ledger.py reduce --ledger issue-debt \
--events <journal-export.json> --state-dir <LOCALAPPDATA>\CoursIA\debt-ledgers
```

### Proposition B — arbitrage ai-01 c.31 (NON avec motif)
### Proposition B — arbitrage ai-01 (NON avec motif)

**L'arbitrage (B) rendu par ai-01 c.31 22:31Z est NON.** Motif : « Une information reconstituable au pliage n'est pas une information perdue, c'est une information moins commode. Ajouter un champ avant que le ledger ait servi une seule fois, c'est ajouter de la flexibilité dont on n'a pas encore besoin — et c'est un PR de plus sur le chemin critique de la décongèstion. »
**L'arbitrage (B) rendu par ai-01 est NON.** Motif : « Une information reconstituable au pliage n'est pas une information perdue, c'est une information moins commode. Ajouter un champ avant que le ledger ait servi une seule fois, c'est ajouter de la flexibilité dont on n'a pas encore besoin — et c'est un PR de plus sur le chemin critique de la décongèstion. »

**Comment faire changer d'avis** : utiliser le ledger 2 cycles, revenir avec la **mesure** (« sur N observations, j'ai dû rouvrir le pliage M fois pour retrouver le type »), pas une intuition. ai-01 écrira le champ lui-même le cas échéant. Une mesure, pas une intuition — et ce sera un oui.

La proposition `act_kind` est donc **mise en attente mesurée**, pas ajoutée au schéma. Le champ n'existe pas et reste à ne pas ajouter à la main.

### Erreurs déjà commises à ne pas reproduire

- **c.7** : cette section disait `--ledger pr-actions` + `kind` + `audited_head_sha` — drift silencieux. Le code aurait rejeté à chaque cycle avec `unknown_field`. Corrigé c.8 par lecture firsthand de `debt_ledger.py` ligne par ligne.
- **En c.6/c.7** : 33 `[ADJOINT CLOSE]` publiés sur GitHub n'ont **pas** été traduits en observations ledger valides (le CLI était absent de main, et la skill disait du faux). Backfill = geste ultérieur, après merge phase A — pas un skip silencieux.
- **Dérive de schéma** : cette section disait `--ledger pr-actions` + `kind` + `audited_head_sha` — drift silencieux. Le code aurait rejeté à chaque cycle avec `unknown_field`. Corrigé par lecture firsthand de `debt_ledger.py` ligne par ligne.
- **Journalisation manquée** : 33 `[ADJOINT CLOSE]` publiés sur GitHub n'ont **pas** été traduits en observations ledger valides (le CLI était absent de main, et la skill disait du faux). Backfill = geste ultérieur, après merge phase A — pas un skip silencieux.

## Émission de dossiers — garde-fous obligatoires (tells c.12-c.15)
## Émission de dossiers — garde-fous obligatoires

- **Instrument de mesure des checks (arbitrage ai-01 2026-09-21 + RECTIF 12:09Z)** : lire `commits/<sha>/check-runs` — **jamais** `actions/runs` (un `attempt=2` y garde l'ancien id plus petit : organe `dedupe_latest`, `scripts/pr_gate.py` l.537, mesure #11416). Dédup **obligatoire** (17 noms dupliqués mesurés sur #16263) par clé canonique `(started_at, id)` dans cet ordre — jamais `created_at`, jamais `id` seul — et **paginer** (`--paginate` : total_count 101 > per_page 100 mesuré sur #16263).
- **DWELL = minuteur, pas un défaut de contenu** : un rouge `PR gate: DWELL -- ... ecoule a <HH:MM>Z. Rien a corriger dans le code` ne se répare PAS par push (chaque push ré-arme le plancher 120 min depuis la nouvelle tête) ; un dossier BLOCKED qui le nomme est un livrable valide, le merge suit l'échéance. `gh pr update-branch` ne ré-arme PAS le plancher depuis #16149. Corollaire : `statusCheckRollup` ment sur ~20 % des candidates (mesuré ai-01 2026-09-21) — ne jamais en faire un verdict.
Expand All @@ -108,7 +108,7 @@ La proposition `act_kind` est donc **mise en attente mesurée**, pas ajoutée au
- **Ledger : poster `d["content"]` avec `messageId = observation_id`** — l'idempotence du CLI est portée par cet id ; un id dérivé à la main crée un doublon silencieux.
- **Une note postée APRÈS le dossier lui est invisible** : `_strip_adjoint_dossier` coupe le corps **jusqu'à sa fin**, donc un commentaire — ou un `CHANGES_REQUESTED` — collé après un bloc dossier ne compte pas comme réserve et l'organe rend `rc=0`. Le pire des deux mondes : perdue pour le gate, lue par l'humain. Une observation qui ne doit ni lever ni réserver se poste dans un commentaire **séparé, AVANT** le dossier.

## Lire un rouge avant de le nommer — tells c.43-c.44
## Lire un rouge avant de le nommer

- **Rouge fabriqué par la limite de débit de l'installation** : quand l'App GitHub épuise son quota d'installation, les jobs qui lisent le body par l'API reçoivent le texte d'erreur à la place du `PR_BODY`. `tag_required` et `perimeter` rougissent, et le bot `vtr-required-block` poste « Grain tag obligatoire » sur un body qui porte bien son tag. Signe : le summary du check-run contient `rate limit exceeded for installation`. Geste : relancer le job, **jamais** corriger le body. Mesuré sur #17180, #16782 et #17048.
- **Un rerun rejoue le merge ref d'origine** : `gh run rerun` rejoue l'état de `main` du run initial. Un check qui attend un correctif mergé depuis (egress #17276, corrigé par #17479) reste rouge au rerun ; il faut un synchronize de la PR après le merge du correctif. Nommer ce geste à la lane, pas un rerun de plus.
Expand Down
Loading