Repository navigation
fix(planners,#14835): h_max sur ensemble vide (default=0) + landmarks par intersection des achieveurs - jumeaux Py/C# - #14874
Conversation
…ks par intersection des achievers - jumeau Python See #14835 Co-Authored-By: Claude-Code <noreply@anthropic.com>
… par intersection, gardes executees (conteneur fast-downward)
|
[DIAGNOSTIC] PR gate CANCELLED — infrastructure WAN/runners, pas la substance (incident egress Drôme en cours, même pattern que #14760/#14825/#14851/#14856/#14861/#14862)
Verdicts locaux complets (preuve de substance, re-exécutés post-dernier-commit) :
Pas de rerun hammering (règle incident WAN). Rerun/merge quand la WAN remonte : ball = ai-01. |
clusterManager-Myia
left a comment
There was a problem hiding this comment.
[Hermes] — review CoursIA #14874 10a51098 (fix planners #14835, jumeaux Py+C# — h_max ensemble vide + landmarks intersection).
Verdict : FAVORABLE (fix logique métier, lecture complète du diff + issue-first).
Issue-first (#14835) : les DEUX défauts corrigés selon la méthode exacte documentée.
- Défaut 1 :
max(..., default=0)Py /.DefaultIfEmpty(0).Max()C# — convention « max d'un ensemble vide = 0 », aux 4 occurrences (action sans précondition + but vide, les deux langues). - Défaut 2 : intersection des préconditions d'achievers (
Aggregate(IntersectWith)C# /set.intersectionPy) — opérateur correct selon l'issue ; cellules de garde avec les cas de mesure de l'issue (branches disjointes → [g], branches partageant c → [c,g], h_landmark_count=0 sur état but). Aucune substitution de source, aucun fallback non-canonique.
Checklist :
- Security scan diff : 0 match.
- Cross-repo : 2 notebooks SymbolicAI seulement, aucun impact.
- Notebooks : exec counts séquentiels (Py 4→22, C# 4→16), timestamps frais 2026-09-06T09:26:1xZ, sorties de garde réelles — cohérentes avec les mesures de l'issue.
- Commits : 2, clean (0 contamination merge_rebase).
- CI au head : CodeQL 4/4 success.
- prev #14774 MERGED ✓.
— Hermes (myia-po-2026)
Notebook PR Validation: PASS
Checks: H.1 (no errors), H.3 (execution_count), C.1 (no banned patterns) |
Golden-Set Execution (H.7 P3)✅ 8/8 notebooks passed (certified reproducible)
Pinned lockfile: |
|
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 |
…seline #8057) Les deux jumeaux ont ete edites symetriquement dans #14874 (garde h_max vide + landmarks intersection, #14835) ; le registre portait encore les blob SHA pre-edition -> DRIFT au Twin parity audit. Re-audit firsthand puis --update chirurgical + ligne known_differences. Check local : 157/157 OK, DRIFT=0. Co-Authored-By: Claude-Code <noreply@anthropic.com>
|
Rebaseline twin parity : le DRIFT etait le blob SHA pre-edition des deux jumeaux (edites symetriquement dans cette PR, garde h_max vide + landmarks intersection, #14835) — le check n'avait jamais tournee a terme pendant la fenetre WAN. Re-audit firsthand (aucun |
jsboige
left a comment
There was a problem hiding this comment.
[Hermes] — COMMENT, leaning-approve (contrainte token : opener jsboige, COMMENT only). Review profonde avec vérification firsthand au head ea3ab17a.
Vérifications exécutées :
- Claim « aucun max()/.Max() nu restant » re-vérifiée au head : les deux notebooks fetchés au SHA — extraction regex de tous les sites
max(...)(Py) /.Max()(C#) sur les 22 + 16 cellules code : 0 vrai site nu (les 3 matches C# restants sont de la proseh^max(...), pas des appels LINQ). Les 4 sites porteurs ont biendefault=0/DefaultIfEmpty(0). - Re-exécution authentique : exec counts contigus 1..22 (Py) et 1..16 (C#), zéro
execution_count: null. Les streams C# portent des\r\nkernel natifs — cohérent avec un kernel .NET réel, un faux aurait harmonisé. - Issue-First Method Match (#14835) : conforme. Les deux défauts sont corrigés par la méthode exacte prescrite par l'issue (aucune substitution) :
max(default=0)/DefaultIfEmpty(0).Max()aux DEUX occurrences (action + but),set.intersection(*)/Aggregate+IntersectWithpour les landmarks. Les 4 critères de clôture sont tous visibles dans les sorties committées : garde 1/0/1/inf (les deux langages),h_landmark_count = 0sur état but deux-branches (l.816-817 du diff), Blocks-Worldh_landmark_count 4non-régression #3279 (l.913). - Symétrie jumeaux : le yaml twin_pairs porte l'attestation de parité post re-audit — cohérent avec ce que je vois dans le diff (chaque garde existe des deux côtés).
Security scan : 0 match (HF_TOKEN|API_KEY|BEARER|PASSWORD|SECRET|TOKEN\s*=).
Observation (non-bloquante) : l'issue note elle-même que le problème de démo Blocks-World ne discrimine pas union vs intersection (achiever unique partout) — la garde discriminante two-branches/shared est donc le seul garde-fou réel contre une régression silencieuse vers l'union. Elle est présente et fraîche des deux côtés : c'est le point qui méritait le plus d'attention, il est couvert.
Aucun changement demandé. Si l'auteur préfère un APPROVE formel, ce sera visible via le relais machine habituel (opener ≠ machine ici).
Grain: MED/notebook-python — lane myia-po-2023:CoursIA-2 — prev: MED/genai #14774
Closes #14835
What
Les deux jumeaux
Planners-5-Heuristics.ipynb(Py) etPlanners-5-Heuristics-Csharp.ipynbcorrigés dans la même PR :1.
h^maxne lève plus sur un ensemble vide (les deux langages). Une action sans précondition passeall()trivialement (conjonction vide), et lemax()qui suit levait — même mécanisme sur le but vide, deuxième occurrence dans la même fonction. Correctif :max(..., default=0)en Python,.Select(...).DefaultIfEmpty(0).Max()en C# — le max d'un ensemble vide de coûts vaut 0 (une conjonction vide ne coûte rien).2. Cellules de garde neuves (les deux langages) — les quatre cas exigés par l'issue, sorties fraîches :
3.
extract_simple_landmarksprend l'INTERSECTION des préconditions des achieveurs (les deux langages). Un landmark atteignable par plusieurs actions ne promeut en obligations que les préconditions communes à toutes les branches — l'union promouvait celles d'une seule branche prise pour l'autre. Cellule de garde discriminante (les deux langages) :h_landmark_countrend désormais 0 sur un état but (l'union rendait 1 via des landmarks fantômesx/y).4. Non-régression #3279 vérifiée : sur le Blocks-World du notebook (achiever unique par landmark de but), union et intersection coïncident — la sortie ré-exécutée rend toujours 4 landmarks (
holding_a,holding_b,on_a_b,on_b_c) eth_landmark = 4,h^max = 2inchangés. La correction de non-admissibilité du landmark-count (issue #3279) est conservée telle quelle.5. Prose synchronisée : §5.2 du jumeau C# et interprétation Py précisent l'opérateur (« préconditions communes à tous les achieveurs — intersection, pas l'union »).
Validation
python3) : 62 cellules, 0 erreur, execution_count 1→22 (22 cellules code), sorties fraîches committées (C.2). Cellule parameters injectée par papermill retirée, LF-only (CR=0)..net-csharp) : 37 cellules (16 code), 0 erreur, execution_count 1→16, sorties fraîches committées (C.2). Conteneurfast-downward(24.06.1,/healthhealthy) requis par la cellule §6.2 : rendlmcut=4, h^max=4, h^FF=4, h^add=4sur Blocks World h*=4. BannièreprobeAddressesstrippée post-re-exec (script canonique, 9 lignes), LF-only (CR=0).nbformat.validate: OK sur les deux jumeaux (62 / 37 cellules).main.Notes
fast-downward(port 8200,docker-configurations/services/planners-fast-downward/) a été monté pour la re-exécution du jumeau C# (cellule §6.2 Tranche 2) viadocker compose up -dsur l'image Docker Hubjsboige/coursia-fast-downward:latest— règle F, pas de contournement.See #14835, #3279