Repository navigation
Conversation
PhD-Brown
left a comment
There was a problem hiding this comment.
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, D06has_proba = confidence is not None, D08[4] masquage des panneaux, D10 masse du modèle complet, D12 palette cyclique, D13self._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)
- 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. - 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.
- Nouvelle archive rouge identifiée par son SHA, en conservant
ed1d91edans l'ascendance ; R5–R10 traités ou explicitement reportés ; matrice corrigée (R9). - 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 = []parpeak = 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"]], puisax.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, etax.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é,
ylimconservé - AD05 : légende de
Patchau 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 :
pickledu clone de figure, retrait descollections,savefigdu clone - N04 :
METHODS[-1 - row][0]dans l'ylabel - N05 :
label_aetlabel_bpermutés - N06 :
label="PC1"etlabel="PC2"permutés - N08 : sur base C05, sommets
T_HI − T_PADde « Types A/B » remplacés parT_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
|
|
||
| | 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. | |
There was a problem hiding this comment.
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]etreal_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_normalPASS.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 ».
- K6 : niveaux C13 avec labels inversés (
- 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 :
- population STAR non gaussienne (mélange bimodal anisotrope) et lignes non-STAR hors mode ;
- lecture du label affiché pour chaque niveau, comparé à la masse intégrée ;
- densité de l'estimateur aux sommets de
cs.allsegs[i]≈cs.levels[i]; est.dataset⊂ lignes STAR ;- 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
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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
There was a problem hiding this comment.
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 |
There was a problem hiding this comment.
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
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
Deuxième revue — RÉSOLU.
AnalyticGaussian vérifié indépendamment :
evaluatenormalisé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
| | 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. | |
There was a problem hiding this comment.
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
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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
There was a problem hiding this comment.
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.
| | 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. | |
There was a problem hiding this comment.
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
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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_verticesFAIL ; - 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() |
There was a problem hiding this comment.
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. Seuln=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
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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
| | 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. | |
There was a problem hiding this comment.
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
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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
There was a problem hiding this comment.
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.
| 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) |
There was a problem hiding this comment.
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
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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 | |
There was a problem hiding this comment.
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
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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 | |
There was a problem hiding this comment.
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
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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
There was a problem hiding this comment.
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.
| | 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. | |
There was a problem hiding this comment.
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
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
Deuxième revue — RÉSOLU.
- R11 : commentaire corrigé dans
a8bc850(la ligne 8, F, est réattribuée) ;ed1d91ereste intacte et rejouée à 21/1. - R12 : ancrages vérifiés dans les corps d'issues : fix: count or omit the HR figure stellar population label #103 L3215, fix: reject reconstruction population mismatches before spectral grouping #104 L2588, fix: make HDBSCAN colorbars agree with plotted cluster colors #105 L1415, fix: keep PCA variance annotations consistent when display is truncated #110 L185, fix: retain small positive MSE values in logarithmic histograms #111 L2824, fix: display computed trustworthiness values below the fixed plot floor #114 L2279.
- R13 : reste une politique ouverte ([M/H] vs [Fe/H], titres fixes, bruit vs anomalies).
- R14 : Black et Ruff passent localement sur 61 fichiers, y compris
audit/*.py; la CI ne couvre pas ce périmètre, ce qui est documenté.
Generated by Claude Code
PhD-Brown
left a comment
There was a problem hiding this comment.
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)
- R1/K10 : contrôle de représentativité de la population ajustée, en plus de l'appartenance. Exemple : fraction du
datasetenx > 3= 90/300 ± 0,10. K10 doit échouer ; un sous-échantillon aléatoire (K11) doit rester admis. - R2b/FD05 : identifier les colorbars catégorielles sans passer par leur texte (mappable non lié à une grandeur physique,
xlabeletylabel). FD05 doit échouer ; AD05 et AC05 doivent rester PASS. - 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. - 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
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 worktreeAstroSpectro-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.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.
pytest -q tests/test_dimred_visualizer.py tests/test_visualizer_review_contracts.py -W errorLa 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.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, worktreeAstroSpectro-m28; HEAD local=distant e924f36, base 39dad87, blob de production 624b857bca5833c3401204b0a592b9ae6ffc2902. Diff limité à tests/audit. Matrice R1–R14 · manifeste révisé et commandes exactes.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.
pytest -q tests/test_dimred_visualizer.py tests/test_visualizer_review_contracts.py -W errorCI 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.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 ; base39dad874610745ccd456d26972e90f6fb3a11405(PR99 fusionnée), blob production624b857bca5833c3401204b0a592b9ae6ffc2902. Checkout principal et anciens worktrees préservés.Matrice complète et limites AP/PA/NA/B · manifeste des preuves · index des issues.
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.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.
python -m pytest -q tests/test_dimred_visualizer.py -W errorpython -m pytest -qet--import-mode=importlib0e35d66(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.