Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 12 additions & 8 deletions .github/workflows/split-reading-advisory.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,17 @@ name: Split-reading advisory
# cellule a UNE cellule de lecture. Si elle en a deja une, on la REECRIT.
# On n'en ajoute jamais une seconde. »
#
# Advisory, jamais bloquant : la dette corpus heritee au cablage est de
# 109 findings (98 generic_pair, 8 separated_by_code, 3 named_split — ces
# derniers fusionnes par la PR soeur #17025). Un garde bloquant rougirait
# chaque PR touchant un notebook porteur de dette heritee. Le passage
# eventuel en blocking sera tranche par le coordinateur apres resorption
# de la dette par serie (precedent : deaccent TRANCHE6 #14325,
# repeated-prose TRANCHE7).
# CLIQUET BLOQUANT depuis #17044 (2026-09-24). La dette corpus heritee au
# cablage (109 findings : 98 generic_pair, 8 separated_by_code, 3 named_split,
# ces derniers fusionnes par la PR soeur #17025) reste GRANDFATHERED : le
# cliquet ne juge que ce que la PR change -- lectures ajoutees ou compte de
# paires qui monte sur un carnet touche. Un garde a plancher absolu aurait
# rougi chaque PR touchant un carnet porteur, ce qui punit le voisin et non
# l'auteur ; c'est cette objection qui avait motive l'advisory, et le cliquet
# la leve sans renoncer au mandat. Mesure avant cablage : 0/11 faux positifs
# sur les 11 dernieres PR notebook mergees (controle positif fondateur 26+16
# intact). Ce job reste workflow_dispatch-only : il ne rend AUCUN verdict de
# PR -- c'est le garde absorbe (registre TRANCHE14) qui le fait.
#
# Wiring : scripts/ci/fast_lane_registry.py :: TRANCHE14.
# Identite : Guard.name == job.name (cf check_absorbed_check_run_identity.py).
Expand All @@ -41,7 +45,7 @@ concurrency:

jobs:
split-reading-advisory:
name: "Split-reading-cells advisory (per-notebook, non-blocking)"
name: "Split-reading ratchet (base vs PR)"
runs-on: [self-hosted, coursia-ephemeral, coursia-linux]
if: github.event.pull_request.head.repo.full_name == github.repository || github.event_name == 'workflow_dispatch'

Expand Down
9 changes: 6 additions & 3 deletions scripts/ci/check_self_hosted_runner_policy.py
Original file line number Diff line number Diff line change
Expand Up @@ -319,9 +319,12 @@
# vehicule workflow_dispatch-ONLY servant de cible d'identite au
# check-run absorbe par fast-lane (registre TRANCHE14) et de re-run
# manuel du recensement sur main. Detecteur de paires de cellules de
# lecture scindees (check_split_reading_cells.py), advisory
# pur-Python stdlib-only, jamais bloquant, aucun secret.
# Rollback = revert de la PR (l'entree disparait de l'allowlist).
# lecture scindees (check_split_reading_cells.py), pur-Python
# stdlib-only, aucun secret. Promu en cliquet BLOQUANT par #17044 : le
# verdict de PR est rendu par le garde absorbe, PAS par ce workflow, qui
# ne tourne jamais sur un pull_request (dispatch-only) -- l'entree reste
# justifiee telle quelle. Rollback = revert de la PR (l'entree
# disparait de l'allowlist).
"split-reading-advisory.yml",
"stale-base-warning.yml",
# fin de chantier #14283 (feu vert ai-01 2026-09-02) : les jobs
Expand Down
28 changes: 22 additions & 6 deletions scripts/ci/fast_lane_registry.py
Original file line number Diff line number Diff line change
Expand Up @@ -1368,24 +1368,40 @@ class Guard:
# classe de collision que le renommage TRANCHE9 -> TRANCHE10 plus haut -- le
# POSTERIEUR cede l'index, jamais l'inverse (deux affectations du meme nom se
# remplaceraient silencieusement et un garde disparaitrait du registre).
#
# PROMOTION EN CLIQUET (#17044, 2026-09-24). Le garde naissait advisory : la
# dette corpus heritee au cablage (109 findings) aurait rougi toute PR
# touchant un carnet porteur, ce qui punit le voisin, pas l'auteur. Le
# cliquet leve exactement cette objection sans renoncer au mandat user
# 2026-09-20 (« une sortie de cellule a UNE cellule de lecture ; si elle en a
# deja une, on la REECRIT, on n'en ajoute jamais une seconde ») : il ne
# regarde QUE ce que la PR change -- lectures AJOUTEES (detect_added_readings)
# ou compte de paires qui MONTE sur un carnet touche. Les 91 findings herites
# restent donc grandfathered, et le cliquet ne rougit que l'augmentation.
# Mesure avant cablage : 0/11 faux positifs sur les 11 dernieres PR notebook
# mergees, controle positif fondateur 26+16 intact (organe
# scripts/ci/check_17464_positive_control.py), self-test 5/5.
TRANCHE14: list[Guard] = [
Guard(
name="Split-reading-cells advisory (per-notebook, non-blocking)",
name="Split-reading ratchet (base vs PR)",
source="split-reading-advisory.yml",
paths=[
"MyIA.AI.Notebooks/**/*.ipynb",
"scripts/notebook_tools/check_split_reading_cells.py",
"scripts/tests/test_check_split_reading_cells.py",
".github/workflows/split-reading-advisory.yml",
],
iterate_paths=["MyIA.AI.Notebooks/**/*.ipynb"],
pre_argv=[
"python", "scripts/notebook_tools/check_split_reading_cells.py",
"--self-test",
],
argv=[
"python", "scripts/notebook_tools/check_split_reading_cells.py",
"--json", "--fail-on-findings", "{changed_paths}",
"--base-ref", "{base_ref}", "--head", "HEAD",
"--json", "--fail-on-findings",
],
blocking=False, # advisory : signale les paires scindees, ne rougit jamais
iterates_paths=True,
blocking=True, # cliquet : rougit l'AJOUT de lecture scindee, jamais la dette heritee
needs_base=True,
absorbed=True,
warn_rc=(1, 2), # rc=2 = findings (signale sans bloquer) ; rc=1 = vacuue
),
]
Loading
Loading