eval-toolkit 0.50.0__tar.gz → 1.0.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (185) hide show
  1. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/.gitignore +8 -0
  2. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/CHANGELOG.md +298 -0
  3. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/PKG-INFO +40 -43
  4. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/README.md +39 -42
  5. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/src/eval_toolkit/__init__.py +8 -0
  6. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/src/eval_toolkit/_rng.py +28 -9
  7. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/src/eval_toolkit/_sweep.py +31 -3
  8. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/src/eval_toolkit/_version.py +1 -1
  9. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/src/eval_toolkit/analysis.py +24 -1
  10. eval_toolkit-1.0.1/src/eval_toolkit/audit_citation_alignment.py +301 -0
  11. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/src/eval_toolkit/bootstrap.py +43 -4
  12. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/src/eval_toolkit/calibration.py +29 -0
  13. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/src/eval_toolkit/claims.py +19 -1
  14. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/src/eval_toolkit/harness.py +84 -5
  15. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/src/eval_toolkit/losses.py +10 -0
  16. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/src/eval_toolkit/metric_specs.py +7 -0
  17. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/src/eval_toolkit/protocols.py +19 -1
  18. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/src/eval_toolkit/splits.py +38 -5
  19. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/src/eval_toolkit/thresholds.py +49 -19
  20. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/golden/public_api/snapshot.json +32 -2
  21. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_analysis.py +20 -0
  22. eval_toolkit-1.0.1/tests/test_audit_citation_alignment.py +242 -0
  23. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_bootstrap_calibration_mc.py +12 -5
  24. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_bootstrap_unit.py +67 -0
  25. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_calibration_unit.py +18 -0
  26. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_harness_folded.py +76 -0
  27. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_harness_parallelism.py +77 -0
  28. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_losses.py +14 -0
  29. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_protocol_conformance.py +46 -0
  30. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_recall_at_fpr.py +45 -0
  31. eval_toolkit-1.0.1/tests/test_rng.py +97 -0
  32. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_scorecard.py +12 -0
  33. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_sweep.py +54 -0
  34. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/LICENSE +0 -0
  35. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/STYLE.md +0 -0
  36. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/docs/archive/README.md +0 -0
  37. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/docs/research/README.md +0 -0
  38. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/docs/research/datasets/README.md +0 -0
  39. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/docs/research/papers/data-integrity/README.md +0 -0
  40. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/docs/research/papers/eval-ecosystem/README.md +0 -0
  41. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/docs/research/papers/inference/README.md +0 -0
  42. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/docs/research/papers/prompt-injection/README.md +0 -0
  43. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/docs/source/adr/README.md +0 -0
  44. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/docs/source/methodology/README.md +0 -0
  45. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/pyproject.toml +0 -0
  46. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/src/eval_toolkit/__main__.py +0 -0
  47. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/src/eval_toolkit/_deprecated.py +0 -0
  48. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/src/eval_toolkit/_parallel.py +0 -0
  49. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/src/eval_toolkit/adversarial.py +0 -0
  50. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/src/eval_toolkit/artifacts.py +0 -0
  51. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/src/eval_toolkit/config.py +0 -0
  52. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/src/eval_toolkit/docs.py +0 -0
  53. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/src/eval_toolkit/embeddings.py +0 -0
  54. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/src/eval_toolkit/evidence.py +0 -0
  55. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/src/eval_toolkit/leakage.py +0 -0
  56. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/src/eval_toolkit/loaders.py +0 -0
  57. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/src/eval_toolkit/manifest.py +0 -0
  58. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/src/eval_toolkit/metrics.py +0 -0
  59. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/src/eval_toolkit/operating_points.py +0 -0
  60. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/src/eval_toolkit/paths.py +0 -0
  61. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/src/eval_toolkit/plotting.py +0 -0
  62. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/src/eval_toolkit/preprocessing.py +0 -0
  63. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/src/eval_toolkit/probes.py +0 -0
  64. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/src/eval_toolkit/provenance.py +0 -0
  65. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/src/eval_toolkit/py.typed +0 -0
  66. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/src/eval_toolkit/schemas/manifest.v1.json +0 -0
  67. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/src/eval_toolkit/schemas/manifest.v2.json +0 -0
  68. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/src/eval_toolkit/schemas/manifest.v3.json +0 -0
  69. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/src/eval_toolkit/schemas/ood_manifest.v1.json +0 -0
  70. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/src/eval_toolkit/schemas/results.v1.json +0 -0
  71. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/src/eval_toolkit/schemas/results_full.v1.json +0 -0
  72. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/src/eval_toolkit/scorecards.py +0 -0
  73. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/src/eval_toolkit/seeds.py +0 -0
  74. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/src/eval_toolkit/stacking.py +0 -0
  75. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/src/eval_toolkit/text_dedup.py +0 -0
  76. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/baseline/test_plotting_visual/plot_bootstrap_distribution.png +0 -0
  77. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/baseline/test_plotting_visual/plot_confusion_matrix_grid.png +0 -0
  78. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/baseline/test_plotting_visual/plot_lift_ci.png +0 -0
  79. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/baseline/test_plotting_visual/plot_metric_bars.png +0 -0
  80. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/baseline/test_plotting_visual/plot_pareto_frontier.png +0 -0
  81. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/baseline/test_plotting_visual/plot_pr_curve.png +0 -0
  82. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/baseline/test_plotting_visual/plot_reliability_diagram.png +0 -0
  83. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/baseline/test_plotting_visual/plot_roc_curve.png +0 -0
  84. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/baseline/test_plotting_visual/plot_score_histograms.png +0 -0
  85. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/baseline/test_plotting_visual/plot_slice_metric_heatmap.png +0 -0
  86. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/benchmarks/__init__.py +0 -0
  87. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/benchmarks/test_kernel_benchmarks.py +0 -0
  88. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/conftest.py +0 -0
  89. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/golden/bootstrap_ci/cases.json +0 -0
  90. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/golden/data/dedup_holdout.jsonl +0 -0
  91. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/golden/data/dedup_holdout_expected.json +0 -0
  92. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/golden/data/dedup_holdout_provenance.md +0 -0
  93. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/golden/docs/expected.md +0 -0
  94. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/golden/docs/input.md +0 -0
  95. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/golden/docs/metrics.json +0 -0
  96. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/golden/test_dedup_holdout_calibration.py +0 -0
  97. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/strategies.py +0 -0
  98. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_adversarial.py +0 -0
  99. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_artifacts.py +0 -0
  100. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_block_bootstrap_on_folds.py +0 -0
  101. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_bootstrap_edge_cases.py +0 -0
  102. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_bootstrap_golden.py +0 -0
  103. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_bootstrap_njobs.py +0 -0
  104. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_bootstrap_props.py +0 -0
  105. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_bootstrap_research_grounded.py +0 -0
  106. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_calibration_binary_adapters.py +0 -0
  107. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_calibration_bootstrap_chain.py +0 -0
  108. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_calibration_determinism.py +0 -0
  109. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_calibration_optimization_failures.py +0 -0
  110. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_calibration_props.py +0 -0
  111. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_calibration_research_grounded.py +0 -0
  112. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_claims.py +0 -0
  113. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_claims_coverage.py +0 -0
  114. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_claims_props.py +0 -0
  115. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_cli.py +0 -0
  116. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_config.py +0 -0
  117. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_coverage_bootstrap.py +0 -0
  118. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_coverage_calibration.py +0 -0
  119. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_coverage_harness.py +0 -0
  120. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_coverage_metrics.py +0 -0
  121. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_coverage_plotting.py +0 -0
  122. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_croissant_e2e.py +0 -0
  123. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_dedup_split_leakage_chain.py +0 -0
  124. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_deprecated_scalars_shim.py +0 -0
  125. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_deprecations.py +0 -0
  126. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_docs_golden.py +0 -0
  127. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_docs_props.py +0 -0
  128. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_embeddings.py +0 -0
  129. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_evidence_validators.py +0 -0
  130. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_harness_edge_cases.py +0 -0
  131. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_harness_fault_injection.py +0 -0
  132. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_harness_internals.py +0 -0
  133. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_harness_metric_options.py +0 -0
  134. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_harness_smoke.py +0 -0
  135. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_import_boundaries.py +0 -0
  136. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_is_metric_defined_for_slice.py +0 -0
  137. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_lazy_extras_messages.py +0 -0
  138. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_leakage.py +0 -0
  139. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_leakage_error_paths.py +0 -0
  140. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_leakage_props.py +0 -0
  141. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_loaders.py +0 -0
  142. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_loaders_coverage.py +0 -0
  143. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_loaders_props.py +0 -0
  144. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_logging.py +0 -0
  145. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_manifest.py +0 -0
  146. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_manifest_contamination_round_trip.py +0 -0
  147. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_manifest_props.py +0 -0
  148. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_manifest_validation.py +0 -0
  149. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_metrics_props.py +0 -0
  150. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_metrics_stratified_subsets.py +0 -0
  151. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_metrics_unit.py +0 -0
  152. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_misc_coverage.py +0 -0
  153. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_numeric_edge_cases.py +0 -0
  154. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_ood_loader.py +0 -0
  155. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_operating_points.py +0 -0
  156. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_operating_points_props.py +0 -0
  157. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_parallel.py +0 -0
  158. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_paths.py +0 -0
  159. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_pipeline_e2e.py +0 -0
  160. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_plotting_edge.py +0 -0
  161. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_plotting_smoke.py +0 -0
  162. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_plotting_visual.py +0 -0
  163. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_preprocessing.py +0 -0
  164. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_probes.py +0 -0
  165. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_provenance.py +0 -0
  166. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_public_api.py +0 -0
  167. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_reference_equivalence.py +0 -0
  168. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_reproducibility_integration.py +0 -0
  169. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_schemas.py +0 -0
  170. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_seeds.py +0 -0
  171. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_splits.py +0 -0
  172. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_splits_leakage_integration.py +0 -0
  173. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_splits_props.py +0 -0
  174. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_stacking.py +0 -0
  175. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_text_dedup.py +0 -0
  176. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_text_dedup_coverage.py +0 -0
  177. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_text_dedup_props.py +0 -0
  178. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_text_dedup_strategies.py +0 -0
  179. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_thresholds.py +0 -0
  180. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_thresholds_constant_score.py +0 -0
  181. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_thresholds_coverage.py +0 -0
  182. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_thresholds_props.py +0 -0
  183. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_thresholds_research_grounded.py +0 -0
  184. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_tokenization_leakage_check.py +0 -0
  185. {eval_toolkit-0.50.0 → eval_toolkit-1.0.1}/tests/test_v09_contracts.py +0 -0
@@ -54,6 +54,14 @@ mutants/
54
54
  gate3-audit-prompt.md
55
55
  gate3-audit-report.md
56
56
  gate3-audit-round-*-report.md
57
+ # R8-C10 audit fix: extend to cover the comprehensive-audit-* and
58
+ # audit-verification-* naming conventions introduced at v0.50/v0.51.
59
+ codex-comprehensive-audit-*-report.md
60
+ codex-microaudit-*.md
61
+ gemini-microaudit-*.md
62
+ audit-gemini.md
63
+ comprehensive-audit-codex.md
64
+ audit-verification-*.md
57
65
 
58
66
  # Claude Code project settings (machine-local)
59
67
  .claude/
@@ -5,6 +5,304 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [1.0.1] — 2026-05-25 — audit_citation_alignment + RC4 docs polish
9
+
10
+ First v1.x patch release. Ships the `audit_citation_alignment` validator
11
+ that's been pre-staged by consumer `prompt-injection-detection-prototype`
12
+ (see #77), plus the smallest #76 cleanup item (RC4).
13
+
14
+ ### Added
15
+
16
+ - **`audit_citation_alignment` module** — flat-module per [ADR 0001](docs/source/adr/0001-flat-module-layout.md)
17
+ (stay-flat-through-v1.x; subpackage restructure deferred to v2.0).
18
+ Exports `validate_citations(...)`, `ADRSubject`, `CitationMisalignment`,
19
+ and `extract_adr_subject_category` as Tier 1 STRICT (per
20
+ [ADR 0003](docs/source/adr/0003-stability-contract-and-gate3-methodology.md)).
21
+ Validator catches the bug class where a markdown surface cites "per
22
+ ADR-NNN" but the cited ADR's actual subject doesn't match the
23
+ surrounding claim category — motivated by the V1.3.2 P1-2 finding in
24
+ the consumer `prompt-injection-detection-prototype` audit where
25
+ `docs/REPRODUCIBILITY.md:76` cited ADR-029 (test markers) for a
26
+ tier-lock claim that should have cited ADR-034 (reproducibility tier
27
+ ladder). The mis-citation went undetected by lychee (URL-resolves
28
+ check), consumer's `audit_numbers.py` (numeric values), and consumer's
29
+ `audit_adr_count_claims.py` (count claims). Closes #73.
30
+ - **Pre-tag dogfood**: `validate_citations()` exercised against
31
+ eval-toolkit's own docs (95 files including README + audit_findings +
32
+ methodology + migration guides) — 0 misalignments found. Validator
33
+ proven in production use before consumers adopt.
34
+
35
+ ### Fixed
36
+
37
+ - **RC4** (#76 cleanup) — v0.51 documentation count-tally reconciliation
38
+ across `docs/source/audit_findings.md`, `docs/source/migration/v0.51.md`,
39
+ and `CHANGELOG.md` `[0.51.0]` section. Canonical tally now consistent:
40
+ **13 confirmed → fixed in v0.51 / 3 refuted (R8-G2 + R8-G5 + R8-V1+V2
41
+ paired) / 2 deferred (R8-G3, R8-G4) = 18 total**. Prior drift was
42
+ "left 2 undecided" (migration/v0.51) vs "deferred" (CHANGELOG) +
43
+ ambiguity in the audit_findings ship-status section. Closes RC4 of #76.
44
+
45
+ ## [1.0.0] — 2026-05-25 — Stability contract activates per ADR 0003
46
+
47
+ v1.0 is a **stability-contract activation**, not a code delta from v0.51.
48
+ Every fix that landed at v0.51 is what v1.0 ships; the new thing at v1.0
49
+ is that the [ADR 0003](docs/source/adr/0003-stability-contract-and-gate3-methodology.md)
50
+ Tier 1 / Tier 2 / Tier 3 stability contract becomes load-bearing.
51
+ Breaking changes to Tier-1 surfaces after v1.0 require a major bump (v2.0).
52
+
53
+ ### Contract activation
54
+
55
+ - **Tier 1 STRICT** — public-API signatures captured in
56
+ `tests/golden/public_api/snapshot.json`. Any signature drift bumps to v2.0.
57
+ - **Tier 2 ADDITIVE** — the 9 strict Protocols (`Scorer`, `LeakageCheck`,
58
+ `Splitter`, `ThresholdSelector`, `DatasetLoader`, `MetricSpec`,
59
+ `MetaLearner`, `Probe`, `TextTransform`) + 1 opt-in (`Versioned`).
60
+ Method shapes are frozen; additive subprotocols + new Protocols allowed.
61
+ - **Tier 3 FREE** — internal modules (prefixed `_`). Refactors don't
62
+ bump major.
63
+
64
+ ### Gate 3 audit closure (Rounds 5 → 10)
65
+
66
+ The multi-LLM cross-review sequence is closed. Per ADR 0003, Gate 3
67
+ substitutes Codex + Gemini + Claude independent reads for external
68
+ academic peer review. Outcomes:
69
+
70
+ - **Round 8** (against v0.50): 13 confirmed → fixed in v0.51; 3 refuted;
71
+ 2 v1.x-deferred (R8-G3 custom exceptions; R8-G4 joblib OOM capping).
72
+ - **Round 9** (against v0.51 RC): 6 confirmed of 10 source items + 3
73
+ third-audit findings in modules neither auditor cited. 2 candidate-
74
+ blocker items fixed in-PR before tag.
75
+ - **Round 10** (micro-audit on R9 follow-on commit): 3 Codex confirmed →
76
+ fixed in v0.51; 1 accept-as-design (Gemini); 1 refuted (Gemini
77
+ Pattern-1 violation).
78
+
79
+ Full ledger at `docs/source/audit_findings.md` Rounds 5 → 10. v1.0.1
80
+ cleanup batch tracked at GH issue #76.
81
+
82
+ ### Carried-over deprecations
83
+
84
+ The R8-C1 `DeprecationWarning` on multi-seed `evaluate_folded(seeds=...)`
85
+ calls without an explicit `reseed_splitter` callback **persists past v1.0
86
+ by design** (pre-v1.0 deprecation window is one minor; `DEPRECATION.md`
87
+ requires ≥2 minors to close a cycle). Single-seed callers see no change;
88
+ multi-seed callers should pass `reseed_splitter` for true seed variance.
89
+
90
+ ### Migration
91
+
92
+ If your consumer is on v0.51, nothing changes. If on v0.50 or earlier,
93
+ follow [`docs/source/migration/v0.51.md`](docs/source/migration/v0.51.md)
94
+ for the actual migration steps. Downstream projects should pin
95
+ `eval-toolkit>=1.0,<2.0` to opt into the stability contract.
96
+
97
+ ## [0.51.0] — 2026-05-24 — Round 8 rectification batch
98
+
99
+ The 18-item rectification batch following the Round 8 multi-LLM audit
100
+ (Codex + Gemini reports verified at
101
+ `audit-verification-codex-gemini-v0.50.0.md`, 2026-05-24). Per Decision
102
+ Y.2 + the staggered-pre-v1.0 plan, v0.51.0 is a BREAKING-allowed
103
+ minor bundling all fixes before v1.0 tags. Round 9 audit runs against
104
+ the v0.51 RC.
105
+
106
+ **Audit outcome**: 13 confirmed → fixed in this release; 2 deferred
107
+ (R8-G3 custom exceptions, R8-G4 joblib OOM capping) to v1.x as Tier-2
108
+ additive; 3 refuted (R8-G2 cyclic-import framing; R8-G5 cherry-picked
109
+ weak test; R8-V1 + R8-V2 over-confident Gemini validations). See
110
+ `docs/source/audit_findings.md` Round 8 section for the full ledger.
111
+
112
+ **Round 9 follow-on**: a Round 9 multi-LLM cross-review (Codex + Gemini)
113
+ ran against the v0.51 RC pre-tag. Verified by Claude at
114
+ `audit-verification-round-9-v0.51.0.md` (6 confirmed / 3 refuted / 1
115
+ partial; plus 3 third-audit fixes in modules neither auditor cited).
116
+ **Two third-audit findings + one source-report regression fix shipped
117
+ in this RC pre-tag** (commit-graph below); the remaining 4 deferred
118
+ items go to v1.0.1. See `audit_findings.md` Round 9 section for the
119
+ full ledger.
120
+
121
+ ### Added (Round 9 follow-on)
122
+
123
+ - **R9-F-sweep-1** (CANDIDATE v1.0 BLOCKER closed) — `_sweep.py:
124
+ _validate_scorer_output()` now validates scorer output is finite
125
+ (no NaN / +inf / -inf), not just shape. Pre-R9 follow-on, NaN/inf
126
+ scores passed R7-C's shape check and silently propagated into the
127
+ sweep DataFrame, then silently zeroed the ASR flag (NaN >= threshold
128
+ is False). Closes the "no silent failures" invariant gap R7-C
129
+ established for shape but didn't extend to finiteness. Brings sweep
130
+ validation to parity with `stacking.py`'s `_validate_fit_inputs` /
131
+ `_validate_predict_inputs`. Tier-2 additive — callers whose scorers
132
+ were silently producing NaN now get a clear `ValueError` with
133
+ diagnostic context.
134
+
135
+ - **R9-F-bootstrap-1** — `bootstrap.bootstrap_ci(...)` emits a
136
+ `UserWarning` when scipy's BCa method degenerates (returns
137
+ `ci_low == ci_high == point` or non-finite bounds). Pre-R9, the
138
+ R8-C4(b) RNG bug spuriously varied bootstrap streams and could mask
139
+ BCa degeneracy on small-n + ceiling/floor-metric inputs; post-R8 with
140
+ correct RNG, the brittleness is exposed. Warning text recommends
141
+ `method='percentile'` as the safer fallback at small n. The default
142
+ remains `method='BCa'` (preserves bit-stability for non-degenerate
143
+ cases); auto-fallback is deferred to v1.0.1 if user demand.
144
+
145
+ - **R9-F-bootstrap-2** — `bootstrap.mde_from_ci(...)` now explicitly
146
+ rejects NaN CI width with `RuntimeError`. Pre-R9, NaN width
147
+ (possible when scipy BCa returns NaN bounds) bypassed the
148
+ `if width <= 0` check (NaN <= 0 is False in IEEE float) and
149
+ silently returned `MDEEstimate.mde = NaN`. Bundled with F-bootstrap-1.
150
+
151
+ ### Fixed (Round 10 follow-on)
152
+
153
+ Pre-tag scoped Codex + Gemini micro-audit on `edadddc` surfaced 3
154
+ Codex-confirmed findings (all fix-recommended / minor; no v1.0
155
+ blockers). Verified by Claude; 1 Gemini accept-as-design + 1 Gemini
156
+ refuted (Pattern-1 violation; calibration record in
157
+ `audit_findings.md` Round 10 section). All 3 confirmed findings
158
+ shipped in this RC pre-tag:
159
+
160
+ - **R10-F1** — `protocols.Scorer.predict_proba` docstring + `_sweep.py`
161
+ error message clarification. Pre-R10, `_validate_scorer_output`'s
162
+ runtime error said "finite floats in [0, 1]" but the boundary check
163
+ only enforced finiteness (no range validation); the Scorer Protocol
164
+ docstring also lacked an explicit `[0, 1]` contract statement. R10-F1
165
+ extends the Protocol docstring to document calibrated-probability
166
+ semantics + reword the sweep runtime message to drop the unenforced
167
+ `[0, 1]` claim. Range enforcement is intentionally deferred to a
168
+ future minor once consumer usage patterns clarify whether the
169
+ Protocol should be strict (`[0, 1]`) or permissive (ranking scores).
170
+
171
+ - **R10-F2** — `tests/test_bootstrap_unit.py::test_bootstrap_ci_bca_degeneracy_emits_warning`
172
+ test predicate hardening. Pre-R10, the test's assertion block used
173
+ `if ci.ci_low == ci.ci_high == ci.point_estimate:` — but NaN==NaN is
174
+ False in IEEE float, so the assertions were silently skipped on the
175
+ current scipy fixture (which returns NaN bounds). The test passed
176
+ WITHOUT proving the warning fires for the common degeneracy mode.
177
+ R10-F2 mirrors the production predicate exactly:
178
+ `(not np.isfinite(low)) or (not np.isfinite(high)) or (low == high == point)`.
179
+ The assertion block now runs whenever ANY degeneracy mode fires.
180
+
181
+ - **R10-F3** — `bootstrap.mde_from_ci` docstring update for the
182
+ R9-F-bootstrap-2 non-finite-width branch. Pre-R10, the Raises section
183
+ said "non-positive width" only; the implementation has also been
184
+ rejecting non-finite width since `edadddc` but the docstring lagged.
185
+ R10-F3 updates the Raises text to "non-positive or non-finite width"
186
+ and adds a 4-line note explaining the scipy-BCa NaN-bound motivation
187
+ so callers understand the new behavior is intentional, not incidental.
188
+
189
+ ### Added
190
+
191
+ - **R8-C6** — `calibration.reliability_curve(...)` and
192
+ `calibration.maximum_calibration_error(...)` now call
193
+ `_validate_calibrated_score(y_score)` BEFORE the sklearn dispatch.
194
+ Pre-v0.51 these functions silently accepted raw logits (any range);
195
+ sibling `metrics.expected_calibration_error*` variants already
196
+ validated input range via the same helper. Now symmetric — out-of-range
197
+ scores raise `ValueError` with the same actionable diagnostic. Also,
198
+ `calibration.fit_temperature(...)` now validates the `bounds` tuple
199
+ (finiteness, positivity, `lo < hi`) BEFORE forwarding to
200
+ `scipy.optimize.minimize_scalar` — cryptic optimizer errors replaced
201
+ with actionable input-validation errors.
202
+
203
+ - **R8-F1** — `losses.RecallAtLowFPR.__init__(...)` now validates
204
+ `pos_weight > 0` at construction time, matching the sibling-kwarg
205
+ validators for `fpr_target` and `fpr_smoothing_beta`. Pre-v0.51
206
+ non-positive `pos_weight` produced degenerate-but-bounded loss
207
+ values silently.
208
+
209
+ - **R8-F2** — `metric_specs.ece(n_bins=, strategy=)` factory now validates
210
+ `n_bins` eagerly at spec-construction time (matches the eager
211
+ `strategy` validation already present). Pre-v0.51 `n_bins`
212
+ validation was deferred to compute time.
213
+
214
+ - **R8-F3** — `analysis.CsvPredictionReader.read_predictions(...)` now
215
+ detects missing CSV columns at read time and raises a
216
+ `ValueError(f"CSV file at {uri!r} is missing required column(s) ...")`
217
+ with the file path + available columns. Pre-v0.51 missing columns
218
+ were silently filled with empty strings, causing cryptic
219
+ `ValueError: invalid literal for int() with base 10: ''` downstream
220
+ in `load_prediction_arrays`'s dtype conversion. Root cause now
221
+ surfaces at the boundary.
222
+
223
+ - **R8-C1** — `harness.evaluate_folded(...)` now accepts an optional
224
+ `reseed_splitter: Callable[[Splitter, int], Splitter] | None`
225
+ callback. When provided, each seed iteration calls
226
+ `reseed_splitter(splitter, seed)` to produce a fresh splitter for
227
+ that seed's fold iteration. Default `None` preserves the historical
228
+ behavior (the same splitter instance is reused across the seed loop,
229
+ so multi-seed × CV only varies the bootstrap RNG, not fold
230
+ partitions) AND emits a `DeprecationWarning` when `len(seeds) > 1`.
231
+ The warning persists past v1.0 because the pre-v1.0 deprecation
232
+ window (v0.51 → v1.0) is one minor and ADR 0003 / DEPRECATION.md
233
+ require ≥2 minors to close a cycle. Migration example::
234
+
235
+ from dataclasses import replace
236
+ evaluate_folded(
237
+ scorers, splitter, slice_,
238
+ seeds=(1, 2, 3),
239
+ reseed_splitter=lambda sp, s: replace(sp, seed=s),
240
+ ...
241
+ )
242
+
243
+ R8-C1 audit fix.
244
+
245
+ ### BREAKING
246
+
247
+ - **R8-C2** — `SourceDisjointKFoldSplitter.iter_folds(...)` now caps
248
+ the fold count at `min(self.k, n_sources)` (matching
249
+ `get_n_splits(...)`). Pre-v0.51 the loop ran `range(self.k)` and
250
+ yielded EMPTY test partitions for the surplus folds when
251
+ `k > n_sources` while `get_n_splits` returned `min(k, n_sources)`
252
+ — the two methods silently disagreed on fold count. v0.51 caps both
253
+ at the same value AND emits a `UserWarning` when `k > n_sources` so
254
+ the caller knows the cap was applied. Callers that consumed the
255
+ surplus empty-test folds will see fewer iterations now; that was
256
+ the bug. (Probe-verified at
257
+ `audit-verification-codex-gemini-v0.50.0.md`.)
258
+
259
+ - **R8-C3** — `thresholds.recall_at_fpr(...)` fallback semantics changed
260
+ when no threshold satisfies `target_fpr`. Pre-v0.51 the fallback set
261
+ `threshold = 1.0` and then computed `y_pred = (y_score >= 1.0)` —
262
+ inclusive comparator — which classified any negative-class sample
263
+ with score exactly 1.0 as predicted-positive. The probe
264
+ `recall_at_fpr(y=[0,1], scores=[1.0,1.0], target_fpr=0.0)` returned
265
+ `actual_fpr=1.0, fp=1` in silent violation of the function's
266
+ FPR-ceiling invariant. v0.51 returns a SENTINEL
267
+ `RecallAtFprResult(threshold=np.inf, recall=0.0, actual_fpr=0.0,
268
+ fp=0, tn=n_val_neg)` whenever the constraint is unsatisfiable.
269
+ Callers detect via `np.isinf(result.threshold)`. The
270
+ `actual_fpr ≤ target_fpr` invariant is now preserved by construction.
271
+ Migration: any caller filtering on `result.threshold` should add an
272
+ `np.isinf(...)` branch — pre-v0.51 the sentinel value was `1.0`.
273
+ (Verified at `audit-verification-codex-gemini-v0.50.0.md`.)
274
+
275
+ - **R8-C4(a)** — `harness.evaluate(...)` with a `Generator`-typed `rng`
276
+ is now bit-stable across `n_jobs` values. Prior to v0.51, the same
277
+ `rng` object was attached to every `(slice, scorer)` work_unit;
278
+ joblib forked copies at the SAME generator state into N parallel
279
+ workers, so every worker used identical bootstrap sample streams —
280
+ silently producing non-independent CIs across `(slice, scorer)`
281
+ pairs in parallel mode and divergent results vs sequential mode.
282
+ The v0.51 implementation spawns one independent `SeedSequence` per
283
+ work unit at the dispatch boundary in `_score_all_slices` (depends
284
+ on the R8-C4(b) `spawn_seed_sequences` fix). Each pair now sees an
285
+ independent bootstrap stream; sequential (`n_jobs=1`) and parallel
286
+ (`n_jobs>1`) modes produce bit-identical CIs per the SPEC 7
287
+ contract at `docs/source/methodology/parallelism.md`. Integer `rng`
288
+ callers (the common case) are unaffected. (Verified by multi-slice
289
+ probe at `audit-verification-codex-gemini-v0.50.0.md`.)
290
+
291
+ - **R8-C4(b)** — `eval_toolkit._rng.spawn_seed_sequences(rng, n)` now
292
+ respects `Generator` state. Prior to v0.51, the function extracted
293
+ the bit-generator's seed_seq and called `.spawn(n)` on it — so a
294
+ `Generator` advanced by prior draws produced the same children as a
295
+ fresh `Generator` with the same construction seed. The new
296
+ implementation draws `n` fresh entropy values FROM the generator
297
+ via `rng.integers(0, 2**63-1, size=n)` and wraps each in a
298
+ `SeedSequence`. Each call advances generator state, so repeated
299
+ calls on the same instance yield different children. This was the
300
+ root cause of bootstrap non-independence across `(slice, scorer)`
301
+ pairs in `harness.evaluate` — when the same `Generator` was shared
302
+ across bootstrap callsites, all callsites silently used the same
303
+ resample stream. (Verified probe at
304
+ `audit-verification-codex-gemini-v0.50.0.md`.)
305
+
8
306
  ## [0.50.0] — 2026-05-23 — SPEC 7 `rng` parameter adoption
9
307
 
10
308
  The SPEC 7 follow-up to v0.49.0. The `_rng.py` scaffold shipped at
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: eval-toolkit
3
- Version: 0.50.0
3
+ Version: 1.0.1
4
4
  Summary: Reusable evaluation contracts for binary classification: metrics, bootstrap CIs, calibration, artifacts, and evidence gates.
5
5
  Project-URL: Homepage, https://github.com/brandon-behring/eval-toolkit
6
6
  Project-URL: Documentation, https://brandon-behring.github.io/eval-toolkit/
@@ -114,7 +114,8 @@ format changes.
114
114
  │ gpu_info + leakage_report (NeurIPS-aligned) │
115
115
  ├─ Tier 2 ─ Protocol-based orchestration ────────────────┤
116
116
  │ Scorer / SliceAwareScorer / LeakageCheck / Splitter │
117
- │ ThresholdSelector / DatasetLoader / SimilarityStrategy
117
+ │ ThresholdSelector / DatasetLoader / MetricSpec
118
+ │ MetaLearner / Probe / TextTransform (9 strict) │
118
119
  │ Versioned (opt-in: per-object versions in manifest) │
119
120
  ├─ Tier 1 ─ Functional core ─────────────────────────────┤
120
121
  │ pr_auc / roc_auc / ECE variants / Brier / bootstrap_ci│
@@ -129,69 +130,65 @@ run: capture the manifest.
129
130
 
130
131
  ## Documentation
131
132
 
132
- - **[Getting started](docs/getting-started.md)** — end-to-end
133
+ - **[Getting started](docs/source/getting-started.md)** — end-to-end
133
134
  walkthrough for new users: install, define a Scorer, build slices,
134
135
  run `evaluate()`, persist results, add a claim, render a plot.
135
- - **[Methodology curriculum](docs/methodology/README.md)** — 16
136
+ - **[Methodology curriculum](docs/source/methodology/README.md)** — 16
136
137
  chapters on splits, metrics, calibration, evidence gates,
137
138
  prediction artifacts, and more.
138
- - **[Schema reference](docs/schemas.md)** — field-by-field semantics
139
+ - **[Schema reference](docs/source/schemas.md)** — field-by-field semantics
139
140
  for `results.v1.json`, `results_full.v1.json`, `manifest.v1.json`.
140
- - **[Migration guides](docs/MIGRATION.md)** — v0.6→v0.7, v0.7→v0.8,
141
- v0.8→v0.9.
142
- - **[Extending](docs/extending.md)** — Protocol-by-Protocol guide for
141
+ - **[Migration guides](docs/source/MIGRATION.md)** — per-version migration
142
+ hub (v0.7 onward).
143
+ - **[Extending](docs/source/extending.md)** — Protocol-by-Protocol guide for
143
144
  custom Scorers, Splitters, LeakageChecks, ThresholdSelectors,
144
145
  DatasetLoaders, EvidenceGates.
145
- - **[Repo strategy](docs/repo-strategy.md)** — how the package is
146
- organized, the 6-bucket target shape, and the checklist that
147
- governs when to extract a sub-package into its own repo.
146
+ - **[Repo strategy](docs/source/repo-strategy.md)** — how the package is
147
+ organized, the flat-module layout per ADR 0001, and the v2.0 trigger
148
+ criteria for any future subpackage split.
148
149
 
149
150
  ## Methodology
150
151
 
151
152
  What good binary-classification evaluation looks like, with each
152
153
  concern mapped to the toolkit primitive that operationalizes it.
153
154
 
154
- - [`docs/methodology/`](docs/methodology/README.md) — the curriculum
155
- (16 chapters). Recommended reading order:
156
- [`leakage`](docs/methodology/leakage.md) →
157
- [`splits`](docs/methodology/splits.md) →
158
- [`thresholds`](docs/methodology/thresholds.md) →
159
- [`calibration`](docs/methodology/calibration.md) →
160
- [`comparison`](docs/methodology/comparison.md) →
161
- [`bootstrap`](docs/methodology/bootstrap.md) →
162
- [`length_stratification`](docs/methodology/length_stratification.md) →
163
- [`text_dedup`](docs/methodology/text_dedup.md) →
164
- [`versioning`](docs/methodology/versioning.md) →
165
- [`fairness`](docs/methodology/fairness.md) →
166
- [`reproducibility`](docs/methodology/reproducibility.md) →
167
- [`testing`](docs/methodology/testing.md) →
168
- [`reading_list`](docs/methodology/reading_list.md).
169
- - [`docs/MIGRATION.md`](docs/MIGRATION.md) — per-version migration
170
- guides (v0.6→v0.7, v0.7→v0.8).
171
- - [`docs/roadmap.md`](docs/roadmap.md) — forward-looking tracker;
172
- v1.0.0 path; consumer gap-doc cross-links.
155
+ - [`docs/source/methodology/`](docs/source/methodology/README.md) — the
156
+ curriculum (16 chapters). Recommended reading order:
157
+ [`leakage`](docs/source/methodology/leakage.md) →
158
+ [`splits`](docs/source/methodology/splits.md) →
159
+ [`thresholds`](docs/source/methodology/thresholds.md) →
160
+ [`calibration`](docs/source/methodology/calibration.md) →
161
+ [`comparison`](docs/source/methodology/comparison.md) →
162
+ [`bootstrap`](docs/source/methodology/bootstrap.md) →
163
+ [`length_stratification`](docs/source/methodology/length_stratification.md) →
164
+ [`text_dedup`](docs/source/methodology/text_dedup.md) →
165
+ [`versioning`](docs/source/methodology/versioning.md) →
166
+ [`fairness`](docs/source/methodology/fairness.md) →
167
+ [`reproducibility`](docs/source/methodology/reproducibility.md) →
168
+ [`testing`](docs/source/methodology/testing.md) →
169
+ [`reading_list`](docs/source/methodology/reading_list.md).
170
+ - [`docs/source/MIGRATION.md`](docs/source/MIGRATION.md) — per-version
171
+ migration guides (v0.7 onward; v0.49 / v0.50 / v0.51 included as of
172
+ v0.51.0).
173
+ - [`docs/source/roadmap.md`](docs/source/roadmap.md) forward-looking
174
+ tracker; v1.0.0 path; consumer gap-doc cross-links.
173
175
 
