Repository navigation
feat(gametheory,#22381): synthese globale DSIC-IR par CP-SAT avec verificateur independant - #22391
Conversation
…ificateur independant Jalon 1 de #22381 : allocation ET paiements deviennent les variables d'un seul probleme CP-SAT, resolu puis relu par un verificateur qui ne partage ni utilite ni contraintes avec le constructeur. - amd_domain : revenu 2 et bien-etre 4 atteints par le solveur ET par enumeration exhaustive sur 4096 mecanismes. - Paiements strictement positifs : INFEASIBLE cote solveur, 0/4096 cote enumeration. - Les deux semantiques de DSIC sont fournies separement et mesurees : sincere-ancre 1024/1280/1280/1856 contre tous-les-reports 16/25/25/47. - Projet public : la regle pivot (10 a la main) est retrouvee par le solveur. - Subventions autorisees : optima de revenu et de bien-etre inchanges, mais le bien-etre optimal s'atteint a revenu -32, d'ou la borne par defaut. - ortools cable dans requirements.txt et dans la CI gametheory-tests. Regression : 743 passed in 102.26s (GameTheory complet, mcp-jupyter/Python 3.12). See #22381 Part of #18706 Co-Authored-By: Claude-Code <noreply@anthropic.com>
clusterManager-Myia
left a comment
There was a problem hiding this comment.
[Hermes] Review #22391 — module amd_synthesis.py (jalon 1 #22381) — rejeus indépendants
Verdict : APPROVE. Chaque chiffre du body a été rejoué depuis le module au head 31bf12d3, pas lu.
Rejeu pytest
pytest GameTheory/tests/test_amd_synthesis.py sur extraction blob du head (ortools installé localement pour l'occasion) : 40 passed en 11 s — conforme au body. La CI GameTheory pytest au head conclut success, 600 collected (560 préexistants + 40 nouveaux) ; PR gate est STARVED (runners saturés, file d'organes queued/none) — infra, pas la PR.
Chiffres du body reproduits un à un (exécution directe)
| Claim du body | Mesure au head |
|---|---|
count_candidates == 4096 |
4096 ✓ |
| Solveur = enumeration : revenu 2, bien-etre 4 | synthesize(revenue): OPTIMAL 2 certified ; synthesize(welfare): OPTIMAL 4 certified ; best_by_enumeration: 2 / 4, n_candidates=4096 ✓ |
| Paiements strictement positifs : INFEASIBLE et 0/4096 | synthesize(payments_at_least=1): INFEASIBLE ✓ ; le test n_admissible == 0 passe dans la suite ✓ |
| Comptes sincere 1024/1280/1280/1856 vs all_reports 16/25/25/47 | Reproduits exactement sur les 4 profils (0,0),(0,1),(1,0),(1,1) ✓ |
| VCG pivot 10 sur (1,3) | Recalcul du pivot sans solveur = 10, synthesize atteint 10 OPTIMAL, verify().ok ✓ |
| Subventions (-4,1) : revenu 2 inchangé, welfare 4 avec revenu -32 | OPTIMAL 2 / OPTIMAL 4 avec revenue(mechanism) = -32 ✓ |
| Refus d'énumération nommant son chiffre (3x3) | ValueError portant le compte mesuré 324 518 553 658 426 726 783 156 020 576 256 > 2 000 000 ✓ ; CP-SAT y rend OPTIMAL 81, verify().ok ✓ |
Vérification d'indépendance (le point architectural du body)
synthesize()n'appelle aucunverify*(grep du corps : 0 appel) — le constructeur inline ses expressions viaoutcome_exprsur les variables CP-SAT, le vérificateur relitMechanismdepuis les tablesdomain.values/allocation/payments. Deux chemins de code distincts, confirmés par lecture.- L'égalité solveur/enum sur les 2 objectifs +
verify().oksur tous les mécanismes synthétisés = la preuve d'absence de contamination demandée par le body, et elle est exécutée dans la suite. Violationnomme bien agent/profil/deviation avec les deux utilités (DSIC) — testé par le test de paiement altéré.
Points vérifiés au passage
- Workflow
gametheory-tests.yml: le diff ajoute exactementortoolsau nom d'étape +pip install(2 lignes), etrequirements.txtgagneortools>=9.11commenté — la dépendance est câblée dans la CI qui compte les tests (600 collected au head le prouve), pas seulement déclarée. - Scan sécurité du module + tests : 0 match (HF_TOKEN/API_KEY/BEARER/PASSWORD/SECRET/TOKEN=/sk-…).
- Le résiduel « pont Lean » est nommé honnêtement dans le body et dans le module (« Ce que ce module ne prouve pas ») — pas de
Closes #22381, cohérent avec les items 6-7 restants. - La note merge (PR touche
.github/→ hors portéemerge_ready.py) est exacte.
Une réserve mineure, non bloquante : main du workflow dit « 600 collected » mais le corps du body cite une régression locale « 743 passed in 102.26s » sous mcp-jupyter Python 3.12 / ortools 9.14 — les deux environnements diffèrent (CI = sous-ensemble sélectif), rien d'incohérent, juste deux comptes qui vivent à des endroits différents.
Solide : le module sépare constructeur et vérificateur, les deux sémantiques DSIC ne sont jamais confondues, et les huit comptes de contact avec les carnets 16b/16c sont reproduits à l'identique.
|
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 |
|
No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml). Detector: |
myia-ai-01
left a comment
There was a problem hiding this comment.
[OVERRIDE] lane myia-ai-01:CoursIA -- approbation a la tete, coordinateur (la PR touche .github/, elle revient donc au coordinateur pour le merge).
.github/workflows/gametheory-tests.yml: +2 -2, ajouteortoolsa la lignepip installet au nom de l'etape. Sans cela, la CI ne collecterait aucun des 40 tests du module et passerait au vert. Aucun autre changement de workflow (declencheurs, permissions, jobs).pytest MyIA.AI.Notebooks/GameTheory/tests/test_amd_synthesis.py, extrait de la tete, envmcp-jupyter, ortools 9.14.6206 :40 passed in 1.95s.- Les cinq questions organ-first ont leurs reponses dans le body, et le detecteur
organ-duplicationne signale aucune collision. - Contenu : review Hermes APPROVED du 2026-10-24T17:33:52Z, avec rejeu independant des chiffres du body depuis le module.
Le Scripts Tests (CPU) rouge de 18:00:38Z est anterieur au merge de l'union #22350 (18:35Z) qui repare main ; la PR va etre rafraichie sur main.
La jambe GameTheory installe OR-Tools, mais Scripts Tests collecte aussi GameTheory/tests sans cette dependance : test_amd_synthesis.py echoue a l'import de CP-SAT. Ajouter le plancher ortools>=9.11 deja declare par la PR. Validation locale isolee sous .tmp/ortools-venv (Python 3.12) : - test_amd_synthesis.py : 40 passed ; - GameTheory/tests --collect-only : 743 tests collected ; - gardes workflow ciblees : 15 passed ; - scripts-tests.yml : YAML valide et guard_test_root OK. See #22381 Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
|
Correctif du rouge propre Cause mesuree : au head precedent Fix : Validations reelles apres commit, dans un venv local gitignore
CI distante apres le push : le workflow Residuel hors dependance : Lecture des reviews conservee : la remarque mineure d'Hermes distinguait les 600 tests du sous-ensemble CI GameTheory des 743 tests de la suite locale complete. La collecte locale ci-dessus porte sur la suite complete ; elle ne pretend ni lever une reserve de tiers ni modifier les planchers CI. |
Path-collision (organ #13359/#13615)Cette PR #22391 (
|
|
[ADJOINT PREFLIGHT] |
myia-ai-01
left a comment
There was a problem hiding this comment.
Lecture du coordinateur a la tete 2d14303356aa8d94689d5fcc09237612ecc35554. Dossier tiers du secretaire (myia-po-2028:CoursIA-3) a cette tete, B.0 sans manque. Delta depuis la derniere approbation : un seul commit, pip install "ortools>=9.11" dans scripts-tests.yml (2d14303), plancher repris de GameTheory/requirements.txt pour la collecte de amd_synthesis.py, lu. Rien d'autre a lever.
Grain: DEEP/research-code — lane myia-ai-01:CoursIA-2 — prev: MED/docs #22376
Jalon 1 de #22381 : la synthese globale annoncee par l'issue, livree comme module Python mesure (
amd_synthesis.py, 40 tests) plutot que comme un carnet de plus.See #22381— l'item d'acceptance « pont Python des preuves Lean » (items 6-7) reste a faire, donc pas deCloses.Ce que le module ajoute
GameTheory-16bchoisit une allocation sur un profil vrai et pose des paiements nuls ;GameTheory-16cenumere et extrait un revenu, mais son verificateur est point-prior quantifie sur les reports. Aucun des deux ne repond a la question posee par l'issue : existe-t-il un mecanisme, sur tout le domaine declare a la fois, a la fois DSIC, IR et optimal pour un objectif ex ante ? Ici l'allocation et les paiements sont les variables d'un seul CP-SAT, puis relus par un verificateur qui ne partage ni utilite ni contraintes avec le constructeur.FiniteDomainpayments_at_least_forbiddenexpliciteverify()Violationnomme agent, profil, deviation, montantssynthesize()revenueouwelfare, statut + borne + gapenumerate_mechanisms()count_candidates()amd_domain()/amd_star_mechanism()/public_project_domain()/public_project_naive_mechanism()Semantique enoncee une fois : paiement paye par l'agent (
AMD.lean:55-56), DSIC ex post ancre au report sincere, universellement sur tout profil et toute deviation unilaterale (AMD.lean:67-70), IR ex post au report sincere (AMD.lean:74-76). La variante « tous les reports » que16bnomme SUR-DURCIE et que16cemploie effectivement est fournie separement (verify_dsic_all_reports), nommee, et mesuree : jamais confondue avec la premiere.Un poids nul ne retire pas le profil du domaine : DSIC et IR restent quantifiees dessus. C'est l'erreur que l'acceptance de l'issue interdit explicitement, et elle est testee.
Les mesures qui portent les claims
Toutes reproductibles par
pytest MyIA.AI.Notebooks/GameTheory/tests/test_amd_synthesis.py.count_candidates == 4096mecanismesINFEASIBLEet0 / 4096admissibles par enumeration1024 / 1280 / 1280 / 1856; « tous les reports »16 / 25 / 25 / 47(profils (0,0), (0,1), (1,0), (1,1)) — les huit valeurs reproduisent celles que16bet16cmesurentpayment_bounds=(-4,1): optimum de revenu inchange (2) ; optimum de bien-etre inchange (4) mais atteint avec un revenu de -32. La borne par defaut (agents paient) n'est donc pas une commodite de modelisation : sans elle l'objectif de bien-etre est degenereValueErrorportant le nombre mesure, pas un budget muetLes 8 comptes de semantique sont le point de contact empirique : ils sont mesures dans les carnets et reproduits par le module, donc les deux contrats de lecture sont implementes tels qu'ils sont mesures, pas tels qu'on les suppose.
Regression
(
mcp-jupyter, Python 3.12, ortools 9.14.6206 ; les 40 tests du module y sont inclus.)Dependance et CI
ortoolsest deja utilise parSearch/Part5-Frontieres, il ne l'etait pas par la serie GameTheory : ajoute arequirements.txtet a la lignepip installdegametheory-tests.yml(sinon la CI collecte 0 test et passe au vert — le pire des deux mondes).A noter pour le merge : la PR touche
.github/, doncmerge_ready.pyne peut pas la merger par l'organe — elle revient au coordinateur.Organ-first — les 5 questions
GameTheoryla possede pour le revenu (16c) et pour l'allocation (16b) ;Search/Part5-Frontierespossede le WDP/VCG OR-Tools ;AMD.leanpossede les theoremes.16b/16csont des cellules de carnet, pas des modules appelables — c'est precisement le manque que l'issue demande de combler. Le solveur, lui, est appele (ortoolsreel, pas une reimplementation).0 / 4096sur l'impossibilite et4096comme taille d'espace ; le CP-SAT rendINFEASIBLEsur la meme instance. Deux organes de nature differente doivent tomber d'accord.verify()recalcule tout depuis les tables et ne partage rien avec le constructeur, qui inline ses expressions lineaires au lieu d'appeler l'utilite du verificateur — l'egalite solveur/enumeration des tests est ce qui prouve l'absence de contamination.Residuel nomme
Le pont Python des preuves Lean (items 6-7 de l'issue) n'est pas livre : ce module synthetise et verifie sur une instance, il n'importe aucun enonce de
AMD.lean. C'est le jalon suivant, pas un oubli — le corps du module le dit dans « Ce que ce module ne prouve pas ».Part of #18706
🤖 Generated with Claude Code