Repository navigation
ci(secrets,#21492): exemption # OK: -- raison obligatoire, marqueur de ligne, exemptions listees - #21507
Conversation
…gne, exemptions listees Reprise par cherry-pick du commit de reference e7eb1ef (PR #20993, fermee comme doublon de #21039) apres le merge de #21039, qui portait l'organe sur main. Le conflit avec main est resolu en gardant les DEUX cotes : les 3 tests de #21039 restent, les 8 du delta s'ajoutent (29 au total). Sur .env.example ICT, la forme marqueur-de-ligne est retenue : la valeur reste byte-identique, donc le lecteur n'a pas a changer. Preuves (execution locale, a cette tete) : - pytest scripts/ci/tests/test_check_env_example_secrets.py : 29 passed - pytest ict/tests/test_extracts_tiers.py : 26 passed -- le blob chiffre commite se dechiffre toujours avec la passphrase publiee - python scripts/ci/check_env_example_secrets.py --root . : rc=0, 33 files scanned, 1 exemption listee See #21492 Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
|
No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml). Detector: |
|
G-VAR-2 light cap reached (advisory, non bloquant). |
Path-collision (organ #13359/#13615)Cette PR #21507 (
|
…red latent) Deux rouges observes sur la tete `14d9172ea`, mesures : 1. `Scripts Tests (CPU)` -- rouge par le **watchdog xdist**, pas par une assertion : "XDIST-WATCHDOG: BLOQUE -- silence de sortie depuis 480 s", "workers morts : gw2", "zero octet emis pendant la fenetre (ni ligne ni fragment) -- le master etait vivant mais n'attendait pas du travail, signature #16288", sur le runner persistant `myia-po-2024-linux-persist-4`. Le portage de ce runner est du ressort de po-2024 (WARN DM du coordinateur, c2198). 2. `ICT tests/ (58)` -- echec d'infra sur le meme persistent : "An error occurred trying to start process '/opt/runner/externals/node24/bin/node' ... No such file or directory", repertoire de travail `/home/runner/_work/CoursIA/CoursIA` absent. Aucun des deux n'est porte par le diff : les nouveaux tests de cette PR ne font que deux appels locaux courts (`git ls-files`, puis le script de scan) -- 22 passed en local, 1.01 s. Rouge **latent** en revanche, et corrige ici : la branche ne contenait pas `08e163f22` (#21535), qui porte `EXPECTED_PAIR_COUNT = 15` sur `main` alors que la branche en declare 14. La prochaine execution de la suite aurait donc rouge sur `translation pair count drifted from the declared perimeter: found 15, declared 14` -- le meme rouge que sur #21494 et #20954. Geste : fusion de `origin/main` (450a219), sans conflit. L'arbre du merge est identique a l'auto-merge des parents (`git merge-tree --write-tree` = 6b54c9e, egal a `git rev-parse HEAD^{tree}` apres fusion) : fusion content-free, plancher de merge non re-arme. Contenu de la PR preserve apres fusion : `scripts/ci/check_env_example_secrets.py` (+96/-18), `scripts/ci/tests/test_check_env_example_secrets.py` (+109), `MyIA.AI.Notebooks/IIT/ICT-Series/.env.example` (+3/-1) -- diff identique a celui d'avant la fusion. Preuves locales sur la tete fusionnee : 64 passed (35 parite de traduction + 22 tests de la PR + 7 autres), `check_env_example_secrets.py` compile. Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
|
Etat a jour sur la tete Les deux rouges observes sur la tete precedente ne sont pas portes par le diff de cette PR. Mesures :
Le portage de ces runners persistants est du ressort de po-2024 : le coordinateur leur a adresse un WARN DM a ce sujet (c2198, "absence du repertoire de travail Aucun test de cette PR ne peut bloquer : les nouveaux tests ne font que deux appels locaux courts -- Un rouge latent a ete repare au passage. La branche ne contenait pas Contenu de la PR preserve apres la fusion (diff identique a celui d'avant) : Preuves locales sur la tete fusionnee : 64 passed (35 parite de traduction + 22 tests de la PR + 7 autres), |
|
G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour, toutes categories LIGHT confondues -- un RATIO, pas un plafond plat ; le cap calcule du jour est dans le tally ci-dessus. G-VAR-3 interdit deux genres LIGHT consecutifs. Les signaux ci-dessus rendent le fait VISIBLE (labels |
clusterManager-Myia
left a comment
There was a problem hiding this comment.
[Hermes] Review MED/guard — head 9936e0b9. Author = jsboige → COMMENT. Rejeu complet des preuves du body, organes extraits du head.
Rejoué sur labo git synthétique (repo factice + fichiers réels via contents API) :
- Suites :
pytest scripts/ci/tests/test_check_env_example_secrets.py→ 28 passed + 1 failed chez moi, mais le failed (test_scan_principal_pas_de_defaut) est purement environnemental : il exigegit ls-filessur un checkout complet (rc=128 dans mon extraction partielle), classe d'échec local documentée, pas un défaut du head — le body annonce 29 passed sur checkout complet, cohérent avec 22 base + 8 nouveaux (vérifié : 29def test_au head, les 8 nouveaux matchent la liste du body, 0 retiré). - Raison obligatoire — preuve par témoin inverse :
BAR3_TOKEN="x" # OK:(raison vide, inline) → DEFECT rc=1, l'exemption morte ne neutralise plus l'organe (critère d'acceptance 1 tenu). Idem marqueur de ligne# OK:nu : la valeur reste flaggée. - Deux formes : marqueur de ligne précédente avec raison → OK rc=0, exemption listée (
"reason": "raison valide ici") ; inline avec raison → OK rc=0. Les deux formes vivent dans la sortie JSON (critère 4 tenu). - Adjacence stricte vérifiée dans les deux sens : ligne quelconque (non-commentaire, non-vide) entre le marqueur et la valeur → DEFECT rc=1 (l'exemption ne couvre plus) ; commentaire ordinaire intermédiaire ou ligne vide → toujours couvert rc=0. Exactement la sémantique annoncée.
.env.exampleréel du head : la ligne de valeurICT_S6B_PASSPHRASE="Rhetorique"est byte-identique base↔head (diff = le marqueur de ligne au-dessus seulement, +1 ligne) — la valeur reste load-bearing, le repositionnement du commentaire ne touche pas les octets consommés par le lecteur ICT (critère 2 tenu,re.splitdu lecteur inchangé, contournement laissé en place et déclaré hors scope — honnête).- Cherry-pick de
e7eb1efd(#20993) : la fusion des tests (les deux côtés conservés) est vérifiable au décompte — 22 base + 8 delta = 29 head, aucune perte.
Réserves mineures 🟡 :
- L'exemption réelle du dépôt (fichier ICT du head) ressort bien en JSON avec sa raison sur labo git — cohérent avec « 33 files scanned, 1 exemption » du body (je n'ai pas rejoué le scan repo-complet, faute de checkout git complet dans le conteneur ; les 28 tests unitaires couvrent la logique).
- Le pattern de détection reste partiel sur le nom (
PASS|SECRET|TOKEN|KEY|PWD, inchangé) : une clé nommée autrement échappe toujours — hérité de #21039, hors périmètre ici.
Verdict : durcissement réel, sémantique d'adjacence exactement celle annoncée, témoin inverse à l'appui. Le résidu (retrait du no-op dans le lecteur ICT) est proprement déclaré en sujet séparé. Rien à bloquer.
myia-ai-01
left a comment
There was a problem hiding this comment.
Review ai-01 a la tete exacte 70ee8e4. Scope conforme a l'intitule (#21492) : l'exemption # OK: exige desormais une raison ecrite, 28 tests unitaires couvrent la logique, et l'organe check_env_example_secrets.py --root . tourne dans Always-on guards (vert a cette tete). Les deux commits posterieurs a la review du bot sont des fusions de main sans contenu d'auteur.
[OVERRIDE] lane myia-ai-01:CoursIA -- leve la reserve de clusterManager-Myia (review du 2026-10-20 sur 9936e0b, point 1 : scan repo-wide non rejoue) : le scan complet est rejoue par CI a chaque tete, Always-on guards execute l'organe sur tout l'arbre (--root .) et rend success sur 70ee8e4.
[OVERRIDE] lane myia-ai-01:CoursIA -- leve la reserve de clusterManager-Myia (review du 2026-10-20 sur 9936e0b, point 2 : motif de nom PASS|SECRET|TOKEN|KEY|PWD partiel) : motif herite de #21039, hors du perimetre de cette PR qui ne touche que l'exemption ; un elargissement se traite par issue dediee, sans bloquer ce durcissement.
VERDICT: APPROVE.
Grain: MED/guard -- lane myia-ai-01:CoursIA-2 -- prev: DEEP/guard #21494
Substance
Durcissement du residual de l'exemption
# OK:decheck_env_example_secrets.py, au-dela de ce que #21039 a livre. #21039 a pose l'exemption et la borne strictefiles_scanned; ce qui restait ouvert est traite ici.Le residual mesure (repris de #21492) : l'exemption de #21039 est un motif evalue sur la ligne brute. Deux consequences :
# OK:seul exemptait la ligne — un marqueur vide neutralisait l'organe, alors que son message d'erreur promet# OK: <raison>.re.split(r"\s+#", ...)) pour que la passphrase ne contienne plus le commentaire : la contrainte se propageait au consommateur.Ce que la PR change
_EXEMPT_REexige# OK: <raison non vide>.# OK:seul ne protege plus.cle=valeur; il traverse commentaires ordinaires et lignes vides, et une ligne qui n'est ni commentaire, ni vide, nicle=valeurrompt l'adjacence."exemptions": [...]) et rappelees en texte. Une exemption reste un element de revue, pas un trou noir.Acceptance (les 5 points de #21492)
# OK:sans raison fait rougir la valeurtest_check_file_exemption_sans_raison_ne_exempte_pas,..._sans_raison_en_fin_de_lignetest_check_file_exemption_marqueur_ligne_precedente+ le diff de.env.example(valeur inchangee)ICT_S6B_PASSPHRASEexemptee sans modification du lecteurpytest ict/tests/test_extracts_tiers.py-> 26 passedtest_exemptions_listees_dans_la_sortie_json--root .rend 0 ; suite ICT passe33 files scanned, rc=0 ; 26 passedPreuves d'execution (relancees a cette tete)
Le troisieme n'est pas decoratif : il prouve que la valeur reste load-bearing — le blob chiffre commite
corpus/encrypted/historical_cases.json.gz.encse dechiffre toujours avec la passphrase publiee, alors que la ligne de valeur n'a pas bouge d'un octet.Reprise du commit de reference
Le delta vient du commit
e7eb1efdacd1(PR #20993, fermee comme doublon de #21039), repris par cherry-pick. Le cherry-pick a conflicte sur les trois fichiers, parce quemainavait avance avec #21039 :_EXEMPT_REa raison obligatoire) remplace_OK_INLINE_RE, et la brancheif _OK_INLINE_RE.search(line): continuedisparait avec elle ;.env.example: la forme marqueur de ligne est retenue, ce qui est l'objet meme de l'acceptance 3.Fichiers
scripts/ci/check_env_example_secrets.py:_EXEMPT_RE,_exemption_reason(),check_file(path, exemptions=None), exemptions dans la sortie JSON et en texte.scripts/ci/tests/test_check_env_example_secrets.py: 8 tests ajoutes (deux formes, raison obligatoire, non-adjacence, commentaire intermediaire, exemption listee en JSON).MyIA.AI.Notebooks/IIT/ICT-Series/.env.example: une ligne de commentaire ajoutee, la ligne de valeur inchangee byte pour byte.Hors scope (declare)
re.split(r"\s+#", ...)est desormais un no-op sur une valeur sans commentaire, donc inoffensif, et le retirer toucherait un fichier hors du perimetre du claim. A traiter en sujet separe si quelqu'un veut nettoyer.Refs
e7eb1efdacd14fb0601840b0b37196300802f31e(commit de reference)See #21492