Skip to content

ci(paths): run relevant jobs after lint and verify every skip - #471

Merged
cdeust merged 2 commits into
mainfrom
ci/green-path-filters
Sep 6, 2026
Merged

cdeust merged 2 commits into
mainfrom
ci/green-path-filters

Conversation

@cdeust

@cdeust cdeust commented Sep 6, 2026 •

Copy link
Copy Markdown
Owner

Symptôme

W1-2 / F12 : les PR de documentation et les PR échouant à Lint lançaient la
matrice complète. Cette PR est empilée sur #470 ; les trois PR temporaires
d'acceptation seront ouvertes contre cette branche et ne seront pas fusionnées.

Cause racine

Aucune classification de chemins ni dépendance à Lint. L'agrégateur autorisait
un skip par nom de job, sans vérifier que sa raison s'appliquait au run.

Changement

changes classe code/docs/docker/workflows/deps avec
dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d (v4.0.1).
Les chemins inconnus sont traités comme du code. Les jobs coûteux dépendent de
changes et de Lint ; une PR documentaire exécute ces deux jobs et CI Green.
Les changements de code, dépendances ou workflows exécutent la matrice ; les
changements Docker seuls exécutent les jobs Docker.

Un validateur stdlib vérifie les sorties, le contexte, la couverture exacte des
jobs et la raison de chaque skip. Échecs, annulations et résultats manquants
restent bloquants. Le contrôle statique impose l'agrégateur always() et les
dépendances. Les PR de forks conservent la garde du postinstall fournisseur.

Une garde refuse les PR dépassant 3 000 fichiers avant la classification, car
l'API GitHub utilisée par dorny est plafonnée.
Elle refuse aussi un compteur absent ou invalide : aucune classification
tronquée n'est acceptée silencieusement. Le filtre de branche des PR est retiré
pour couvrir les PR empilées. Dependabot groupe les mises à jour mineures et
patch par écosystème/répertoire ; les majeures restent séparées.

Preuve

Au SHA c2f4108b, macOS ARM64 / Python 3.13.7 : gates ordonnés verts,
Ruff 1 416 fichiers, craftsmanship, Pyright zéro diagnostic ; couche
scripts 825 passed, 5 skipped, 280 subtests ; suite complète
7 572 passed, 221 skipped, 280 subtests en 145,65 s.
Charge avant : 4,89 pour 10 cœurs ; disque libre avant/après : 66 GiB.

uv sync --locked --no-default-groups --extra dev --extra sqlite --group lint
.venv/bin/ruff check
.venv/bin/ruff format --check
.venv/bin/python scripts/check_craftsmanship.py
uv sync --locked --no-default-groups --extra dev --extra postgresql \
  --extra sqlite --extra codebase --extra otel --group typecheck --group lint
.venv/bin/python -m pyright mcp_server/
export CORTEX_TEST_DATABASE_URL=postgresql://localhost:1/cortex_green_isolated
export CORTEX_MEMORY_STORE_BACKEND=sqlite DATABASE_URL=
export HF_HUB_OFFLINE=1 TRANSFORMERS_OFFLINE=1 CORTEX_RERANKER_OFFLINE=1
.venv/bin/python -m pytest tests_py/scripts/ -q --tb=short
.venv/bin/python -m pytest -q --tb=short
actionlint .github/workflows/ci.yml
.venv/bin/python scripts/check_ci_gate_complete.py

Logs locaux : /private/tmp/cortex-green-w1-2-final-gates.log.
Les tests couvrent documentation, code/documentation mélangés, Docker,
dépendances, workflows, forks, skips inattendus, annulations et sorties invalides.
La garde de liste couvre les frontières 3 000/3 001 et le refus CLI explicite.

Acceptation externe PR / run Résultat
Documentation seule #472, run 34036213779 Vert : Changed paths 6 s, Lint 12 s, CI Green 5 s ; tous les jobs coûteux ignorés
Échec Lint volontaire #473, run 34036544212 Échec attendu F401 : Lint 11 s, Changed paths 7 s, CI Green 7 s ; zéro job test/Windows/Docker lancé
Changement de code #474, run 34036866480 Vert : quatre Python, SQLite, Windows, trois jobs Docker et tous les autres jobs pertinents exécutés

Ces trois runs utilisent l'événement réel pull_request. Le cas code exécute
17 jobs, pour 4366 secondes cumulées (72.77 minutes), contre 23 s
pour le cas documentaire. Ces durées observées excluent les skips et l'attente,
et ne sont pas des mesures d'énergie. La CI de cette PR est également
verte, run 34035713474.

Le cas documentaire au SHA d59bd3cae31851a6b81636d12d384650b20b58bc
confirme exactement trois jobs exécutés et 23 s de durée cumulée de ces jobs,
hors attente en file. Les timestamps des jobs ignorés ne sont pas additionnés.
Relevé brut : /private/tmp/cortex-green-w1-2-docs-jobs.jsonl.

Le cas Lint au SHA f8ffa159bbf87f616b9ef2b1152c81efcf9baca0 échoue
uniquement sur l'import math inutilisé de la sonde. Tous les jobs coûteux
sont ignorés ; CI Green refuse ce run. Relevés :
/private/tmp/cortex-green-w1-2-lint-jobs.jsonl et
/private/tmp/cortex-green-w1-2-lint-failure.log.

Conformité

  • Branche/PR W1-2 ; gates locaux verts, nouveaux fichiers sous les caps,
    baseline inchangée.
  • Aucun import de couche mémoire modifié ; aucune donnée de production lue.
  • Action tierce épinglée et constante de limite sourcée ; aucun repli silencieux.
  • Aucun mécanisme de test retiré : les jobs restent exigés sur les changements
    pertinents, et le gate refuse un skip injustifié.
  • Aucune fusion et aucune issue ouverte.

Candidats issues

La protection de main a été migrée le 2026-09-06 après les trois preuves :
CI Green (app GitHub Actions 15368) remplace les contextes CI individuels ;
CodeQL (app Advanced Security 57789) et strict=false sont conservés.
Lecture avant/après prouve que toutes les autres protections sont identiques.
CodeQL reste indépendant de ci.yml. La taille pré-existante du
workflow n'est pas absorbée par cet item. Une PR de plus de 3 000 fichiers doit
actuellement être scindée pour cette classification exhaustive.

Runbook

Le propriétaire décide de la fusion. Les trois PR temporaires d'acceptation sont
fermées sans fusion, après consignation de leurs résultats. Aucune opération de production.

@cdeust
cdeust merged commit 4066f8e into main Sep 6, 2026
28 checks passed
@cdeust
cdeust deleted the ci/green-path-filters branch September 8, 2026 16:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant