Pilote pr-review par niveaux : mesurer 20 PR et faire le bilan #458

Open
opened 2026-10-17 12:18:06 +00:00 by maximus · 2 comments
Owner

Dernier travail du pilote « évolution de /pr-review ». Contexte et mesures de départ : docs/evolution-pr-review.md, PR maximus/agent-defenseurs#190, section 4.1.

Bloquée par #456 et #457.

Travail

  1. C2 : faire tourner le pilote sur les 20 premières PR de simpl-resultat relues après #457.
  2. Relever, par PR : niveau calculé, nombre de tours de revue, REQUEST_CHANGES, constats de la passe sécurité (niveau haut), niveau jugé juste ou non par Max.
  3. Comparer aux mesures de départ (39 PR, #344 à #452 : environ 2 verdicts par PR, 4 REQUEST_CHANGES, classement d'essai 3 / 19 / 17).
  4. C3 : consigner le bilan dans docs/evolution-pr-review.md (dépôt agent-defenseurs), puis décider : étendre REVIEW.md aux autres projets, passer au constat 3 (relecture bornée au nouveau diff).

Critères d'acceptation

  • Tableau des 20 PR consigné dans un commentaire de cette issue.
  • Bilan et décision écrits dans docs/evolution-pr-review.md.
Dernier travail du pilote « évolution de `/pr-review` ». Contexte et mesures de départ : [`docs/evolution-pr-review.md`](https://git.lacompagniemaximus.com/maximus/agent-defenseurs/src/branch/docs-evolution-pr-review/docs/evolution-pr-review.md), PR maximus/agent-defenseurs#190, section 4.1. Bloquée par #456 et #457. ## Travail 1. **C2** : faire tourner le pilote sur les 20 premières PR de simpl-resultat relues après #457. 2. Relever, par PR : niveau calculé, nombre de tours de revue, `REQUEST_CHANGES`, constats de la passe sécurité (niveau haut), niveau jugé juste ou non par Max. 3. Comparer aux mesures de départ (39 PR, #344 à #452 : environ 2 verdicts par PR, 4 `REQUEST_CHANGES`, classement d'essai 3 / 19 / 17). 4. **C3** : consigner le bilan dans `docs/evolution-pr-review.md` (dépôt `agent-defenseurs`), puis décider : étendre `REVIEW.md` aux autres projets, passer au constat 3 (relecture bornée au nouveau diff). ## Critères d'acceptation - [ ] Tableau des 20 PR consigné dans un commentaire de cette issue. - [ ] Bilan et décision écrits dans `docs/evolution-pr-review.md`.
maximus added the
status:blocked
type:infra
source:human
labels 2026-10-17 12:18:06 +00:00
Author
Owner

Relevé du pilote (C2) — mis à jour à chaque PR

#456 (REVIEW.md, PR #460) et #457 (skills) sont fermées le 2026-10-18 : le pilote compte les PR relues à partir de maintenant. #460 elle-même, relue avant #457, n'entre pas dans les 20.

# PR Niveau calculé (fichiers qui le fixent) Tours de revue REQUEST_CHANGES Constats de la passe sécurité Niveau jugé juste par Max
1 #459 (#455, updater sans zip) haut : src-tauri/Cargo.toml, src-tauri/Cargo.lock, check-rust.yml (étape de verdict modifiée), skill /release 1 (commentaire 24757) 1. Corrigé dans le texte, merge sans second tour (décision de Max) 1, zone Release : le corps présentait le cycle de la prochaine release comme la première preuve de l'updater sans zip, alors que ce cycle exécute l'updater de la v0.17.1 (suivi #463). Aucun constat §1 à §4 de security-scan. oui (2026-10-18)
2 #450 (la-compagnie-maximus#180, report de la matrice des éditions vers le site) haut : .claude/skills/release/SKILL.md seul (Release et mise à jour) 1 (commentaire 24899) 0 0 non, trop haut (2026-10-18) : premier cas isolé du motif .claude/skills/release/**, à restreindre à scripts/** (#462)
3 #464 (#419, latest.json vide ou à plusieurs documents refusé, étape « Publish » exécutée par les tests) haut : .forgejo/workflows/release.yml (Release et mise à jour), aussi scripts/check-latest-json.jq, scripts/build-latest-json.test.mjs et .claude/skills/release/SKILL.md 1 (commentaire 24912) 0 0 oui (2026-10-18)
4 #465 (#421, confirmations attendues avant de supprimer ou de retirer la clé) haut : package.json et package-lock.json (Dépendances : ajout de @tauri-apps/plugin-dialog) 1 (commentaire 24953) ; ff9656d, tests seuls, ajouté après la revue et non relu (commentaire 25025) 0 0 oui (2026-10-18), règle inchangée : un paquet ajouté reste haut même quand sa moitié Rust est déjà dans l'app à la même version (2.6.0)

Lignes 3 et 4 ajoutées après coup le 2026-10-18 : les revues de #464 et #465 ont été faites dans une autre session, qui n'a pas mis ce relevé à jour. Le rang d'une PR se lit ici, dans l'ordre des revues.

Mesures de départ, pour comparaison : 39 PR (#344 à #452), environ 2 verdicts par PR, 4 REQUEST_CHANGES, classement d'essai 3 / 19 / 17 ; avec REVIEW.md, 3 / 28 / 8.

## Relevé du pilote (C2) — mis à jour à chaque PR #456 (`REVIEW.md`, PR #460) et #457 (skills) sont fermées le 2026-10-18 : le pilote compte les PR relues à partir de maintenant. #460 elle-même, relue avant #457, n'entre pas dans les 20. | # | PR | Niveau calculé (fichiers qui le fixent) | Tours de revue | `REQUEST_CHANGES` | Constats de la passe sécurité | Niveau jugé juste par Max | |---|---|---|---|---|---|---| | 1 | #459 (#455, updater sans `zip`) | haut : `src-tauri/Cargo.toml`, `src-tauri/Cargo.lock`, `check-rust.yml` (étape de verdict modifiée), skill `/release` | 1 (commentaire 24757) | 1. Corrigé dans le texte, merge sans second tour (décision de Max) | 1, zone Release : le corps présentait le cycle de la prochaine release comme la première preuve de l'updater sans `zip`, alors que ce cycle exécute l'updater de la v0.17.1 (suivi #463). Aucun constat §1 à §4 de `security-scan`. | oui (2026-10-18) | | 2 | #450 (la-compagnie-maximus#180, report de la matrice des éditions vers le site) | haut : `.claude/skills/release/SKILL.md` seul (Release et mise à jour) | 1 (commentaire 24899) | 0 | 0 | non, trop haut (2026-10-18) : premier cas isolé du motif `.claude/skills/release/**`, à restreindre à `scripts/**` (#462) | | 3 | #464 (#419, `latest.json` vide ou à plusieurs documents refusé, étape « Publish » exécutée par les tests) | haut : `.forgejo/workflows/release.yml` (Release et mise à jour), aussi `scripts/check-latest-json.jq`, `scripts/build-latest-json.test.mjs` et `.claude/skills/release/SKILL.md` | 1 (commentaire 24912) | 0 | 0 | oui (2026-10-18) | | 4 | #465 (#421, confirmations attendues avant de supprimer ou de retirer la clé) | haut : `package.json` et `package-lock.json` (Dépendances : ajout de `@tauri-apps/plugin-dialog`) | 1 (commentaire 24953) ; `ff9656d`, tests seuls, ajouté après la revue et non relu (commentaire 25025) | 0 | 0 | oui (2026-10-18), règle inchangée : un paquet ajouté reste haut même quand sa moitié Rust est déjà dans l'app à la même version (2.6.0) | Lignes 3 et 4 ajoutées après coup le 2026-10-18 : les revues de #464 et #465 ont été faites dans une autre session, qui n'a pas mis ce relevé à jour. Le rang d'une PR se lit ici, dans l'ordre des revues. Mesures de départ, pour comparaison : 39 PR (#344 à #452), environ 2 verdicts par PR, 4 `REQUEST_CHANGES`, classement d'essai 3 / 19 / 17 ; avec `REVIEW.md`, 3 / 28 / 8.
maximus added
status:in-progress
and removed
status:blocked
labels 2026-10-18 16:43:30 +00:00
Author
Owner

Essai hors relevé : Fable en second relecteur sur les PR de niveau haut (2026-10-18)

Question posée : sur une PR de niveau haut, un relecteur d'un autre modèle (Fable 5.1) attrape-t-il ce que la revue Opus laisse passer ? L'essai ne compte pas dans les 20 PR du relevé C2.

Méthode

  • 4 PR de niveau haut de la calibration (#456), choisies parce qu'un défaut y est passé à travers la revue et a été trouvé plus tard : #359, #368, #387, #416.
  • Revue à l'aveugle : un clone par PR, tronqué à la tête de la PR (git fetch du seul commit de tête, aucun historique postérieur, aucun remote), avec la seule description de la PR, sans réseau ni accès à Forgejo. Le même prompt adversarial pour les 4 (parcours réels, choix délibérés de l'auteur, tests qui ne peuvent pas échouer).
  • Référence : le défaut connu (issue de suite) et le commentaire de la revue /pr-review d'origine sur la PR.

Résultats

PR Défaut passé à travers Revue Opus d'origine Fable
#359 #360 : jeton d'une autre machine, licence bloquée en Gratuite partiel : mécanisme décrit (carte qui masque la section Machines), pas signalé comme défaut trouvé, bloquant : parcours réinstallation → Activer → 409 → Désactiver l'ancienne machine → refresh() → Gratuite, section Machines démontée ; faux refresh du harnais de test signalé
#368 #373 : clé révoquée saisie en cours de session, Base jusqu'au redémarrage manqué (trouvé par Max en testant la v0.16.0) partiel : starter consommé au premier ready, clé ressaisie gardée en Base jusqu'au redémarrage, mais limité au cas d'un dossier de données effacé et jugé « délibéré »
#387 #389 : le faux t rend la clé brute, un appel oublié passe trouvé (S1, non bloquant) manqué : affirme qu'aucun test du front n'est un faux qui ne peut pas échouer
#416 #419 : latest.json vide accepté sous jq 1.6 manqué (« tient sous jq 1.6 ») manqué : parité jq 1.6 affirmée par lecture, testée sous 1.7 seulement

Union des deux relecteurs : 3 défauts sur 4 au moins en partie. Chacun voit ce que l'autre manque (#359 et #368 pour Fable, #387 pour Opus) : les angles morts sont décorrélés, Fable n'est pas meilleur.

Constats annexes de Fable

  • #368 : un remboursement traité en supprimant la ligne de licence au lieu de la révoquer (not_found → Unknown) laisse l'édition payante pour toujours. À écrire dans stripe-ops.md : révoquer, jamais supprimer.
  • #416 : notes de version vides publiées sans erreur quand CHANGELOG.md n'a pas la section du tag ; un .sig fait d'espaces passe le script et l'assertion.
  • #387 : la ligne du Journal « emplacement libéré sur le serveur » est écrite même quand aucune requête n'est partie.

Limites

  • 4 PR : un indice, pas une mesure.
  • Montage défavorable à Fable : pas de node_modules ni de réseau, donc suite front jamais lancée ; jq 1.6 absent. cargo test et une mutation ont tourné sur #368 et #387 seulement.
  • La qualification de « régression introduite par #359 » n'est pas vérifiée ; le mécanisme l'est par #360.
  • Coût : 130 à 180 k tokens et 5 à 12 min par PR.

Ce que l'essai change

  1. Le défaut de #373 a été trouvé par un contrôle de Max sur l'application, pas par une lecture de code. La règle « Max doit lire avant le merge » est remplacée par un dossier de décision : skill /pr-brief (intention, irréversible, contrôle concret, angles morts), rédigé le 2026-10-18.
  2. Un second relecteur Fable reste une option pour le niveau haut, avec un environnement complet (dépendances installées, versions d'outils de la CI) et les règles de zone de REVIEW.md. Non décidé : à trancher au bilan C3.
## Essai hors relevé : Fable en second relecteur sur les PR de niveau haut (2026-10-18) Question posée : sur une PR de niveau haut, un relecteur d'un autre modèle (Fable 5.1) attrape-t-il ce que la revue Opus laisse passer ? L'essai ne compte pas dans les 20 PR du relevé C2. ### Méthode - 4 PR de niveau haut de la calibration (#456), choisies parce qu'un défaut y est passé à travers la revue et a été trouvé plus tard : #359, #368, #387, #416. - Revue à l'aveugle : un clone par PR, tronqué à la tête de la PR (`git fetch` du seul commit de tête, aucun historique postérieur, aucun remote), avec la seule description de la PR, sans réseau ni accès à Forgejo. Le même prompt adversarial pour les 4 (parcours réels, choix délibérés de l'auteur, tests qui ne peuvent pas échouer). - Référence : le défaut connu (issue de suite) et le commentaire de la revue `/pr-review` d'origine sur la PR. ### Résultats | PR | Défaut passé à travers | Revue Opus d'origine | Fable | |---|---|---|---| | #359 | #360 : jeton d'une autre machine, licence bloquée en Gratuite | partiel : mécanisme décrit (carte qui masque la section Machines), pas signalé comme défaut | **trouvé, bloquant** : parcours réinstallation → Activer → 409 → Désactiver l'ancienne machine → `refresh()` → Gratuite, section Machines démontée ; faux `refresh` du harnais de test signalé | | #368 | #373 : clé révoquée saisie en cours de session, Base jusqu'au redémarrage | manqué (trouvé par Max en testant la v0.16.0) | **partiel** : starter consommé au premier `ready`, clé ressaisie gardée en Base jusqu'au redémarrage, mais limité au cas d'un dossier de données effacé et jugé « délibéré » | | #387 | #389 : le faux `t` rend la clé brute, un appel oublié passe | **trouvé** (S1, non bloquant) | manqué : affirme qu'aucun test du front n'est un faux qui ne peut pas échouer | | #416 | #419 : `latest.json` vide accepté sous jq 1.6 | manqué (« tient sous jq 1.6 ») | manqué : parité jq 1.6 affirmée par lecture, testée sous 1.7 seulement | Union des deux relecteurs : 3 défauts sur 4 au moins en partie. Chacun voit ce que l'autre manque (#359 et #368 pour Fable, #387 pour Opus) : les angles morts sont décorrélés, Fable n'est pas meilleur. ### Constats annexes de Fable - #368 : un remboursement traité en supprimant la ligne de licence au lieu de la révoquer (`not_found` → `Unknown`) laisse l'édition payante pour toujours. À écrire dans `stripe-ops.md` : révoquer, jamais supprimer. - #416 : notes de version vides publiées sans erreur quand `CHANGELOG.md` n'a pas la section du tag ; un `.sig` fait d'espaces passe le script et l'assertion. - #387 : la ligne du Journal « emplacement libéré sur le serveur » est écrite même quand aucune requête n'est partie. ### Limites - 4 PR : un indice, pas une mesure. - Montage défavorable à Fable : pas de `node_modules` ni de réseau, donc suite front jamais lancée ; jq 1.6 absent. `cargo test` et une mutation ont tourné sur #368 et #387 seulement. - La qualification de « régression introduite par #359 » n'est pas vérifiée ; le mécanisme l'est par #360. - Coût : 130 à 180 k tokens et 5 à 12 min par PR. ### Ce que l'essai change 1. Le défaut de #373 a été trouvé par un contrôle de Max sur l'application, pas par une lecture de code. La règle « Max doit lire avant le merge » est remplacée par un dossier de décision : skill `/pr-brief` (intention, irréversible, contrôle concret, angles morts), rédigé le 2026-10-18. 2. Un second relecteur Fable reste une option pour le niveau haut, avec un environnement complet (dépendances installées, versions d'outils de la CI) et les règles de zone de `REVIEW.md`. Non décidé : à trancher au bilan C3.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: maximus/Simpl-Resultat#458
No description provided.