Repository navigation
test(dimred): audit run reporter artifacts and reproducibility (M2.7) - #99
Conversation
PhD-Brown
left a comment
There was a problem hiding this comment.
Première revue scientifique indépendante — Claude — M2.7 RunReporter
Verdict : MODIFICATIONS REQUISES
Revue COMMENTED : le compte GitHub est partagé avec l'auteur de la PR, ce n'est donc pas une approbation ou un refus formel. Fils R1–R12 inline, à laisser ouverts jusqu'à vérification indépendante après correction.
Examiné. HEAD 9666d7da7e3d6a430fff0c1b2858797d92c8ee7b, base main 1e2266385eab287d3a1c54c2e919e012293fa44b, blob production b966d9b90f056baa37c0ccbb68135c71ff65de92 inchangé, archive rouge 51fe4d1ff3645aea28cda59f0260acc86fa0c834 (ancêtre de la tête). AGENTS.md v1.3. 15 fichiers, tous dans tests//audit/. Aucune modification de src/, des notebooks ni des dépendances.
Exécutions réelles (Linux · Python 3.11.18 · venv requirements/ci.txt (NumPy 2.4.6, pandas 3.1.1, SciPy 1.17.1, sklearn 1.9.1, joblib 1.6.0, pytest 8.4.2) · production b966d9b9 inchangée ; variantes appliquées seulement dans des copies jetables)
| Commande | Résultat |
|---|---|
pytest -q tests/test_dimred_run_reporter.py -W error |
84 PASS |
check_m27_mutations.py --reverse |
84 PASS |
pytest -q / --import-mode=importlib |
599 PASS / 3 SKIP / 62 deselected / 7 warnings (identique à la CI Linux ; les 602 de Codex sont sous Windows) |
| Rejeu de l'archive (script Codex et checkout direct) | 18 FAIL / 1 PASS / 0 ERROR, tous par assertions pertinentes |
Black 24.4.2 / Ruff 0.5.0 / pip check / git diff --check |
PASS (41 fichiers) / PASS / aucun conflit / OK |
| CI 42732747074, journal du job 129554543095 lu | merge de contrôle 6ba4cdf = 9666d7d sur 1e22663, Python 3.11.18, 599/3/62, Black 38 / Ruff / pip check PASS |
Oracles recalculés indépendamment
- PCA 9:4:1 : valeurs propres 3,6/1,6/0,4, énergie 28, seuils 2/2/3/3 ✔.
- MSE PCA-2 = 2/18 ✔, mais égale à la MSE AE de la fixture (R9).
- Spearman 33/35 et ex aequo ✔.
- #97 : 23/35 contre 1 ✔, mais fixture monotone (R6). Contre-exemple non monotone : 0,9 / 31/35 / 0,1.
- Zoom, confusion 3×3, accuracy 3/6 et 4/6, quantiles linéaires et écarts-types de population ✔.
- Sondes JSON par dtype (R1) : float64, str inféré, float32, Float64+Inf et colonne toute manquante échouent en strict ;
NaT→"NaT".
Ce qui est solide
Lecture réelle du module et des notebooks, oracles analytiques indépendants pour les statistiques, intégration avec une PCA réellement ajustée. Distinction AP/PA/NA soignée. Limites de reproductibilité honnêtes : aucune version, aucun hash, figures partagées, y_aligned non conservé. Chronologie des mutants honnête. Accuracy présentée comme positionnelle, pas comme preuve d'identité. Les sept défauts #92–#98 sont confirmés sur le fond.
Pourquoi des modifications sont requises
- Les preuves rouges acceptent 10 faux correctifs évidents (copies jetables, preuves archivées inchangées) :
| Variante | Preuve satisfaite à tort | État réel laissé |
|---|---|---|
| F1 NaN/Inf→0 | #92 ×4 | mesure nulle inventée |
F8 allow_nan=False |
#92 ×4 et #97 | JSON tronqué + joblib/legacy publiés |
| F2 refus de collision après les alias | #93 ×5 | latest/legacy = B, latest.json = A, même timestamp |
| F3 rollback sans legacy | #94 ×2 | legacy (lu par NB03) = B, latest = A |
F4 .png→.pkl / F4b autre clé |
#95 | modèle inventé ou figure présentée comme modèle |
F5 {"error": null} / F5c mot sans rapport |
#96 ×2 | échec toujours avalé |
| F6 paires finies décalées | #97 | ρ faux, mais =1 sur fixture monotone |
| F7 axe 1 dupliqué | #98 | corrélation d'un axe inexistant |
- Trois remèdes admissibles sont rejetés pour leur seul type d'exception : F9 (refus
RuntimeErroravant écriture), F10 (rollback complet +RuntimeErrorchaînée), F11 (propagation chaînée). F4c (model_path=None) et F6c (pairwise) sont correctement acceptés. - Suite verte : 7 de mes 8 mutants sémantiques survivent (N01–N06, N08) à cause de fixtures symétriques ou coïncidentes, alors que la matrice déclare AP (R8–R10). N07 est tué.
Mutants pour la campagne (remplacements exacts dans run_reporter.py)
- N01 :
pca_spec→pcadansn_keep_spec,variance_thresholds_spec,pca_spectra.variance_explained_totaletvariance_summary_top10 - N02 :
"y_spec": class_counts(y_spec)→class_counts(y) - N03 :
"pca_mse_2_components": mse_pca2→mse_ae_global - N04 :
safe_df_records(summary_df)→safe_df_records(comparison_df)dansreconstruction_summary - N05 : TXT « AE best val_loss » imprime
final_val_loss - N06 : TXT accuracy calculée sur
yp[::-1] - N07 : préférer
labels_normày_aligned(tué, à conserver) - N08 :
embedding_stats_nd(Z_umap3)→embedding_stats_nd(Z_umap if Z_umap is not None else Z_umap3)dansumap3d_summary
Décisions scientifiques ouvertes (responsable humain)
Politique des valeurs non finies (null+raison, refus, signe de ±Inf). Propagation ou statut structuré pour les métriques. Stratégie de collision et format d'identifiant. Protocole de publication (staging, manifeste, marqueur d'achèvement) et sort de l'alias legacy. Pairwise ou complete-case, et effectif minimal des corrélations. Transport de la référence alignée et des IDs (#50/#88). Câblage du vrai model_path du bridge (#95). Provenance, versions et hashes (#20/#38/#68). Aucun test ne doit trancher ces choix, d'où les demandes d'élargir les oracles aux remèdes admissibles.
Prochaine action
Codex reprend la même PR #99 / même branche : preuves révisées archivées par nouveau SHA (l'ancienne 51fe4d1 reste dans l'ascendance), renforcement des fixtures R8/R9, compléments R10–R12, puis rejeu (verts, mutants N01–N08, contrôles admissibles). La seconde revue Claude vérifiera chaque fil. Pas de passage en Ready for review ni de fusion sans décision humaine. M2.8 non commencée.
Les scripts de cette revue (harnais, variantes, sondes, oracles) n'ont pas été poussés. Les remplacements utiles sont reproduits dans les fils.
Generated by Claude Code
PhD-Brown
left a comment
There was a problem hiding this comment.
Seconde revue scientifique indépendante — Claude — M2.7 RunReporter
Verdict : MODIFICATIONS REQUISES — deux corrections ciblées, déjà validées sur une copie jetable
Revue COMMENTED (compte partagé) : ce n'est ni une approbation ni un refus GitHub formel. 10 fils sur 12 résolus. Restent ouverts R3 et R5, avec un contre-exemple reproductible et un correctif mesuré dans chaque fil.
Examiné. Tête 38acff8fe2082d9f94099df0311b002a29b7ab5b (= distant), base 1e2266385eab287d3a1c54c2e919e012293fa44b, blob reporter b966d9b90f056baa37c0ccbb68135c71ff65de92 inchangé. Diff 9666d7d..38acff8 (19 fichiers) puis diff cumulé contre main (29 fichiers) : uniquement audit/ et tests/ ; src/, notebooks, dépendances et données inchangés. Archives 51fe4d1 et e0680e0 : accessibles, ancêtres de la tête. Aucun fichier rouge n'est collecté par la suite verte. Helpers et conftest identiques entre l'archive et la tête.
Exécutions réelles (Linux, Python 3.11.18, venv requirements/ci.txt, PYTHONHASHSEED=0)
| Commande | Résultat |
|---|---|
pytest tests/test_dimred_run_reporter.py -W error / tests/test_reporter_review_contracts.py -W error / combinés |
86 / 20 / 106 PASS |
check_m27_mutations.py --reverse |
106 PASS |
pytest -q / --import-mode=importlib |
621 PASS / 3 SKIP / 62 deselected / 7 warnings chacun (= CI Linux ; 624 côté Windows selon Codex) |
check_m27_review.py --proofs-ref e0680e0 --only baseline (fichiers de preuve, helpers et conftest reconstruits depuis l'archive) + pytest direct dans le checkout e0680e0 |
38 FAIL / 7 PASS / 0 ERROR les deux fois (les 7 PASS sont légitimes) |
check_m27_review.py complet |
10 faux correctifs rejetés / 12 admissibles acceptés, identique aux journaux |
Black 24.4.2 (54 fichiers) / Ruff 0.5.0 / pip check / git diff --check |
PASS ; worktree propre après exécution |
| CI 42742860889, journal du job 129587921453 lu | c458385 = merge 38acff8+1e22663, Python 3.11.18, 621/3/62, Black 40 / Ruff / pip PASS ; pas de fusion réelle |
Vérifications indépendantes
- Mes implémentations d'origine (pas celles de Codex) rejouées sur les preuves révisées : F1, F2, F3, F4, F4b, F5, F5c, F6, F7 et F8 sont rejetés ; F9, F4c, F6c et F11 sont acceptés.
- Mon F10 d'origine (restauration des seuls alias) est rejeté à cause des archives B orphelines. C'est une exigence défendable et documentée ; le F10 complet de Codex est accepté.
- N01–N08 : 8/8 tués, avec mes implémentations comme avec le script de Codex. Sites exécutés, collecte identique, échecs par assertions portant sur la valeur visée.
- Contrôles admissibles : C01–C06 à 86/86, plus un contrôle nouveau C07 (re-padding TXT) à 86/86.
- Oracles recalculés : PCA spectres 81 : 4 : 0,25 (324/341 > 0,95 → seuils 1/1/1/2) ; MSE 1/36 contre 1/9 ; axe 3 UMAP moyenne 17,5 et variance 185,25 ; Spearman 0,9 / 31/35 / 0,1 ; accuracy de repli 3/6.
- Nouvelles sondes : F4e (chemin relatif) rejeté ; F9over (sur-refus) rejeté par R3 ; les refus « par mots-clés » ne sont acceptés qu'avec un instantané d'octets intact, donc sans artefact trompeur.
Lacunes restantes (bloquantes, correctifs courts)
| Fil | Faux correctif accepté | Correctif validé (copie jetable de e0680e0) |
|---|---|---|
| R3 | F12 : marqueur {"status": "incomplete", "artifacts": [4 alias]} écrit sans condition et jamais effacé → 14/14 PASS, alors que les groupes A/B restent mélangés. embedding_group sort sans aucun contrôle, et la publication nominale de A n'est jamais vérifiée comme « non incomplète ». |
assert embedding_group(c.reports, [a]) != "explicitly incomplete" après A ; si un marqueur est invoqué après la panne, il doit citer le timestamp de B ou la cause d'origine. Résultat : F12 14 FAIL, F10 et F10marker 15/15 PASS, base de référence 38/7 inchangée. |
| R5 | F5d : panne AE journalisée comme PCA et inversement → 2/2 PASS. La sentinelle "M27 {metric} numerical sentinel 4701" contient le jeton de métrique, l'identification est donc circulaire. |
Sentinelle neutre "numerical sentinel 4701". Résultat : F5d 2 FAIL, F11 et F11log 3/3 PASS, base de référence 38/7. |
Ajouter F12 et F5d à check_m27_review.py, puis archiver une preuve révisée sous un nouveau SHA, en conservant 51fe4d1 et e0680e0 dans l'ascendance.
Réserves non bloquantes (documentées ou mineures)
- R4 : la règle porte sur les clés
model*; F4d (classifier_path= figure) passe. Généralisation facultative. - R1 :
unavailable()accepte"inf"pour-inf, ce qui relève de la politique ouverte sur les signes. - R11 : la trace de provenance est vérifiée par mots-clés.
- La concurrence entre processus et les pannes matérielles restent hors du périmètre validé.
Matrice et issues
La section « Revision after Claude first review » couvre bien R1–R12 : contrat, oracle, faux correctif, alternative, SHA, limites. Elle distingue AP/PA/NA sans revendiquer identité, provenance, reproductibilité ou validité astrophysique. Elle devra seulement mentionner F12/F5d après correction.
- #92–#98 restent confirmées.
- #95 est correctement précisée (bridge l.328, non transmis par NB02, câblage futur possible, historique non reconstruit).
- #100 est distincte de #50 et #88, avec preuve minimale rouge, sans politique figée.
Politiques scientifiques ouvertes (décision humaine, non figées par les tests)
- Représentation de NaN/Inf/NaT et des signes.
- Propagation ou statut des métriques en échec.
- Identifiants de run et collisions.
- Protocole de publication, marqueur et alias legacy.
- Pairwise ou complete-case.
- Référence alignée et identifiants des observations (#100/#50/#88).
- Câblage du
model_path. - Versions, hashes et manifestes.
Prochaine action
Reprise Codex ciblée sur la même PR #99 : R3 et R5 uniquement, plus ajout de F12/F5d aux contrôles et nouvelle archive rouge. Une troisième revue Claude courte vérifiera ces deux fils. Ensuite, décision humaine de fusion. Pas de Ready for review, pas de fusion, M2.8 non commencée.
Generated by Claude Code
PhD-Brown
left a comment
There was a problem hiding this comment.
Troisième revue scientifique — Claude — M2.7 RunReporter (R3/R5)
Verdict scientifique : APPROUVER — prête pour décision humaine
Review enregistrée COMMENTED (compte partagé) : ce n'est pas une approbation GitHub formelle. La fusion reste la décision exclusive du responsable scientifique.
Examiné. Tête 0644bd06b9d287ca90382a4ac7f00ae52b925f4e (= distant), base 1e2266385eab287d3a1c54c2e919e012293fa44b, blob reporter b966d9b90f056baa37c0ccbb68135c71ff65de92 inchangé. Diff 38acff8..0644bd0 : 9 fichiers, tous dans audit/ et tests/, uniquement des ajouts de journaux m27_r35_* (aucun ancien journal modifié). Archives 51fe4d1, e0680e0 et 3eab1fd accessibles et ancêtres de la tête ; aucun fichier rouge dans la tête verte.
R3 — RÉSOLU.
- Mon F12 d'origine : 14 FAIL (« Nominal publication was declared incomplete »).
- F3 : 13 FAIL / 1 PASS.
- Marqueurs sans rapport (timestamp de A) ou inventaire partiel (3 alias) : rejetés.
- Admissibles : F10 et F10marker à 15 PASS ; marqueur lié à B, marqueur « en cours » effacé en cas de succès, marqueur lié à la cause : 15 PASS chacun.
R5 — RÉSOLU.
- Sentinelle neutre.
- Rejetés : mon F5d d'origine (2 FAIL), F5, F5c et le logger étranger.
- Admissibles : F11 et F11log à 3 PASS ; contrôles nominaux intacts.
Limite non bloquante. Un message qui nomme les deux méthodes mais attribue la panne à la mauvaise passe encore (2/2). C'est une limite d'interprétation de la langue naturelle, inscrite dans la portée bornée déclarée et documentée dans le fil R5.
Exécutions (Linux, Python 3.11.18, venv requirements/ci.txt, PYTHONHASHSEED=0) :
| Commande | Résultat |
|---|---|
reporter + helpers -W error |
114 PASS (86 + 28) |
pytest -q |
629 PASS / 3 SKIP / 62 deselected / 7 warnings |
check_m27_review.py --proofs-ref 3eab1fd --only baseline (preuve, helpers et conftest reconstruits depuis l'archive, outil de la tête) + pytest direct dans le checkout 3eab1fd |
38 FAIL / 7 PASS / 0 ERROR les deux fois |
check_m27_review.py --only F12 F3 F10 F10marker F5d F5 F5c F11 F11log |
conforme : 5 faux correctifs rejetés, 4 admissibles acceptés |
Black 24.4.2 (54 fichiers) / Ruff / pip check / git diff --check |
PASS ; worktree propre |
| CI 42945389910, job 130276822201 lu | c9c76ad = merge 0644bd0+1e22663 (contrôle, pas une fusion), Python 3.11.18, 629/3/62, Black / Ruff / pip PASS |
M01–M18 et N01–N08 ne sont pas rejoués : leurs sites et oracles n'ont pas changé depuis 38acff8.
Fils R1–R12 : tous résolus. Les 15 critères d'approbation sont satisfaits. La documentation R3/R5 est prudente (pas de schéma de manifeste, pas de garantie matérielle, diagnostic borné à AE/PCA).
Réserves non bloquantes conservées.
- R4 : la règle porte sur les clés
model*. - R1 :
"inf"accepté pour-inf. - R11 : provenance vérifiée par mots-clés.
- R5 : attribution en langue naturelle (ci-dessus).
- Concurrence entre processus et pannes matérielles hors périmètre.
Politiques humaines ouvertes : non-finis et signes, statut des erreurs de métriques, identifiants et collisions, publication et legacy, pairwise ou complete-case, références et IDs (#100/#50/#88), câblage de model_path (#95), versions et hashes.
Prochaine action : décision humaine de fusion de #99. M2.7 n'est pas marquée intégrée avant la fusion ; M2.8 non commencée.
Generated by Claude Code
Refs #43 — corrections finales limitées à R3/R5 après la seconde revue Claude. Dix fils résolus sont préservés ; seuls R3/R5 restent ouverts pour une troisième revue indépendante strictement limitée. Tests/helpers, preuves et documentation uniquement.
Même branche
audit/43-dimred-run-reporter, worktree existantAstroSpectro-m27. Tête 0644bd0 local=distant, working tree propre ; base/main 1e22663 ; blob production b966d9b90f056baa37c0ccbb68135c71ff65de92 inchangé. Deux commits : 3eab1fd (snapshot rouge poussé et relu sur GitHub), puis 0644bd0 (retrait normal des preuves de la tête verte). Aucun nouveau travail M2.8, branche, changement de production/notebooks/dépendances/données, force-push ou fusion.ValueError("numerical sentinel 4701"): l'identité AE/PCA vient du diagnostic. F5d attribution inversée : 2 FAIL par assertions pertinentes, F5 et F5c : 2 FAIL chacun. F11 propagation/chaînage et F11log diagnostic pertinent : 3 PASS chacun, nominal inclus. Tests verts du helper : attribution correcte, refus inversé/log étranger, statut structuré accepté.Contrôles ciblés et patches exacts : baseline 38 FAIL/7 PASS/0 ERROR/SKIP, 45 cas, pas 38 bugs. Les sélections adversariales incluent leur baseline, assertions et exécution des sites modifiés. Le HEAD actif des journaux est distingué des hashes LF réellement testés ; les octets archivés et les octets finaux de production/tests/helpers/fixture ont été rapprochés.
Troisième archive immuable : 3eab1fd1e23b92fe796fca090ad126a5fd636627. Rejeu du commit : 38 FAIL/7 PASS, inchangé. Les archives 51fe4d1, e0680e0 et 3eab1fd restent dans l'ascendance ; le ref original reste à 51fe4d1. Intégrité : 40 JSON historiques inchangés et fichiers protégés identiques à la base. Aucun résultat historique réécrit, aucun xfail.
Depuis la tête verte :
Le ref par défaut reconstruit preuve/helper/fixture exacts du troisième snapshot en copie jetable ; sortie par défaut ignorée
test-results/m27-r35-controls.json. Les campagnes M01–M18/N01–N08 ne sont pas relancées : code/oracles inchangés, résultats historiques accessibles dans la matrice et le manifeste.python -m pytest -q tests/test_dimred_run_reporter.py tests/test_reporter_review_contracts.py -W errorpython -m pytest -qpuispython -m pytest -q --import-mode=importlibc9c76ad(0644bd0 vers base1e22663), sans fusion de PR.Validation locale détaillée. NumPy2.4.6, pandas3.1.1, scipy1.17.1, sklearn1.9.1, joblib1.6.0, pytest8.4.2, Black24.4.2, Ruff0.5.0. Les suites complètes ont été exécutées après stabilisation des oracles ; le retrait du fichier rouge non collecté et le choix du ref par défaut n'en modifient pas les octets testés. Ciblés et baseline rejoués après retrait.
Les autres acquis R1/R2/R4/R6–R12 restent ceux de la première correction et de la seconde revue ; défauts de production #92–#98/#100 séparés et non corrigés. Les anciens journaux et liens CI restent disponibles dans l'historique. Publication/legacy, représentation NaN/Inf, propagation/statuts, collisions, alignement/IDs, provenance et politiques scientifiques restent ouverts. Les helpers sont bornés aux marqueurs concernés et aux métriques AE/PCA ; aucune validation astrophysique, des runs historiques, des backends complets ou des pannes matérielles n'est revendiquée. CI verte = contrôles configurés.
Réponses directes R3/R5 publiées ; ces deux fils restent ouverts pour Claude. Dix autres fils résolus inchangés. Arrêt après livraison pour troisième revue Claude limitée à F12/F5d, remèdes admissibles, archives, oracles et validations, puis décision scientifique humaine. PR reste Draft et non fusionnée, #43 ouverte ; M2.7 non intégrée, M2.8 non commencée.