Skip to content

ci(secrets): durcir l'exemption # OK: -- raison obligatoire, marqueur de ligne, exemptions listees #21492

Open

Description

@jsboige

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 :

  1. 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>.
  2. 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 passphrase ICT_S6B_PASSPHRASE est relue par ict/tests/test_extracts_tiers.py et sert a dechiffrer le blob commite corpus/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

  1. Raison obligatoire : # OK: sans raison n'exempte rien, la valeur rouge toujours.
  2. 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.
  3. 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_PASSPHRASE est exemptee sans modification du lecteur ict/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

  1. jsboige commented on Oct 20, 2026

    @jsboige
    OwnerAuthor

    [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

  2. jsboige commented on Oct 20, 2026

    @jsboige
    OwnerAuthor

    [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.example pour 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.

  3. added a commit that references this issue on Oct 21, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions