Skip to content
338 changes: 338 additions & 0 deletions audit/M28_DIMRED_VISUALIZER.md

Large diffs are not rendered by default.

84 changes: 84 additions & 0 deletions audit/M28_PROOFS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
# M2.8 — immutable red evidence manifest

> Revision 2026-11-13: this manifest and its counts describe the **first pass**.
> The original archive is preserved unchanged. See [revised proof manifest](M28_REVIEW_PROOFS.md)
> for corrected oracles, new archive and review campaigns.

Refs #43. Base39dad874610745ccd456d26972e90f6fb3a11405;
production visualizer blob624b857bca5833c3401204b0a592b9ae6ffc2902 unchanged.
`tests/proofs_dimred_visualizer.py` is explicitly executed, never discovered
by the normal test naming pattern. It is committed in one final archive,
pushed/read back, then removed normally from the Draft PR head. No xfail.
The designated archive is **ed1d91ec0efb619aeb77a5bf7e4a0ab43fa84cac**; its
ancestry preserves exact conftest, green tests, source, scripts and results.

Final baseline: **22 cases,21FAIL/1PASS/0ERROR/SKIP**. This is **15 grouped
findings**, not21bugs. The passing `n_show=0` case already refuses an impossible
subplot count. It is a control/observation, not a requirement to keep one
particular exception text. Green valid-data cases accompany invalid proofs.

| 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.

| 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

| 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

| 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.

| D06 | `actual_unit_confidence` /1 | Values all1 are compatible with actual probabilities. Without an availability flag the renderer cannot assert predict_proba absent. Missing probability still tested as None in green; no calibrated probability claim. |
| D07 | `no_physical_columns` /2 | Class-only AE/zoom inputs have a defined nonempty class plot or relevant explicit refusal; scalar axes TypeError is not a decision. Correct scalar-to-array handling admitted. |
| D08 | `cluster_profiles_unavailable` /2,1PASS | n_show1 must address an actual axis; n_show4/two clusters must hide unused data slots. n_show0 explicit refusal admitted. Top-five signed numeric data remain protected in green. |
| D09 | `more_reconstructions` /1 | Requested4/available2 must not present blank measurement panels. Hide unused or allocate actual count; valid1/3/6 rows still exact. |
| D10 | `truncated_variance_annotation` /1 | Reported3PCs cannot be paired with85% when3 actually explain100%. Correct numeric association or removal/clarification of that claim accepted; no PCA sign convention. |
| 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.

| D15 | `default_eigenspectrum` /1 | Actual default Balmer mathtext must draw with Agg. Doubled backslashes cause a parser error. Supplied custom marker labels are already green; unescaping default labels admitted. Notebook01 supplies RAIES, so no historical failure asserted. |

## Reproduction and admissibility

On the archived checkout:

```powershell
python -m pytest -q tests/proofs_dimred_visualizer.py --tb=short
```

From the green checkout with the fixed archive SHA:

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

The runner reads exact proof/green/fixture bytes from Git into its own synthetic
TemporaryDirectory; production source is unchanged. No real datasets are copied.
Exit1 for explicit proof pytest is expected. The runner itself reports evidence
without treating expected counterexamples as an infrastructure failure.

Mutations M01–M16 are separately scoped to green tests, all reached and KILLED
by assertions with matching collection. They are not15production fixes.
Fourteen admissible C01–C14 candidates exercise percentages, export, aesthetic
colors, explicit alignment refusal, gravity margin, count omission, small MSE
support, scalar axes, profile addressing, full trust range, hidden unused
reconstructions, integrated KDE and valid mathtext. These are experimental
copies, not patches proposed for production. Selections and test counts are in
the ledgers; each candidate was not run against the entire repository.

