Skip to content

test(dimred): audit visualizer scientific figure contracts (M2.8) - #116

Draft
PhD-Brown wants to merge 8 commits into
mainfrom
audit/43-dimred-visualizer
Draft

PhD-Brown wants to merge 8 commits into
mainfrom
audit/43-dimred-visualizer

Conversation

@PhD-Brown

@PhD-Brown PhD-Brown commented Nov 11, 2026 •

Copy link
Copy Markdown
Owner

Refs #43 — M2.8, troisième passe strictement ciblée après la deuxième revue Claude 5895743573. Corrections livrées pour une vérification indépendante courte sur K10, FD05, R6/R7 et R10 uniquement. PR maintenue Draft ; production inchangée ; M2.8 🟡 ; #43 ouverte ; M2.9 non commencée.

Même branche audit/43-dimred-visualizer, même worktree AstroSpectro-m28, propre ; HEAD local=distant fbe7526, base 39dad87. Aucun chemin protégé modifié ; blob production 624b857bca5833c3401204b0a592b9ae6ffc2902. Matrice · manifeste de troisième passe, politiques et limites.

  • R1/K10 : appartenance STAR conservée et proportion du second mode contrôlée sur les trois mélanges : 90/300 ± 0,10. Justification hypergéométrique fournie ; aucune taille universelle ou obligation d’utiliser tous les STAR. K10 : 3 assertions FAIL / 2 PASS ; K11 : 5 PASS. C13/K4/K5 : 5 PASS chacun. Masses, labels et géométries précédents préservés. Les régions annoncées complètes doivent être fermées et dans le cadre ; politique de travail et limites documentées dans fix: derive latent KDE contour labels from enclosed probability mass #101. La représentativité sur ces fixtures n’est pas une garantie universelle d’absence de biais.
  • R2b/FD05 : colorbars identifiées par leur structure/rôle et leur lien aux données, indépendamment du label ; deux orientations couvertes. Toutes les clés catégorielles présentes doivent correspondre aux couleurs réelles, y compris légendes de figure/additionnelles et annotations. FD05/FD05_H : 2 assertions FAIL chacun ; AD05/AC05/AC05_H/AD05_ANN : 2 PASS chacun. Aucune palette imposée.
  • R6/R7 : suffixes k/M, milliers et décimales françaises, tokens accentués, PC/PCs/CP/composantes. Le contrôle vert exige une relation numérique compte/variance, sans figer « 2 PCs » ou « 92.9% ». FD03_K et FVAR_COMPONENT rejetés ; A_VARIANCE et AD_COMMA : 2 PASS chacun. Valeurs/effectifs/bornes pertinents faux rejetés par assertion, sans erreur de conversion. Limites de locale/grammaire explicitement bornées.
  • R10 — politique de test proposée, à valider scientifiquement : densité conditionnelle d’aire 1 avec exclusions exactes, ou densité sur effectif total d’aire 3/50 = 0,06, avec échelle, support et référence correctement identifiés. A_TOTAL PASS ; F_TOTAL_LIE/F_CONDITIONAL_LIE rejetés par assertions. Les légendes réellement affichées sont contrôlées, pas seulement les labels internes d’artistes. Proposition P2 complète conservée, distincte de fix: retain small positive MSE values in logarithmic histograms #111 ; aucune nouvelle issue créée avant approbation humaine.

Seuls les cinq fils R1/R2b/R6/R7/R10 ont une nouvelle réponse, avec tests, faux candidats, alternatives admises et SHA. Ils restent ouverts. Les observations déjà résolues ne sont pas rouvertes.

Vérification exécutée sur les fichiers de cette passe Résultat
M2.8 pytest -q tests/test_dimred_visualizer.py tests/test_visualizer_review_contracts.py -W error 66 PASS ; 61 anciens nœuds conservés, 5 nouveaux
Pytest complet par défaut / importlib 698 PASS / 62 exclus / 7 warnings Gaia préexistants, chacun
M2.8 inversé, hashseed 7 66 PASS
M01–M16, sites et assertions vérifiés 16 KILLED, baseline 66 PASS
C01–C14 et F01–F03 14 admissibles PASS / 3 faux remèdes KILLED
Revue étendue, 47 expériences 27 incorrects KILLED / 0 SURVIVED / 0 inconclusive, 18 admissibles PASS, plus deux expériences conjointes
JOINT / JOINT_TOTAL 92/92 PASS chacun, 66 verts + 26 preuves, également reconstruits depuis l’archive
Nouvelle archive rouge 25 FAIL / 1 PASS / 0 ERROR/SKIP, 26 cas, pas 25 bugs
Black --check/Ruff (quatre scripts audit inclus), pip check, diff/check et fichiers protégés PASS
Nouvelle CI 43487983468, job 132101414005, journal lu success : 695 PASS / 3 SKIP / 62 exclus / 7 warnings, pip check / Black (43 fichiers) / Ruff PASS

La campagne de revue comprend les 19 candidats incorrects précédents et 8 variantes ciblées de cette passe ; ce n’est pas un nombre de nouveaux bugs. Chaque mauvais candidat a une baseline admissible PASS, les hunks modifiés exécutés, la collecte identique et des assertions pertinentes. Les checkpoints exploratoires sont préservés et séparés du bilan figé.

Nouvelle CI Linux/Python 3.11.18 sur merge de contrôle 80d86a3 = fbe7526 vers 39dad87. Aucune fusion de PR. Windows local/Python 3.11.9 ; versions, HEAD actif et empreintes LF effectivement testées sont dans les journaux. La CI ne lance ni les preuves rouges explicites, ni les mutations, ni le lint audit.

Troisième archive immuable 8e668780b181948856cacb58650b25a0e03eeddf, tag audit/m28-round3-proofs-2026-11-13. Huit fichiers relus sur GitHub et blobs vérifiés avant retrait normal du fichier rouge ; rejeu exact depuis la tête verte. ed1d91e et a8bc850, leurs références et tous les anciens JSON sont préservés. Aucun xfail.

python audit/check_m28_evidence.py --mode baseline --proofs-ref 8e668780b181948856cacb58650b25a0e03eeddf
python audit/check_m28_review.py --proofs-ref 8e668780b181948856cacb58650b25a0e03eeddf --only K10 K11 FD05 FD05_H FD03_K FVAR_COMPONENT A_VARIANCE AD_COMMA A_TOTAL F_TOTAL_LIE F_CONDITIONAL_LIE
python audit/check_m28_review.py --proofs-ref 8e668780b181948856cacb58650b25a0e03eeddf --only JOINT JOINT_TOTAL

Campagne figée · validation verte · rejeu rouge · deux rejeux conjoints · intégrité archive/historique.

Réserves : seuil de représentativité et adaptateurs bornés aux fixtures/formats décrits ; politique R10 proposée en attente de validation finale ; création d’issue R10 toujours soumise à approbation explicite. R13, zéro/négatifs/nonfinis, PDF scientifique, taxonomie et validation astrophysique restent dans leur état précédent. Aucun catalogue/run réel, identité externe sans IDs ou calibration nouvellement validé. #101–#115 restent des corrections de production séparées. Arrêt après passation : vérification courte Claude, puis décision humaine ; sans Ready, merge ou M2.9.

Livraisons précédentes — texte historique intégral avant la troisième passe

Refs #43 — M2.8 après première revue indépendante Claude : corrections des tests et preuves livrées pour seconde revue. PR maintenue Draft, sans fusion. Production inchangée ; M2.8 🟡, #43 ouverte, M2.9 non commencée.

La première revue 5858927009 concluait MODIFICATIONS REQUISES. Les résultats ci-dessous concernent cette nouvelle passe ; la livraison initiale est conservée intégralement plus bas.

Branche audit/43-dimred-visualizer, worktree AstroSpectro-m28 ; HEAD local=distant e924f36, base 39dad87, blob de production 624b857bca5833c3401204b0a592b9ae6ffc2902. Diff limité à tests/audit. Matrice R1–R14 · manifeste révisé et commandes exactes.

  • R1/R2a : KDE STAR bimodale anisotrope sur trois graines et QSO distincts ; dataset ajusté, vrais labels, sommets et masse des polygones tracés contre quadrature indépendante ; contrôle gaussien analytique conservé. Protocole analytique cohérent, K4/K5/C13 admis. Les contrôles complètent aussi le domaine d’affichage : de simples seuils corrects laissaient parfois le contour 99 % coupé.
  • R2b/R3 : légende catégorielle ou colorbar fidèle ; domaine HR indépendant des axes ; tableaux de reconstruction réels ; effectifs et hauteurs d’histogrammes indépendamment recomptés ; PNG comparé à l’export explicite de la même figure scientifique.
  • R4/R5 : classes/effectifs ↔ coordonnées, méthodes ↔ géométries, extrémités ↔ labels et PC ↔ séries. Export sans collections rejeté ; PDF reste limité au fichier/backend.
  • R6–R8 : annotations reformulées toujours reliées aux valeurs ; visibilité ou indication précise des exclusions, avec borne réellement franchie ; vrais sous-ensembles sklearn capturés, appariement/rangs/reproductibilité vérifiés sans imposer choice(42). Quantiles clim et prose française non figés.
  • R9/R11–R14 : 38/38 méthodes inventoriées ; AP limité aux contrats numériques testés, marges HR PA et délimitations/taxonomie astrophysiques NA. Ligne réattribuée D04 corrigée en 8 ; ancrages d’issues corrigés avec notes datées. Métallicité/titres fixes/anomalies restent PA ou politique ouverte. Quatre scripts d’audit lintés localement ; workflow inchangé.
  • R10 : scénario linéaire reproduit : 3/50 QSO conservés, aire 1, 47 exclus. Preuve rouge et proposition P2 en cinq rubriques, distinction avec le plancher log fix: retain small positive MSE values in logarithmic histograms #111 et recherche de doublons documentées. Aucune nouvelle issue créée avant décision humaine.

12/12 fils ont une réponse directe et restent non résolus, à disposition de Claude. Les décisions scientifiques ouvertes ne sont pas transformées en contrats verts.

Vérification réellement exécutée sur les nouveaux fichiers Résultat
M2.8 pytest -q tests/test_dimred_visualizer.py tests/test_visualizer_review_contracts.py -W error 61 PASS, dont les 53 nœuds initiaux conservés
Suite complète par défaut et importlib 693 PASS / 62 exclus / 7 warnings Gaia préexistants, chacune
Suite complète inversée ; M2.8 inversé puis mélangé (3/11/29), hashseed explicite 693 PASS ; 61 PASS ×4, M2.8 avec -W error
M01–M16 16 KILLED / 0 SURVIVED / 0 inconclusive, baseline 61 PASS
C01–C14 et F01–F03 14 remèdes PASS / 3 faux remèdes KILLED, sélections documentées
Campagne de revue : K1B/K6/K7/K8/K9, FD02/09/11/12/13/03/10, N01/02/03/04/05/06/10 19 KILLED / 0 SURVIVED / 0 inconclusive, baselines admissibles PASS, tous les hunks atteints, collecte identique et assertions pertinentes
Alternatives de revue 12 contrôles PASS : KDE, légendes/colorbars, exports, cadrages, noms AE, histogrammes et sous-échantillonnage
Correctifs admissibles appliqués ensemble 87/87 PASS (61 verts + 26 preuves), également rejoués depuis l’archive
Black --check/Ruff, pip check, diff --check et protection des fichiers PASS ; source/notebooks/données/modèles/dépendances/workflows inchangés
Nouvelle CI 43469942967, job 132038888863, journal lu success : 690 PASS / 3 SKIP / 62 exclus / 7 warnings, pip check / Black (43 fichiers) / Ruff PASS

CI Linux/Python 3.11.18 sur merge de contrôle 0717c34 = tête e924f36 vers base 39dad87. Aucune fusion de PR. Windows local/Python 3.11.9 ; versions et empreintes LF dans les journaux. La CI ne lance ni les preuves rouges explicites, ni les mutations, ni le lint des scripts audit.

Nouvelle archive immuable a8bc8506804cf4c89e784e458498d3f229ca81cb, tag audit/m28-review-proofs-2026-11-13, lue sur GitHub et blobs vérifiés avant retrait normal du fichier rouge. 26 cas : 25 FAIL / 1 PASS / 0 ERROR/SKIP, groupes D01–D15 + caractérisation R10, pas 25 bugs. L’ancienne archive ed1d91ec0efb619aeb77a5bf7e4a0ab43fa84cac, sa ref et tous les anciens JSON sont conservés ; son rejeu reste 21 FAIL / 1 PASS. Aucun xfail. Les journaux exploratoires ne sont pas agrégés aux résultats figés.

python audit/check_m28_evidence.py --mode baseline --proofs-ref a8bc8506804cf4c89e784e458498d3f229ca81cb
python audit/check_m28_review.py --proofs-ref a8bc8506804cf4c89e784e458498d3f229ca81cb --only JOINT
python audit/check_m28_review.py --proofs-ref a8bc8506804cf4c89e784e458498d3f229ca81cb --output test-results/m28-review-replay.json

Campagne figée · mutations initiales rejouées · validation de la tête verte · rejeu rouge · rejeu conjoint.

Limites : diagnostics/artistes bornés aux contrats décrits ; pas de validation astrophysique, catalogue/FITS/run réel, calibration, identité externe sans IDs, PDF scientifique certifié, GPU, réseau ou couverture de lignes. N08 n’est pas revendiqué détecté ; N09 historique par exception n’est pas ajouté au bilan des assertions. #101–#115 restent des correctifs séparés, non résolus par cette PR. Suite : seconde revue Claude, puis décision humaine. Arrêt après passation, sans passage Ready ni M2.9.

Livraison initiale — texte historique intégral, avant première revue Claude

Refs #43 — M2.8 : audit scientifique de DimRedVisualizer, tests et preuves uniquement. Première revue indépendante Claude attendue ; conserver Draft et décision humaine de fusion. Aucun travail M2.9.

Le visualiseur peut produire des figures plausibles avec une signification numérique incorrecte. Cette PR ajoute 53 cas verts, l’inventaire des 38 méthodes réelles, des oracles indépendants et une archive de contre-exemples. Aucun changement de production, notebook, donnée, modèle, dépendance ou CI.

Branche audit/43-dimred-visualizer, worktree séparé AstroSpectro-m28, HEAD 4364c61 local=distant ; base 39dad874610745ccd456d26972e90f6fb3a11405 (PR99 fusionnée), blob production 624b857bca5833c3401204b0a592b9ae6ffc2902. Checkout principal et anciens worktrees préservés.

Matrice complète et limites AP/PA/NA/B · manifeste des preuves · index des issues.

Contrats testés Preuves
Identités positionnelles, classes, couleurs, paramètres physiques Coordonnées asymétriques, classes inégales, valeurs uniques, permutations cohérentes et manquants sur lignes différentes
PCA/loadings/reconstruction PCA réellement ajustée, covariance9:4:1, MSE5/9 et1/9 ; signes équivariants ; matrices/annotations numériques
Erreurs AE et familles Moyennes2.5/50/3, dispersion entre features et moyenne globale11 ; AE/PCA distincts, profils F10/G12
HDBSCAN et XGBoost Vrais attributs analyzers/palettes, IDs2/7, bruit/clusterunique, couches prédictions/confiance/populations
Trustworthiness Vrai sklearn contre oracle scalaire de rangs, identité1/permutation, sous-échantillonnage apparié
KDE/HR SciPy réel et gaussienne covariance diag(4,9), masse analytique/quadrature indépendante ; coordonnées/axes/gravité et population
Exports/état Agg réel, PNG ouverts avec Pillow, PDF écrits, priorité chemins/erreur d’écriture ; rcParams/modules restaurés, figures fermées

15 issues correctives #101–#115, après recherche de doublons, sans correctif ici. Risques prioritaires : #101 KDE faussement probabiliste ; #104 réattribution par troncature. Autres : géométrie/effectif HR, colorbar, disponibilité des probabilités, panneaux manquants/vides, annotation PCA, classes/petites MSE omises, output_dir, courbe T(k) masquée et labels Balmer non rendables. KDE était déjà signalée dans M1/#43 ; les nouveaux tickets ne constituent pas une revendication de nouveauté historique pour ce risque. #50/#65/#73–#78/#84–#85/#88–#90/#95/#100 restent distinctes.

Archive fixe ed1d91ec0efb619aeb77a5bf7e4a0ab43fa84cac, ref audit/43-dimred-visualizer-proofs, ancêtre conservé. Poussée/lue sur GitHub avant retrait normal du fichier rouge. Rejeu exact et reconstruction depuis la tête verte : 21 FAIL /1 PASS /0 ERROR/SKIP, 22cas, pas21bugs. Aucun xfail.

python audit/check_m28_evidence.py --mode baseline
python audit/check_m28_evidence.py --mode proofs --proofs-ref ed1d91ec0efb619aeb77a5bf7e4a0ab43fa84cac
python audit/check_m28_evidence.py --mode mutations

Mutations finales : 16KILLED/0SURVIVED, assertions seules, sites exécutés et collecte identique, sélections ciblées documentées. 14 alternatives admissibles PASS, distinctes du dénominateur incorrect. F01 refus permanent et F02 figure vide rejetés. F03 seuils normaux constants survivait au cas presque isotrope : covariance anisotrope ajoutée, rejeu KDE final F03 KILLED / C13 intégration PASS. Les anciens JSON restent inchangés ; aucun ancien résultat présenté comme une nouvelle exécution.

Validation locale réellement exécutée Résultat
python -m pytest -q tests/test_dimred_visualizer.py -W error 53 PASS
Ordre inversé/hashseed7 53 PASS
python -m pytest -q et --import-mode=importlib 685 PASS /62 exclus /7 warnings Gaia préexistants, chacune
Black --check/Ruff, trois scripts inclus ; pip check ; diff/protection production PASS
Sondes de bord/signatures et consommateurs statiques 44 observations /38 méthodes, pas44contrats approuvés
GitHub Actions sur cette tête 42952227591 completed/success ; journal du job 130298946891 lu : Linux/Python 3.11.18, 682 PASS /3 SKIP Windows /62 exclus /7 warnings ; pip check/Black41/Ruff PASS. Merge de contrôle 0e35d66 (tête4364c61 vers base39dad87), aucune fusion de PR.

Validation locale détaillée, Windows/Python3.11.9, NumPy2.4.6, pandas3.1.1, SciPy1.17.1, sklearn1.9.1, Matplotlib3.11.2. HEAD parent des journaux distingué des empreintes LF des fichiers effectivement testés ; commits suivants documentaires.

Limites et revue Claude : identité externe non prouvée sans IDs ; façade optionnelle #21 contournée, M2.9 non auditée. Aucun catalogue/FITS/modèle historique, calibration, validité astrophysique, absence de fuite, refit UMAP/t-SNE/AE, GPU/W&B/réseau, notebook complet ou couverture de lignes certifié. PDF vérifié comme fichier/backend, pas comme publication rendue indépendante. Politiques nonfinis/zéro, clipping, disponibilité/provenance, types de refus et taxonomie demeurent ouvertes. Les adaptateurs de preuve sont bornés aux annotations et diagnostics actuels ; Claude doit les éprouver, ainsi que les oracles, contrôles admissibles et l’archive. CI verte = contrôles configurés.

Arrêt après livraison et passation #43, avant toute correction de revue ou nouvelle mission.

@PhD-Brown PhD-Brown left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