174
176
  ## Extending eval-toolkit
175
177
 
176
178
  How to plug your own scorers / leakage checks / splitters / loaders /
177
179
  threshold selectors into the harness.
178
180
 
179
- - [`docs/extending.md`](docs/extending.md) — Protocol-by-Protocol
181
+ - [`docs/source/extending.md`](docs/source/extending.md) — Protocol-by-Protocol
180
182
  guide, ~50-line full-harness recipe, project-layout pointer.
181
183
 
182
184
  ## Worked examples
183
185
 
184
- - [`docs/examples/prompt_injection_walkthrough.md`](docs/examples/prompt_injection_walkthrough.md)
185
- — End-to-end prompt-injection eval on a synthetic OWASP LLM01:2025
186
- fixture; cross-links to the
187
- [showcase repo](https://github.com/brandon-behring/prompt_injection_classifier_showcase)
188
- for the real Lakera PINT walkthrough.
189
- - [`docs/examples/pytorch_scorer_example.md`](docs/examples/pytorch_scorer_example.md)
190
- — HuggingFace transformer + LoRA `Scorer` adapter (batched inference,
191
- GPU/CPU placement, deterministic-mode setup).
192
- - [`docs/examples/claims_and_gates.md`](docs/examples/claims_and_gates.md)
193
- — Composing reference + custom `EvidenceGate`s into a `ClaimSpec` and
194
- running `evaluate_claims()` for release-time go/no-go checks.
186
+ - [`docs/source/examples/`](docs/source/examples/index.md) — Sphinx /
187
+ MyST-NB executable notebooks covering: the evaluation harness,
188
+ metrics + bootstrap, calibration, claims-and-gates, leakage
189
+ detection, cross-corpus contamination scanning, character-injection
190
+ adversarial sweeps, callable-embedder dedup, and the activation-delta
191
+ probe.
195
192
 
196
193
  ## Install
197
194
 
@@ -291,7 +288,7 @@ with tempfile.TemporaryDirectory() as run_dir:
291
288
  | `eval_toolkit.splits` | `Splitter` Protocol + 5 reference impls (holdout / stratified / group / source-disjoint / time-series) |
292
289
  | `eval_toolkit.loaders` | `DatasetLoader` Protocol + 4 reference impls (DataFrame / SingleSlice / ParquetGlob / HF datasets) with Croissant-compatible `describe()` |
293
290
  | `eval_toolkit.manifest` | `RunManifest` (NeurIPS-aligned) + source-role / guardrail metadata + `make_manifest` / `write_manifest` |
294
- | `eval_toolkit.claims` | `EvidenceGate` class (frozen dataclass: name + callable check + severity), reference gate factories (`required_metric_gate`, `minimum_slice_size_gate`, `metric_threshold_gate`, etc.), `evaluate_claims()`, and `ClaimReport` for claim-mode vs exploratory-mode checks. See [`docs/extending.md`](docs/extending.md) for writing custom gates and [`docs/examples/claims_and_gates.md`](docs/examples/claims_and_gates.md) for a worked end-to-end example. |
291
+ | `eval_toolkit.claims` | `EvidenceGate` class (frozen dataclass: name + callable check + severity), reference gate factories (`required_metric_gate`, `minimum_slice_size_gate`, `metric_threshold_gate`, etc.), `evaluate_claims()`, and `ClaimReport` for claim-mode vs exploratory-mode checks. See [`docs/source/extending.md`](docs/source/extending.md) for writing custom gates and [`docs/source/examples/claims_and_gates.md`](docs/source/examples/claims_and_gates.md) for a worked end-to-end example. |
295
292
  | `eval_toolkit.text_dedup` | `SimilarityStrategy` Protocol + 5 strategies (TF-IDF / hash / embedding / Jaccard / MinHash-LSH); `near_dedup` / `cross_dedup` orchestrators |
296
293
  | `eval_toolkit.plotting` | PR curves, reliability diagrams, confusion matrices, score histograms, lift CIs |
297
294
  | `eval_toolkit.provenance` | File hashing, run-directory layout, figure metadata sidecar |
@@ -31,7 +31,8 @@ format changes.
31
31
  │ gpu_info + leakage_report (NeurIPS-aligned) │
32
32
  ├─ Tier 2 ─ Protocol-based orchestration ────────────────┤
33
33
  │ Scorer / SliceAwareScorer / LeakageCheck / Splitter │
34
- │ ThresholdSelector / DatasetLoader / SimilarityStrategy
34
+ │ ThresholdSelector / DatasetLoader / MetricSpec
35
+ │ MetaLearner / Probe / TextTransform (9 strict) │
35
36
  │ Versioned (opt-in: per-object versions in manifest) │
36
37
  ├─ Tier 1 ─ Functional core ─────────────────────────────┤
37
38
  │ pr_auc / roc_auc / ECE variants / Brier / bootstrap_ci│
@@ -46,69 +47,65 @@ run: capture the manifest.
46
47
 
47
48
  ## Documentation
48
49
 
49
- - **[Getting started](docs/getting-started.md)** — end-to-end
50
+ - **[Getting started](docs/source/getting-started.md)** — end-to-end
50
51
  walkthrough for new users: install, define a Scorer, build slices,
51
52
  run `evaluate()`, persist results, add a claim, render a plot.
52
- - **[Methodology curriculum](docs/methodology/README.md)** — 16
53
+ - **[Methodology curriculum](docs/source/methodology/README.md)** — 16
53
54
  chapters on splits, metrics, calibration, evidence gates,
54
55
  prediction artifacts, and more.
55
- - **[Schema reference](docs/schemas.md)** — field-by-field semantics
56
+ - **[Schema reference](docs/source/schemas.md)** — field-by-field semantics
56
57
  for `results.v1.json`, `results_full.v1.json`, `manifest.v1.json`.
57
- - **[Migration guides](docs/MIGRATION.md)** — v0.6→v0.7, v0.7→v0.8,
58
- v0.8→v0.9.
59
- - **[Extending](docs/extending.md)** — Protocol-by-Protocol guide for
58
+ - **[Migration guides](docs/source/MIGRATION.md)** — per-version migration
59
+ hub (v0.7 onward).
60
+ - **[Extending](docs/source/extending.md)** — Protocol-by-Protocol guide for
60
61
  custom Scorers, Splitters, LeakageChecks, ThresholdSelectors,
61
62
  DatasetLoaders, EvidenceGates.
62
- - **[Repo strategy](docs/repo-strategy.md)** — how the package is
63
- organized, the 6-bucket target shape, and the checklist that
64
- governs when to extract a sub-package into its own repo.
63
+ - **[Repo strategy](docs/source/repo-strategy.md)** — how the package is
64
+ organized, the flat-module layout per ADR 0001, and the v2.0 trigger
65
+ criteria for any future subpackage split.
65
66
 
66
67
  ## Methodology
67
68
 
68
69
  What good binary-classification evaluation looks like, with each
69
70
  concern mapped to the toolkit primitive that operationalizes it.
70
71
 
71
- - [`docs/methodology/`](docs/methodology/README.md) — the curriculum
72
- (16 chapters). Recommended reading order:
73
- [`leakage`](docs/methodology/leakage.md) →
74
- [`splits`](docs/methodology/splits.md) →
75
- [`thresholds`](docs/methodology/thresholds.md) →
76
- [`calibration`](docs/methodology/calibration.md) →
77
- [`comparison`](docs/methodology/comparison.md) →
78
- [`bootstrap`](docs/methodology/bootstrap.md) →
79
- [`length_stratification`](docs/methodology/length_stratification.md) →
80
- [`text_dedup`](docs/methodology/text_dedup.md) →
81
- [`versioning`](docs/methodology/versioning.md) →
82
- [`fairness`](docs/methodology/fairness.md) →
83
- [`reproducibility`](docs/methodology/reproducibility.md) →
84
- [`testing`](docs/methodology/testing.md) →
85
- [`reading_list`](docs/methodology/reading_list.md).
86
- - [`docs/MIGRATION.md`](docs/MIGRATION.md) — per-version migration
87
- guides (v0.6→v0.7, v0.7→v0.8).
88
- - [`docs/roadmap.md`](docs/roadmap.md) — forward-looking tracker;
89
- v1.0.0 path; consumer gap-doc cross-links.
72
+ - [`docs/source/methodology/`](docs/source/methodology/README.md) — the
73
+ curriculum (16 chapters). Recommended reading order:
74
+ [`leakage`](docs/source/methodology/leakage.md) →
75
+ [`splits`](docs/source/methodology/splits.md) →
76
+ [`thresholds`](docs/source/methodology/thresholds.md) →
77
+ [`calibration`](docs/source/methodology/calibration.md) →
78
+ [`comparison`](docs/source/methodology/comparison.md) →
79
+ [`bootstrap`](docs/source/methodology/bootstrap.md) →
80
+ [`length_stratification`](docs/source/methodology/length_stratification.md) →
81
+ [`text_dedup`](docs/source/methodology/text_dedup.md) →
82
+ [`versioning`](docs/source/methodology/versioning.md) →
83
+ [`fairness`](docs/source/methodology/fairness.md) →
84
+ [`reproducibility`](docs/source/methodology/reproducibility.md) →
85
+ [`testing`](docs/source/methodology/testing.md) →
86
+ [`reading_list`](docs/source/methodology/reading_list.md).
87
+ - [`docs/source/MIGRATION.md`](docs/source/MIGRATION.md) — per-version
88
+ migration guides (v0.7 onward; v0.49 / v0.50 / v0.51 included as of
89
+ v0.51.0).
90
+ - [`docs/source/roadmap.md`](docs/source/roadmap.md) forward-looking
91
+ tracker; v1.0.0 path; consumer gap-doc cross-links.
90
92
 
91
93
  ## Extending eval-toolkit
92
94
 
93
95
  How to plug your own scorers / leakage checks / splitters / loaders /
94
96
  threshold selectors into the harness.
95
97
 
96
- - [`docs/extending.md`](docs/extending.md) — Protocol-by-Protocol
98
+ - [`docs/source/extending.md`](docs/source/extending.md) — Protocol-by-Protocol
97
99
  guide, ~50-line full-harness recipe, project-layout pointer.
98
100
 
99
101
  ## Worked examples
100
102
 
101
- - [`docs/examples/prompt_injection_walkthrough.md`](docs/examples/prompt_injection_walkthrough.md)
102
- — End-to-end prompt-injection eval on a synthetic OWASP LLM01:2025
103
- fixture; cross-links to the
104
- [showcase repo](https://github.com/brandon-behring/prompt_injection_classifier_showcase)
105
- for the real Lakera PINT walkthrough.
106
- - [`docs/examples/pytorch_scorer_example.md`](docs/examples/pytorch_scorer_example.md)
107
- — HuggingFace transformer + LoRA `Scorer` adapter (batched inference,
108
- GPU/CPU placement, deterministic-mode setup).
109
- - [`docs/examples/claims_and_gates.md`](docs/examples/claims_and_gates.md)
110
- — Composing reference + custom `EvidenceGate`s into a `ClaimSpec` and
111
- running `evaluate_claims()` for release-time go/no-go checks.
103
+ - [`docs/source/examples/`](docs/source/examples/index.md) — Sphinx /
104
+ MyST-NB executable notebooks covering: the evaluation harness,
105
+ metrics + bootstrap, calibration, claims-and-gates, leakage
106
+ detection, cross-corpus contamination scanning, character-injection
107
+ adversarial sweeps, callable-embedder dedup, and the activation-delta
108
+ probe.
112
109
 
113
110
  ## Install
114
111
 
@@ -208,7 +205,7 @@ with tempfile.TemporaryDirectory() as run_dir:
208
205
  | `eval_toolkit.splits` | `Splitter` Protocol + 5 reference impls (holdout / stratified / group / source-disjoint / time-series) |
209
206
  | `eval_toolkit.loaders` | `DatasetLoader` Protocol + 4 reference impls (DataFrame / SingleSlice / ParquetGlob / HF datasets) with Croissant-compatible `describe()` |
210
207
  | `eval_toolkit.manifest` | `RunManifest` (NeurIPS-aligned) + source-role / guardrail metadata + `make_manifest` / `write_manifest` |
211
- | `eval_toolkit.claims` | `EvidenceGate` class (frozen dataclass: name + callable check + severity), reference gate factories (`required_metric_gate`, `minimum_slice_size_gate`, `metric_threshold_gate`, etc.), `evaluate_claims()`, and `ClaimReport` for claim-mode vs exploratory-mode checks. See [`docs/extending.md`](docs/extending.md) for writing custom gates and [`docs/examples/claims_and_gates.md`](docs/examples/claims_and_gates.md) for a worked end-to-end example. |
208
+ | `eval_toolkit.claims` | `EvidenceGate` class (frozen dataclass: name + callable check + severity), reference gate factories (`required_metric_gate`, `minimum_slice_size_gate`, `metric_threshold_gate`, etc.), `evaluate_claims()`, and `ClaimReport` for claim-mode vs exploratory-mode checks. See [`docs/source/extending.md`](docs/source/extending.md) for writing custom gates and [`docs/source/examples/claims_and_gates.md`](docs/source/examples/claims_and_gates.md) for a worked end-to-end example. |
212
209
  | `eval_toolkit.text_dedup` | `SimilarityStrategy` Protocol + 5 strategies (TF-IDF / hash / embedding / Jaccard / MinHash-LSH); `near_dedup` / `cross_dedup` orchestrators |
213
210
  | `eval_toolkit.plotting` | PR curves, reliability diagrams, confusion matrices, score histograms, lift CIs |
214
211
  | `eval_toolkit.provenance` | File hashing, run-directory layout, figure metadata sidecar |
@@ -52,6 +52,14 @@ _EXPORTS: dict[str, str] = {
52
52
  # CharacterInjectionStrategy + character_injection SimpleNamespace
53
53
  # removed at v0.47 (Decision N + plan §4E). TextTransform Protocol +
54
54
  # the 12 concrete dataclasses are now the only public path.
55
+ # --- audit_citation_alignment ---
56
+ # Flat-module per ADR 0001 (Stay flat through v1.x; subpackage
57
+ # restructure deferred to v2.0). Closes #73. Motivated by consumer
58
+ # V1.3.2 P1-2 ADR-029 mis-citation finding.
59
+ "ADRSubject": "eval_toolkit.audit_citation_alignment",
60
+ "CitationMisalignment": "eval_toolkit.audit_citation_alignment",
61
+ "extract_adr_subject_category": "eval_toolkit.audit_citation_alignment",
62
+ "validate_citations": "eval_toolkit.audit_citation_alignment",
55
63
  # --- losses ---
56
64
  "RecallAtLowFPR": "eval_toolkit.losses",
57
65
  # --- preprocessing ---