Repository navigation
Conversation
…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>
|
Grain tag obligatoire (#10045, bloquant).
Pour passer ce gate, le body doit porter en tete une ligne de la forme : Le |
clusterManager-Myia
left a comment
There was a problem hiding this comment.
[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.
Bash Syntax Advisory — shebang / executable-bit warningsSee the |
|
G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
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 |
Path-collision (organ #13359/#13615)Cette PR #13973 (
|
|
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 Closing to clear the DIRTY/mergeable=CONFLICTING slot from the Grain: LIGHT/guard -- lane myia-po-2026:CoursIA -- prev: LIGHT/guard #13977 (closed earlier this cycle). |
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éral18au lieu d'une constante nommée.L'asymétrie avec
INCIDENT_FLOOR_DATE(déjà nommée) rendait le floorinvisible quand les attentes dérivaient.
INCIDENT_FLOOR_COUNT = 18(symétrique deINCIDENT_FLOOR_DATE)18par la constante dansverdict()test_incident_floor_count_is_named_constant_13966vérifiel'export de la constante ET l'absence du littéral
18dans le source.§2 — Conjonction STALE_FLOOR non documentée
STALE_FLOORnécessiteghosts == floorETlive == 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_DETECTEDau lieu deSTALE_FLOOR.verdict()pour expliciter la conjonctionlive == 0(load-bearing)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
INCOMPLETEne reproduitPAS
INCOMPLETE--load_snapshotne peut pas resynthétiser lesparse_failuresà partir des seuls timestamps (uncreated_atmanquantressemble à 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.
load_snapshot()explicite la perte + raisontest_replay_incomplete_prior_analysis_yields_non_incomplete_13966:pin le contrat (verdict change de classe) + assert la documentation explicite
Vérification
11 tests originaux + 4 nouveaux pour #13966.
Diff
Grain: tier-light/genre-tooling--lane-po2026:CoursIA-2--prev-cycles58-61
Refs #13966