F01 always-refuse is rejected by the valid aligned mean oracle, F02 empty HR
by explicit informative-region assertion. F03 standard-normal thresholds for
every KDE initially survived an almost isotropic sample. Covariance diag(4,9)
now discriminates it: F03 KILLED, while integrated C13 remains PASS. The final
KDE ledger supersedes only this narrow earlier evidence. Old results remain
unchanged. Analytic mass is clamped to0 above peak density; this avoids an
incorrect negative mass in the audit oracle itself.

## Limits

Policy adapters are bounded: explicit diagnostic keywords, current French count

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.

R6 — Important : adaptateurs grammaticaux (limite déclarée, désormais démontrée)

  • FD03 : titre « N = 43 019 » (effectif toujours codé en dur) → hr_population_title PASS.
  • FD10 : annotation « → 85.0% avec 3 PCs » (association toujours fausse) → truncated_variance_annotation PASS et suite verte PASS.

Correction attendue :

  • D03 : tout entier du titre (espaces fines admises) doit égaler n, ou ne pas apparaître ;
  • D10 : tout pourcentage affiché dans le panneau doit égaler la masse cumulée du nombre de PCs mentionné ou du point annoté (annotation.xy), quel que soit l'ordre des mots.

Non bloquant, car la limite est explicitement écrite ici. #103 et #110 devraient toutefois décrire le contrat structurel.


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.

R6 — reformulations trompeuses rejetées. D03 compare les entiers d’effectif du titre à la population fournie, avec nombres groupés et métadonnées de catalogue distinguées. D10 associe chaque pourcentage au compte PC mentionné, dans les deux ordres de phrase, ou au point annoté si le compte est implicite.

FD03 : 2 FAIL (populations 6/9) ; FD10 : 1 FAIL pour « 85 % avec 3 PCs ». Le compte omis C06 reste admissible, et l’annotation du modèle complet passe dans JOINT 87/87. #103 et #110 portent maintenant la précision structurelle datée. La grammaire acceptée reste un adaptateur borné, documenté comme tel.

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)

Rejetés par assertion : FD03, « 43019 objets », FD10 et « 85.0 % de variance pour 3 PCs ».

Restent :

  • (a) « échantillon de 43k étoiles » passe D03 : \b\d+\b ne lit pas « 43k ».
  • (b) D10 ne reconnaît que « PCs ». « 3 composantes → 85.0 % » passe la preuve et n'est rejeté qu'incidemment par le libellé vert figé. À l'inverse, l'annotation correcte « 2 composantes → 92.9% » est rejetée par la preuve (« Annotated PC count and variance disagree »).
  • (c) Le test vert, l. 121, impose encore "2 PCs" et "92.9%" : l'annotation correcte « 2 PCs → 92,9 % » échoue.

Correction attendue : suffixes k/M et formes « ≈ », synonymes composante/CP/PC, virgule décimale ; l. 121 exprimée comme relation 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.

Troisième passe ciblée — suffixes, synonymes et relation numérique. D03 lit maintenant k/K/M, nombres groupés et « ≈ ». D10 et le contrôle vert partagent une relation compte de composantes ↔ somme de variance, avec PC/PCs/CP/composantes et virgule décimale. Le test vert exige le couple scientifique 2 et 100×(9+4)/14 à la précision imprimée ; il n’exige plus les chaînes « 2 PCs » et « 92.9% ».

FD03_K : 2 assertions FAIL ; FVAR_COMPONENT (« 3 composantes → 85 % ») : 1 assertion FAIL. A_VARIANCE : 2 PASS, dont le vrai PCA et la preuve d’affichage tronqué, avec « composantes » et virgule. Les contrôles verts couvrent les quatre synonymes, les suffixes et séparateurs ; aucun échec de conversion n’est compté comme détection.

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.

and variance annotation grammar, Matplotlib colorbar/annotation interfaces and
probability contour order. They do not parse arbitrary scientific language or
all future plotting implementations. A future API/representation change must
update adapters while preserving numerical contracts. In particular diagnostic
wording is not universal proof of correct refusal, class-based availability is
not object identity and a renderable figure is not astrophysical validation.
No green test demands retaining the demonstrated red behavior.
Loading