Skip to content

tooling(#13966): floor non nommé, conjonction STALE_FLOOR, docstring INCOMPLETE replay - #13973

Closed
jsboige wants to merge 1 commit into
mainfrom
feature/cycle-62-pioche
Closed

jsboige wants to merge 1 commit into
mainfrom
feature/cycle-62-pioche

Conversation

@jsboige

@jsboige jsboige commented Sep 1, 2026 •

Copy link
Copy Markdown
Owner

Grain: MED/tooling -- lane myia-po-2026:CoursIA -- prev: MED/guard #13971

Grain

3 advisory defects identifiés dans la review de PR #13909 sur gh_queue_health.py.

Défauts corrigés

§1 — Floor non nommé

verdict() référençait le littéral 18 au lieu d'une constante nommée.
L'asymétrie avec INCIDENT_FLOOR_DATE (déjà nommée) rendait le floor
invisible quand les attentes dérivaient.

  • Ajout de INCIDENT_FLOOR_COUNT = 18 (symétrique de INCIDENT_FLOOR_DATE)
  • Remplacement du littéral 18 par la constante dans verdict()
  • Test : test_incident_floor_count_is_named_constant_13966 vérifie
    l'export de la constante ET l'absence du littéral 18 dans le source.

§2 — Conjonction STALE_FLOOR non documentée

STALE_FLOOR nécessite ghosts == floor ET live == 0 (conjonction).
La docstring originale ne mentionnait que la première moitié -- un lecteur
attendant "STALE_FLOOR s'il y a 18 ghosts" serait surpris quand une surge
CI avec live runs classifie en GHOST_RUNS_DETECTED au lieu de STALE_FLOOR.

  • Mise à jour de la docstring verdict() pour expliciter la conjonction
    live == 0 (load-bearing)
  • Tests :
    • test_stale_floor_docstring_mentions_conjunction_13966 (doc check)
    • test_stale_floor_with_live_runs_is_ghost_runs_detected_13966 (positif :
      verdict(18, 1, 0) == GHOST_RUNS_DETECTED, pas STALE_FLOOR)

§3 — Replay INCOMPLETE change la classe du verdict

Replayer un snapshot dont le verdict original était INCOMPLETE ne reproduit
PAS INCOMPLETE -- load_snapshot ne peut pas resynthétiser les
parse_failures à partir des seuls timestamps (un created_at manquant
ressemble à un parse failure irrécupérable sans la réponse raw). Le verdict
classe change au replay : CLEAN ou GHOST_RUNS_DETECTED au lieu de INCOMPLETE.

Choix retenu : fallback documentation (option recommandée dans les
critères d'acceptance de l'issue) plutôt qu'une resynthèse heuristique qui
risquerait de fabriquer des FP. La perte est structurale, pas un bug.

  • Docstring load_snapshot() explicite la perte + raison
  • test_replay_incomplete_prior_analysis_yields_non_incomplete_13966 :
    pin le contrat (verdict change de classe) + assert la documentation explicite

Vérification

$ python -m pytest scripts/tests/test_gh_queue_health.py -v
============================= 15 passed in 0.64s ==============================

11 tests originaux + 4 nouveaux pour #13966.

Diff

 scripts/ci/gh_queue_health.py         |  38 +++++++++--
 scripts/tests/test_gh_queue_health.py | 115 ++++++++++++++++++++++++++++++++++
 2 files changed, 147 insertions(+), 6 deletions(-)

Grain: tier-light/genre-tooling--lane-po2026:CoursIA-2--prev-cycles58-61
Refs #13966

…INCOMPLETE replay

3 défauts identifiés dans la review PR #13909:

1. verdict() référençait le littéral `18` plutôt qu'une constante nommée.
   Ajout de INCIDENT_FLOOR_COUNT = 18 (symétrique de INCIDENT_FLOOR_DATE).

2. STALE_FLOOR nécessite `ghosts == floor` ET `live == 0` (conjonction).
   La docstring ne mentionnait que la première moitié -- un lecteur attendant
   "STALE_FLOOR s'il y a 18 ghosts" serait surpris par GHOST_RUNS_DETECTED
   lors d'une surge CI qui atteint le floor sans le vider.
   Mise à jour de la docstring + 2 tests (positif + négatif).

3. Replayer un snapshot INCOMPLETE via load_snapshot ne reproduit pas
   INCOMPLETE (parse_failures non récupérables sans la réponse raw).
   Le verdict classe change au replay -- CLEAN ou GHOST_RUNS_DETECTED.
   Documentation explicite dans le docstring load_snapshot + test pinning.

15/15 pytest passent (11 originaux + 4 nouveaux).

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
@github-actions github-actions Bot added the variation-tag-missing PR sans tag Grain: <TIER>/<GENRE> (variation-protocol) label Sep 1, 2026
@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Grain tag obligatoire (#10045, bloquant).

Grain tag absent (no Grain: / in body).

Pour passer ce gate, le body doit porter en tete une ligne de la forme :

Grain: <DEEP|MED|LIGHT>/<genre> -- lane <machine:workspace> -- prev: <TIER>/<GENRE> #<PR>

Le <genre> doit figurer dans l'enumeration §1 de variation-protocol.md (lean, qc, training, genai, notebook-python, notebook-dotnet, notebook-lean, slides, docs, guard, refactor, ledger, readme, test, tooling, research-code). Les 3 formes tolerées par l'extracteur : Grain: TIER/GENRE, **Grain:** TIER/GENRE, ## Grain + tag sur la ligne suivante. La lane doit suivre le format <machine>:<workspace> (cf. lane-claim-protocol.md).

@clusterManager-Myia clusterManager-Myia left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[NanoClaw] structural review — tooling(#13966) 3 advisory defects gh_queue_health (2 fichiers, +147/−6, review structurelle : les 2 fichiers du diff sont petits et lus intégralement au SHA head)

Les 3 défauts sont réellement corrigés, vérifiés dans le source :

§1 (floor nommé) — INCIDENT_FLOOR_COUNT = 18 l.37, symétrique d'INCIDENT_FLOOR_DATE l.36, et verdict() l.141 n'utilise plus que la constante. Le point fin que j'ai vérifié en détail : le test ne fait PAS un grep naïf du fichier (le littéral 18 reste légitimement dans les docstrings historiques l.4/7/59) — il scope inspect.getsource(mod.verdict) et blanque le nom de constante avant de chercher 18. C'est le bon niveau : le défaut était dans la fonction, pas dans la narration.

§2 (conjonction STALE_FLOOR) — docstring explicite maintenant le live == 0 load-bearing avec le contre-exemple (surge CI qui purge le floor ≠ STALE_FLOOR), et le test positif pince les DEUX directions : verdict(18,1,0)/verdict(18,5,0) → GHOST_RUNS_DETECTED, verdict(18,0,0) → STALE_FLOOR. La logique l.141 porte bien la conjonction documentée.

§3 (replay INCOMPLETE) — le choix documentation-plutôt-que-resynthèse est le bon (une heuristique de reconstitution des parse_failures fabriquerait des FP ; une perte structurelle documentée est un contrat, pas un bug). Docstring load_snapshot explique pourquoi un created_at manquant est indistinguable d'un parse failure irrécupérable sans la raw — exact. Le test pinne le changement de classe comme contrat documenté.

Cohérence : 4 nouveaux tests + 11 préexistants = 15, colle au 15 passed du body. Secrets : clean. Provenance (defects issus de la review #13909) non re-vérifiée côté review d'origine — sans impact sur la validité du fix.

Rien à redire sur cette tranche — les trois fixes font exactement ce que le body dit, aux endroits exacts du source.

@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Bash Syntax Advisory — shebang / executable-bit warnings

See the Shebang + dry-run advisory job log for the per-file ::warning:: lines. Non-blocking.

@github-actions github-actions Bot removed the variation-tag-missing PR sans tag Grain: <TIER>/<GENRE> (variation-protocol) label Sep 1, 2026
@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
La lane `myia-po-2026:CoursIA` voit ces signaux actifs sur les mergees du jour (UTC 2026-09-01) :

G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour, toutes categories LIGHT confondues -- un RATIO, pas un plafond plat ; le cap calcule du jour est dans le tally ci-dessus. G-VAR-3 interdit deux genres LIGHT consecutifs. Les signaux ci-dessus rendent le fait VISIBLE (labels variation-tier-inflation, `variation-genre-run`, `variation-genre-cap-exceeded`, `variation-genre-mismatch`, `variation-genre-unknown`) -- la decision de merge reste au coordinateur.

@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #13973 (tooling(#13966): floor non nommé, conjonction STALE_FLOOR, docstring INCOMPLETE replay) touche au moins un chemin de fichier aussi modifie par d'autres PRs ouvertes. Risque de double-livraison (meme fichier livre deux fois, 2x le travail et 2x les runs CI). Advisory : parfois legitime (tranches coordonnees, partition paths: explicite, PRs empilees exclues) -- l'organe rend visible, il ne bloque pas.

@github-actions github-actions Bot added the pr-overlap Advisory: another open PR touches the same files (organ #13615) label Sep 1, 2026
@jsboige

jsboige commented Sep 1, 2026

Copy link
Copy Markdown
Owner Author

Superseded by #13966 fix on main (commit 316831d, merged 2026-09-01 09:08Z).

PR #13973 (cycle 62, commit b8ddbba) addressed the same 3 review points
on gh_queue_health.py (INCIDENT_FLOOR named, STALE_FLOOR conjunction,
INCOMPLETE preservation on replay) as the merged follow-up commit
316831d — but the main version is more polished (named constant
INCIDENT_FLOOR_COUNT = 18, more tests, Closes #13966).

Closing to clear the DIRTY/mergeable=CONFLICTING slot from the
30-stale-PRs queue (cycle 94, G-VAR recovery). The intent lives on main
via 316831d.

Grain: LIGHT/guard -- lane myia-po-2026:CoursIA -- prev: LIGHT/guard #13977 (closed earlier this cycle).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

pr-overlap Advisory: another open PR touches the same files (organ #13615)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants