Skip to content

fix: report.R durci - memoisation partagee, eval_error propage, constantes centralisees - #45

Merged
VincentGuyader merged 1 commit into
audit-0.4.10from
fix/issue-29-report-robustness
Jul 2, 2026
Merged

VincentGuyader merged 1 commit into
audit-0.4.10from
fix/issue-29-report-robustness

Conversation

@VincentGuyader

Copy link
Copy Markdown
Member

Closes #29

Les 4 points de l'issue

  1. Memoisation ignoree : datadiff_report_html() reconstruisait agent + rapport a chaque appel. Il passe par datadiff_render_report() : lit le cache alimente par print() et l'alimente en retour. Fallback synthetique one-shot pour un res assemble a la main (sans wrapper).
  2. eval_error masque : le garde any(n_failed > 0) routait un agent entierement en erreur d'evaluation (n_failed NA partout) vers la branche synthetique all-pass (extraits perdus), et le bloc vectorise forcait eval_error/eval_warning a FALSE. Le garde ajoute || any(eval_error) et les flags reels des steps mappes survivent au bloc vectorise. Note en commentaire : les erreurs d'evaluation des steps structurels ne sont volontairement pas surfacees par colonne.
  3. Code mort : les injections de compteurs par ligne du else (11 lignes) etaient integralement reecrites par le bloc vectorise authoritative-from-coverage - supprimees.
  4. Constantes : R/constants.R definit une fois les suffixes __ok/__eq, prefixes __missing_col_/__type_mismatch_ (+ helpers datadiff_ok_col()/datadiff_eq_col()) et les defauts warn/stop - partages par producteurs, consommateurs du verdict et mapping du rapport. Une derive unilaterale ne peut plus casser le mapping silencieusement. Le litteral public 1e-14 reste dans la signature (14 zeros remplaces) pour ne pas fuiter un symbole interne dans la section Usage du man.

Tests (TDD red-first)

test-report-robustness.R : contrat de cache (null avant, alimente par le premier datadiff_report_html, second appel identique au cache), eval_error sur step mappe survit, agent tout-NA-eval_error prend la branche reelle. 4 rouges avant fix.

Suite complete : 913 PASS / 0 FAIL sur la pile.

Review interne

pr-reviewer : APPROVE (mapping match() 1:1 verifie sur agent live, sweep des constantes verifie par grep, memoisation contenu-identique). Nits appliques : messages d'erreur de fast_path composes via les helpers de constantes, commentaire sur les eval_error structurels.

…antes centralisees (issue #29)

- datadiff_report_html() passe par datadiff_render_report() : lit le
  cache alimente par print() et l'alimente en retour (plus de double
  construction agent + rapport)
- un eval_error sur l'agent reel (n_failed NA) prend la branche reelle
  du build (le garde any(n_failed > 0) seul routait silencieusement vers
  la branche synthetique all-pass) et survit au bloc vectorise (qui
  forcait eval_error/eval_warning a FALSE sur toutes les lignes)
- bloc mort supprime dans build_report_agent : les injections de
  compteurs par ligne du else etaient integralement reecrites par le
  bloc vectorise authoritative-from-coverage
- R/constants.R : suffixes __ok/__eq, prefixes __missing_col_/
  __type_mismatch_ et defauts warn_at/stop_at definis une fois et
  partages par producteurs, consommateurs du verdict et mapping du
  rapport ; helpers datadiff_ok_col()/datadiff_eq_col()

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

This PR hardens datadiff’s report rendering path by reusing the existing lazy-report cache (shared with print()), correctly propagating pointblank evaluation errors into the rebuilt report agent, and centralizing internal naming/threshold constants to prevent silent mapping drift (per issue #29).

Changes:

  • datadiff_report_html() now reuses the memoized report via datadiff_render_report() when res$reponse is a datadiff_report, avoiding unnecessary agent/report rebuilds.
  • build_report_agent() no longer masks real eval_error / eval_warning for mapped steps and avoids incorrectly routing “pure eval_error” agents to the synthetic all-pass branch.
  • Introduces R/constants.R to centralize __ok/__eq and dummy-column naming conventions plus default warn/stop thresholds, and updates producers/consumers to use these helpers/constants.

Reviewed changes

Copilot reviewed 8 out of 8 changed files in this pull request and generated no comments.

Show a summary per file
File Description
tests/testthat/test-report-robustness.R Adds regression tests for shared memoization and eval_error propagation in the report agent.
R/tolerance.R Switches __ok/__eq column naming to centralized helpers (datadiff_ok_col(), datadiff_eq_col()).
R/report.R Reuses the lazy-report cache in datadiff_report_html(), preserves mapped step eval flags, removes dead count-injection code, and uses centralized defaults.
R/pointblank_setup.R Uses centralized dummy-column prefixes and equality/tolerance column helpers when building pointblank agents.
R/fast_path.R Uses centralized helpers for boolean column lookup and improves related internal error messages accordingly.
R/constants.R Adds shared internal constants and helpers for naming conventions and default warn/stop thresholds.
R/compare_datasets_from_yaml.R Aligns default threshold literal formatting and switches internal suffix usage to shared constants/helpers.
NEWS.md Documents the robustness changes and the new centralized constants (issue #29).

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

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.

2 participants