Skip to content

ci(guards,#10600): tranche 2 paths-filter sur les 11 workflows unfiltered éligibles (pr-gate + secret-scan exempts) #12773

Closed

Description

@jsboige

Origine

Issue #10600 : « CI: 74 workflows se declenchent sur chaque PR, 0 filtre de chemin — cause structurelle du merge bottleneck ».

Tranche 1 livrée : PR #10799 (instrument audit READ-ONLY + CI advisory) + PR #11980 (audit inventory). Mesure main courant : 81/94 workflows PR avec paths (-82% vs 74 initiaux). L'acceptance #10600 originelle (étape 1 « inventorier les checks requis sur main » + étape 2 « mesure avant/après reproductible ») est remplie.

Résidu à traiter : 13 workflows unfiltered restants (cf docs/audit/workflow-path-filters/latest.md).

Inventaire des 13 unfiltered

Source : python scripts/notebook_tools/audit_workflow_path_filters.py (instrument tranche 1) + API GH repos/jsboige/CoursIA/branches/main/protection (mesure directe).

À filtrer (11 éligibles)

Workflow PR-trigger Required (API) Type paths proposé
base-not-main-advisory.yml oui non advisory **/*
fast-lane-shadow.yml oui non advisory **/* ou restriction surface
lane-claim-guard.yml oui non label-posing .github/workflows/**, scripts/check_lane_claim.py, scripts/tests/**
orphaned-delivery-scan.yml oui non advisory **/*.md, .github/workflows/orphaned-delivery-scan.yml, scripts/**
perimeter-review-guard.yml oui non label-posing .github/workflows/**, scripts/check_pr_perimeter.py, scripts/tests/**
regression-guard.yml oui non label-posing **/* ou restriction surface
repo-size-advisory.yml oui non advisory **/*
stale-base-warning.yml oui non advisory **/*
translation-guard.yml oui non label-posing .github/workflows/**, scripts/**, .claude/**, *.csv, *.md, *.py, *.json
variation-light-genre.yml oui non label-posing .github/workflows/**, scripts/check_variation_light_cap.py, scripts/tests/**
variation-tag-guard.yml oui non label-posing .github/workflows/**, scripts/check_variation_tag.py, scripts/tests/**

Exempts (2)

Workflow Raison
pr-gate.yml SEUL check REQUIS sur main (cf API protection de branche contexts: [\"PR gate\"]). Le commentaire d'en-tête du fichier explicite : « GitHub counts a check that never started as pending forever -- a workflow skipped by its paths: filter never reports skipped. Requiring any path-filtered check would make every PR that does not touch that path permanently unmergeable. »
secret-scan.yml Cf body #10600 verbatim : « Mettre paths-ignore sur un guard de securite (secret-scan) : le cout d'un faux negatif n'est pas commensurable au temps CI economise. » Gitleaks scanne les BLOBS de l'historique complet (cf #10799+#12543 checkout hygiene).

Total à filtrer : 11 workflows.

Acceptance cible

  • Mesure repo-wide avant : python scripts/audit_workflow_paths_filters.py rend unfiltered: 13 au départ de cette tranche.
  • PR par workflow (atomique, 1 paths: par PR — pas de composite).
  • Mesure après : unfiltered: 2 (pr-gate + secret-scan exempts) sur main post-tranche.
  • Contrôle positif : PR touchant .github/workflows/variation-tag-guard.yml → les guards filtrés paths: .github/workflows/, scripts/` tournent toujours (le filtre n'a pas aveuglé le détecteur).
  • Contrôle négatif : PR markdown-only déclenche uniquement les guards à paths **/*.md ou **/*. Fan-out estimé prédit ≈ 11 workflows (vs 74 sans cette tranche).
  • Profondeur de file drainée post-tranche (cible < 60 runs/h après un push de 74 workflows).

Contraintes

  1. Aucun PR composite (un seul paths: par PR, jamais batch).
  2. Pas de paths-ignore sur secret-scan (cf CI: 74 workflows se declenchent sur chaque PR, 0 filtre de chemin — cause structurelle du merge bottleneck #10600).
  3. PR gate reste exempt (cf design).
  4. Tests : pour chaque PR de la tranche, un test vérifie que le filtre est sémantiquement correct (le workflow ne skippe pas sur une PR touchant sa surface).

Voir aussi

Sub-grain scope

Lane myia-po-2024:CoursIA-2 (worker po-2024). Si une autre lane se sent légitime, elle peut claimer paths: .github/workflows/.yml`` sur un workflow précis — mais l'arbitrage global reste coordinateur ai-01.

Activity

  1. jsboige commented on Aug 24, 2026

    @jsboige
    OwnerAuthor

    [CLAIMED] lane myia-po-2024:CoursIA-2 -- paths: .github/workflows/base-not-main-advisory.yml, .github/workflows/fast-lane-shadow.yml, .github/workflows/lane-claim-guard.yml, .github/workflows/orphaned-delivery-scan.yml, .github/workflows/perimeter-review-guard.yml, .github/workflows/regression-guard.yml, .github/workflows/repo-size-advisory.yml, .github/workflows/stale-base-warning.yml, .github/workflows/translation-guard.yml, .github/workflows/variation-light-genre.yml, .github/workflows/variation-tag-guard.yml, scripts/audit_workflow_path_filters.py, scripts/audit_workflow_paths_filters.py, scripts/tests/** -- c.1331p456 reservation, scope sub-grain: 11 PRs atomiques + audit-script evolution

  2. jsboige commented on Aug 26, 2026

    @jsboige
    OwnerAuthor

    [CLAIMED-AMEND] lane myia-po-2024:CoursIA-2 -- correction du glob mort signale par ai-01 (DM msg-20260826T050419, point 3 ; fail-OPEN #13057) :

    Le glob scripts/audit_workflow_path_filters.py ne matche aucun fichier suivi. Les chemins REELS sont :

    • scripts/audit_workflow_paths_filters.py (forme pluriel, racine scripts -- deja dans la claim originale)
    • scripts/notebook_tools/audit_workflow_path_filters.py (forme singuliere, canonique notebook_tools)

    Clause paths: corrigee (remplace la precedente, meme reservation c.1331p456) :

    paths: .github/workflows/base-not-main-advisory.yml, .github/workflows/fast-lane-shadow.yml, .github/workflows/lane-claim-guard.yml, .github/workflows/orphaned-delivery-scan.yml, .github/workflows/perimeter-review-guard.yml, .github/workflows/regression-guard.yml, .github/workflows/repo-size-advisory.yml, .github/workflows/stale-base-warning.yml, .github/workflows/translation-guard.yml, .github/workflows/variation-light-genre.yml, .github/workflows/variation-tag-guard.yml, scripts/audit_workflow_paths_filters.py, scripts/notebook_tools/audit_workflow_path_filters.py, scripts/tests/**

  3. added 2 commits that reference this issue on Aug 27, 2026
  4. added 3 commits that reference this issue on Aug 27, 2026
  5. added 8 commits that reference this issue on Aug 28, 2026
  6. 14 remaining items

  7. jsboige commented on Sep 2, 2026

    @jsboige
    OwnerAuthor

    [CLAIMED] lane myia-po-2024:CoursIA -- paths: .github/workflows/source-output-ratchet.yml, .github/workflows/orphaned-delivery-scan.yml, docs/audit/workflow-path-filters/latest.json, docs/audit/workflow-path-filters/latest.md

  8. added a commit that references this issue on Sep 2, 2026
  9. added a commit that references this issue on Sep 2, 2026
  10. jsboige commented on Sep 8, 2026

    @jsboige
    OwnerAuthor

    [CLAIMED-AMEND] lane myia-po-2024:CoursIA-2 -- paths: scripts/audit_workflow_paths_filters.py, scripts/tests/test_audit_workflow_paths_filters.py -- 2026-09-08T03:15Z

    Sub-grain borné : faire reconnaître par l'audit (et excluant main) comme filtre effectif pour l'objectif #10600 — vérifié first-hand sur (5 runs PR sur branches feature/* en sept., 0 run sur PR vers main : le filtre marche, l'audit ne le voit pas). Acceptance #12773 « unfiltered: 2 » serait atteinte (1 optional deviendrait filtered via branches-ignore). Cycle 30 min worker. Anti-pattern évité : ne pas piper un simulacre DEEP/CONTENU (Tell c.310-L3 sustained), grain META/guard assumé pour R7, G-VAR-1 floor NON TENU assumé 3ᵉ cycle consécutif.

  11. jsboige commented on Sep 8, 2026

    @jsboige
    OwnerAuthor

    [CLAIMED-AMEND] lane myia-po-2024:CoursIA-2 -- paths: scripts/audit_workflow_paths_filters.py, scripts/tests/test_audit_workflow_paths_filters.py -- 2026-09-08T03:15Z

    Sub-grain borné : faire reconnaître par l'audit branches-ignore: [main] (et branches: excluant main) comme filtre effectif pour l'objectif #10600 — vérifié first-hand sur orphaned-delivery-scan.yml (5 runs PR sur branches feature/* en sept., 0 run sur PR vers main : le filtre marche, l'audit ne le voit pas). Acceptance #12773 « unfiltered: 2 » serait atteinte (1 optional orphaned-delivery-scan.yml deviendrait filtered via branches-ignore). Cycle 30 min worker. Anti-pattern évité : ne pas piper un simulacre DEEP/CONTENU (Tell c.310-L3 sustained), grain META/guard assumé pour R7, G-VAR-1 floor NON TENU assumé 3ᵉ cycle consécutif.

    (le commentaire précédent a été corrompu par interprétation shell des backticks — ce body est la version corrigée, posté via gh issue comment --body-file.)

  12. added 2 commits that reference this issue on Sep 8, 2026
  13. added a commit that references this issue on Sep 9, 2026
  14. jsboige commented on Sep 9, 2026

    @jsboige
    OwnerAuthor

    [CLAIMED] lane myia-po-2024:CoursIA -- paths: scripts/audit_workflow_paths_filters.py, scripts/tests/test_audit_workflow_paths_filters.py, docs/audit/workflow-path-filters/latest.md, docs/audit/workflow-path-filters/latest.json -- sub-grain : faire reconnaitre a l'audit les exemptions documentees (plan-loss #14391/#14429, always-on #13234, perimeter #11268, pr-gate/secret-scan #10600) pour atteindre l'acceptance unfiltered=2, + rapport regenere

  15. jsboige commented on Sep 9, 2026

    @jsboige
    OwnerAuthor

    Livraison tranche 2 residuelle -- lane myia-po-2024:CoursIA : PR #15417 (audit reconnait les exemptions documentees). Mesure fraiche : 150 workflows, 86 PR-triggered, 79 avec paths, 80 avec filtre effectif PR->main, 6 exemptions documentees, 0 sans-filtre eligible. Les 11 eligibles de la tranche 2 sont traites (tranches 1a/1b/1c + #14281 + #15165) ; le dernier residu (notebook-plan-loss-gate) est couvert par une exemption ecrite (#14391/#14429), pas un oubli. Cloture de l'issue : a la revue du coordinateur (la lane ne ferme pas).

  16. added a commit that references this issue on Sep 10, 2026
  17. jsboige commented on Sep 13, 2026

    @jsboige
    OwnerAuthor

    [RELEASED] lane myia-po-2024:CoursIA -- #12773 : le résidu est livré, vérifié firsthand à l'instant (2026-09-13 ~11:05Z), aucun geste de lane restant sur les chemins claimés.

    Preuve (3 organes)

    1. Instrument autoritaire (scripts/audit_workflow_paths_filters.py, celui de mes claims) mesuré sur main courant : 160 workflows, 91 PR-triggered, 84 avec paths, 6 exemptions documentées, sans-filtre eligible: 0. Les chemins de mon claim (l'instrument + ses tests + docs/audit/workflow-path-filters/latest.*) sont couverts par les livraisons mergées : fix(guards,#12773): audit recognizes branches-ignore/branches as effective filter for PR→main #15165 (branches-ignore reconnu), fix(guards,#12773): audit reconnait les exemptions documentees de paths (unfiltered eligible = 0) #15417 (exemptions documentées, eligible=0), feat(ci,#15055): classify job deaths -- infra deaths readable from check-run annotations #15425 (+11 tranches antérieures).
    2. Faux positifs de l'instrument jumeau : les 2 « optional à investiguer » du script notebook_tools/audit_workflow_path_filters.py sont tous deux exemptés par design — orphaned-delivery-scan.yml (filtre par la base branches-ignore: [main], commentaire explicite dans le yml) et notebook-plan-loss-gate.yml (« PAS de paths: ici », discipline ci(#14283): route quarto build/validate-pr vers le pool via tarball officiel #14391/ci(quarto): la jambe PR rend le site ENTIER (1192 entrees, sans cache) -- 53 min de rendu, gate auto-annule, PR jamais concluante #14429). Ce sont les reconnaissances fix(guards,#12773): audit recognizes branches-ignore/branches as effective filter for PR→main #15165/fix(guards,#12773): audit reconnait les exemptions documentees de paths (unfiltered eligible = 0) #15417 que le jumeau n'a jamais reçues.
    3. Découverte annexée — issue de suivi Doublon instruments audit paths-filters : le cron CI (05:37) appelle l'instrument sans reconnaissance exemptions (#15165/#15417), l'autoritaire est orphelin #15962 : l'instrument périmé est celui que le cron CI workflow-path-filter-audit.yml (05:37 quotidien) appelle, tandis que l'autoritaire est orphelin — plus la feature checkout-hygiene (ci(organe,#11860): l audit quotidien des workflows ignore l hygiene de checkout — 40 workflows PR clonent 2,12 Gio sans clone partiel #12385) vit dans le périmé, et une exécution locale du câblé écrase latest.json (fix(guards,#12773): audit reconnait les exemptions documentees de paths (unfiltered eligible = 0) #15417, nouveau schéma) avec l'ancien. Consolidation proposée dedans, Grain: MED/guard pressenti.

    La fermeture de #12773 reste au coordinateur (la tranche 2 est livrée, eligible=0 au recensement de référence).

  18. added a commit that references this issue on Sep 14, 2026
  19. myia-ai-01 commented on Sep 18, 2026

    @myia-ai-01
    Collaborator

    Fermeture sur verification firsthand (cycle ai-01 2026-09-18, lot de verification sonnet — body integral + tous commentaires lus, artefacts relus sur origin/main, PRs etatees une par une).

    Mesure firsthand du jour, pas une relecture de claim : l'instrument consolide scripts/notebook_tools/audit_workflow_path_filters.py — celui que le cron appelle — execute sur les workflows d'origin/main rend « 91 PR-triggered, Filtered: 85, Exempt documented: 1, unfiltered eligible: 0 », controle positif OK.

    PRs #15165 (2026-09-09) et #15417 (2026-09-10) MERGED, twins consolides par #15967. Le suivi de l'instrument vit dans #15962 (OPEN).

    Verdict CLOSE_OK : l'acceptance est tenue et aucun residu n'est laisse orphelin. Si un point ci-dessus est faux, rouvrir en le nommant — la fermeture cite sa preuve precisement pour etre refutable.

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