Skip to content

test(dimred): audit run reporter artifacts and reproducibility (M2.7) - #99

Merged
PhD-Brown merged 10 commits into
mainfrom
audit/43-dimred-run-reporter
Nov 11, 2026
Merged

PhD-Brown merged 10 commits into
mainfrom
audit/43-dimred-run-reporter

Conversation

@PhD-Brown

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

Copy link
Copy Markdown
Owner

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

Fil Correction et discrimination
R3 Après A nominal, le groupe doit être publié sans être déclaré incomplet. Après panne B, un marqueur doit identifier les quatre alias et être lié au timestamp B ou à la cause injectée. À défaut, lecture effective des contenus, legacy et archives. Aucun schéma de manifeste imposé. F12 permanent : 14 FAIL ; F3 rollback incomplet : 13 FAIL/1 PASS. F10 et F10marker : 15 PASS chacun, nominal inclus.
R5 Cause injectée neutre 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 :

python audit/check_m27_review.py --only baseline
python audit/check_m27_review.py --only F12 F3 F10 F10marker F5d F5 F5c F11 F11log

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.

Validation réellement exécutée Résultat
python -m pytest -q tests/test_dimred_run_reporter.py tests/test_reporter_review_contracts.py -W error 114 PASS : reporter86 + helpers28
python -m pytest -q puis python -m pytest -q --import-mode=importlib Windows/Python3.11.9 : 632 PASS/62 exclus/7 warnings Gaia préexistants, chacune
Black/Ruff, dont les cinq scripts M27 ; pip check ; git diff --check ; intégrité protégée PASS
CI sur la tête finale 42945389910 completed/success ; journal130276822201 lu : Linux/Python3.11.18, 629 PASS/3 SKIP/62 exclus/7 warnings ; pip check/Black40/Ruff PASS. Merge de contrôle c9c76ad (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.

@PhD-Brown PhD-Brown left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

Première revue 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

  1. 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
  1. Trois remèdes admissibles sont rejetés pour leur seul type d'exception : F9 (refus RuntimeError avant écriture), F10 (rollback complet + RuntimeError chaînée), F11 (propagation chaînée). F4c (model_path=None) et F6c (pairwise) sont correctement acceptés.
  2. 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 → pca dans n_keep_spec, variance_thresholds_spec, pca_spectra.variance_explained_total et variance_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) dans reconstruction_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) dans umap3d_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

Comment thread audit/M27_PROOFS.md Resolved
Comment thread audit/M27_PROOFS.md Resolved
Comment thread audit/M27_PROOFS.md Resolved
Comment thread audit/M27_PROOFS.md Resolved
Comment thread audit/M27_PROOFS.md Resolved
Comment thread tests/conftest.py Resolved
Comment thread tests/test_dimred_run_reporter.py Resolved
Comment thread tests/test_dimred_run_reporter.py Resolved
Comment thread tests/test_dimred_run_reporter.py Resolved
Comment thread audit/M27_RUN_REPORTER.md Resolved

@PhD-Brown PhD-Brown left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

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 PhD-Brown left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

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

@PhD-Brown
PhD-Brown marked this pull request as ready for review November 11, 2026 02:36
@PhD-Brown
PhD-Brown merged commit 39dad87 into main Nov 11, 2026
1 check passed
@PhD-Brown
PhD-Brown deleted the audit/43-dimred-run-reporter branch November 11, 2026 02:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant