docs(review): REVIEW.md, calibrated risk levels and review rules per zone (#456) #460
No reviewers
Labels
No labels
autopilot:pending-human
source:analyste
source:defenseur
source:human
source:medic
status:approved
status:blocked
status:in-progress
status:needs-clarification
status:needs-fix
status:ready
status:review
status:triage
type:bug
type:feature
type:infra
type:refactor
type:schema
type:security
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: maximus/Simpl-Resultat#460
Loading…
Reference in a new issue
No description provided.
Delete branch "issue-456-review-md"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Fixes #456
Ajoute
REVIEW.mdà la racine, premier travail du pilote « évolution de/pr-review» (document de départ : maximus/agent-defenseurs#190, section 4), et une ligne de renvoi dansCLAUDE.md. Aucun fichier de code, de build ou de CI n'est touché.Le fichier
src-tauri/. Bas : la doc etSTATE.mdseuls. Le reste est normal.CLAUDE.mdou un ADR, plus le fichier du dépôt quand le fait n'existe que là (tauri.conf.json, les workflows,.claude/rules/, le skill/release).check-rust, Windows par cargo-xwin, sonde denpm test).pr-reviewcorrigés pour ce dépôt (sa section « CI coverage gap » est fausse ici depuis #232).CLAUDE.md, section « Documentation technique », renvoie àREVIEW.mdet demande qu'un changement qui rend faux un fait cité le mette à jour dans la même PR.Calibration (C1)
Les deux ensembles. Les « 39 PR de référence » du document de départ sont le résultat de
GET /pulls?state=closed&limit=40&sort=recentupdate(39 mergées, plus #374 non mergée) : 39 des 51 PR mergées entre #344 et #452, choisies par date de dernière mise à jour. Les motifs d'essai rejoués sur cet ensemble redonnent exactement 3/19/17, ce qui l'identifie. Ce tri n'est pas stable, d'où la liste figée :#344 #375 #377 #378 #379 #380 #381 #382 #383 #386 #387 #388 #394 #402 #403 #407 #412 #413 #414 #415 #416 #417 #418 #420 #428 #433 #434 #435 #436 #438 #439 #440 #441 #442 #443 #444 #445 #448 #452
Il laisse de côté #349, #359, #362, #364, #366, #368, #385, #404, #405, #406, #410 et #411, dont quatre PR de licence de niveau haut. La plage complète est donc consignée aussi.
REVIEW.mdREVIEW.mdNiveau haut, les 8 des 39 :
license_commands.rs,licenseService.ts) ;fn migrations()delib.rs,profile_db.rs,consolidated_schema.sql,profile_commands.rs), #436 (profile_db.rs,profile_commands.rs) ;release.yml), #416 et #418 (release.yml,scripts/build-latest-json.sh, gardescripts/check-latest-json.jq).Sur les 51, quatre de plus, toutes de licence : #359, #364, #366, #368.
Sorties du niveau haut :
REVIEW.mdsrc-tauri/Cargo.lockpackage-lock.json.forgejo/workflows/**.forgejo/workflows/**fs_commands.rs, une entrée degenerate_handler!danslib.rsfs_commands.rsnormal, entrées degenerate_handler!exemptéesfs_commands.rsdataExportService.ts(+8/−1, une notification de données)db.tssrc/services/entitlements.test.tsÉcart à la cible. 8 sur 39 donne 20,5 %, au-dessus des 20 % (7,8 PR). Descendre à 7 obligerait à rétrograder une zone réellement haute : chacune des 8 touche le code de licence, le chemin des bases de profils et des migrations, ou
release.yml, qui détient la clé de signature. Sur les 51, la part monte à 23,5 % parce que la plage contient la vague de licence du go-live (#359 à #368) : la part de niveau haut suit la phase du projet.Recoupement avec les demandes de changements. Le document relève 4 commentaires
REQUEST_CHANGES, sur #415, #416 et #428. AvecREVIEW.md, #416 est haute ; #415 (garde ajoutée) et #428 sont normales, et c'est la revue de profondeur normale, celle d'aujourd'hui, qui a trouvé leurs défauts.Variante écartée, pour mémoire : toute montée de version d'une dépendance au niveau haut donnait 11/39 (28 %) et 16/51 (31 %).
Niveau de chaque PR (51)
REVIEW.mdsrc-tauri/src/commands/license_commands.rs,src-tauri/src/commands/license_commands.rs (appel réseau),src/services/licenseService.tssrc-tauri/src/commands/entitlements.rs,src-tauri/src/commands/license_commands.rs,src/services/licenseService.tssrc-tauri/src/commands/license_commands.rs,src/services/licenseService.tssrc-tauri/src/commands/balance_commands.rs,src-tauri/src/commands/license_commands.rs,src/services/licenseService.tssrc-tauri/src/commands/license_commands.rssrc-tauri/src/commands/license_commands.rs,src/services/licenseService.tssrc-tauri/src/commands/balance_commands.rs,src-tauri/src/commands/license_commands.rs,src/services/licenseService.tssrc-tauri/Cargo.toml,src-tauri/src/commands/profile_commands.rs,src-tauri/src/database/consolidated_schema.sqlet 10 autres.claude/skills/release/SKILL.md,.forgejo/workflows/audit.yml,.forgejo/workflows/release.yml.claude/skills/release/SKILL.md,.claude/skills/release/scripts/verify-release.sh,.forgejo/workflows/release.ymlet 2 autres.claude/skills/release/SKILL.md,.claude/skills/release/scripts/verify-release.sh,.forgejo/workflows/release.ymlet 3 autressrc-tauri/src/commands/profile_commands.rs,src-tauri/src/database/profile_db.rsScript de calibration
Versionné depuis
24da72b:scripts/review-levels.py, en lecture seule sur l'API Forgejo (jeton$FORGEJO_TOKEN, sinon~/.forgejo-token).python3 scripts/review-levels.py [premier dernier]rejoue les niveaux, en environ 3 minutes pour les 51 PR ;python3 scripts/review-levels.py --checkvérifie, sans réseau, que ses 37 motifs sont ceux du tableau Haut (sortie 1 sinon, prouvé en retirant.npmrcd'une copie du tableau). Dernier passage, à neuf, sur24da72b: 39 → essai 3/19/17,REVIEW.md3/28/8 ; 51 → essai 6/22/23,REVIEW.md6/33/12, niveaux identiques PR par PR au passage defa1abb1.Écarts au texte de l'issue
main:REVIEW.mddemande à #457 de le lire surmain, pas sur la base de la PR, pour qu'un maillon de pile ne soit pas jugé par une version non relue.Contrôle du plan
Trois passages refusés, la limite du skill
/fix-issue, chacun sur des points réels :prep-2026-10-16-lot-v018(#449, #453).tauri.*.conf.jsonpropres à une plateforme,src-tauri/.cargo/,.npmrc, workflow ajouté qui lit les secrets.CLAUDE.mdou ADR ; l'action de cache de #375 écrit$GITHUB_ENV(règle CI précisée) ; fichiers de configuration voisins (vite.config.js,vitest.config.*,postcss,Cargo.tomlà la racine), d'où la règle qui échoue fermée.Un constat du premier passage a été écarté : #314 n'a pas montré un cron d'audit mort, sa prémisse a été infirmée (
STATE.md). Après le troisième passage, les derniers points appliqués, Max a choisi de continuer (commit annoté « plan check bypassed »). Les correctifs ne changent le niveau d'aucune des 51 PR (script relancé à neuf contre l'API).Vérifications
REVIEW.md(nouveau, 190 lignes),CLAUDE.md(+2 lignes) etscripts/review-levels.py(outil de calibration, lancé à la main, lu par aucun build ni test). Aucun code applicatif.REVIEW.mdmènent à des fichiers du dépôt, et chaque symbole cité (migration_checksums_match_the_released_ones,prepare_profile_db,infer_floor,toSqlFlag,notifyDataChanged,isEntitled,SR_DEV_EDITION,fetch_price,withTransaction…) existe (git grep). Les chemins non résolus sont des motifs pour des fichiers absents (.npmrc,**/rust-toolchain*,src-tauri/Tauri*.toml), des extensions, un schéma d'URL ou un artefact de release (latest.json).fa1abb1, aucune CI (deux*.mdde la racine, exclus parcheck-frontendet hors despathsdecheck-rust). Depuis24da72b,scripts/déclenchecheck-frontend(npm ci, build,npm test), qui ne lit pas le script ;check-rustne tourne pas.Après la première revue (commentaire 24517)
Revue APPROVE avec 7 suggestions ; Max a choisi de les appliquer puis de demander une seconde revue. Commit
24da72b, pas encore relu :REVIEW.md: exception des CSV compilés dans le piège « CI d'une pile » ; niveau haut pour.claude/settings.jsonet.mcp.json, un déclencheurpull_request_target, une étape d'installation qui change la toolchain ou lePATH, une origine de paquet dont l'hôte ou le schéma change même avec une nouvelle version, et un diff qui retire ou contourne un consentement ;cargo-xwinet la toolchain parmi ce qui s'exécute avec la clé ;EXPECTEDdans la gardewindows-sys;identifierprécisé (le service du trousseau est une constante) ;--check) ;db.tsetdataExportService.ts: décision de Max du 2026-10-18, ils restent normaux, et la zone « Migrations, profils et données » nomme le verrou, le changement de profil et la restauration. Contrairement à ce qu'écrivait la revue, une condition sur le verrou aurait fait passer #433 en haut (9/39) ;/release) : laissé au pilote #458, qui notera si Max juge ce niveau juste ;pathsdecheck-rust,cargo-xwinet toolchain à épingler, commentaire périmé derelease.yml:104).Ces changements ne déplacent le niveau d'aucune des 51 PR. Un premier passage du script les montrait à tort : #375 sortait haute, à cause de commentaires qui contenaient « toolchain » et « PATH ». Les contrôles de workflow ignorent désormais les commentaires.
Suite
/pr-review 459sera la première PR mesurée du pilote #458, de niveau haut (src-tauri/Cargo.toml,src-tauri/Cargo.lock, étape de garde decheck-rust.yml, skill/release).REVIEW.mdà jour (--lockeddans le tableau des commandes ; fin du piège « Fauxt» sur les clés présentes dans une seule langue).🤖 Generated with Claude Code
Revue — PR #460 (
fa1abb1)Verdict : APPROVE
Niveau selon ses propres règles : haut.
REVIEW.mdcrée la section « Niveaux » (dernière ligne du tableau Haut) etCLAUDE.mdn'est jamais bas. Aucune version deREVIEW.mdn'existe encore surmain, donc rien ne règle la profondeur : la revue a relu chaque fait vérifiable contre le dépôt et rejoué la calibration.Résumé. Le fichier tient ce qu'il annonce : la calibration se reproduit à l'identique, les faits cités sont exacts à une exception près (point 1), et les cinq critères d'acceptation de #456 sont remplis, l'écart de 20,5 % étant justifié. Les suggestions portent sur ce fait inexact, un défaut latent du script de calibration et des fichiers à risque que le tableau Haut laisse en normal ; aucune ne bloque le merge.
Ce qui a été exécuté
REVIEW.md3/28/8 (20,5 %) ; 51 PR, 6/22/23 et 6/33/12 (23,5 %).*.mdetsrc-tauri/, de la ligne en prose, y sont codés en logique).CLAUDE.mdou ADR ; 29 liens, tous résolus ; symboles cités présents (migration_checksums_match_the_released_onesdansprofile_db.rs,prepare_profile_db,infer_floor,derive_machine_id,toSqlFlag,notifyDataChanged,COUNTERS_SQL,isEntitled,useEntitlement,withTransaction,SR_DEV_EDITIONetdev-override).paths,paths-ignoreet commandes des quatre workflows ; gardes, canaris etcontinue-on-errordecheck-rust; absence de--locked; clé de signature dans les deux étapesnpx tauri build;connect-srcetidentifierdetauri.conf.json; permissions decapabilities/default.json(aucunefs) ; single-instance en premier plugin, callback sanscoderemonté au front ; quatre fichiersreqwest, aucunfetchréseau côté TS ; en-têtes defetch_price; champs deFeedbackContext; court-circuitfreeen tête deisEntitled; clés decheck-latest-json.jq; sections citées des ADR 0004, 0005, 0006, 0009, 0017, 0018, 0020, 0021, 0022 et 0023, dedocs/architecture.mdet des étapes 0 et 10 du skill/release.SR-, JWT, clés Stripe, PEM, jetons) : rien.fa1abb1, ce qui est attendu : deux*.mdde la racine, exclus parcheck-frontendet hors despathsdecheck-rust. Suites non rejouées : aucun build, test ni workflow ne litCLAUDE.mdouREVIEW.md(git grep), le diff ne peut pas changer leur résultat.pull_refclosesvenant de #460 ; commit conventionnel,Fixes #456, trailer présent.Suggestions (non bloquantes)
1. Fait inexact, piège « CI d'une pile » (
REVIEW.md:177).src-tauri/src/commands/fs_commands.rs:218-221compilesrc/__fixtures__/samples/exemple-desjardins.csvetexemple-tangerine.csvparinclude_str!. Ces deux fichiers sont hors despathsdecheck-rust: une PR qui les renomme, les déplace ou les supprime cassecargo checksans quecheck-rusttourne (seulcheck-frontendtourne, et vitest passe sisamples/index.tssuit), et la casse n'apparaît qu'au run du lundi ou au pré-vol de/release. « L'état Rust d'une pile est prouvé par le dernier maillon qui en a touché » est donc faux pour eux. Une phrase dans le piège suffit ici ; ajoutersrc/__fixtures__/samples/**auxpathsdecheck-rustrelève d'un suivi.2. Script de calibration : pages tronquées. Il demande
/pulls/{n}/files?limit=100et s'arrête dès quelen(fb) < 100, alors que l'instance plafonne les pages à 50 (max_response_items: 50;/pulls?limit=100rend 50 éléments). Au-delà de 50 fichiers, une PR serait tronquée en silence. Sans effet sur la calibration publiée (la plus grosse PR de la plage, #444, compte 38 fichiers), maisREVIEW.md:71demande de rejouer ce script à chaque modification de la section : boucler jusqu'à une page vide avant le pilote #458. Versionner le script (dansscripts/, par exemple) éviterait aussi que « ce script » dépende d'un corps de PR modifiable, et ferait changer motifs et script dans le même diff.3. Fichiers à risque que le tableau Haut laisse en normal. Chaque cas ci-dessous, passé au script, sort normal.
.claude/settings.json(absent aujourd'hui ;settings.local.jsonest ignoré). Un fichier ajouté sous.claude/ne relève pas d'« un dossier caché nouveau ». Seshookslancent des commandes sur le poste à chaque session Claude Code, avec les droits et les jetons de l'utilisateur, etpermissionsélargit ce que/autopilotfait sans demander ; aucune CI ne le voit (.claude/**exclu). Même raisonnement pour un.mcp.jsonmodifié (son ajout est déjà couvert par la règle des fichiers de la racine).src/components/balance/PriceFetchControl.tsx:128-140,src/components/settings/PriceFetchConsentToggle.tsx), etfetch_pricene le vérifie pas. Un diff qui retire ou contourne cette vérification n'ajoute pas d'appel et ne change pas ce qu'il envoie, au sens littéral de la ligne « code livré » (REVIEW.md:29). Ajouter « retire ou contourne un consentement » à sa condition, et nommer ces deux fichiers dans la zone Vie privée.dataExportService.ts(la restauration faitDELETE FROM transactions,categories,keywords…, lignes 666-721) etdb.ts(verrou et changement de profil, #408, incident de la v0.10.0) sont normaux en entier. Une condition à la façon debalance_commands.rs(« le diff touche les suppressions de la restauration », « le verrou ou le changement de profil ») les laisserait normaux pour #402 et #433. Choix de calibration, à confirmer par Max.REVIEW.md:40et 46). « Un déclencheur ajouté » reste normal,pull_request_targetcompris, alors que ce déclencheur (documenté par Forgejo Actions, non éprouvé sur cette instance) fait tourner la définition de la base avec ses secrets et son jeton pour toute PR, forks compris, sur un dépôt public : à nommer au niveau haut. Préciser aussi si la liste qui suit les deux-points est exhaustive : une étape d'installation modifiée (toolchain épinglée, binaire remplacé dans/root/.cargo/bin, qui est dans lePATHdu job) peut faire passer au vert sans y figurer.REVIEW.md:36). « Change l'origine d'un paquet sans changer sa version » laisse passer une origine changée en même temps que la version (hôte deresolvedousourcedifférent dans le hunk d'une montée). Juger l'hôte et le schéma, pas la version.4. Zone Release (
REVIEW.md:123) : la liste de ce qui voit la clé est incomplète.release.yml:46installecargo-xwinsans version épinglée (cargo install --locked cargo-xwinprend la dernière version publiée à chaque tag), puisrelease.yml:58-63le lance par--runner cargo-xwinavecTAURI_SIGNING_PRIVATE_KEYdans l'environnement ; la toolchain Rust (stable,release.yml:29) n'est pas épinglée non plus. Hors diff, mais c'est du code qui voit la clé ; épinglercargo-xwinserait un suivi derelease.yml.5. Garde
windows-sys(REVIEW.md:117). Le workflow interdit d'éditerCRATES,PINetEXPECTEDpour faire passer l'étape (check-rust.yml:221-224).REVIEW.mdnomme la liste, la version et le canari, pasEXPECTED, qui est la correction paresseuse la plus probable quand une version dewindows-sysapparaît dans le lock.6. Pour le pilote #458. Appliquées aux deux autres PR ouvertes, les règles donnent haut pour #459 (attendu) et pour #450, qui ne change qu'une instruction de
.claude/skills/release/SKILL.md. Le motif.claude/skills/release/**n'avait aucun cas isolé dans la calibration (#414, #416 et #418 touchaient aussirelease.yml) : à confirmer, ou à restreindre àscripts/et aux étapes de tag et de publication.7. Précision (
REVIEW.md:99). Le service du trousseau est une constante (KEYCHAIN_SERVICE = "com.simpl.resultat",token_store.rs:30), alignée sur l'identifierpar convention, pas dérivée : changer l'identifierdésaligne le trousseau sans rendre ses jetons OAuth orphelins. Deviennent orphelins les bases (app_config_dir()) et, sousapp_data_dir(), la clé de licence, le jeton d'activation et le fichier de repli des jetons.Hors PR : le commentaire de
release.yml:104annonce encore « a .deb fallback », alors que la clé générique a été retirée le 2026-10-11 (#320, PR #418).Actions faites
status:reviewremplacé parstatus:approved./tmp/pr460-calib/: script extrait et sa sortie) supprimée.Suggestions de la revue 24517 appliquées dans
24da72b, commit ajouté après l'APPROVE et pas encore relu : #456 repasse enstatus:review, et une seconde revue suit (choix de Max).REVIEW.md: points 1, 3, 4, 5 et 7 (détail dans la section « Après la première revue » du corps de la PR).db.tsetdataExportService.tsrestent normaux sur décision de Max ; la zone les nomme.scripts/review-levels.py: le script du corps de la PR, versionné. Pages de 50 lues jusqu'à une page vide, nouvelles règles, commentaires ignorés par les contrôles de workflow, et--check, qui compare les motifs au tableau Haut sans réseau.--checkpasse (37 motifs) et sort 1 sur une copie du tableau privée de.npmrc;branches:ajouté, entrée depaths-ignoreajoutée ;fa1abb1.Revue — PR #460 (
24da72b), seconde passeVerdict : APPROVE
Niveau selon ses propres règles : haut, fixé par
REVIEW.md(création de la section « Niveaux »).mainn'a pas encore deREVIEW.md: la revue couvre le diff complet, en priorité24da72b, ajouté après la première revue. Max doit lire.Résumé. Les faits ajoutés par
24da72bsont exacts, la calibration se reproduit à l'identique avec le script versionné, et la CI de la tête est verte. Les constats restants appartiennent aux familles déjà relevées par la première revue : des listes énumérées qui oublient un membre, et des conditions que le script approche. Aucun ne bloque. La règle de non-convergence du skill demande donc de merger plutôt que d'ouvrir un troisième tour.Ce qui a été exécuté
scripts/review-levels.pyde24da72b, sur une copie hors dépôt, contre l'API en lecture seule, réponses mises en cache. Sur 39 PR : essai 3/19/17,REVIEW.md3/28/8 (20,5 %). Sur 51 PR : 6/22/23 et 6/33/12 (23,5 %). Les niveaux sont identiques, PR par PR, au tableau du corps.--checkpasse (37 motifs). Mutations sur une copie du tableau :.mcp.json) : sortie 1 ;export_import_commands.rs) : sortie 1 ;src-tauri/src/database/**passé de « toujours » à « le diff ajoute un fichier.sql») : sortie 0 (point 4).review_level()(diffs fabriqués, base locale, aucun réseau) : 5 rendent le niveau du texte, 6 divergent (point 4).24da72brelus contre le code :balance_commands.rs;hasConsent()est appelé danshandleClick(PriceFetchControl.tsx:129-134), seul appelant deprices.fetchPrice(balance.service.ts:2812) ;identifier:license.keyetactivation.tokensousapp_data_dir()(license_commands.rs:56-113), repliauth/tokens.jsonau même endroit (token_store.rs:74-86),KEYCHAIN_SERVICEconstante (token_store.rs:30) ;db.ts,withTransactionet générations ; dansrunRestore(dataExportService.ts:424-445),notifyDataChanged()vient aprèswithTransaction. Sources vérifiées : tableau de l'ADR 0022, « Reconnexion nécessaire » de l'ADR 0005,docs/architecture.md:145;release.yml: rustup sans version (l. 29),cargo install --locked cargo-xwinsans--version(l. 46),--runner cargo-xwinavec la clé (l. 58-63) ;windows-sys:CRATES,PIN,EXPECTEDet canari (check-rust.yml:222-230) ;include_str!des deux CSV desrc/__fixtures__/samples/(fs_commands.rs:219-221).SR-, JWT, clés Stripe, PEM, jetons) : rien.check-frontendsur24da72blu (checkout de24da72b, build, 134 fichiers et 2248 tests verts).check-rustn'a pas tourné, ce qui est attendu.pull_refclosesvenant de #460 ; commits conventionnels, trailers présents.Suggestions (non bloquantes)
Les points 1 à 3 prolongent les points 3, 4 et 7 de la première revue : chaque passe trouve un membre de plus d'une liste énumérée. Une phrase de principe à la place de l'énumération ferme la famille. Sinon, les confier au pilote #458 plutôt qu'à un tour de plus.
1. Locks : vérifier l'hôte ne suffit pas, une liste blanche ferme la famille (
REVIEW.md:36). Un cas reste normal, au texte comme au script : une montée de version dont leresolveddésigne l'archive d'un autre paquet sur le même hôte (registry.npmjs.org/evil-foo/-/evil-foo-1.2.4.tgzsous la clénode_modules/foo, sonde P5). La même sonde avec un autre hôte sort haute. C'est le cas que vise l'option--validate-package-namesde lockfile-lint.resolveddu lock actuel ont tous la forme canoniquehttps://registry.npmjs.org/<nom de la clé>/-/<nom court>-<version>.tgz, sans alias, et les 665sourcedeCargo.locksont l'index crates.io.sourceautre que l'index crates.io, unresolvedhors de la forme canonique de sa clé et de sa version, ou unchecksumou unintegritychangés sans nouvelle version ».2. Consentements : l'app en a deux (
REVIEW.md:29et:85). La parenthèse de la ligne « code livré » et la zone Vie privée ne nomment que celui des cours.openFeedbackdeLogViewerCard.tsx:20-33(localStorage,FeedbackConsentDialog.tsx), seul chemin versFeedbackDialog. Le nommer.prices.fetchPrice) : un nouvel appelant hors dePriceFetchControlcontourne le consentement sans toucher aux deux fichiers nommés.PriceFetchConsentToggle.tsxaccorde et retire le consentement, seulPriceFetchControl.tsxle vérifie.3. Deux énumérations à remplacer par leur principe.
REVIEW.md:126). La liste omet Node.js, installé par le script NodeSource sans archive épinglée, querelease.yml:19-25désigne lui-même comme lancé avec la clé. Elle omet aussiactions/checkout@v4, une étiquette mobile. Le job tourne dans un seul conteneur : ce qui s'y exécute avant les deuxnpx tauri buildatteint la clé. Proposé : « Tout ce qui s'exécute dans le jobbuild-and-releaseatteint la clé ; hors derelease.yml, les points d'entrée sont : … ». Les niveaux n'en dépendent pas,release.ymlétant toujours haut.identifier(REVIEW.md:101). Sousapp_data_dir()vivent aussiprofiles.json(liste des profils etpin_hash,profile_commands.rs:13-35) et tout le dossierauth/. Proposé : « orpheline tout ce que l'app range sous ces deux dossiers, dont … »..claude/settings.jsonou.mcp.jsonfait exécuter (script d'un hook, commande d'un serveur MCP) porte le même risque qu'eux, mais reste normal sous.claude/**.4. Le script approche les conditions : le dire. Six sondes s'écartent du texte :
env:ajouté sousname:au niveau du workflow (P2a), ou au niveau du job avantruns-on:(P3), sort normal. Le résultat dépend de la place : à côté depermissions:ou decontainer:, il sort haut ;run:ajoutée qui supprime ou édite un fichier du dépôt parrmoused -isort normale (P4, P4b) ;lib.rs(P6) ousrc-tauri/Cargo.toml(P7) sort normale.changed()écarte les commentaires, alors que le texte ne les exempte pas pour ces lignes.Aucune de ces sondes ne déplace l'une des 51 PR : dans les PR normales,
lib.rsne change que des entrées degenerate_handler!(#366, #368, #380, #387), etCargo.tomln'apparaît que dans #394, haute par ailleurs. À faire :REVIEW.md, pas dans sa sortie (ni #457 ni #458 ne doivent l'utiliser sur une PR ouverte) ;--checkne compare que la première colonne (mutation sur la condition, sortie 0).REVIEW.md:71le dit bien (« ses motifs »), mais:73demande de mettre le script à jour dans le même diff, et ce contrôle n'en couvre que les motifs. L'écrire : les conditions restent à la revue de niveau haut.5. #457 contredit
REVIEW.md:5. Son point A1 litREVIEW.mdà?ref=<base>, alors que le fichier demandemain. L'écart est consigné dans le corps de cette PR, pas sur l'issue. Commenter #457 avant qu'elle démarre, pour que l'implémentation lisemain.Actions faites
status:reviewremplacé parstatus:approved./tmp/pr460-review/: script,REVIEW.md, cache des réponses de l'API, sondes, journal du run 562) supprimée.