Première revue indépendante Claude — M2.8 DimRedVisualizer (PR #116)

Verdict scientifique : MODIFICATIONS REQUISES. Le compte GitHub étant partagé, la revue est publiée en COMMENTED ; ce statut n'est pas une approbation. PR laissée en Draft, M2.8 🟡, aucune modification de la branche, aucun commit, aucun merge, M2.9 non commencée.

Revue effectuée sur : tête 4364c61f56d91f7ec93c5c6072b9f88c46023241 (= distant) · base 39dad874610745ccd456d26972e90f6fb3a11405 · blob de production 624b857b… identique à la base. Le diff (24 fichiers) se limite à audit/ et tests/ ; il ne touche ni production, ni notebooks, ni données. Clone et worktrees détachés isolés (4364c61, ed1d91e) ; toutes les mutations ont été appliquées dans des copies jetables.

Ce qui est solide (démontré par réexécution)

  • Oracles mathématiques :
    • KDE analytique : dblquad, Monte-Carlo 2·10⁶ et χ²₂ concordent (1 − 12πt). La production étiquette « 68 % » un contour qui enferme 95,3 % de la masse, « 95 % » un contour à 99,4 % et « 99 % » un contour à 99,8 %. #101 P1 confirmé.
    • Sommet HR à −93,3175 dex pour un axe couvrant 0,4066–4,9909 (#102) ; moyennes D04 1140/13 et 1060/12 (#104).
    • PCA 9:4:1, MSE 5/9 et 1/9, bande à ddof=0 du producteur ; familles 2,5 et 50/3 avec écarts-types entre features (ddof=1), moyenne globale 11 ; moyennes F10/G12 ; oracle de rangs identique à la définition de sklearn.
  • Archive ed1d91e : commit présent sur la ref distante et ancêtre de la tête ; production et tests identiques à la tête. Rejouée de trois façons (script --mode baseline, checkout direct, et mode proofs) : 21 FAIL / 1 PASS / 0 ERROR. Elle n'est pas collectée par la suite normale (0 item). sha256 LF du fichier de preuve : 05beb617…, identique aux journaux. JSON historiques non réécrits.
  • Campagne de Codex reproduite : M01–M16 16/16 KILLED ; C01–C14 14 PASS ; F01, F02 et F03 KILLED ; fichiers protégés inchangés. Mutants indépendants également tués : N10 (sous-échantillon non apparié) et N09 (refus d'IDs non consécutifs, détecté par exception).
  • Satisfiabilité conjointe : les 14 contrôles de Codex, plus mes remèdes pour les groupes sans contrôle positif (D05 colorbar ListedColormap/BoundaryNorm, D06 has_proba = confidence is not None, D08[4] masquage des panneaux, D10 masse du modèle complet, D12 palette cyclique, D13 self._save), appliqués ensemble, donnent 75/75 PASS sur la suite verte et les preuves complètes. Les contrats rouges ne sont donc ni contradictoires ni insatisfaisables.

Vérifications réellement exécutées

Linux, Python 3.11.18, venv requirements/ci.txt ; NumPy 2.4.6, SciPy 1.17.1, scikit-learn 1.9.1, Matplotlib 3.11.2, pandas 3.1.1 ; MPLBACKEND=Agg.

Commande Résultat
pytest -q tests/test_dimred_visualizer.py -W error 53 PASS
Même suite en ordre inversé (PYTHONHASHSEED=7) puis 3 mélanges aléatoires (graines 3, 11, 29), -W error 53 PASS ×4
pytest -q / --import-mode=importlib / suite complète inversée / mélangée 682 PASS / 3 SKIP (jonction Windows) / 62 exclus / 7 warnings, à chaque fois
black --check et ruff check sur src tests scripts app.py + les trois scripts audit/check_m28_* PASS (44 fichiers ; la CI n'en couvre que 41)
pip check ; git diff --check 39dad87 4364c61 PASS
check_m28_evidence.py --mode baseline / --mode proofs --proofs-ref ed1d91e / --mode mutations 21/1 ; 14 PASS et 3 KILLED ; 16 KILLED
Journal CI 42952227591, job 130298946891 (lu) 0e35d66 = 4364c61 fusionné dans 39dad87 ; 682/3/62 ; Black (41 fichiers) et Ruff PASS

Observations

ID Sévérité Emplacement Résumé
R1 Bloquant M28_PROOFS.md:18 La preuve KDE accepte K6 (labels inversés), K8 (contours transposés), K7 (KDE ajustée sur toutes les classes) et K1B (seuils gaussiens calés sur le pic ; accepté par la variante analytique, et par la variante réelle sur 11/60 graines)
R2a Bloquant M28_DIMRED_VISUALIZER.md:39 Le stub analytique rejette des remèdes KDE corrects (K4 resample, K5 grille élargie) par AttributeError
R2b Bloquant M28_PROOFS.md:22 D05 rejette une légende catégorielle exacte
R3 Bloquant M28_PROOFS.md:19 Faux correctifs acceptés pour D02 (axe élargi, contrôle circulaire), D09 (ligne vide), D11 (données toujours filtrées), D12 (entrée de légende sans histogramme), D13 (export vierge)
R4 Bloquant test_dimred_visualizer.py:476 5 mutants de légende survivent (XGBoost, classes HDBSCAN, lignes de synthèse, extrémités A/B, PC1/PC2)
R5 Important test_dimred_visualizer.py:615 Un export sans les artistes de données passe
R6 Important M28_PROOFS.md:73 Adaptateurs grammaticaux : FD03 et FD10 acceptés (limite déclarée)
R7 Important M28_PROOFS.md:31 « Without indication » contredit la preuve (AD14 rejeté)
R8 Important test_dimred_visualizer.py:528 Le test recopie le RNG de production ; libellés et clim figés
R9 Important M28_DIMRED_VISUALIZER.md:94 plot_hr_teff_regions absent de la matrice ; géométrie T_eff des régions non testée (N08)
R10 Important M28_DIMRED_VISUALIZER.md:93 Défaut candidat non répertorié : troncature à 1,5·P99_STAR puis renormalisation (3/50 QSO → aire 1)
R11 Suggestion M28_PROOFS.md:21 Commentaire D04 : c'est la ligne 8, pas la 5
R12 Suggestion issues Ancrages de lignes approximatifs : #104 L2579 pointe la palette (troncature L2588-2600) ; #103 L3212 (titre L3215) ; #105 L1431 (colorbar L1415-1424) ; #110 L184 (annotation L186-193) ; #111 L2825 ; #114 L2278 (ylim L2279)
R13 Suggestion / politique ouverte matrice mh_gspphot affiché « [Fe/H] » en 6 endroits. La documentation DPAC (GSP-Phot) parle de métallicité globale [M/H] non calibrée, et la page ESA de calibration exige un modèle pour passer à [Fe/H] ; le datamodel de l'archive dit « iron abundance ». Convention discutable, à trancher avec #65. Également : titre « 3 premières composantes » affiché avec n_components=1 ; « 183 features », min_size=300 et « anomalies » (#78) codés en dur ; tout cela reste PA ou politique ouverte
R14 Suggestion audit La CI ne vérifie ni Black ni Ruff sur audit/*.py (localement : PASS) ; les ledgers contiennent des chemins Windows absolus

Remarque sur la tolérance KDE (0,006) : elle est justifiée par la quadrature. Elle rejette à juste titre K3 (HPD renormalisée sur la grille affichée tronquée : 0,935 au lieu de 0,95). Elle rejette aussi K2, la « fraction d'étoiles » (0,907 au lieu de 0,95), qui estime une autre quantité : la couverture empirique et non la masse de la KDE. Ce choix de contrat doit être écrit dans #101, car il exclut délibérément la définition « contient p % des étoiles ».

Issues #101–#115

Toutes ont été lues. Mécanismes reproduits par l'archive ; aucun doublon trouvé parmi les issues #1–#100 (titres et recherche ciblée). Priorités cohérentes : P1 pour #101 (probabilité trompeuse) et #104 (réattribution silencieuse), P2 pour les autres. Aucune requalification de sévérité. Corrections documentaires : R11 (#104) et R12 (ancrages). #106 est bien distincte de #90 (consommateur et producteur) et #110 de #59. R10 constitue une découverte candidate hors index, documentée ici mais sans issue créée.

Reste à faire (Codex, même PR)

  1. R1 et R2a : refondre D01. Population non gaussienne avec lignes non-STAR, labels lus, géométrie des iso-lignes, dataset ⊂ STAR, stub d'interface complète ; ajouter K1B, K6, K7 et K8 aux faux correctifs, et K4 et K5 aux contrôles admissibles.
  2. R2b, R3 et R4 : renforcer les adaptateurs D02, D05, D09, D11, D12 et D13 et les assertions de légende ; ajouter mes faux correctifs (FD02, FD09, FD11, FD12, FD13, N01, N02, N04, N05, N06) et AD05 aux campagnes.
  3. Nouvelle archive rouge identifiée par son SHA, en conservant ed1d91e dans l'ascendance ; R5–R10 traités ou explicitement reportés ; matrice corrigée (R9).
  4. Seconde revue Claude limitée à ces fils, puis décision humaine.
Contre-oracle KDE indépendant (copie jetable : `tests/test_review_kde.py`, fixture `visualizer_case`)

Résultats : C13, K4 et K5 PASS ; K1B, K6, K7 et K8 FAIL par assertion.

"""Reviewer counter-oracle (disposable): non-Gaussian STAR mixture + off-mode QSO.

Checks, for the plotted contours: (a) each label's region encloses the labelled
mass of the *fitted* estimator (broad quadrature), (b) contour vertices lie on
the iso-density of that estimator (geometry), (c) the estimator was fitted on
STAR rows only (population), using only public SciPy/Matplotlib interfaces.
"""
import numpy as np
import pandas as pd
import pytest


def mixture():
    rng = np.random.default_rng(31)
    a = rng.normal(size=(210, 2)) * [1.0, 2.0]
    b = rng.normal(size=(90, 2)) * [1.4, 0.7] + [6.0, 3.0]
    q = rng.normal(size=(40, 2)) * 0.3 + [6.0, -4.0]
    Z = np.vstack([a, b, q])
    y = np.array(["STAR"] * 300 + ["QSO"] * 40)
    return Z, y, pd.DataFrame({"teff_gspphot": np.linspace(3500, 9000, 340)})


def test_kde_mixture_labels_geometry_population(visualizer_case, monkeypatch):
    import scipy.stats
    from matplotlib.axes import Axes

    c = visualizer_case
    Z, y, meta = mixture()
    fitted, contours, labels = [], [], []
    real = scipy.stats.gaussian_kde
    orig_contour, orig_clabel = Axes.contour, Axes.clabel

    def fit(data, **kw):
        est = real(data, **kw)
        fitted.append(est)
        return est

    def contour(ax, *a, **kw):
        cs = orig_contour(ax, *a, **kw)
        contours.append(cs)
        return cs

    def clabel(ax, cs, *a, **kw):
        labels.append((cs, kw.get("fmt", a[0] if a else None)))
        return orig_clabel(ax, cs, *a, **kw)

    monkeypatch.setattr(scipy.stats, "gaussian_kde", fit)
    monkeypatch.setattr(Axes, "contour", contour)
    monkeypatch.setattr(Axes, "clabel", clabel)
    c.viz.plot_latent_kde(Z, y, meta)
    est = fitted[0]
    # (c) population: the estimator sample is the STAR population (any subset of it).
    stars = {tuple(r) for r in Z[y == "STAR"]}
    assert all(tuple(p) in stars for p in est.dataset.T), "KDE fitted on non-STAR rows"
    # (a) labelled mass of the fitted estimator on a broad independent domain.
    gx, gy = np.meshgrid(np.linspace(-12, 18, 601), np.linspace(-14, 14, 561))
    dens = est(np.vstack([gx.ravel(), gy.ravel()]))
    cell = (30 / 600) * (28 / 560)
    assert abs(dens.sum() * cell - 1) < 1e-3
    cs, fmt = labels[0]
    for level in cs.levels:
        text = fmt[level] if isinstance(fmt, dict) else fmt(level)
        claimed = float(text.strip().rstrip("%")) / 100
        assert abs(dens[dens >= level].sum() * cell - claimed) < 0.006, (text, level)
    # (b) geometry: plotted iso-lines are iso-density lines of the estimator.
    for level, segs in zip(cs.levels, cs.allsegs):
        pts = np.vstack([s for s in segs if len(s)])
        assert np.allclose(est(pts.T), level, rtol=0.05), "contour not on iso-density"
Éditions exactes des faux correctifs et des mutants (copies jetables de la production `624b857`)
  • K1B : remplacer le bloc zz_flat … levels = [] par peak = float(ZZ.max()); levels = sorted((1 - p) * peak for p in [0.99, 0.95, 0.68])
  • K4 : draws = kde.resample(200000, seed=np.random.default_rng(7)); dens = kde(draws); levels = sorted(np.quantile(dens, 1 - p) for p in (.99, .95, .68))
  • K5 : grille 500×500 sur [min − 4σ_KDE, max + 4σ_KDE], avec σ_KDE = sqrt(diag(kde.covariance)), puis HPD cumulée
  • K6 : sur base C13, zip(levels, ["68%", "95%", "99%"][-n_lv:])
  • K7 : sur base C13, kde = gaussian_kde(Z_ae.T, bw_method="scott")
  • K8 : sur base C13, ax.contour(XX, YY, ZZ.T, …)
  • FD02 : _ys = [v[1] for r in REGIONS for v in r["poly"]], puis ax.set_ylim(max(G_HI + G_PAD * 5, max(_ys)), min(G_LO - G_PAD * 5, min(_ys)))
  • FD09 : for ax in list(axes)[len(idx):]: ax.plot([], [])
  • FD11 : np.log10(vals.min()) comme premier bord, et ax.hist(vals[vals >= 1e-4] if xscale == "log" else vals, …)
  • FD12 : for cls in classes[len(palette):]: ax.plot([], [], label=f"{cls} (n=…)")
  • FD13 : dans plot_training_history, plt.figure().savefig(self.output_dir / "ae_training_history.png")
  • FD03 : « 43 019 étoiles » remplacé par « N = 43 019 »
  • FD10 : f"→ {cumvar[idx]*100:.1f}% avec {n_thresh} PCs"
  • AD14 : texte « T(k) < 0.75 hors champ » ajouté, ylim conservé
  • AD05 : légende de Patch au lieu de la colorbar, annotations vidées
  • N01/N02 : noms de classe décalés d'un rang dans les labels, effectifs conservés
  • N03 : pickle du clone de figure, retrait des collections, savefig du clone
  • N04 : METHODS[-1 - row][0] dans l'ylabel
  • N05 : label_a et label_b permutés
  • N06 : label="PC1" et label="PC2" permutés
  • N08 : sur base C05, sommets T_HI − T_PAD de « Types A/B » remplacés par T_LO + T_PAD
  • A_TRUST : idx = np.sort(rng.permutation(len(X_ref))[:n])

Critère KILLED/SURVIVED : marqueur d'exécution placé sur l'instruction modifiée ou sur l'instruction englobante, collection identique, échecs par assertion uniquement.

Limites de cette revue : aucune validation astrophysique, aucun catalogue ou run réel, aucun rendu PDF certifié, aucun environnement Windows (les 3 SKIP sont propres à Windows). Les mutants survivants signalent des contrats non testés, pas des bugs de production. R10 est une découverte candidate et non un bug établi au sens de #43.


Generated by Claude Code

Comment thread audit/M28_PROOFS.md

| ID | Red test selection / failed cases | Independent invariant and admitted outcomes |
|---|---|---|
| D01 | `kde_labeled_regions` /2 | Real SciPy and analytic Gaussian covariance diag(4,9). Independent expanded-grid quadrature and analytic `max(0,1-12*pi*t)`; density-height percentiles do not specify enclosed probability. Integrated thresholds accepted. M1 already noted this risk; no separate corrective issue existed. |

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

R1 — Bloquant — D01 (ed1d91e:tests/proofs_dimred_visualizer.py:46-122) : la preuve KDE accepte de faux correctifs

  • Contrat : chaque contour étiqueté p % enferme la masse p de la KDE ajustée sur la population STAR, à l'endroit où il est tracé.
  • Preuve (copies jetables, base = C13 de Codex, sites atteints, collection identique). Passent kde_labeled_regions[real_scipy], [analytic_normal] et real_kde_reproducible :
    • K6 : niveaux C13 avec labels inversés (["68%", "95%", "99%"]) → 3/3 PASS. Les labels ne sont jamais lus.
    • K8 : ax.contour(XX, YY, ZZ.T, …) → 3/3 PASS. Les niveaux sont justes mais la géométrie est fausse ; la quadrature sur la grille tracée est invariante par transposition.
    • K7 : gaussian_kde(Z_ae.T), toutes classes confondues → 3/3 PASS. La fixture ne contient que des STAR et l'oracle intègre l'estimateur produit lui-même (fitted[0]).
    • K1B : levels = (1-p)·max(ZZ), exact pour toute gaussienne et faux sinon → analytic_normal PASS. real_scipy échoue (0,6667 contre 0,68), mais seulement à cause de l'échantillon : K1B passe sur 11/60 autres graines de la même fixture. diag(4,9) a éliminé F03 sans fermer la classe des « seuils valides seulement pour la famille gaussienne ».
  • Risque : la preuve qui validera le correctif P1 fix: derive latent KDE contour labels from enclosed probability mass #101 peut accepter une figure fausse.
  • Correction attendue dans les tests :
    1. population STAR non gaussienne (mélange bimodal anisotrope) et lignes non-STAR hors mode ;
    2. lecture du label affiché pour chaque niveau, comparé à la masse intégrée ;
    3. densité de l'estimateur aux sommets de cs.allsegs[i] ≈ cs.levels[i] ;
    4. est.dataset ⊂ lignes STAR ;
    5. ajout de K1B, K6, K7 et K8 aux faux correctifs de check_m28_evidence.py.
  • Alternatives admissibles : mon contre-oracle (code dans la synthèse) accepte C13, K4 (kde.resample, Monte-Carlo) et K5 (grille élargie de 4 σ_KDE). Il rejette K1B (écart de masse 0,065, contre une tolérance de 0,006), K6, K7 et K8.

Generated by Claude Code

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

R1 — corrigé dans les preuves, production inchangée. D01 ajoute trois mélanges STAR bimodaux anisotropes (graines 31/7/83) et des QSO hors modes. L’oracle vérifie les observations réellement fournies à l’estimateur, les labels réels, les sommets d’isodensité et la masse des polygones tracés, séparément de la masse au-dessus du seuil. La quadrature indépendante inclut les queues ; le contrôle gaussien analytique est conservé. Tolérance de masse 0,006 et contrôle de masse totale à 1e-4 explicités.

Rejeu sur entrées figées : K1B : 4 FAIL/1 PASS ; K6 : 5 FAIL ; K7 : 3 FAIL/2 PASS ; K8 : 5 FAIL, tous par assertions pertinentes, avec baseline admissible PASS, sites atteints et collecte identique. K9, retrait d’un mode entier, est également rejeté (5 assertions). C13/K4/K5 : 5 PASS chacun, avec domaine d’affichage complété afin de fermer les contours à 99 %. Ces observations dépassent les seuls quatre mutants connus.

Commit livré : e924f36f24412a435f5ca54a95cdfad914835ff2 ; archive révisée a8bc8506804cf4c89e784e458498d3f229ca81cb, ancienne ed1d91e conservée. Campagne et assertions · manifeste/rejeu/limites. Fil laissé ouvert pour la seconde revue indépendante.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

Deuxième revue (e924f36, archive a8bc850) — PARTIELLEMENT RÉSOLU, reste un point bloquant : K10

Ce qui est vérifié indépendamment (mon harnais, mes propres éditions, marqueur d'exécution, collection identique) :

  • K1B : 4 FAIL / 1 PASS. Les cas gaussien et mélanges échouent ; seul le cas analytique, gaussien par construction, passe.
  • K6 : 5 FAIL. K7 : 3 FAIL sur les mélanges (« KDE fitted on non-STAR observations ») ; les cas gaussiens ne contiennent que des STAR, donc rien à détecter. K8 : 5 FAIL (polygones et sommets). K9 : 5 FAIL (campagne Codex rejouée).
  • C13, K4 et K5, avec domaine d'affichage complété : 6/6 PASS. Sous-échantillon aléatoire de la moitié des STAR (K11, admissible) : 6/6 PASS.

Tolérances mesurées (graines 31, 7, 83, plus 5 et 11 inédites) :

  • Écart de quadrature entre les pas 0,05 et 0,02 : ≤ 3,2·10⁻⁴, pour une tolérance de 0,006.
  • Masse C13 : à ≤ 1·10⁻³ de l'étiquette ; masse totale = 1,000000.
  • Écart relatif aux sommets : ≤ 1,6 %, pour une tolérance de 5 %.
  • K1B : écarts de 0,017 à 0,080, donc rejet structurel.

Les seuils sont justifiés par la discrétisation et ne sont pas calés sur les candidats connus.

Contre-exemple bloquant K10 : sur la base C13 + domaine complété (kde_levels de Codex), une seule ligne change, L2424 :

kde = gaussian_kde(Z_stars[idx][Z_stars[idx][:, 0] < 3].T, bw_method="scott")

Résultat : mixture31 PASS, mixture7 PASS, gaussian et analytic_normal PASS. Seul mixture83 échoue, et uniquement par la tolérance des sommets (10/337). C'est un effet incident, pas le contrôle de population. La KDE ignore pourtant tout le second mode stellaire (90/300 STAR) : les contours étiquetés 68/95/99 % ne décrivent plus la population STAR affichée. La cause : le contrôle vérifie seulement l'appartenance dataset ⊂ STAR. C'est moi qui avais proposé ce critère, et il est insuffisant.

Correction attendue : un contrôle de représentativité qui n'interdise pas le sous-échantillonnage aléatoire. Par exemple, pour les mélanges, la fraction de estimator.dataset (ou de la masse de l'estimateur) en x > 3 doit valoir 90/300 ± 0,10, soit σ ≈ 0,04 pour n ≥ 100. K10 donne 0 et K11 ≈ 0,3. Ajouter K10 comme faux candidat et K11 comme contrôle admissible.

Politique ouverte (non bloquante) : la preuve exige désormais des contours à 99 % complets dans le cadre affiché. C13, K4 et K5 sur la fenêtre de production (marge 0,15) échouent 5/5 sur la masse des polygones. C'est défendable, mais c'est une nouvelle exigence d'affichage que le responsable scientifique doit entériner dans #101. Sinon, restreindre l'oracle des polygones à la fenêtre affichée.

Suggestion : les labels ne sont lus que via clabel. Une légende de contours (proxies distinguant couleur, épaisseur et tirets, comme la production) est rejetée avec « needs labelled contours ». Par ailleurs, sorted(claims) == [.68, .95, .99] fige l'ensemble de niveaux promis par le titre ; c'est acceptable à condition de le documenter.


Generated by Claude Code

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

Troisième passe ciblée après revue 5895743573 — K10 rejeté sur la population. D01 conserve appartenance STAR, masses, labels, polygones et sommets ; il ajoute sur les trois mélanges la proportion ajustée en x>3 : 90/300 ± 0,10. Pour le contrôle aléatoire n=150/N=300, l’écart-type hypergéométrique est environ 0,0265 ; l’enveloppe vaut environ 3,8 écarts-types et tolère le petit chevauchement synthétique. Aucune taille particulière ni utilisation de toutes les étoiles n’est imposée. Ce contrôle borné ne garantit pas universellement l’absence de biais.

K10 : 3 assertions FAIL / 2 PASS, avec fraction réelle 0 contre 0,30, avant la vérification d’interpolation. K11 : 5 PASS ; C13/K4/K5 : 5 PASS chacun. Les anciens faux correctifs restent rejetés. Baselines admissibles PASS, sites atteints, mêmes collections.

La politique de régions complètes demandée pour cette passe est explicitée dans #101 et le manifeste : chemins fermés et intégralement dans le cadre affiché, sans assimiler une portion visible à la région complète. Les limites de l’adaptateur et de la représentativité restent déclarées.

Tête livrée fbe7526cb47680d42726482c398c9fa7c892449c ; archive immuable 8e668780b181948856cacb58650b25a0e03eeddf, deux archives antérieures conservées. Contrats/limites/rejeu · campagne figée. Fil laissé ouvert pour la vérification courte de Claude.

repeatable; this cannot establish the external identity of supplied observations.
[Primary definition and domain](https://scikit-learn.org/stable/modules/generated/sklearn.manifold.trustworthiness.html).

KDE uses actual SciPy plus a separately injected analytic Gaussian with known

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

R2a — Bloquant : le stub analytique rejette des remèdes KDE légitimes

StandardNormal n'implémente que __call__. Deux correctifs mathématiquement corrects passent real_scipy et mon contre-oracle non gaussien, mais échouent analytic_normal pour une raison non scientifique :

  • K4 (seuils par rééchantillonnage de la KDE, 2·10⁵ tirages) : AttributeError: 'StandardNormal' object has no attribute 'resample'.
  • K5 (grille élargie par la bande passante) : AttributeError: … 'covariance'.

Correction attendue : un stub qui expose l'interface gaussian_kde réellement utilisable par un correctif (dataset, d, n, covariance, factor, resample, evaluate/__call__) et qui est cohérent avec la loi exacte N(0, diag(4,9)) ; resample tire dans cette loi. À défaut, documenter l'interface imposée au futur correctif de #101. L'oracle analytique lui-même est exact : je l'ai vérifié par dblquad (normalisation 1 − 6·10⁻¹⁵), Monte-Carlo sur 2·10⁶ tirages et χ²₂ (1 − 12πt). Le seuil au-dessus du pic donne bien une masse nulle.


Generated by Claude Code

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

R2a — protocole analytique renforcé. AnalyticGaussian expose dataset/d/n/covariance/factor/inv_cov/weights/neff, evaluate/call/pdf et resample. Évaluation et tirages représentent la même loi N(0,diag(4,9)) ; un contrôle vert vérifie densités et moments simulés. Le dataset reste la provenance des observations fournies, sans prétendre reproduire toute l’implémentation interne de scipy.

K4 (rééchantillonnage) et K5 (grille avec 4 écarts-types de noyau) donnent chacun 5 PASS ; C13 aussi. Aucun AttributeError n’est compté. La géométrie a révélé un point supplémentaire : corriger seulement les seuils peut laisser des arcs à 99 % coupés par le domaine d’origine. Les contrôles actuels complètent donc aussi ce domaine ; les échecs exploratoires restent consignés et ne sont pas présentés comme des fautes de leurs algorithmes probabilistes.

Commit livré : e924f36f24412a435f5ca54a95cdfad914835ff2 ; archive révisée a8bc8506804cf4c89e784e458498d3f229ca81cb, ancienne ed1d91e conservée. Campagne et assertions · manifeste/rejeu/limites. Fil laissé ouvert pour la seconde revue indépendante.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

Deuxième revue — RÉSOLU.

AnalyticGaussian vérifié indépendamment :

  • evaluate normalisée (dblquad : 1 − 6·10⁻¹⁵) ;
  • resample : covariance empirique diag(3,985 ; 8,986) et moyenne ≈ 0 sur 4·10⁵ tirages ;
  • masse Monte-Carlo de 0,682 au seuil analytique de 68 %.

L'interface dataset/d/n/covariance/factor/inv_cov/evaluate/pdf/resample est cohérente. K4 (rééchantillonnage) et K5 (grille élargie par σ) : 6/6 PASS dans mes rejeux, sans aucune AttributeError.

Remarque documentée et sans conséquence : covariance décrit ici la loi exacte et non la covariance de noyau de SciPy, ce qui rend K5 plus conservateur.


Generated by Claude Code

Comment thread audit/M28_PROOFS.md
| D02 | `hr_region_vertices` /1 | All gravity coordinates must lie in gravity-domain bounds. Current mixed K/dex margin yields−93.3175dex for supplied ordinary data. Nonempty informative regions required; corrected gravity margin admitted. |
| D03 | `hr_population_title` /2 | Displayed count must be supplied population count6/9 or omitted. Hardcoded43019 is neither. Omission admitted; stellar-region taxonomy is not validated. |
| D04 | `reconstruction_cardinality` /1 | Deleted middle observation: actual F mean1140/13, plotted1060/12. Incompatible lengths must not reassign labels by truncation. Pertinent ValueError/RuntimeError refusal or true correspondence admitted; valid aligned F10/G12 still must work. No external equal-size IDs inferred. |
| D05 | `cluster_colorbar` /2 | Nonconsecutive2/7 labels and actual analyzer palette. Displayed colorbar mapping at each CID must match the point RGB; an informative categorical annotation can replace a colorbar. No fixed aesthetic palette imposed. |

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

R2b — Bloquant : D05 rejette une légende catégorielle exacte

Remède testé : suppression de la colorbar et de l'annotation, remplacées par ax.legend(handles=[Patch(color=color_map[c], label=f"C{c}") …], title="Cluster ID"). Les couleurs sont exactement celles des points. Résultat : cluster_colorbar[plot_hdbscan_clusters] FAIL avec « Cluster identity must remain interpretable », alors que la suite verte HDBSCAN reste à 3/3. L'adaptateur n'accepte qu'une colorbar libellée Cluster ID ou un texte C{cid} avec bbox.

Correction attendue : accepter aussi les handles de légende (couleur de face = RGB des points du cluster, label C{cid}). Aucune palette ni forme de légende ne doit être imposée.

Satisfiabilité : une colorbar ListedColormap + BoundaryNorm construite sur les IDs réels passe les deux cas D05.


Generated by Claude Code

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

R2b — légende catégorielle admise. D05 suit ID réel → coordonnées/couleur de la collection → représentation de l’ID. Il accepte une colorbar discrète fidèle, des handles Patch/Line ou des annotations colorées pertinentes ; aucune palette esthétique n’est imposée. Une colorbar fausse ne peut être excusée par une annotation correcte ailleurs.

AD05 : 2 PASS, légendes Patch sur clusters et HR ; AC05 : 2 PASS, colorbars discrètes. Un contrôle vert avec couleurs de handles permutées est rejeté par l’oracle. La production conserve ses deux FAIL D05 ; le correctif conjoint passe les deux contrats.

Commit livré : e924f36f24412a435f5ca54a95cdfad914835ff2 ; archive révisée a8bc8506804cf4c89e784e458498d3f229ca81cb, ancienne ed1d91e conservée. Campagne et assertions · manifeste/rejeu/limites. Fil laissé ouvert pour la seconde revue indépendante.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

Deuxième revue — PARTIELLEMENT RÉSOLU, reste un point bloquant : FD05

Vérifié : AD05 (légende Patch) et AC05 (ListedColormap + BoundaryNorm) passent 2/2 ; la permutation des couleurs de handles est rejetée (contrôle vert) ; aucune palette n'est imposée.

Contre-exemple FD05 : production inchangée, sauf L1421 label="Groupe HDBSCAN" au lieu de "Cluster ID". Résultat : cluster_colorbar_matches_actual_cluster_rgb[plot_hdbscan_clusters] PASS. La colorbar turbo normalisée sur 0…n−1 attribue pourtant aux IDs 2 et 7 des couleurs différentes de celles des points ; c'est exactement ce que la preuve rejette avec le label d'origine (« Misleading colorbar »). Ici, les annotations C2/C7 fidèles excusent une colorbar contradictoire, cas que le contrat révisé dit exclure. La cause est que assert_cluster_encoding ne retient une colorbar comme catégorielle que si son ylabel correspond à cluster|\bid\b. Une colorbar renommée, ou horizontale (label en x), est ignorée. Le cas plot_hdbscan_hr échoue, mais pour une autre raison.

Correction attendue : identifier les colorbars catégorielles sans passer par leur texte. Toute colorbar du panneau dont le mappable n'est pas la collection colorée par une grandeur physique (ScalarMappable sans données, ou norme couvrant les IDs) doit être fidèle, et il faut lire xlabel comme ylabel. Ajouter FD05 aux faux correctifs. AD05 et AC05 doivent rester PASS.


Generated by Claude Code

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

Troisième passe ciblée — rôle structurel et contradictions vérifiés. Les objets Colorbar sont lus directement, indépendamment de leur caption ou orientation. Une barre physique est liée à une collection réelle portant les données ; les ScalarMappables catégoriels sont comparés aux couleurs effectives des clusters. Toutes les représentations présentes sont vérifiées, y compris légendes de figure/additionnelles et annotations : une clé correcte ne compense pas une autre clé fausse.

FD05 et FD05_H : chacun 2 assertions FAIL. AD05/AC05/AC05_H/AD05_ANN : chacun 2 PASS. Le contrôle d’annotations seules fournit réellement les annotations sur la petite fixture HR (copie synthétique uniquement). Les contrôles verts rejettent aussi une légende de figure contradictoire malgré une colorbar/légende d’axe correcte. Palette et formulation esthétique libres ; production inchangée.

Tête livrée fbe7526cb47680d42726482c398c9fa7c892449c ; archive immuable 8e668780b181948856cacb58650b25a0e03eeddf, deux archives antérieures conservées. Contrats/limites/rejeu · campagne figée. Fil laissé ouvert pour la vérification courte de Claude.

Comment thread audit/M28_PROOFS.md
| ID | Red test selection / failed cases | Independent invariant and admitted outcomes |
|---|---|---|
| D01 | `kde_labeled_regions` /2 | Real SciPy and analytic Gaussian covariance diag(4,9). Independent expanded-grid quadrature and analytic `max(0,1-12*pi*t)`; density-height percentiles do not specify enclosed probability. Integrated thresholds accepted. M1 already noted this risk; no separate corrective issue existed. |
| D02 | `hr_region_vertices` /1 | All gravity coordinates must lie in gravity-domain bounds. Current mixed K/dex margin yields−93.3175dex for supplied ordinary data. Nonempty informative regions required; corrected gravity margin admitted. |

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

R3 — Bloquant : des preuves P2 sont satisfaites par de faux correctifs non grammaticaux

Groupe Faux correctif (copie jetable, site atteint) Résultat Cause
D02 (ici) set_ylim élargi jusqu'aux sommets (l'axe affiche jusqu'à −93 dex) hr_region_vertices PASS Le domaine vient de ax.get_ylim(), fixé par le code testé : contrôle circulaire
D09 (l. 26) ax.plot([], []) sur les panneaux inutilisés 4/4 PASS ax.lines non vide ≠ données
D11 (l. 28) Premier bord à vals.min(), mais histogramme de vals[vals >= 1e-4] PASS (et suite verte) Seul le bord est contrôlé, pas les effectifs
D12 (l. 29) ax.plot([], [], label="E (n=2)"), sans histogramme pour E PASS (et suite verte) Seules les étiquettes de légende sont lues
D13 (l. 30) plt.figure().savefig(output_dir / …) (figure vierge) PASS (cas training) Seule l'existence du fichier est vérifiée

Correction attendue :

  • D02 : domaine physique indépendant de l'axe (log g fini des données ± marge en dex, ou bornes justifiées) ;
  • D09 : chaque panneau visible porte des lignes non vides, et leur nombre égale le nombre de lignes réelles ;
  • D11 : chaque MSE positive est comptée (somme des effectifs des barres = n) ;
  • D12 : un conteneur par classe, contenant n_classe observations ;
  • D13 : le PNG par défaut est identique (pixels) à un export explicite de la même figure.

Alternatives admissibles : C05, C07 et C12 passent toujours. Mes remèdes D12 (zip(classes, palette * k)) et D13 (self._save) aussi : avec les 14 contrôles de Codex, la satisfiabilité conjointe est de 75/75 (voir la synthèse).


Generated by Claude Code

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

R3 — les cinq faux correctifs sont rejetés par assertions. D02 utilise une enveloppe indépendante tirée des entrées K/dex, et non les limites choisies par la figure. D09 exige des tableaux originaux/reconstruits non vides, les bonnes observations et deux panneaux de mesure visibles. D11 recompte indépendamment chaque observation positive dans chaque bin et vérifie les hauteurs effectives. D12 exige une vraie distribution et ses effectifs pour chaque classe. D13 compare le PNG au rendu explicite de la figure scientifique retournée.

FD02/FD09/FD11/FD12/FD13 : chacun 1 FAIL pertinent, sites atteints, baselines admissibles PASS et mêmes collections. Les remèdes C05/C07/C12, la palette cyclique et les exports corrects restent satisfaisables : 87/87 PASS en application conjointe. Affichage partiel précisément signalé admis selon R7.

Commit livré : e924f36f24412a435f5ca54a95cdfad914835ff2 ; archive révisée a8bc8506804cf4c89e784e458498d3f229ca81cb, ancienne ed1d91e conservée. Campagne et assertions · manifeste/rejeu/limites. Fil laissé ouvert pour la seconde revue indépendante.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

Deuxième revue — RÉSOLU.

Mes cinq éditions d'origine, rejouées dans des copies jetables (site atteint), échouent toutes par assertion :

  • FD02 : enveloppe indépendante K/dex, hr_region_vertices FAIL ;
  • FD09 : « Visible panel needs original and reconstructed observations » ;
  • FD11 : « Histogram omitted observations inside its own displayed support » ;
  • FD12 : « Legend-only classes are not histogram populations » (4 ≠ 5) ;
  • FD13 : « Export geometry differs from the returned figure ».

Les remèdes C05, C07 et C12, la palette cyclique et self._save restent admis (JOINT 87/87, rejoué).

Réserve transversale, traitée dans R7 : l'adaptateur numbers() partagé, utilisé par D11, échoue sur une virgule décimale.


Generated by Claude Code

_, axes = c.viz.plot_xgboost_umap(c.Z, pred, confidence, cl, {2: "red", 7: "blue"})
for sc, cls in zip(axes[0].collections, ["F", "G", "M"]):
assert_array_equal(offsets(sc), c.Z[pred == cls])
assert f"n={(pred == cls).sum()}" in sc.get_label()

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

R4 — Bloquant : légendes non reliées aux observations

Mutants originaux qui survivent (suite verte, site atteint, collection identique) :

  • N01 plot_xgboost_umap : noms de classes décalés, effectifs corrects (« G (n=3) » sur les points F) → 2/2 PASS. Seul n= est vérifié, ici.
  • N02 plot_hdbscan_clusters, panneau des classes (l. 377-378) : même décalage → 7/7 PASS.
  • N04 plot_synthesis_grid (l. 590-597) : noms de méthode inversés dans les ylabels de ligne → 2/2 PASS.
  • N05 plot_latent_interpolation (l. 276-279) : labels A/B permutés → PASS.
  • N06 plot_loadings_family_bar (l. 162-164) : légende PC1/PC2 permutée → PASS.

La matrice déclare ces appariements AP. Une légende qui affiche « G » sur des étoiles F est une figure scientifiquement fausse et visuellement convaincante.

Correction attendue : suivre le modèle de test_embedding_exact_observation_associations :

  • classe du label == classe des points de chaque collection ;
  • ylabel de la colonne 0 == méthode de la géométrie ;
  • label du marqueur de départ == label_a ;
  • handle « PC1 » == conteneur des valeurs PC1.

Alternatives admissibles : formulation, ordre des entrées et palette restent libres.


Generated by Claude Code

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

R4 — appariements sémantiques ajoutés aux 53 nœuds initiaux. Chaque classe/effectif XGB et HDB est associé aux coordonnées réellement dessinées ; les noms PCA/UMAP/AE aux géométries des lignes ; les labels fournis A/B aux vraies extrémités ; PC1/PC2 aux conteneurs et valeurs correspondants.

N01 : 2 FAIL ; N02 : 3 FAIL ; N04 : 2 FAIL ; N05/N06 : 1 FAIL chacun, tous par assertions sur une baseline admissible PASS. Les formulations françaises exactes ont été assouplies. A_METHODS : 2 PASS avec « AE » ; palette alternative C03 et contrôles nominaux restent PASS. Aucun renommage de production.

Commit livré : e924f36f24412a435f5ca54a95cdfad914835ff2 ; archive révisée a8bc8506804cf4c89e784e458498d3f229ca81cb, ancienne ed1d91e conservée. Campagne et assertions · manifeste/rejeu/limites. Fil laissé ouvert pour la seconde revue indépendante.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

Deuxième revue — RÉSOLU.

Mes éditions N01 (2 FAIL), N02 (3 FAIL), N04 (2 FAIL), N05 (1 FAIL) et N06 (1 FAIL) sont rejetées par des assertions qui relient chaque label à ses coordonnées, ses effectifs ou ses conteneurs de barres, et non au seul texte. A_METHODS (« AE ») et la palette C03 restent admis.


Generated by Claude Code

Comment thread audit/M28_PROOFS.md
| D11 | `log_histogram_keeps` /1 | Strictly positive1e-8..1 MSE values cannot disappear below an arbitrary1e-4 bin floor without indication. Positive-support bin choice admitted; truezero/negative policy remains open. |
| D12 | `fifth_class` /1 | All five supplied classes represented or relevant explicit refusal; no silent loss due palette length. Nominal <=4class density arithmetic separately protected. |
| D13 | `default_output_directory` /2 | Configured output_dir must actually create a default file on successful training/comparison plot; direct calls currently bypass_save. Explicit exports do work and are green. |
| D14 | `trustworthiness_axis_contains` /1 | Calculated.5,.55882353,.50396825 cannot all be below a fixed.75 display floor without indication. Full0..1 range admitted; independent numerical computation stays green. |

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

R7 — Important : « without indication » contredit la preuve (D14, et D11 l. 28)

AD14 : on conserve ylim(0.75, 1.01) et on ajoute un texte explicite « T(k) < 0.75 hors champ : min = 0.500 ». Résultat : trustworthiness_axis_contains FAIL. Le manifeste (et #114/#111) suggère pourtant qu'une indication explicite serait admissible.

Décision humaine requise :

  • soit le contrat est « toutes les valeurs calculées sont visibles », et il faut corriger le texte du manifeste et des issues ;
  • soit il est « visibles ou explicitement signalées », et il faut élargir l'oracle.

C11 (plage 0–1) passe dans les deux cas.


Generated by Claude Code

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

R7 — la décision humaine fournie dans la reprise est appliquée : visible OU précisément signalé. D14 accepte AD14 avec borne réelle 0,75 et minimum réel 0,500. Le contrôle C11 affichant tout reste valide. Pour les histogrammes, l’indication doit identifier classe, exclus/total et la borne réellement franchie ; des effectifs exacts avec une borne sans rapport ne passent pas.

AD14, A_HIST, AD_HIST et AD_LOG : chacun PASS. Les contrôles verts rejettent avertissement générique, minimum faux, mauvais total et mauvaise borne d’exclusion. #114 et les manifestes sont cohérents. Les politiques zéro/négatifs/nonfinis et l’interprétation physique restent ouvertes, sans décision cachée dans les tests.

Commit livré : e924f36f24412a435f5ca54a95cdfad914835ff2 ; archive révisée a8bc8506804cf4c89e784e458498d3f229ca81cb, ancienne ed1d91e conservée. Campagne et assertions · manifeste/rejeu/limites. Fil laissé ouvert pour la seconde revue indépendante.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

Deuxième revue — PARTIELLEMENT RÉSOLU (non bloquant)

La politique « visible OU signalé de façon exacte » est bien appliquée :

  • mon AD14, ainsi que A_HIST, AD_HIST et AD_LOG, passent ;
  • les contrôles verts rejettent les avertissements génériques et les minimum, total ou borne faux ;
  • C11 reste admis.

Réserve démontrée : visualizer_review_contracts.numbers() lève ValueError sur une virgule décimale. Une divulgation exacte en français, « QSO : 47 exclus sur 50, hors support 0,000000 à 0,148650 », fait passer linear_histogram_truncation_discloses_population et log_histogram_keeps_small_positive_errors en erreur non assertive (could not convert string to float: '0,000100'). Pour un projet francophone, il s'agit d'un remède légitime rejeté sans raison scientifique.

Correction attendue : convertir , en . entre chiffres, en dehors des séparateurs de milliers ; reconnaître aussi les jetons accentués (« tronqué », « tronquées »). Les politiques MSE nulles, négatives et non finies restent ouvertes.


Generated by Claude Code

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

Troisième passe ciblée — virgule décimale et termes accentués admis. numbers() convertit les décimales françaises, préserve les milliers espacés/fins/insécables et les groupes à plusieurs virgules non ambigus ; les tokens sont normalisés pour les accents. Les rôles exclus/total et la borne réellement franchie sont vérifiés. La convention pour une virgule isolée ambiguë est explicitement française, sans prétendre inférer toutes les locales.

AD_COMMA : 2 PASS, sur l’histogramme linéaire et les petites erreurs logarithmiques. FD_COMMA_BOUND : assertion FAIL sur la borne haute pertinente de R10 ; le contrat D11, qui concerne la borne basse, reste PASS. Minimum faux, effectifs inversés, mauvais total et borne pertinente fausse sont rejetés par assertions dans les contrôles verts. Aucune ValueError de conversion. AD14 et les politiques précédentes restent admis ; zéro/négatifs/nonfinis restent ouverts.

Tête livrée fbe7526cb47680d42726482c398c9fa7c892449c ; archive immuable 8e668780b181948856cacb58650b25a0e03eeddf, deux archives antérieures conservées. Contrats/limites/rejeu · campagne figée. Fil laissé ouvert pour la vérification courte de Claude.

Comment thread tests/test_dimred_visualizer.py Outdated
rng = np.random.default_rng(1729)
X = rng.normal(size=(12, 2))
bad = X[np.array([7, 0, 9, 4, 1, 10, 2, 11, 3, 6, 5, 8])]
idx = np.random.default_rng(42).choice(12, size=subsample, replace=False)

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

R8 — Important : couplage à l'implémentation

A_TRUST : un sous-échantillon apparié tout aussi valide, np.sort(rng.permutation(n)[:k]), fait échouer le cas [9], parce que le test recopie default_rng(42).choice de la production.

Correction attendue : enregistrer les sous-ensembles réellement passés à sklearn.manifold.trustworthiness (wrapper monkeypatch), vérifier l'appariement ligne à ligne, puis appliquer l'oracle de rangs à ces sous-ensembles. N10 (appariement rompu) doit rester tué ; il l'est aujourd'hui.

Également figés sans nécessité scientifique :

  • clim == [1.12, 20.22] (percentiles 2/98, l. 53) ;
  • libellés exacts « non disponible » (l. 478), « Prédit F (n=3) » (l. 496), « STAR (n=3, μ=5.3333) » (l. 345).

Préférer des assertions sémantiques (classe, effectif, valeur numérique).


Generated by Claude Code

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

R8 — sous-ensembles réellement calculés capturés. Le wrapper appelle le vrai sklearn et enregistre ses X/Z/k. Le test récupère les identités des lignes, vérifie l’appariement X/UMAP/t-SNE, applique l’oracle indépendant de rangs aux sous-ensembles observés et vérifie la reproductibilité sur deux appels. Il ne recopie plus choice(42).

A_TRUST : 2 PASS ; N10 : 2 FAIL par assertions d’appariement. Les contraintes sur les quantiles clim et plusieurs phrases françaises exactes ont été remplacées par des relations numériques/sémantiques. Les ordres inversés et mélangés (3/11/29) passent les 61 cas avec -W error.

Commit livré : e924f36f24412a435f5ca54a95cdfad914835ff2 ; archive révisée a8bc8506804cf4c89e784e458498d3f229ca81cb, ancienne ed1d91e conservée. Campagne et assertions · manifeste/rejeu/limites. Fil laissé ouvert pour la seconde revue indépendante.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

Deuxième revue — RÉSOLU.

Le wrapper enregistre les appels réels à sklearn.manifold.trustworthiness. Il retrouve les identités par ligne et vérifie l'appariement X/UMAP/t-SNE, la répétabilité sur deux appels et l'oracle de rangs recalculé sur les sous-ensembles observés.

  • Mon A_TRUST (np.sort(rng.permutation(n)[:k])) passe.
  • Mon N10 (np.sort(idx) sur t-SNE) et celui de Codex (np.roll) sont rejetés par assertion.

Le libellé "2 PCs"/"92.9%" encore figé est traité dans R6 (c).


Generated by Claude Code

| `plot_ae_recon_by_spectral_type` | X/R/types/features -> type means -> `(fig,axes)` or `(None,None)` | aligned F10/G12 manual means; red deleted middle row | AP nominal; positional truncation defect, external IDs PA |
| `plot_ae_error_by_family` | X/R/names/taxonomy -> feature then family stats -> `(fig,axes)` | means/SD/manual global weighting/errorbar endpoints | AP valid supplied taxonomy; fallback TiO #65 PA |
| `plot_ae_error_distribution_logscale` | MSE/y -> linear/log density hist -> `(fig,axes)` | nominal areas/medians; red tiny positive MSEs | AP nominal; zero/negative/Inf/NaN and truncation PA |
| `plot_synthesis_grid` | distinct PCA/AE/optionalUMAP -> method x scalar panels -> **fig only** | exact per-method/class/physical association | AP nominal; absent/allmissing panels/provenance PA |

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

R9 — Important : plot_hr_teff_regions absent de la matrice

L'AST compte 38 méthodes pour 37 lignes ; la seule méthode absente est plot_hr_teff_regions. Elle est pourtant couverte par D02, D03 et test_hr_regions_scatter_preserves_input_triplets_despite_geometry_defect.

Par ailleurs, N08 (sur base C05 : polygone « Types A/B » déplacé du côté froid) passe la suite verte et les preuves. La géométrie en T_eff des régions n'est donc pas testée.

Correction attendue : ajouter la ligne, avec un statut NA explicite pour la taxonomie et la géométrie des régions (astrophysiquement arbitraires) et un statut PA pour les marges et unités.


Generated by Claude Code

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

R9 — inventaire corrigé et statuts séparés. Comparaison AST/table effectuée : 38 méthodes réelles, 38 noms inventoriés, aucun manque ni surplus. plot_hr_teff_regions cite le test vert existant des triplets/couleurs/orientations et le sentinel sans colonnes : AP limité à ces contrats numériques. D02 apporte une preuve dimensionnelle partielle sur les marges K/dex : PA. Taxonomie et délimitations/position astrophysique des régions : NA.

N08 n’est pas revendiqué comme détecté ni comme frontière astrophysique validée. C05 reste un contrôle admissible des unités, sans transformer cette correction en validation des classes stellaires. Les résultats verts initiaux sont conservés.

Commit livré : e924f36f24412a435f5ca54a95cdfad914835ff2 ; archive révisée a8bc8506804cf4c89e784e458498d3f229ca81cb, ancienne ed1d91e conservée. Campagne et assertions · manifeste/rejeu/limites. Fil laissé ouvert pour la seconde revue indépendante.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

Deuxième revue — RÉSOLU.

Vérification AST : 38 méthodes, 38 lignes, aucun manque ni doublon. plot_hr_teff_regions est AP seulement pour les triplets, couleurs, orientation et sentinelle ; l'enveloppe dimensionnelle est PA ; la taxonomie et les frontières astrophysiques sont NA. N08 n'est revendiqué nulle part, ce qui est cohérent.


Generated by Claude Code

| `plot_latent_kde` | STAR latent+params -> scipy KDE/grid/contours -> `(fig,axes)` | actual STAR/color pairing/reproducibility; analytic+real red masses | AP tested inputs/defect; no-star/small/singular/allmissing boundary PA |
| `plot_ae_recon_by_spectral_type` | X/R/types/features -> type means -> `(fig,axes)` or `(None,None)` | aligned F10/G12 manual means; red deleted middle row | AP nominal; positional truncation defect, external IDs PA |
| `plot_ae_error_by_family` | X/R/names/taxonomy -> feature then family stats -> `(fig,axes)` | means/SD/manual global weighting/errorbar endpoints | AP valid supplied taxonomy; fallback TiO #65 PA |
| `plot_ae_error_distribution_logscale` | MSE/y -> linear/log density hist -> `(fig,axes)` | nominal areas/medians; red tiny positive MSEs | AP nominal; zero/negative/Inf/NaN and truncation PA |

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

R10 — Important : angle mort, troncature puis renormalisation dans le panneau linéaire

plot_ae_error_distribution_logscale (L2837-2853) utilise bins = linspace(0, 1.5·P99_STAR, 60) avec density=True. Ma sonde : seuls 3 QSO sur 50 tombent dans la fenêtre, mais l'aire tracée vaut 1,000 et la médiane (5,287) est hors champ. Les 47 autres observations disparaissent sans indication ; le titre « (P99 étoiles) » ne signale pas la renormalisation.

Ce cas n'est couvert par aucune issue #101–#115 (#111 concerne les petites valeurs du panneau log). C'est un défaut candidat P2, à qualifier par le responsable scientifique avant toute issue ; une preuve rouge serait utile. Le test vert l. 349-351 vérifie aire = 1 sur une fixture non tronquée : il ne fige pas ce comportement.


Generated by Claude Code

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

R10 — reproduit indépendamment, sans nouveau ticket créé. Fixture : 40 STAR dans [0,01 ; 0,1] et 50 QSO dont trois petites erreurs et 47 valeurs dans [4 ; 7]. Le support linéaire se termine à 0,14865 : 3/50 QSO représentés, 47 exclus, aire des barres 1, médiane réelle de cette fixture 5,402173913… hors champ.

La nouvelle caractérisation rouge échoue par assertion sur ces effectifs, sans erreur d’exécution. A_HIST (support complet) et AD_HIST (exclusion exacte) : chacun PASS. Le manifeste contient la proposition en cinq rubriques, priorité P2, recherches de doublons et distinction explicite avec le plancher logarithmique de #111. La création de l’issue attend la décision humaine.

Commit livré : e924f36f24412a435f5ca54a95cdfad914835ff2 ; archive révisée a8bc8506804cf4c89e784e458498d3f229ca81cb, ancienne ed1d91e conservée. Campagne et assertions · manifeste/rejeu/limites. Fil laissé ouvert pour la seconde revue indépendante.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

Deuxième revue — diagnostic P2 confirmé : je recommande la création d'une issue (décision humaine).

Recalcul indépendant : borne 1,5·P99(STAR) = 0,14865 ; 3 QSO sur 50 dans le support, 47 exclus ; aire tracée 1 ; médiane 5,4021739…, hors champ. La preuve rouge échoue par assertion. A_HIST et AD_HIST passent. Le défaut est distinct de #111 (plancher logarithmique), et la recherche de doublons est documentée.

Politique ouverte : une normalisation par l'effectif total de la classe (aire visible = 3/50) est rejetée, car assert_histogram_population impose une densité conditionnelle (hauteurs ≠, 3/59 barres). Il faut décider si cette représentation vaut divulgation. La virgule décimale relève de R7.


Generated by Claude Code

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

Troisième passe ciblée — deux conventions proposées de test, encore soumises à validation scientifique finale. La densité conditionnelle (aire 1) reste admise avec exclusions exactes. La densité rapportée aux 50 QSO totaux est maintenant admise avec aire 3/50 = 0,06, si la densité, le support réel et la population de référence sont identifiés. Les hauteurs sont vérifiées contre des effectifs indépendants, et les légendes effectivement affichées sont lues : une belle aire ou une caption ne choisit pas seule le dénominateur.

A_HIST/AD_HIST/A_TOTAL : PASS ; AD_COMMA : 2 PASS. F_TOTAL_LIE et F_CONDITIONAL_LIE : 1 assertion FAIL chacun. JOINT et JOINT_TOTAL : 92/92 PASS chacun, également reconstruits depuis l’archive. Une bonne légende proxy est admise et une légende globale contradictoire rejetée dans les contrôles verts.

Le diagnostic P2 et la proposition complète en cinq rubriques sont conservés, distincts de #111. Aucune nouvelle issue créée ; sa création attend toujours l’approbation humaine explicite.

Tête livrée fbe7526cb47680d42726482c398c9fa7c892449c ; archive immuable 8e668780b181948856cacb58650b25a0e03eeddf, deux archives antérieures conservées. Contrats/limites/rejeu · campagne figée. Fil laissé ouvert pour la vérification courte de Claude.

Comment thread audit/M28_PROOFS.md
| D01 | `kde_labeled_regions` /2 | Real SciPy and analytic Gaussian covariance diag(4,9). Independent expanded-grid quadrature and analytic `max(0,1-12*pi*t)`; density-height percentiles do not specify enclosed probability. Integrated thresholds accepted. M1 already noted this risk; no separate corrective issue existed. |
| D02 | `hr_region_vertices` /1 | All gravity coordinates must lie in gravity-domain bounds. Current mixed K/dex margin yields−93.3175dex for supplied ordinary data. Nonempty informative regions required; corrected gravity margin admitted. |
| D03 | `hr_population_title` /2 | Displayed count must be supplied population count6/9 or omitted. Hardcoded43019 is neither. Omission admitted; stellar-region taxonomy is not validated. |
| D04 | `reconstruction_cardinality` /1 | Deleted middle observation: actual F mean1140/13, plotted1060/12. Incompatible lengths must not reassign labels by truncation. Pertinent ValueError/RuntimeError refusal or true correspondence admitted; valid aligned F10/G12 still must work. No external equal-size IDs inferred. |

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

R11 — Suggestion : commentaire D04 inexact (archive l. 149-151, reproduit dans #104)

La ligne 4 retirée est un G. C'est la ligne 8 (F) qui est réattribuée à G par la troncature, pas la ligne 5 (qui est un G). Les valeurs 1140/13 et 1060/12, que j'ai recalculées, sont exactes. Le refus pertinent (C04) et le rejet de F01 restent valides.


Generated by Claude Code

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

R11 — commentaire corrigé dans la nouvelle archive. C’est la ligne originale 8 (F) qui reçoit G après suppression de la ligne originale 4 (G). Les calculs indépendants 1140/13 et 1060/12 sont inchangés. #104 porte la précision documentaire datée ; l’ancienne archive n’a pas été réécrite.

C04 PASS et F01 KILLED au rejeu des contrôles initiaux (14 admissibles PASS / 3 faux remèdes KILLED). R12 : ancrages vérifiés corrigés dans #103/#104/#105/#110/#111/#114. R13 : métallicité, titres fixes et interprétation des anomalies restent PA/politique ouverte. R14 : Black/Ruff exécutés explicitement sur les quatre scripts d’audit ; workflow inchangé.

Commit livré : e924f36f24412a435f5ca54a95cdfad914835ff2 ; archive révisée a8bc8506804cf4c89e784e458498d3f229ca81cb, ancienne ed1d91e conservée. Campagne et assertions · manifeste/rejeu/limites. Fil laissé ouvert pour la seconde revue indépendante.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

Deuxième revue — RÉSOLU.


Generated by Claude Code

@PhD-Brown PhD-Brown left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

Deuxième revue indépendante Claude — M2.8 (PR #116, e924f36)

Verdict scientifique : MODIFICATIONS REQUISES — corrections ciblées restantes. Le compte étant partagé, la revue est publiée en COMMENTED, ce qui ne vaut pas approbation ; une approbation scientifique ne vaudrait pas non plus autorisation de fusion. La PR reste en Draft. Aucune modification de la branche, aucun commit, aucun merge ; M2.9 n'est pas commencée.

Revue effectuée sur : tête e924f36f24412a435f5ca54a95cdfad914835ff2 (= distant) · base 39dad874610745ccd456d26972e90f6fb3a11405 · blob de production 624b857b… inchangé. Aucun chemin protégé n'est modifié dans 39dad87..e924f36. Les travaux ont été faits dans des worktrees détachés isolés (e924f36, a8bc850) et des copies jetables.

Statut des fils (détail et contre-exemples dans chaque fil)

Fil Statut Point déterminant
R1 KDE PARTIELLEMENT RÉSOLU — bloquant K1B, K6, K7, K8 et K9 sont rejetés ; C13, K4 et K5 sont admis ; les tolérances sont justifiées par la mesure. K10 (KDE ajustée sur un sous-ensemble biaisé de STAR, sans le second mode) passe 4/5 cas ; son seul échec est incident. Politique ouverte : contours complets exigés dans le cadre affiché
R2a stub RÉSOLU Loi analytique cohérente (normalisation, resample, masse Monte-Carlo)
R2b D05 PARTIELLEMENT RÉSOLU — bloquant AD05 et AC05 sont admis, mais FD05 passe : une colorbar contradictoire renommée « Groupe HDBSCAN » est excusée par les annotations
R3 P2 RÉSOLU Mes FD02, FD09, FD11, FD12 et FD13 d'origine sont rejetés par assertion
R4 légendes RÉSOLU Mes N01, N02, N04, N05 et N06 sont rejetés par des associations label ↔ données
R5 export RÉSOLU (PNG) ; PDF PA N03 est rejeté, A_EXPORT et C02 sont admis
R6 annotations PARTIELLEMENT RÉSOLU (non bloquant) « 43k » passe D03 ; D10 ne reconnaît que « PCs » ; "2 PCs"/"92.9%" encore figés dans le test vert
R7 affichage partiel PARTIELLEMENT RÉSOLU (non bloquant) La politique est appliquée, mais numbers() plante sur la virgule décimale (ValueError, erreur non assertive)
R8 trustworthiness RÉSOLU Sous-ensembles réels capturés ; A_TRUST admis ; N10 rejeté
R9 inventaire RÉSOLU 38/38 ; NA explicite pour les régions HR (N08 non revendiqué)
R10 histogramme Diagnostic P2 confirmé Création d'issue recommandée (décision humaine). Politique ouverte : normalisation par l'effectif total rejetée
R11, R12, R14 RÉSOLU Commentaire D04, ancrages d'issues, lint local de audit/*.py
R13 POLITIQUE OUVERTE [M/H] vs [Fe/H], titres fixes, bruit vs anomalies

Corrections ciblées attendues (même PR)

  1. R1/K10 : contrôle de représentativité de la population ajustée, en plus de l'appartenance. Exemple : fraction du dataset en x > 3 = 90/300 ± 0,10. K10 doit échouer ; un sous-échantillon aléatoire (K11) doit rester admis.
  2. R2b/FD05 : identifier les colorbars catégorielles sans passer par leur texte (mappable non lié à une grandeur physique, xlabel et ylabel). FD05 doit échouer ; AD05 et AC05 doivent rester PASS.
  3. Non bloquant, même passe : numbers() doit accepter la virgule décimale et les jetons accentués ; D03 doit lire « 43k » ; D10 doit accepter « composantes/CP » ; la l. 121 du test vert doit devenir une relation numérique.
  4. Décisions humaines : contours complets exigés ou non (#101) ; normalisation par l'effectif total admise ou non (R10) ; création de l'issue R10.

Vérifications réellement exécutées

Linux, Python 3.11.18, venv requirements/ci.txt ; NumPy 2.4.6, SciPy 1.17.1, scikit-learn 1.9.1, Matplotlib 3.11.2, pandas 3.1.1 ; Agg.

Commande Résultat
61 tests M2.8, -W error ; ordre inversé (hashseed 7) ; 3 mélanges (3/11/29) 61 PASS ×5
Suite complète : normale, importlib, inversée 690 PASS / 3 SKIP / 62 exclus / 7 warnings (Linux ; les 3 SKIP sont propres à Windows, d'où les 693 PASS de Codex sous Windows 3.11.9)
Black --check, Ruff (src, tests, scripts, app.py, audit/*.py : 61 fichiers), pip check, git diff --check PASS
check_m28_evidence.py --mode baseline --proofs-ref a8bc850 25 FAIL / 1 PASS / 0 ERROR (21 assertions, 3 pytest.fail d'exception incidente, 1 mathtext D15, tous préexistants dans leur nature)
Même commande avec --proofs-ref ed1d91e 21 FAIL / 1 PASS
check_m28_review.py --proofs-ref a8bc850 / --only JOINT 19 KILLED ; 12 admissibles PASS ; JOINT 87/87 (61 verts + 26 preuves)
check_m28_evidence.py --mode mutations M01–M16 : 16 KILLED (baseline 61 PASS)
Mon harnais indépendant (éditions d'origine, marqueur d'exécution) voir les fils, plus les contre-exemples K10, FD05, R6/R7
Journal CI 43469942967, job 132038888863 (lu) merge 0717c34 = e924f36 + 39dad87 ; 690/3/62 ; Black (43 fichiers), Ruff et pip check PASS

Archives : a8bc850 (tag audit/m28-review-proofs-2026-11-13) existe sur le distant et a ed1d91e pour ancêtre (ref -proofs conservée), elle-même ancêtre de la tête. Les blobs des tests, helpers, conftest, script de revue et production sont identiques entre l'archive et la tête ; celui de la preuve vaut d77396ae…, conforme au registre. La preuve n'est pas dans la tête, et aucun JSON de première passe n'est modifié.

Limites : aucune validation astrophysique, aucun run réel, aucun rendu PDF certifié, pas d'exécution Windows. Les adaptateurs textuels restent bornés. Les contre-exemples ci-dessus sont des cas minimaux reproductibles, pas des bugs de production.


Generated by Claude Code

This branch has not been deployed

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant