Repository navigation
ci(secrets): durcir l'exemption # OK: -- raison obligatoire, marqueur de ligne, exemptions listees #21492
Description
Part of #21013
Durcissement de l'exemption # OK: de l'organe check_env_example_secrets.py, au-dela de ce que #21039 livre.
Ce que #21039 livre deja (l'exemption elle-meme + la borne stricte files_scanned) : c'est ce qui satisfy les deux points de #21013. Cette issue ne les reprend pas -- elle traite le residual de l'implementation d'exemption.
Le residual mesure
L'exemption de #21039 est un motif _OK_INLINE_RE evalue sur la ligne brute, avant _strip_value. Deux consequences :
- La raison est ignoree.
# OK:seul, sans raison, exempte la ligne. Un contributeur peut neutraliser l'organe avec un marqueur vide : l'exemption n'a plus de contrepoids lisible en revue, alors que le message de l'organe promet# OK: <raison>. - La forme « en fin de ligne » est la seule disponible. Or, sur une valeur load-bearing — une valeur relue par du code — le commentaire en fin de ligne entre dans la valeur. C'est exactement ce qui s'est produit sur
MyIA.AI.Notebooks/IIT/ICT-Series/.env.example: la passphraseICT_S6B_PASSPHRASEest relue parict/tests/test_extracts_tiers.pyet sert a dechiffrer le blob commitecorpus/encrypted/historical_cases.json.gz.enc; ci(secrets,#21013): implementer exemption # OK: et borne stricte files_scanned #21039 a donc du modifier le lecteur (re.split(r"\s+#", ...)) pour que la passphrase ne contienne plus le commentaire. C'est correct, mais c'est une modification du code de lecture pour satisfaire un garde-fou : la contrainte se propage au consommateur la ou un marqueur de ligne l'aurait evite.
Le delta propose
- Raison obligatoire :
# OK:sans raison n'exempte rien, la valeur rouge toujours. - Deux formes : en fin de ligne de la valeur (
API_KEY=vraie_valeur # OK: <raison>), ou sur une ligne de commentaire juste au-dessus. Cette seconde forme laisse la valeur byte-identique -- le lecteur ICT n'a pas a changer, et la contrainte ne se propage pas au consommateur. - Exemptions visibles : elles sont listees dans la sortie JSON (
"exemptions": [...]) et rappelees en texte. Une exemption reste un element de revue, pas un trou noir.
Le marqueur de ligne couvre la valeur qu'il precede immediatement : il est consomme par la prochaine cle=valeur (qu'elle porte ou non un nom de cle secret) ; une ligne qui n'est ni commentaire, ni vide, ni cle=valeur rompt l'adjacence.
Implementation de reference — deja ecrite et verifiee
Commit e7eb1efdacd14fb0601840b0b37196300802f31e sur la branche fix/20919-env-example-secrets-guard (PR #20993, fermee comme doublon de #21039). La branche est conservee : le delta se reprend par cherry-pick, sans relancer la CI d'une PR (file de runs saturee a la date du 19/10 : 2538 runs, seuil 1000).
Le commit porte :
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 (les deux formes, la raison obligatoire, la non-adjacence, le commentaire intermediaire, l'exemption listee en JSON) ;MyIA.AI.Notebooks/IIT/ICT-Series/.env.example: un marqueur de ligne ajoute, la ligne de valeur inchangee byte pour byte.
Preuves mesurees (execution locale, au commit e7eb1efdacd1)
| Mesure | Resultat |
|---|---|
python scripts/ci/check_env_example_secrets.py --root . |
OK: 33 files scanned, 1 exemption listee, rc=0 |
pytest scripts/ci/tests/test_check_env_example_secrets.py |
26 passed (18 anterieurs + 8 nouveaux) |
pytest MyIA.AI.Notebooks/IIT/ICT-Series/ict/tests/test_extracts_tiers.py |
26 passed — le blob chiffre commite se dechiffre toujours avec la passphrase publiee |
Le dernier point est le preuve que la valeur reste load-bearing : sans la forme « marqueur de ligne », la passphrase aurait change de contenu et le dechiffrement aurait echoue.
Acceptation
- L'exemption exige une raison non vide ;
# OK:seul fait rougir la valeur. - La forme « marqueur de ligne juste au-dessus » est acceptee et laisse la ligne de valeur byte-identique.
-
ICT_S6B_PASSPHRASEest exemptee sans modification du lecteurict/tests/test_extracts_tiers.py(le correctif de ci(secrets,#21013): implementer exemption # OK: et borne stricte files_scanned #21039 devient inutile et peut etre retire). - Les exemptions sont listees dans la sortie JSON et en texte.
-
check_env_example_secrets.py --root .rend 0 sur le depot, et la suite de tests ICT passe.
Prerequis : l'organe doit etre sur main -- c'est la PR #21039 qui l'y porte. Cette issue ne peut donc pas etre servie avant le merge de #21039.
Activity
jsboige commentedon Oct 20, 2026
[CLAIMED] lane myia-ai-01:CoursIA-2 -- paths: scripts/ci/check_env_example_secrets.py, scripts/ci/tests/test_check_env_example_secrets.py, MyIA.AI.Notebooks/IIT/ICT-Series/.env.example -- durcir l'exemption # OK: (raison obligatoire, marqueur de ligne, exemptions listees) par cherry-pick de e7eb1ef, #21039 desormais sur main
jsboige commentedon Oct 20, 2026
[DELIVERED] lane myia-ai-01:CoursIA-2 -- PR #21507
Delta repris par cherry-pick de
e7eb1efdacd1(le prerequis #21039 est sur main). Le cherry-pick a conflicte sur les 3 fichiers ; resolution : les 2 tests-blocs sont conserves (3 de #21039 + 8 du delta = 29 passed), et la forme marqueur-de-ligne est retenue sur.env.examplepour garder la passphrase byte-identique.Preuves a la tete : 29 passed (organe), 26 passed (dechiffrement ICT),
--root .rc=0 / 33 files / 1 exemption.Hors scope declare dans le corps : le retrait du
re.split(r"\s+#", ...)du lecteur ICT reste optionnel et hors claim.fix(ci,#21492): exemption # OK: -- raison obligatoire, marqueur de li…