diff --git a/docs/50_LOOP_PLAN.md b/docs/50_LOOP_PLAN.md index c45cfc68..14312055 100644 --- a/docs/50_LOOP_PLAN.md +++ b/docs/50_LOOP_PLAN.md @@ -242,7 +242,11 @@ Phase 4: ✅ Complete (Loops 40–49) | 28 ✅ | Policy version bump workflow for when real data arrives | `scripts/bump_recalibration_policy.py`: standalone script with `--dry-run`, decision-log guard, auto-increment + write. CI guard in `ci.yml` validates policy version changes against base branch. v0.5.49. 9 tests. | CI rejects policy PRs without valid decision log; `make bump-policy-version` and `make bump-policy-version-dry-run` available | | 29 ✅ | No public negative-result archive format. If Wave 1 yields all negatives, where do they go? | `docs/NEGATIVE_RESULT_ARCHIVE.md`: full template with entry schema, procedures, automation notes, and limitations. Covers pre-selection rejects, selected-untested, lab inactives, lab toxic, control failures. v0.5.50. | Template complete enough for a lab partner to fill; schema defines 18 fields with required/conditional markers | -**All 50 loops complete.** +**Next loop:** None. All 50 loops complete. See Loop 50 below. + +| Loop | Bottleneck | Deliverable | Verification | +|------|-----------|-------------|-------------| +| 50 ✅ | Reproducibility report lab_batch_pack check used wrong path (Makefile target, not file path); plan header stale | Fixed `full_reproducibility_report.py` to check for script. Updated plan docs. v0.5.70 | Report now correctly shows all Phase 4 artifacts. 2021 tests | **Phase 2 exit criteria (all 5 met ✅):** - ✅ `make calibration-loop` runs from clean checkout, produces batch-2 manifest diff --git a/docs/METRICS_CURRENT.md b/docs/METRICS_CURRENT.md index 9347a025..65718b85 100644 --- a/docs/METRICS_CURRENT.md +++ b/docs/METRICS_CURRENT.md @@ -5,7 +5,7 @@ Machine-readable snapshot: `outputs/metrics_snapshot.json` regenerated with `mak > **Purpose:** One authoritative table of current pipeline metrics. If any doc disagrees > with this file, this file wins. Updated whenever benchmark/benchmark config changes. > -> **Last updated:** 2026-07-06 (culmination — v0.5.69) +> **Last updated:** 2026-07-06 (loop 50 polish — v0.5.70) > **New in v0.5.65:** `scripts/build_lab_batch_pack.py` now writes `chain_of_custody.json` and `MANIFEST.json` into lab batch packs. The custody file includes SHA-256 hashes for `panel.csv`, the ordered candidate list, each candidate sequence, and each evidence certificate. `--verify-pack` verifies archive integrity and detects tampering. These hashes prove identity/integrity only, not biological activity, safety, or synthesis success. 5 tests. > **New in v0.5.64:** `schemas/decision_log.schema.json` — 12-field JSON Schema for human review decisions. Covers 9 decision types from AGENTS.md §8. Dissent conditional. 11 tests. 2000 total. > **New in v0.5.63:** `scripts/build_lab_batch_pack.py` — generates single zip with candidate CSV, 36 evidence certs, protocol refs, controls manifest, data return template. `make lab-batch-pack`. 10 tests. 1989 total. diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index 58506e8c..2a928b19 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -1,5 +1,18 @@ # Roadmap +## v0.5.70 — Loop 50: Reproducibility Report Polish ✓ (2026-07-06) + +Fixed lab_batch_pack check in reproducibility report (was checking for +a Makefile target; now checks for the build script). All 50 loops complete. + +Changes: +- ``scripts/full_reproducibility_report.py`` — Fixed lab_batch_pack path + to check for ``scripts/build_lab_batch_pack.py`` instead of ``make + lab-batch-pack``. Updated loops_completed to 50. +- ``docs/50_LOOP_PLAN.md`` — Added Loop 50 entry. Next loop set to "None." +- ``docs/METRICS_CURRENT.md`` — Changelog updated. +- 2021 tests passing. + ## v0.5.69 — Culmination Reproducibility Report (Loop 49) ✓ (2026-07-06) All 49 loops complete. Final reproducibility report documents pipeline diff --git a/scripts/full_reproducibility_report.py b/scripts/full_reproducibility_report.py index 2795a3bb..5b6bd17e 100644 --- a/scripts/full_reproducibility_report.py +++ b/scripts/full_reproducibility_report.py @@ -26,7 +26,7 @@ def build_report() -> dict: "report_type": "full_reproducibility", "pipeline_version": __version__, "generated_at": datetime.now(timezone.utc).isoformat(), - "loops_completed": 49, + "loops_completed": 50, "phases_completed": { "phase_0_structure": True, "phase_1_benchmark_honesty": True, @@ -98,7 +98,7 @@ def build_report() -> dict: "pass_fail_criteria": "configs/wave1_pass_fail.yaml", "expert_review_template": ".github/ISSUE_TEMPLATE/expert_review.yml", "decision_log_schema": "schemas/decision_log.schema.json", - "lab_batch_pack": "make lab-batch-pack", + "lab_batch_pack": "scripts/build_lab_batch_pack.py", "analysis_plan": "docs/WAVE1_ANALYSIS_PLAN.md", "data_return_validation": "scripts/validate_lab_data_return.py", "publication_pack": "docs/PUBLICATION_PACK.md", diff --git a/tests/test_full_reproducibility_report.py b/tests/test_full_reproducibility_report.py index 29218643..b0ffa81b 100644 --- a/tests/test_full_reproducibility_report.py +++ b/tests/test_full_reproducibility_report.py @@ -10,7 +10,7 @@ def test_report_builds(): report = build_report() assert report["report_type"] == "full_reproducibility" - assert report["loops_completed"] == 49 + assert report["loops_completed"] == 50 assert "sections" in report