Phase AC is complete as of 2026-07-15. AC1 records one explicit disconfirming test as a DTR- artifact. AC2 aggregates those records into an ACDG- gate. AC3 exposes that gate through a CLI and make target, with nonzero status for partial or not-established results so the review control is usable in repeatable loops. This is an auditability improvement only. It does not validate biology, improve benchmark performance, or authorize release.
On 2026-07-16, Phase AA AA6 made the reproducibility gate runnable through the CLI and Make surface. It fails closed unless RMC, DCR, CFP, and SBW artifact IDs are present. This makes the provenance gate easier to execute; it does not certify that the referenced artifacts are accurate or that any biology is validated.
On 2026-07-16, the external-result intake path was tightened: schema-invalid lab-result files are now preserved as structured input errors, written into the intake report, and block both the intake CLI and recalibration gate. This prevents a partial result directory from masquerading as a clean cohort. It does not validate the underlying assay data or establish biological claims.
On 2026-07-17, the same boundary now rejects missing or non-directory result paths before report generation. An existing empty directory remains a valid, explicit no-results state. This prevents an operator typo from masquerading as an empty experimental cohort; it does not create wet-lab evidence.
On 2026-07-17, result identity checks now retain duplicate lab-result IDs and duplicate panel candidate IDs as structured input-integrity issues. Reporting and calibration-intake commands exit nonzero for these ambiguous inputs, and the recalibration gate refuses to proceed. This prevents copied or duplicated observations from being treated as independent evidence; it does not validate assay quality or establish biological claims.
On 2026-07-19, calibration intake tightened the adjacent control-quality boundary: observations with failed positive or negative controls remain visible in raw audit fields but no longer contribute to per-assay actual predicates, retrospective cohort metrics, or interpretable per-candidate outcome flags. The recalibration gate continues to reject any control failure. This prevents a failed assay from influencing descriptive triage while preserving the negative evidence; it does not validate the assay.
This file is the current milestone authority. The older
50_LOOP_PLAN.md is a historical execution record, not a
live status page. Select the next bottleneck from
HIGH_LEVERAGE_TASKS.md and
NEXT_100_PR_MAP.md; do not infer a new scientific phase
from the completion of Phase AC alone. The strategic bottleneck remains
external truth: qualified review, fair baseline-controlled pilots, and real
result intake.
- CalibrationReadinessEntry: binary gate consuming CBA- aggregators
- gate_passed consistent with failure_reasons; degrading-trend and marginal-Brier warnings
- Phase O (O1-O5 Calibration QA) fully complete
- CrossBatchAggregatorEntry aggregates CalibrationPerformanceEntry results across N>=2 batches
- trend field (improving/stable/degrading) feeds calibration readiness gate
- min/mean/max Brier scores, high-variance warning
- CalibrationImprovementEntry schema documents recalibration actions taken after drift/quality failures
- 6 action categories, trigger_ids linked to CPS-/DRM- records
- Closes the loop between detection and correction
- Added
PredictionDriftEntryschema tracking mean/std score shifts between reference and evaluation batches - Detects silent model degradation before wet-lab confirmation
- Constants: SIGNIFICANT_DRIFT_THRESHOLD=0.1, VARIANCE_EXPLOSION_RATIO=2.0
- CLI:
openamp-foundry prediction-drift-check - 68 tests; all passing
- Added
CalibrationPerformanceEntryschema tracking prediction accuracy over batches with known outcomes - Confusion matrix validation; Brier score; FP rate, recall, and small-sample warnings
- dry_lab_only=False (requires real experimental data)
- CLI:
openamp-foundry calibration-performance-check - 46 tests; all passing
- Added
ExperimentPriorityEntryschema documenting why a batch was selected over alternatives - Safety review enforcement; post-hoc selection warning; resource constraint transparency
- Requires at least 2 criteria and 1 rejected alternative — selection without alternatives is not a decision
- CLI:
openamp-foundry experiment-priority-check - 62 tests; all passing
- Phase N (Pre-registration & Baseline Honesty) complete
- Added
NegativeResultEntryschema ensuring failed experiments are documented, not discarded - 6 failure categories, 5 assay types; warns on suppressed reporting, systematic failures, uncalibrated overprediction
- dry_lab_only=False supported for real lab data
- CLI:
openamp-foundry negative-result-check - 68 tests; all passing
- Added
BaselineComparisonEntryschema for machine-verifiable proof the pipeline beats cheap baselines - 6 metric names, 2 comparison directions, p_value sentinel for uncomputed significance
- Detects inconsistent beat/lose verdicts, missing p-values, large unchecked effects
- CLI:
openamp-foundry baseline-comparison-check - 68 tests; all passing
- Added
HypothesisOutcomeEntryschema linking pre-registration to actual experimental outcomes - Records confirmed/refuted/inconclusive/partially_confirmed verdicts with observed metric value
- Warns on threshold/verdict inconsistency and undocumented inconclusive deviations
- dry_lab_only=False supported (real lab data can be recorded)
- CLI:
openamp-foundry hypothesis-outcome-check - 48 tests; all passing
- Added
PreRegistrationEntryschema for machine-verifiable experiment pre-commitment - Records hypothesis, outcome metric, success threshold, and baseline comparators before results are observed
- Prevents HARKing (Hypothesising After Results are Known)
- Warns when random baseline is absent, hypothesis is underspecified, or statistical test is a placeholder
- CLI:
openamp-foundry pre-registration-check - 62 tests; all passing
- Added
AuditChainEntryschema validating all 9 evidence chain links exist for a batch - Detects gaps from sequence input through benchmark, filter, scoring, selection, certificate, claims, decision audit, and reviewer briefing
- missing_links consistency check catches declaration errors
- CLI:
openamp-foundry audit-chain-check - 39 tests; all passing
- Phase M (Audit Trail Infrastructure) complete
- Added
ReviewerBriefingEntryschema for one-stop external auditor handoff packages - Validates CoI declaration, minimum artifact count, scope, candidate count
- 4 warning conditions: large batch, underfocused questions, long scope, minimal artifacts
- CLI:
openamp-foundry reviewer-briefing-check - 52 tests; all passing
- Added
ScoreDecompositionEntryschema documenting how composite scores decompose into components - 6 valid scoring methods; weight-sum tolerance; dominant/unbalanced/low-score warnings
- CLI:
openamp-foundry score-decomposition-check - 54 tests; all passing
- Added
ClaimToEvidenceEntryschema mapping each claim to supporting artifacts - 7 valid claim types; 4 warning conditions for exploratory or weakly-evidenced claims
- CLI:
openamp-foundry claim-to-evidence-check - 50 tests; all passing
- Phase M M1: pipeline decision audit entry schema — records each filter/threshold/rank decision with rationale and alternatives considered for external audit. PipelineDecisionAuditEntry dataclass, validate_pipeline_decision_audit(), CLI pipeline-decision-audit-check.
- Phase L L5: dataset release package checker — validates that open dataset releases meet data governance requirements (license, provenance, dual-use assessment, release approval). DatasetReleaseEntry dataclass, validate_dataset_release(), CLI dataset-release-check. Completes Phase L.
- Phase L L4: multi-candidate comparison schema — validates structured side-by-side comparisons of two or more candidates for publication-ready supplementary tables. MultiCandidateComparisonEntry dataclass, validate_multi_candidate_comparison(), CLI multi-candidate-comparison-check.
- Phase L L3: candidate summary card schema — validates publication-ready per-candidate structured summaries with sequence, evidence level, activity prediction, and safety flags. CandidateSummaryCardEntry dataclass, validate_candidate_summary_card(), CLI candidate-summary-card-check.
- Phase L L2: reproducibility manifest schema — captures exact software versions, data checksums, and random seeds for a pipeline run. ReproducibilityManifestEntry dataclass, validate_reproducibility_manifest(), CLI reproducibility-manifest-check.
- Phase L L1: preprint evidence bundle schema — ties K-phase artifacts into a submission-ready record for scientific preprints. PreprintBundleEntry dataclass, validate_preprint_bundle(), CLI preprint-bundle-check.
- Phase K K5: uncertainty quantification report schema — validates prediction intervals, confidence levels, and calibration source for dry-lab candidate recommendations. UncertaintyReportEntry dataclass, validate_uncertainty_report(), CLI uncertainty-report-check.
- Phase K K4: post-experiment calibration intake schema — captures structured comparison of pipeline dry-lab prediction against actual experimental outcome. CalibrationIntakeEntry dataclass (dry_lab_only=False enforced), validate_calibration_intake(), CLI calibration-intake-check.
docs/evidence/PILOT_PACKAGE_GUIDE.md with purpose, required field table (11
fields), mandatory artifact types table (3 types: selection_rationale,
batch_priority, evidence_certificate), valid artifact types (8 types), warnings,
validation workflow, honest-use boundary.
src/openamp_foundry/evidence/pilot_package.py with PilotPackageEntry
dataclass (11 fields, dry_lab_only=True enforced), PilotPackageResult
dataclass (5 fields, dry_lab_only=True), MINIMUM_REQUIRED_ARTIFACTS (3),
READINESS_SCORE_THRESHOLD (0.80), MANDATORY_ARTIFACT_TYPES (3:
batch_priority, evidence_certificate, selection_rationale),
VALID_ARTIFACT_TYPES (8 types), validate_pilot_package() (11 checks, 3
warning conditions: missing artifacts, low completeness score, same
reviewer/approver), validate_pilot_package_dict() (10 required fields guard).
CLI: openamp-foundry pilot-package-check. make pilot-package-check target.
v0.8.1 milestone — every pilot submission is machine-validated for
completeness before external lab submission.
docs/evidence/BATCH_PRIORITY_GUIDE.md with field table and validation workflow
for batch synthesis wave priority entries.
src/openamp_foundry/evidence/batch_priority.py with BatchPriorityEntry
dataclass (12 fields, dry_lab_only=True enforced), BatchPriorityResult
dataclass (6 fields), VALID_SYNTHESIS_COMPLEXITIES (3: high/low/medium),
VALID_NOVELTY_TIERS (3: high/low/medium), VALID_EVIDENCE_LEVELS (1–6),
validate_batch_priority() (11 checks, 3 warning conditions: low evidence,
top-rank+high-complexity, low score), validate_batch_priority_dict()
(10 required fields guard).
CLI: openamp-foundry batch-priority-check. make batch-priority-check target.
v0.8.0 milestone — synthesis wave ranking is now machine-validated with
explicit evidence level and complexity signals.
docs/evidence/SELECTION_RATIONALE_GUIDE.md documenting what selection rationale
entries must contain, why they are needed for external review, and how evidence
levels map to PROOF_LADDER.md.
src/openamp_foundry/evidence/selection_rationale.py with SelectionRationaleEntry
dataclass (11 fields, dry_lab_only=True enforced), SelectionRationaleResult
dataclass (5 fields), VALID_EVIDENCE_LEVELS (1–6), MINIMUM_SAFETY_FLAGS (1),
validate_selection_rationale() (11 checks, 1 warning condition for low evidence
levels), validate_selection_rationale_dict() (10 required fields guard).
CLI: openamp-foundry selection-rationale-check. make selection-rationale-check target.
Phase K milestone: v0.7.9 — every candidate selection now requires a
machine-validated rationale with evidence level and baseline comparison.
docs/governance/ANNUAL_REVIEW_CHECKLIST.md with 5-section structured annual
review checklist (safety_policy: 6 checks covering dual-use safeguards,
dry_lab_only enforcement, toxicity/hemolysis filter thresholds, evidence_level
guard; benchmark_thresholds: 6 checks covering threshold loosening guard,
easy-baseline requirement, selectivity benchmarks, deprecation check;
calibration_status: 4 checks covering recalibration gate, decision checklist,
rollback plan; governance_decisions: 4 checks covering active decisions,
COI disclosures, maintainer rotation; data_governance: 3 checks covering
proprietary data license flags, external source documentation).
src/openamp_foundry/governance/annual_review.py with AnnualReviewEntry
dataclass (10 fields: review_id, year, section, reviewer, finding_count,
action_items_count, status, notes, completion_date, dry_lab_only),
AnnualReviewResult dataclass (6 fields, dry_lab_only=True),
VALID_REVIEW_SECTIONS (5: benchmark_thresholds, calibration_status,
data_governance, governance_decisions, safety_policy),
VALID_ENTRY_STATUSES (5: completed, deferred, in_progress, not_applicable,
pending), validate_annual_review_entry() (9 checks: ANN- prefix, 4-digit year,
valid section, non-empty reviewer, non-negative finding_count,
non-negative action_items_count, valid status, completed requires YYYY-MM-DD
completion_date, dry_lab_only must be True; completed+no-notes warns, deferred
warns, findings+no-action-items warns), validate_annual_review_dict() (7
required fields guard). CLI (openamp-foundry annual-review-check) with
--entry-json, --format text|json. make annual-review-check target.
Long-term trust: annual review entries are now machine-validated.
docs/governance/EXTERNAL_ADVISORY_REVIEW_PROCESS.md with reviewer eligibility
criteria (4 requirements), review scope table (5 review types with minimum
reviewer counts: candidate_review and safety_policy_review require ≥2 reviewers,
others ≥1), 5-step process (prepare packet, assign+disclose COI, receive+log,
respond to findings by severity, close and record), finding severity handling
(critical halts release, major resolves before release, minor defers, informational
notes), limitations section.
src/openamp_foundry/governance/advisory_review.py with AdvisoryReview dataclass
(11 fields: review_id, review_type, artifact_id, reviewer_handle, assigned_date,
deadline_date, status, finding_severity, finding_summary, resolved, dry_lab_only),
AdvisoryReviewResult dataclass (5 fields, dry_lab_only=True),
VALID_REVIEW_TYPES (5: benchmark_audit, candidate_review, evidence_review,
governance_review, safety_policy_review), VALID_REVIEW_STATUSES (5: assigned,
completed, deferred, in_progress, pending), VALID_FINDING_SEVERITIES (4:
critical, informational, major, minor), MINIMUM_REVIEWER_COUNTS (5 entries),
validate_advisory_review() (9 checks + 3 warning conditions),
validate_advisory_review_dict() (7 required fields guard).
CLI (openamp-foundry advisory-review-check) with --review-json (required),
--format text|json. Handler _run_advisory_review_check in reports.py.
make advisory-review-check target. 29 tests. 3653 total.
Credibility: external advisory reviews now have a validated structure, documented eligibility criteria, and a clear process from assignment to closure.
docs/governance/ROADMAP_ISSUE_SYNC_CHECKLIST.md with 5-section checklist:
roadmap items → issues (5 checks), issues → roadmap (3 checks), completed
items (4 checks), priority alignment (3 checks), version consistency (3 checks).
src/openamp_foundry/governance/roadmap_sync.py with RoadmapSyncEntry
dataclass (10 fields: item_id, phase, description, priority, sync_status,
issue_number, pr_number, completed, completion_date, dry_lab_only),
RoadmapSyncResult dataclass (5 fields, dry_lab_only=True),
VALID_SYNC_STATUSES (5: synced, missing_issue, orphaned_issue, stale,
completed), VALID_PRIORITY_LEVELS (4: A, B, C, D), VALID_PHASES (7:
E, F, G, H, I, J, K), validate_roadmap_sync_entry() (8 checks + 4 warning
conditions), validate_roadmap_sync_dict() (5 required fields guard).
CLI (openamp-foundry roadmap-sync-check) with --entry-json (required),
--format text|json. Handler _run_roadmap_sync_check in reports.py.
make roadmap-sync-check target. 24 tests. 3624 total.
Keeps strategy actionable: roadmap sync entries are machine-validated, priority A items without issues get an immediate warning, and stale or orphaned items are flagged for cleanup.
docs/governance/CITATION_AND_REUSE_GUIDE.md with citation formats (inline,
BibTeX), reuse table (4 artifact types with open/attribution_required/
contact_required/restricted classes), attribution requirements, honest-use
boundary (dry-lab outputs only), contact information, linked policies.
src/openamp_foundry/governance/citation_policy.py with
CitationEntry dataclass (11 fields: artifact_id, citation_type, title,
version, authors, year, license_identifier, reuse_class, url, bibtex_key,
dry_lab_only), CitationValidationResult dataclass (6 fields,
dry_lab_only=True), VALID_CITATION_TYPES (4: dataset, method, schema,
software), VALID_REUSE_CLASSES (4: attribution_required, contact_required,
open, restricted), VALID_LICENSE_IDENTIFIERS (5: Apache-2.0, CC-BY-4.0,
CC-BY-NC-4.0, MIT, Proprietary), validate_citation_entry() (9 checks
- 3 warning conditions),
validate_citation_dict()(8 required fields guard).
CLI (openamp-foundry citation-check) with --citation-json (required),
--format text|json. Handler _run_citation_check in reports.py.
make citation-check target. 24 tests. 3599 total.
Ecosystem clarity: citation entries are machine-validated, reuse classes are explicit, and the honest-use boundary is documented in the guide.
docs/governance/SECURITY_POLICY.md with private vulnerability reporting
process, response timeline (48h acknowledgment, 30d patch), severity
classification (critical/high/medium/low), 5 vulnerability categories
(code_vulnerability, secret_leakage, dependency_vulnerability,
safety_guardrail_bypass, dual_use_risk), out-of-scope items, disclosure
process.
src/openamp_foundry/governance/security_policy.py with
VulnerabilityReport dataclass (9 fields: report_id, severity, category,
description, affected_version, reporter_handle, report_date, status,
dry_lab_only), SecurityReportValidationResult dataclass (6 fields:
report_id, severity, passed, errors, warnings, dry_lab_only=True),
VALID_SEVERITY_LEVELS (4: critical, high, medium, low),
VALID_VULNERABILITY_CATEGORIES (5: code_vulnerability, secret_leakage,
dependency_vulnerability, safety_guardrail_bypass, dual_use_risk),
VALID_REPORT_STATUSES (6: received, acknowledged, under_review, patched,
disclosed, not_applicable), validate_vulnerability_report() (9 checks:
report_id SEC- prefix, valid severity, valid category, non-empty
description, non-empty affected_version, non-empty reporter_handle,
YYYY-MM-DD date, valid status, dry_lab_only must be True; critical+received
warning, safety_guardrail_bypass warning), validate_report_dict() (dict
input with 8 required fields guard, missing fields returns passed=False
early).
CLI (openamp-foundry security-report-check) with --report-json
(required), --format text|json. Handler _run_security_report_check in
reports.py.
make security-report-check target. 18 tests. 3575 total.
Private vulnerability reporting now has a validated structure and documented process — security reporters have a clear channel and the project has a documented response process.
Changes:
docs/governance/SECURITY_POLICY.md(J6) — Private vulnerability reporting process with response timeline, severity classification (critical/high/medium/low), 5 vulnerability categories, out-of-scope items, disclosure process.src/openamp_foundry/governance/security_policy.py(J6) — Core module withVulnerabilityReport(9 fields),SecurityReportValidationResult(6 fields, dry_lab_only=True),VALID_SEVERITY_LEVELS(4),VALID_VULNERABILITY_CATEGORIES(5),VALID_REPORT_STATUSES(6),validate_vulnerability_report()(9 checks with critical+received warning and safety_guardrail_bypass warning),validate_report_dict()(dict input with 8 required fields guard).tests/governance/test_security_policy.py(J6) — 18 tests covering: valid report passes, report_id not SEC- fails, empty report_id fails, invalid severity fails, invalid category fails, empty description fails, empty affected_version fails, empty reporter_handle fails, invalid date fails, invalid status fails, dry_lab_only=False fails, critical+received warns, safety_guardrail_bypass warns, validate_report_dict passes, validate_report_dict missing fields fails, all results dry_lab_only=True, VALID_SEVERITY_LEVELS has 4, VALID_VULNERABILITY_CATEGORIES has 5.src/openamp_foundry/cli/main.py(J6) — Registeredsecurity-report-checksubcommand with--report-json,--formatflags. Added import and dispatch.src/openamp_foundry/cli/commands/reports.py(J6) — Added_run_security_report_check()CLI handler with JSON parsing,validate_report_dict()call, text and JSON output, exit code 3 on validation failure.Makefile(J6) — Addedsecurity-report-checktarget with demo invocation using dependency_vulnerability severity medium. Added to.PHONY.docs/evidence/METRICS_CURRENT.md(J6) — v0.7.4 J6 changelog. Pipeline version: v0.7.4. Test count: 3575.tests/test_test_count_regression.py— baseline updated to 3575.
Honest boundaries:
- Security policy validation checks structural and policy requirements only. It does not verify that the vulnerability actually exists, that the reporter has accurately described it, or that the severity assessment is correct.
dry_lab_only: trueis a const field on all dataclasses — security reports are governance artifacts, not biological findings.- The validator checks that the report_date is in YYYY-MM-DD format but does not verify that the date is reasonable (e.g. not in the future).
- Critical severity with received status produces a warning but does not fail validation — the maintainer may have good reasons for delayed acknowledgment, but the warning ensures it is visible.
- Safety guardrail bypass reports always produce a warning to ensure immediate maintainer attention, regardless of other validation status.
- The security policy defines a process and timeline but does not guarantee that maintainers will actually meet those timelines.
- The policy covers code vulnerabilities, secret leakage, dependency vulnerabilities, safety guardrail bypass, and dual-use risks. It does not cover theoretical vulnerabilities without a reproducible PoC, social engineering, or upstream dependency issues without fixes.
docs/governance/MAINTAINER_ROTATION_PLAN.md with maintainer rotation and
bus-factor plan (purpose, current maintainers table with 3 entries covering
primary_maintainer, secondary_maintainer, external_advisor, role definitions
for 4 roles, bus-factor assessment with target >=2 per critical function,
rotation schedule every 6 months, onboarding and offboarding checklists,
linked policies).
src/openamp_foundry/governance/maintainer_rotation.py with MaintainerEntry
dataclass (6 fields: github_handle, role, backup_handle, responsibilities,
status, dry_lab_only), RotationPlanValidationResult dataclass (7 fields:
passed, errors, warnings, maintainer_count, critical_role_coverage,
bus_factor_sufficient, dry_lab_only), VALID_ROLES (4: primary_maintainer,
secondary_maintainer, external_advisor, contributor), CRITICAL_ROLES (2:
primary_maintainer, secondary_maintainer), VALID_STATUSES (4: active,
on_leave, emeritus, departing), validate_maintainer_entry() (6 checks:
non-empty github_handle, valid role, critical role requires backup_handle,
non-empty responsibilities, valid status, dry_lab_only=True),
validate_rotation_plan() (aggregates entry validation + bus-factor
coverage: missing critical role is error, single coverage is warning),
validate_rotation_plan_dict() (dict input with missing-fields guard).
CLI (openamp-foundry rotation-plan-check) with --plan-json (required),
--format text|json. Handler _run_rotation_plan_check in reports.py.
make rotation-plan-check target. 21 tests. 3557 total.
Maintainer rotation and bus-factor coverage is now machine-validated — the project can detect when critical roles lack backups.
Changes:
docs/governance/MAINTAINER_ROTATION_PLAN.md(J5) — Maintainer rotation and bus-factor plan with purpose, current maintainers table (3 entries), role definitions (4 roles), bus-factor assessment, rotation schedule (every 6 months), onboarding checklist (11 items), offboarding checklist (7 items), linked policies.src/openamp_foundry/governance/maintainer_rotation.py(J5) — Core module withMaintainerEntry(6 fields),RotationPlanValidationResult(7 fields, dry_lab_only=True),VALID_ROLES(4),CRITICAL_ROLES(2),VALID_STATUSES(4),validate_maintainer_entry()(6 checks),validate_rotation_plan()(bus-factor coverage: missing critical role is error, single coverage is warning),validate_rotation_plan_dict()(dict input with missing-fields guard).tests/governance/test_maintainer_rotation.py(J5) — 21 tests covering: valid plan passes, empty entries fails, empty github_handle fails, invalid role fails, critical role without backup fails, empty responsibilities fails, invalid status fails, dry_lab_only=False fails, no active primary maintainer fails, no active secondary maintainer fails, single primary maintainer warns, single secondary maintainer warns, validate_rotation_plan_dict missing 'entries' key fails, validate_rotation_plan_dict valid dict passes, validate_rotation_plan_dict missing entry fields fails, all results dry_lab_only=True, VALID_ROLES has 4 entries, CRITICAL_ROLES has 2 entries, contributor role valid, on_leave status valid, emeritus status valid.src/openamp_foundry/cli/main.py(J5) — Registeredrotation-plan-checksubcommand with--plan-json,--formatflags. Added import and dispatch.src/openamp_foundry/cli/commands/reports.py(J5) — Added_run_rotation_plan_check()CLI handler with JSON parsing,validate_rotation_plan_dict()call, text and JSON output, exit code 3 on validation failure.Makefile(J5) — Addedrotation-plan-checktarget with demo invocation using maintainer and backup-maintainer. Added to.PHONY.docs/evidence/METRICS_CURRENT.md(J5) — v0.7.3 J5 changelog. Pipeline version: v0.7.3. Test count: 3557.tests/test_test_count_regression.py— baseline updated to 3557.
Honest boundaries:
- Maintainer rotation validation checks structural and policy requirements only. It does not verify that the listed maintainers actually have the skills or availability to perform their roles.
dry_lab_only: trueis a const field on all dataclasses — rotation plan validation is a governance artifact, not a legal determination.- Bus-factor assessment is a project-durability estimate, not a security guarantee. A bus-factor of 2 means two named people can cover a function, but both might be unavailable simultaneously.
- The validator cannot detect unlisted critical dependencies (e.g., institutional knowledge, CI secrets, domain expertise held by only one person).
- The rotation schedule is a policy declaration; this validator does not track whether rotations actually occurred.
- Onboarding and offboarding checklists are documentation and guidance — they do not replace judgment about whether a new maintainer is ready.
docs/governance/COI_DISCLOSURE_TEMPLATE.md with structured COI disclosure
template (purpose, fill-in-the-blank format with 10 fields: Disclosure ID
COI-YYYY-NNN, disclosure type reviewer|contributor|maintainer|external_advisor,
subject GitHub handle, related artifact or PR, relationship type
financial|institutional|competitive|personal|none, description (required unless
none), date YYYY-MM-DD, recusal_required true|false, reviewer GitHub handle,
review_status pending|acknowledged|resolved).
src/openamp_foundry/governance/coi_disclosure.py with COIDisclosure
dataclass (10 fields), COIValidationResult dataclass (6 fields,
dry_lab_only=True), VALID_DISCLOSURE_TYPES (4: contributor, external_advisor,
maintainer, reviewer), VALID_RELATIONSHIP_TYPES (5: competitive, financial,
institutional, none, personal), VALID_REVIEW_STATUSES (3: acknowledged,
pending, resolved), validate_coi_disclosure() (10 checks: disclosure_id
starts with COI-, valid disclosure_type, non-empty subject/related_artifact,
valid relationship_type, description required unless none, YYYY-MM-DD date,
non-empty reviewer, valid review_status, dry_lab_only must be True; financial
without recusal yields warning not error), validate_coi_dict() (dict input
with 10 required fields guard).
CLI (openamp-foundry coi-check) with --disclosure-json (required),
--format text|json. Handler _run_coi_check in reports.py.
make coi-check target. 20 tests. 3536 total.
COI disclosures now have a validated structure that builds institutional trust.
Changes:
docs/governance/COI_DISCLOSURE_TEMPLATE.md(J4) — Structured COI disclosure template with purpose, template (10 fields), when to disclose (financial, institutional, competitive, personal), process (5 steps with escalation).src/openamp_foundry/governance/coi_disclosure.py(J4) — Core module withCOIDisclosure(10 fields),COIValidationResult(6 fields, dry_lab_only=True),VALID_DISCLOSURE_TYPES(4),VALID_RELATIONSHIP_TYPES(5),VALID_REVIEW_STATUSES(3),validate_coi_disclosure()(10 checks),validate_coi_dict()(dict input with 10 required fields guard).tests/governance/test_coi_disclosure.py(J4) — 20 tests covering: valid reviewer none relationship passes, valid contributor financial passes, disclosure_id not starting with COI- fails, empty disclosure_id fails, invalid disclosure_type fails, empty subject fails, empty related_artifact fails, invalid relationship_type fails, relationship not none with empty description fails, relationship none with empty description passes, invalid date format fails, empty reviewer fails, invalid review_status fails, dry_lab_only=False fails, financial without recusal warns, validate_coi_dict passes, validate_ coi_dict with missing fields fails, all results dry_lab_only=True, VALID_DISCLOSURE_TYPES has 4, VALID_RELATIONSHIP_TYPES has 5.src/openamp_foundry/cli/main.py(J4) — Registeredcoi-checksubcommand with--disclosure-json,--formatflags. Added import and dispatch.src/openamp_foundry/cli/commands/reports.py(J4) — Added_run_coi_check()CLI handler with JSON parsing, validate_coi_dict call, text and JSON output, exit code 3 on validation failure.Makefile(J4) — Addedcoi-checktarget. Added to.PHONY.docs/evidence/METRICS_CURRENT.md(J4) — v0.7.2 J4 changelog. Pipeline version: v0.7.2. Test count: 3536.tests/test_test_count_regression.py— baseline updated to 3536.
Honest boundaries:
- COI disclosure validation checks structural and policy requirements only. It does not verify that the disclosed information is true, complete, or accurate.
- Financial relationship without recusal produces a warning, not an error — the reviewer retains discretion to determine whether recusal is necessary.
- The validator cannot detect undisclosed conflicts — it only checks that disclosed conflicts are well-formed.
dry_lab_only: trueis a const field on all dataclasses — COI disclosures are governance artifacts, not legal determinations.- The COI template is a transparency and governance tool — it does not replace the judgment of the human reviewer or governance team.
docs/governance/RELEASE_REQUEST_TEMPLATE.md with structured release request
template (purpose, fill-in-the-blank format with 17 fields: Release ID,
release type, artifact ID/version, requestor name/institution, request date,
evidence level 1-6, dry_lab_only, safety_review_status, benchmark_summary,
known_limitations, intended_use, data_license, human_reviewer, review_class
A-D, approval_status; review criteria with 8 checks; process with classes A-D
timelines and escalation path).
src/openamp_foundry/governance/release_request.py with ReleaseRequest
dataclass (17 fields), ReleaseRequestValidationResult dataclass (6 fields,
dry_lab_only=True), VALID_RELEASE_TYPES (5: candidate, model, dataset,
evidence_packet, schema), VALID_SAFETY_STATUSES (3: pending, approved,
not_required), VALID_INTENDED_USES (4: research, internal, external_partner,
public), VALID_APPROVAL_STATUSES (4: pending, approved, rejected, deferred),
VALID_REVIEW_CLASSES (4: A, B, C, D), validate_release_request() (17 checks:
release_id format, release_type valid, non-empty artifact_id/artifact_version/
requestor_name/requestor_institution, request_date YYYY-MM-DD, evidence_level
1-6, dry_lab_only must be True, safety_review_status valid, non-empty
benchmark_summary/known_limitations/data_license/human_reviewer, intended_use
valid, review_class valid, approval_status valid, dry_lab_only+evidence_level>4
error, public+safety_pending error, model+review_class warning).
validate_request_dict() (dict input with 17 required fields guard, missing
fields returns passed=False early).
CLI (openamp-foundry release-request-check) with --request-json (required),
--format text|json. Handler _run_release_request_check in reports.py.
make release-request-check target. 25 tests. 3516 total.
Blocks public releases with pending safety review, blocks dry_lab_only artifacts with evidence_level>4. Formal release requests now have a validated structure before entering human review.
Changes:
docs/governance/RELEASE_REQUEST_TEMPLATE.md(J3) — Structured release request template with purpose, template (17 fields), review criteria (8 checks), process (5 steps with A-D timelines and escalation path).src/openamp_foundry/governance/release_request.py(J3) — Core module withReleaseRequest(17 fields),ReleaseRequestValidationResult(6 fields, dry_lab_only=True),VALID_RELEASE_TYPES(5),VALID_SAFETY_STATUSES(3),VALID_INTENDED_USES(4),VALID_APPROVAL_STATUSES(4),VALID_REVIEW_CLASSES(4),validate_release_request()(17 checks),validate_request_dict()(dict input with missing-fields guard).tests/governance/test_release_request.py(J3) — 25 tests covering: valid candidate release request passes, release_id not starting with REL- fails, invalid release_type fails, empty artifact_id fails, empty requestor_name fails, invalid request_date format fails, evidence_level=0 fails, evidence_level=7 fails, dry_lab_only=False fails, invalid safety_review_status fails, empty benchmark_summary fails, empty known_limitations fails, invalid intended_use fails, public release with pending safety fails, dry_lab_only with evidence_level=5 fails, all results dry_lab_only=True, validate_request_ dict passes, VALID_RELEASE_TYPES has 5, VALID_SAFETY_STATUSES has 3, VALID_INTENDED_USES has 4, VALID_APPROVAL_STATUSES has 4, VALID_REVIEW_CLASSES has 4, model review_class warning, dict missing fields fails.src/openamp_foundry/cli/main.py(J3) — Registeredrelease-request-checksubcommand with--request-json,--formatflags. Added import and dispatch.src/openamp_foundry/cli/commands/reports.py(J3) — Added_run_release_request_check()CLI handler with JSON parsing, validate_request _dict call, text and JSON output, exit code 3 on validation failure.Makefile(J3) — Addedrelease-request-checktarget. Added to.PHONY.docs/evidence/METRICS_CURRENT.md(J3) — v0.7.1 J3 changelog. Pipeline version: v0.7.1. Test count: 3516.tests/test_test_count_regression.py— baseline updated to 3516.
Honest boundaries:
- Release request validation checks structural and policy requirements only. It does not verify that the artifact actually exists, that the evidence level claim is accurate, or that the safety review was thorough.
dry_lab_only: trueis a const field on all dataclasses — release requests are governance artifacts, not biological findings.- The validator blocks public releases with pending safety review, but it cannot verify that the safety review was correctly performed or that the reviewer was qualified.
- Review classes are policy declarations — the validator checks that the class is valid (A-D) but not that the appropriate review process was followed.
- The release request template is a communication and governance tool — it does not replace the judgment of the human reviewer.
docs/governance/DECISION_LOG.md with structured governance decision log
(purpose, decision index with 8 entries GOV-001 through GOV-008 covering
safety/benchmark/release/evidence/data/adapter/contribution/docs scopes,
how to add entries, linked policies).
src/openamp_foundry/governance/decision_log.py with VALID_SCOPES (8:
safety, benchmark, release, evidence, data, adapter, contribution, docs),
VALID_STATUSES (4: active, superseded, under_review, proposed),
VALID_REVIEW_CLASSES (4: A, B, C, D), GovernanceDecision dataclass
(8 fields: decision_id, date, scope, decision, status, rationale,
review_class, dry_lab_only=True), DecisionValidationResult dataclass
(5 fields: decision_id, passed, errors, warnings, dry_lab_only=True),
GOVERNANCE_DECISIONS list (8 entries: GOV-001 through GOV-008),
validate_governance_decision() (9 checks: decision_id format, date
format, valid scope, non-empty decision, valid status, non-empty rationale,
valid review_class, dry_lab_only must be True, superseded warning),
validate_all_decisions() (aggregates total/passed/failed/all_passed/
results/dry_lab_only), get_decisions_by_scope() (filters by scope),
get_decisions_by_status() (filters by status).
CLI (openamp-foundry decision-log) with --validate, --scope,
--format text|json. Handler _run_decision_log in reports.py.
make decision-log target. 27 tests. 3491 total.
Phase J milestone: v0.7.0 — governance decisions are now discoverable and machine-validated.
Changes:
docs/governance/DECISION_LOG.md(J2) — Structured governance decision log with purpose, decision index (8 entries GOV-001 through GOV-008), how to add entries, linked policies.src/openamp_foundry/governance/decision_log.py(J2) — Core module withVALID_SCOPES(8),VALID_STATUSES(4),VALID_REVIEW_CLASSES(4),GovernanceDecision(8 fields, dry_lab_only=True default),DecisionValidationResult(5 fields, dry_lab_only=True default),GOVERNANCE_DECISIONS(8 entries: GOV-001 through GOV-008),validate_governance_decision()(9 checks),validate_all_decisions()(aggregates total/passed/failed/all_passed),get_decisions_by_scope(),get_decisions_by_status().tests/governance/test_decision_log.py(J2) — 27 tests covering all 8 GOV entries pass validation, empty/invalid decision_id, invalid date format, invalid scope (parametrized), empty decision text, invalid status (parametrized), empty rationale, invalid review_class (parametrized), dry_lab_only=False failure, superseded warning, validate_all_decisions passes, get_decisions_by_scope safety → GOV-001, get_decisions_by_status active → all 8, 8 entries constant check, all results dry_lab_only=True, valid set counts, DecisionValidationResult dataclass fields.src/openamp_foundry/cli/main.py(J2) — Registereddecision-logsubcommand with--validate,--scope,--formatflags. Added import and dispatch.src/openamp_foundry/cli/commands/reports.py(J2) — Added_run_decision_log()CLI handler with validate/scope filtering/list all modes, text and JSON output, exit code 3 on validation failure.Makefile(J2) — Addeddecision-logtarget. Added to.PHONY.docs/evidence/METRICS_CURRENT.md(J2) — v0.7.0 J2 changelog. Pipeline version: v0.7.0. Test count: 3491.tests/test_test_count_regression.py— baseline updated to 3491.
Honest boundaries:
- Decision log tracks governance decisions only — it does not measure biological activity, safety, or clinical value.
dry_lab_only: trueis a const field on all dataclasses — the decision log is a computational governance artifact, not a biological finding.- The list of valid scopes and statuses is policy-defined and may need expansion as governance matures.
- Validation checks structural and policy requirements only — it does not verify that the decision was correctly implemented or enforced.
- Review classes are declarations stored on each decision; the validator does not verify that the declared review class was actually applied.
- The decision log is a documentation and validation tool — it does not replace human judgment about whether a decision is appropriate.
docs/governance/RELEASE_REQUEST_TEMPLATE.md with structured release
request template (purpose, fill-in template with 17 fields, review
criteria with 8 checks, process with classes A-D timelines and escalation).
src/openamp_foundry/governance/release_request.py with ReleaseRequest
dataclass (17 fields), ReleaseRequestValidationResult dataclass (6 fields,
dry_lab_only=True), VALID_RELEASE_TYPES (5), VALID_SAFETY_STATUSES (3),
VALID_INTENDED_USES (4), VALID_APPROVAL_STATUSES (4),
VALID_REVIEW_CLASSES (4), validate_release_request() (17 checks with
dry_lab_only+evidence_level>4 error, public+safety_pending error,
model+review_class warning), validate_request_dict() (dict input with
missing-fields guard).
CLI (openamp-foundry release-request-check) with --request-json,
--format text|json. Handler _run_release_request_check in reports.py.
make release-request-check target. 25 tests. 3516 total.
Changes:
docs/governance/RELEASE_REQUEST_TEMPLATE.md(J3) — Structured release request template with purpose, fill-in template (17 fields), review criteria (8 checks), process (submit→validate→review→decision→release), expected timelines per class A-D, escalation path.src/openamp_foundry/governance/release_request.py(J3) — Core module withReleaseRequest(17 fields),ReleaseRequestValidationResult(6 fields, dry_lab_only=True),VALID_RELEASE_TYPES(5),VALID_SAFETY_STATUSES(3),VALID_INTENDED_USES(4),VALID_APPROVAL_STATUSES(4),VALID_REVIEW_CLASSES(4),validate_release_request()(17 checks including cross-field rules: dry_lab_only+evidence_level>4 error, public+safety_pending error, model+review_class C/D warning),validate_request_dict().tests/governance/test_release_request.py(J3) — 25 tests covering: valid candidate passes, release_id must start with REL-, invalid type, empty artifact_id/requestor_name, invalid date format, evidence_level 0/7, dry_lab_only=False, invalid safety_status, empty benchmark_summary/ known_limitations, invalid intended_use, public+safety_pending fails, dry_lab_only+evidence_level 5 fails, dry_lab_only=True on results, valid dict passes, VALID_RELEASE_TYPES has 5 entries, VALID_SAFETY_STATUSES has 3, VALID_INTENDED_USES has 4, VALID_APPROVAL_STATUSES has 4, VALID_REVIEW_CLASSES has 4, model+low review_class warning, dict missing fields, invalid type via dict.src/openamp_foundry/cli/main.py(J3) — Registeredrelease-request-checksubcommand with--request-json(required),--formatflags. Added import and dispatch.src/openamp_foundry/cli/commands/reports.py(J3) — Added_run_release_request_check()CLI handler with JSON parsing,validate_request_dict()call, text and JSON output, exit code 3 on failure.Makefile(J3) — Addedrelease-request-checktarget with demo invocation using schema release type with all fields valid. Added to.PHONY.docs/evidence/METRICS_CURRENT.md(J3) — v0.7.1 J3 changelog. Pipeline version: v0.7.1. Test count: 3516.tests/test_test_count_regression.py— baseline updated to 3516.
Honest boundaries:
- Release request validation checks structural and policy requirements only. It does not verify that the release was actually performed, that the artifact exists, or that the benchmark claims are biologically meaningful.
dry_lab_only: trueis a const field on all dataclasses — release requests are computational governance artifacts, not biological findings.- The validator does not verify that the human reviewer has actually reviewed the request — it only checks that a GitHub handle was provided.
- Review class appropriateness is advisory: the validator warns about model releases with low review classes but does not block them.
- The template and process are governance tools — they do not replace human judgment about whether a release is appropriate or safe.
docs/governance/RELEASE_CHECKLIST.md with structured release checklist
cross-referencing docs/trust/RELEASE_CHECKLIST.md.
src/openamp_foundry/governance/release_gate.py with RELEASE_TYPES (5:
candidate, model, dataset, evidence_packet, schema), UNIVERSAL_GATES (7:
ci_tests_pass, agent_check_passes, no_critical_issues, dry_lab_only_confirmed,
safety_flags_reviewed, data_license_verified, no_hardcoded_secrets),
EXTRA_GATES_BY_TYPE (per-type additional gates), ReleaseGateResult
dataclass (8 fields, dry_lab_only=True), validate_release_gate() (validates
all required gates, treats missing gates as failed, raises CRITICAL error
on dry_lab_only_confirmed failure).
CLI (openamp-foundry release-gate-check) with --release-type,
--artifact-id, --gates-json, --format text|json.
make release-gate-check target. 18 tests. 3478 total.
Starts Phase J (Governance and release maturity) — releases now require all gates to pass before external release, preventing accidental bypass of required checks.
Changes:
docs/governance/RELEASE_CHECKLIST.md— Structured release checklist with pre-release gates, release-type gates (5 types), post-release checklist.src/openamp_foundry/governance/__init__.py— Empty package init.src/openamp_foundry/governance/release_gate.py(J1) — Core module withRELEASE_TYPES(5),UNIVERSAL_GATES(7),EXTRA_GATES_BY_TYPE,ReleaseGateResult(8 fields, dry_lab_only=True),validate_release_gate().tests/governance/__init__.py— Empty package init.tests/governance/test_release_gate.py(J1) — 18 tests covering all release types, universal gate failure, missing gates, invalid release type, empty artifact_id, dry_lab_only_confirmed CRITICAL error, constant checks.src/openamp_foundry/cli/commands/gates.py(J1) — Added_run_release_gate_check()CLI handler with JSON parsing,validate_release_gate()call, text and JSON output.src/openamp_foundry/cli/main.py(J1) — Registeredrelease-gate-checksubcommand with--release-type,--artifact-id,--gates-json,--formatflags. Added import and dispatch.Makefile(J1) — Addedrelease-gate-checktarget with demo invocation using schema release type with all gates green. Added to.PHONY.docs/evidence/METRICS_CURRENT.md(J1) — v0.6.9 J1 changelog. Pipeline version: v0.6.9. Test count: 3478. Phase J started note.tests/test_test_count_regression.py— baseline updated to 3478.
Honest boundaries:
- Release gate validator can only check what it is told via gate_statuses — if a gate status is incorrectly reported as passing, the validator cannot detect that.
- The checklist is documentation and automation — it does not replace human judgment about whether a release is appropriate.
- dry_lab_only flag is always True; the validator enforces this but cannot verify the actual status of external artifacts.
- No wet-lab validity implied. Gates are dry-lab governance only.
src/openamp_foundry/adoption/scorecard.py with SCORECARD_DIMENSIONS
(5 weighted dimensions summing to 1.0: integration_check 0.25,
license_compliance 0.20, adapter_validation 0.20, schema_compatibility 0.20,
contribution_readiness 0.15), ADOPTION_TIERS (4 tiers: not_ready 0.0-0.40,
emerging 0.40-0.65, established 0.65-0.85, mature 0.85-1.01),
DimensionScore dataclass (8 fields: dimension, weight, raw_score,
weighted_score, passed_checks, total_checks, notes, dry_lab_only=True),
AdoptionScorecard dataclass (6 fields: total_score, adoption_tier,
dimensions, summary, recommendations, dry_lab_only=True),
build_scorecard() (aggregates dimension inputs into weighted total score
with tier classification and actionable recommendations),
compute_adoption_tier() (maps float score 0.0-1.0 to tier string).
CLI (openamp-foundry adoption-scorecard) with --scores-json and
--format text|json. Handler _run_adoption_scorecard in reports.py.
make adoption-scorecard target. 17 tests. 3446 total.
Phase I (Interoperability and Adoption) is now fully complete — all 10 items I1–I10 implemented (artifact versioning, candidate manifest, benchmark card, artifact changelog, integration checker, adapter validator, data license checker, schema compatibility, contribution intake, adoption scorecard).
Changes:
src/openamp_foundry/adoption/scorecard.py(I10) — Core module withSCORECARD_DIMENSIONS(5 weighted dimensions summing to 1.0),ADOPTION_TIERS(4 tiers),DimensionScore(8 fields, dry_lab_only=True default),AdoptionScorecard(6 fields, dry_lab_only=True default),build_scorecard()(aggregates dimension inputs into weighted total score, tier, and per-dimension scores with recommendations),compute_adoption_tier()(maps float 0.0-1.0 to tier string).tests/adoption/__init__.py(I10) — Empty package init.tests/adoption/test_scorecard.py(I10) — 17 tests covering: perfect scores → mature, all zeros → not_ready, score 0.50 → emerging, score 0.75 → established, weights sum to 1.0, SCORECARD_DIMENSIONS has 5 entries, ADOPTION_TIERS has 4 entries, DimensionScore dry_lab_only=True default, AdoptionScorecard dry_lab_only=True default, recommendations empty when all pass, recommendations populated on failures, weighted sum correctness, missing dimension defaults to 0/0, compute_adoption_tier boundaries, build_scorecard returns correct fields.src/openamp_foundry/cli/main.py(I10) — Registeredadoption-scorecardsubcommand with--scores-json(required),--formatflags. Added import and dispatch.src/openamp_foundry/cli/commands/reports.py(I10) — Added_run_adoption_scorecard()CLI handler with JSON parsing,build_scorecardcall, text and JSON output.Makefile(I10) — Addedadoption-scorecardtarget with demo invocation using all 5 dimensions at perfect scores. Added to.PHONY.docs/evidence/METRICS_CURRENT.md(I10) — v0.6.8 I10 changelog. Pipeline version: v0.6.8. Test count: 3446. Phase I complete note.tests/test_test_count_regression.py— baseline updated to 3446.
Honest boundaries:
- Scorecard measures adoption readiness only — whether the checks pass or fail. It does not measure actual downstream adoption, user satisfaction, or biological validity.
- Dimension weights are heuristic and may need adjustment as adoption data accumulates. The current weights (integration 0.25, license 0.20, adapter 0.20, schema 0.20, contribution 0.15) are the initial guess.
dry_lab_only: trueis a const field on all dataclasses — the scorecard is a computational governance tool, not a biological assessment.- The scorecard aggregates structural signals from other Phase I modules. If any of those modules have blind spots, the aggregation inherits them.
- Perfect scores mean all structural checks pass, not that real-world adoption is happening. Adoption is a social outcome, not a pipeline metric.
docs/community/PUBLIC_GOOD_CONTRIBUTION_GUIDE.md with 6 contribution types
(wet_lab_validation, dataset_donation, compute_sponsorship, expert_review,
governance_participation, algorithm_contribution), review classes A-D, minimum
requirements table, initiation process, data governance, and safety constraints.
src/openamp_foundry/community/contribution_intake.py with ContributionIntake
dataclass (7 fields: institution_name, contact_email, contribution_type,
proposed_scope, human_review_required, dry_lab_only, extra_fields),
IntakeValidationResult dataclass (7 fields: institution_name, contribution_type,
passed, errors, warnings, required_review_class, dry_lab_only),
VALID_CONTRIBUTION_TYPES set (6 entries), VALID_REVIEW_CLASSES set (4 entries),
REQUIRED_FIELDS_BY_TYPE dict (6 entries). validate_contribution_intake() checks
all top-level fields (institution_name, contact_email, contribution_type,
proposed_scope, dry_lab_only), type-specific required fields from
REQUIRED_FIELDS_BY_TYPE, and enforces human_review_required=True for
wet_lab_validation. validate_intake_dict() handles raw dict input with
missing-fields guard.
CLI (openamp-foundry contribution-check) with --intake-json and
--format text|json. Handler _run_contribution_check in reports.py.
make contribution-check target. 16 tests. 3429 total.
Changes:
docs/community/PUBLIC_GOOD_CONTRIBUTION_GUIDE.md(I9) — Full public-good contribution guide with purpose, who can contribute, 6 contribution types table, minimum requirements, initiation process, data governance, safety constraints, and contact information.src/openamp_foundry/community/__init__.py(I9) — Empty package init.src/openamp_foundry/community/contribution_intake.py(I9) — Core module withContributionIntake(7 fields),IntakeValidationResult(7 fields),VALID_CONTRIBUTION_TYPES(6 entries),VALID_REVIEW_CLASSES(4 entries),REQUIRED_FIELDS_BY_TYPE(6 entries),validate_contribution_intake(),validate_intake_dict(). All dataclasses carry dry_lab_only=True.tests/community/__init__.py(I9) — Empty package init.tests/community/test_contribution_intake.py(I9) — 16 tests covering: valid dataset_donation passes, valid wet_lab_validation with human_review passes, empty institution_name fails, invalid email fails, invalid contribution_type fails, empty proposed_scope fails, dry_lab_only=False fails, wet_lab_validation without human_review fails, dataset_donation missing data_license fails, algorithm_contribution missing has_tests fails, all results have dry_lab_only=True, validate_intake_dict passes, dict missing field fails, VALID_CONTRIBUTION_TYPES has 6 entries, REQUIRED_FIELDS_BY_TYPE has 6 keys, wet_lab_validation gets review_class D.src/openamp_foundry/cli/main.py(I9) — Registeredcontribution-checksubcommand with--intake-json(required),--formatflags. Added import and dispatch.src/openamp_foundry/cli/commands/reports.py(I9) — Added_run_contribution_check()CLI handler with JSON parsing, ContributionIntake creation, text and JSON output, and exit code 3 on failure.Makefile(I9) — Addedcontribution-checktarget with demo invocation using Example University dataset_donation. Added to.PHONY.docs/evidence/METRICS_CURRENT.md(I9) — v0.6.7 I9 changelog. Pipeline version: v0.6.7. Test count: 3429.tests/test_test_count_regression.py— baseline updated to 3429.
Honest boundaries:
- Contribution validation checks structural and policy requirements only. It does not verify that the institution actually has the right to share the data or that the data is biologically meaningful.
dry_lab_only: trueis a const field on all dataclasses — contribution intake is inherently computational and must never be presented as biological proof.- wet_lab_validation always requires human_review_required=True — this is a structural check that the flag is set, not verification that human review actually occurred.
- Data governance (DATA_GOVERNANCE.md, DATA_LICENSE_NOTICE.md) applies to all contributed datasets regardless of whether the intake check passes.
- The contribution guide is informational and aspirational. Actual acceptance and review outcomes depend on maintainer capacity and project priorities.
src/openamp_foundry/compatibility/artifact_compatibility.py with
SchemaCompatibilityResult dataclass (5 fields: schema_name, schema_path, passed,
errors, warnings, dry_lab_only=True). UNIVERSAL_REQUIRED_FIELDS (set: dry_lab_only,
version). CONVENTION_CHECKS (dict: dry_lab_only → boolean const true, version →
string matching MAJOR.MINOR.PATCH, evidence_level → integer in 1-6 when present).
check_schema_conventions() validates each schema against universal conventions.
run_compatibility_check() scans all schemas/*.schema.json and returns
total/passed/failed/all_passed/results/dry_lab_only.
CLI (openamp-foundry artifact-compat-check) with --schemas-dir (default:
schemas/) and --format text|json. Handler _run_artifact_compat_check in
reports.py.
make artifact-compat-check target. 20 tests. 3413 total. Cross-artifact
schema compatibility is automatically checked across all schema files, preventing
drift between artifact versions.
Changes:
src/openamp_foundry/compatibility/__init__.py(I8) — Empty package init.src/openamp_foundry/compatibility/artifact_compatibility.py(I8) — Core module withSchemaCompatibilityResult(5 fields, dry_lab_only=True default),UNIVERSAL_REQUIRED_FIELDS,CONVENTION_CHECKS,check_schema_conventions(),run_compatibility_check().tests/compatibility/__init__.py(I8) — Empty package init.tests/compatibility/test_artifact_compatibility.py(I8) — 20 tests covering candidate_manifest/benchmark_card passes, simulation_result detected (known dry_lab_context convention difference), synthetic schemas with missing/misformed fields, run_compatibility_check dict shape, SchemaCompatibilityResult defaults, additionalProperties/$schema warnings.src/openamp_foundry/cli/main.py(I8) — Registeredartifact-compat-checksubcommand with--schemas-dir,--formatflags. Added import and dispatch.src/openamp_foundry/cli/commands/reports.py(I8) — Added_run_artifact_compat_check()CLI handler with text and JSON output, exit code 3 on failure.Makefile(I8) — Addedartifact-compat-checktarget. Added to.PHONY.docs/evidence/METRICS_CURRENT.md(I8) — Updated last updated, new in v0.6.6, pipeline version, test count (3393→3413).
src/openamp_foundry/licensing/license_checker.py with DataLicenseDeclaration
dataclass (11 fields: source_id, source_name, license_id, use_context,
attribution_required, commercial_use_allowed, redistribution_allowed,
modifications_allowed, human_review_required, notes, dry_lab_only).
LicenseCheckResult dataclass (8 fields: source_id, license_id, use_context,
passed, status, errors, warnings, dry_lab_only). check_data_license() validates
declarations against three license sets: APPROVED_LICENSES (11 entries: CC0-1.0,
CC-BY-4.0, CC-BY-SA-4.0, MIT, Apache-2.0, GPL-3.0, LGPL-2.1, BSD-2-Clause,
BSD-3-Clause, ODbL-1.0, PDDL-1.0), RESTRICTED_LICENSES (4 entries: CC-BY-NC-4.0,
CC-BY-NC-SA-4.0, custom, proprietary), BLOCKED_LICENSES (3 entries: unknown,
unlicensed, all-rights-reserved). Blocked licenses fail immediately; restricted
require human_review_required=True; unknown licenses require governance review.
check_license_batch() summarizes total/passed/failed/blocked/any_blocked/
all_passed with dry_lab_only=True. VALID_USE_CONTEXTS (6 entries: training,
scoring, benchmarking, reporting, publication, internal).
CLI (openamp-foundry license-check) with --source-json (required) and
--format text|json. Handler _run_license_check in reports.py.
make license-check target. 20 tests. 3393 total. External data sources
used in pipeline outputs now require explicit license declarations, preventing
hidden legal risk. This is Loop 105 — the 105th PR in the NEXT_100_PR_MAP series.
Changes:
src/openamp_foundry/licensing/__init__.py(I7) — Empty package init.src/openamp_foundry/licensing/license_checker.py(I7) — Core module withDataLicenseDeclaration(11 fields),LicenseCheckResult(8 fields),check_data_license()(validates against APPROVED_LICENSES 11 entries, RESTRICTED_LICENSES 4, BLOCKED_LICENSES 3, VALID_USE_CONTEXTS 6),check_license_batch()(summary with counts, any_blocked, all_passed, dry_lab_only=True). All dataclasses carry dry_lab_only=True.tests/licensing/__init__.py(I7) — Empty package init.tests/licensing/test_license_checker.py(I7) — 20 tests covering: valid CC0 passes, valid MIT passes, blocked unknown/unlicensed/all-rights-reserved fail, restricted CC-BY-NC-4.0 without human_review fails, restricted with human_review passes, empty source_id/source_name/license_id fail, invalid use_context fails, dry_lab_only=False fails, publication without redistribution fails, unknown license gets status=unknown_license, batch counts correct, all results dry_lab_only, constant counts.src/openamp_foundry/cli/main.py(I7) — Registeredlicense-checksubcommand with--source-json,--formatflags. Added import and dispatch.src/openamp_foundry/cli/commands/reports.py(I7) — Added_run_license_check()CLI handler with JSON parsing, DataLicenseDeclaration creation, text and JSON output, and exit code 3 on failure.Makefile(I7) — Addedlicense-checktarget with demo invocation using apd-v2 source and CC-BY-4.0 license. Added to.PHONY.docs/evidence/METRICS_CURRENT.md— v0.6.5 I7 changelog. Test count: 3393.tests/test_test_count_regression.py— baseline updated to 3393.
Honest boundaries:
- License validation checks declared license identifiers against known lists. It does not verify that the data source actually uses the declared license, that the license is legally enforceable in a given jurisdiction, or that the data was lawfully obtained.
- Approved and blocked lists are policy-defined and may need updating as the legal landscape evolves.
dry_lab_only: trueis a const field on all dataclasses — license checks are inherently computational and must never be presented as legal advice.- External adapter authors who produce data from new sources must declare their licenses before those data can influence pipeline outputs.
- Restricted licenses require human_review_required=True — this is a structural check that the flag is set, not verification that human review actually occurred.
src/openamp_foundry/adapters/adapter_validator.py with AdapterDeclaration
dataclass (14 fields: adapter_id, adapter_version, mode, output_status,
score_fields, uncertainty, warnings, failure_reason, release_status,
ranking_effect, has_baseline_comparison, makes_network_calls,
network_call_documented, dry_lab_only). AdapterValidationResult dataclass
(5 fields: adapter_id, passed, errors, warnings_list, dry_lab_only).
validate_adapter_declaration() with 10 checks covering all fields against
their valid value sets (VALID_ADAPTER_MODES, VALID_OUTPUT_STATUSES,
VALID_RANKING_EFFECTS, VALID_RELEASE_STATUSES) plus cross-field rules
(baseline comparison required for ranking_effect=proposed/active, network
call documentation required when makes_network_calls=True, deprecated mode
must not have active/proposed ranking_effect, uncertainty must be 0.0-1.0
or None, dry_lab_only must be True). Gated mode with ranking_effect=none
produces a warning. validate_adapter_dict() for raw dict validation with
missing-fields guard.
CLI (openamp-foundry adapter-check) with --adapter-json (required) and
--format text|json. Handler _run_adapter_check in reports.py.
make adapter-author-check target. 31 tests. 3387 total. External adapter
authors can now validate their declarations against the ADAPTER_AUTHOR_GUIDE
contract before submitting. This is Loop 104 — the 104th PR in the
NEXT_100_PR_MAP series.
Changes:
src/openamp_foundry/adapters/__init__.py(I6) — Empty package init.src/openamp_foundry/adapters/adapter_validator.py(I6) — Core module with AdapterDeclaration (14 fields), AdapterValidationResult (5 fields), validate_adapter_declaration (10 checks), validate_adapter_dict (dict input with missing-fields guard), 4 valid-value sets (VALID_ADAPTER_MODES, VALID_OUTPUT_STATUSES, VALID_RANKING_EFFECTS, VALID_RELEASE_STATUSES), REQUIRED_OUTPUT_CONTRACT_FIELDS (10 items). All dataclasses carry dry_lab_only=True.tests/adapters/__init__.py(I6) — Empty package init.tests/adapters/test_adapter_validator.py(I6) — 31 tests covering: valid minimal declaration, empty adapter_id/version, invalid mode/output_ status/ranking_effect/release_status, dry_lab_only=False, ranking_effect active/proposed requires baseline, network calls require documentation, deprecated+active ranking, uncertainty range, None uncertainty passes, gated+none warning, all valid modes/output_statuses parametrized, result dry_lab_only, valid dict, missing fields in dict, constants counts.src/openamp_foundry/cli/main.py(I6) — Registeredadapter-checksubcommand with--adapter-json,--formatflags. Added import and dispatch.src/openamp_foundry/cli/commands/reports.py(I6) — Added_run_adapter_check()CLI handler with JSON parsing, text and JSON output, adapter validation, and error handling.Makefile(I6) — Addedadapter-author-checktarget with demo invocation using example-adapter. Added to.PHONY.docs/evidence/METRICS_CURRENT.md— v0.6.4 I6 changelog. Fixed > > formatting bug on v0.6.2 line. Test count: 3387.tests/test_test_count_regression.py— baseline updated to 3373.
Honest boundaries:
- Adapter validation checks structural and policy requirements only. It does not verify that the adapter produces biologically meaningful outputs or that the adapter implementation is correct.
- Valid value sets are policy-defined and may need updating as the adapter ecosystem evolves.
- The validator accepts declarative metadata only — it does not run the adapter or verify its behavior at runtime.
dry_lab_only: trueis a const field on all dataclasses — adapters are inherently dry-lab and must never be presented as biological proof.- Safety, toxicity, and dual-use safeguards are preserved — the validator enforces no-ranking-effect for deprecated adapters, baseline comparison for active adapters, and documentation for network calls.
docs/adoption/DOWNSTREAM_PROJECT_TEMPLATE.md with overview of OpenAMP
artifacts (candidate manifests, benchmark cards, evidence certificates,
simulation results — all dry-lab only), minimum viable integration steps
(consume candidate manifest, validate against schema, use Python library),
schema validation guide against candidate_manifest.schema.json, evidence
level interpretation table (L1-L6 with labels, meanings, and caveats),
safety flag conventions table (6 flags with meanings and suggested actions),
benchmark card consumption guide with comparison against baselines, explicit
dry-lab limitations section, and contact/contribution section.
src/openamp_foundry/adoption/integration_checker.py with
REQUIRED_INTEGRATION_CHECKS list (5 checks: manifest_schema_valid,
evidence_level_in_range, dry_lab_only_acknowledged, safety_flags_reviewed,
baseline_comparison_present). IntegrationCheckResult dataclass (4 fields:
check_name, passed, detail, dry_lab_only). run_integration_checks() that
validates a manifest dict against all 5 checks and returns checks list,
passed_count, failed_count, all_passed, dry_lab_only.
Exported from src/openamp_foundry/adoption/__init__.py.
CLI (openamp-foundry integration-check) with --manifest-json (required,
JSON of candidate manifest dict), --format text|json. make integration-check
target. Handler _run_integration_check in reports.py.
14 tests. 3356 total. External researchers who want to use OpenAMP artifacts in their own pipelines now have a guide that shows them the minimum viable integration: how to consume a candidate manifest, validate it, and produce their own evidence packet.
Changes:
docs/adoption/DOWNSTREAM_PROJECT_TEMPLATE.md(I5) — Full downstream project guide with integration steps, schema validation, evidence table, safety flags, benchmark card consumption, dry-lab limitations.src/openamp_foundry/adoption/__init__.py(I5) — Package init, exportsREQUIRED_INTEGRATION_CHECKS,IntegrationCheckResult,run_integration_checks.src/openamp_foundry/adoption/integration_checker.py(I5) — Core module withREQUIRED_INTEGRATION_CHECKS(5 items),IntegrationCheckResultdataclass (4 fields),run_integration_checks()(5 checks against manifest dict, returns dict with checks, counts, all_passed, dry_lab_only).src/openamp_foundry/cli/main.py(I5) — Registeredintegration-checksubcommand with--manifest-json,--formatflags. Added import and dispatch.src/openamp_foundry/cli/commands/reports.py(I5) — Added_run_integration_check()CLI handler with JSON parsing, text and JSON output, integration check execution, and error handling.Makefile(I5) — Addedintegration-checktarget with demo invocation using AMP-001 manifest. Added to.PHONY.tests/adoption/__init__.py(I5) — Empty package init.tests/adoption/test_integration_checker.py(I5) — 14 tests covering: valid manifest all_passed=True, missing candidate_id fails, level=0 fails, level=7 fails, dry_lab_only=False fails, dry_lab_only key missing fails, safety_flags key missing fails, empty scores fails, all checks return dry_lab_only=True, REQUIRED_INTEGRATION_CHECKS has 5 entries, run_integration_checks returns dry_lab_only=True, passed+failed=5, valid manifest failed_count=0, IntegrationCheckResult dataclass constructor.docs/evidence/METRICS_CURRENT.md— v0.6.3 I5 changelog. Test count: 3356.tests/test_test_count_regression.py— baseline updated to 3356.
Honest boundaries:
- The downstream project template is a guide for consuming dry-lab artifacts. It does not contain biological instructions, assay protocols, or safety procedures.
- The integration checker validates structural and policy requirements only. It does not verify that a downstream project actually consumes the artifacts correctly or that the candidate manifests are biologically meaningful.
dry_lab_only: trueis preserved throughout — all integration checks are computational safeguards, not biological proof.- The evidence level table is a taxonomy, not a validation ladder. L1-L3 outputs remain computational hypotheses regardless of integration status.
- Safety flag conventions are advisory. Downstream projects must conduct their own safety review.
docs/engineering/ARTIFACT_CHANGELOG.md with structured changelog format
(version, date, artifact_name, change_type, description, breaking flag).
Unreleased section at top for pending changes. 5 entries covering recent
Phase H and I additions (candidate_manifest, benchmark_card,
simulation_result, simulation_module_registry, artifact_versioning_policy)
plus the changelog itself — all as "added", non-breaking, v1.0.0.
src/openamp_foundry/versioning/artifact_changelog.py with CHANGE_TYPES
set (6 values: added, changed, deprecated, removed, fixed, security),
ChangelogEntry dataclass (7 fields: version, date, artifact_name,
change_type, description, breaking, notes), ARTIFACT_CHANGELOG list
(6 entries), get_changelog_entries() (filters by artifact_name, version,
change_type, breaking_only), validate_changelog() (5 checks: version
MAJOR.MINOR.PATCH, date YYYY-MM-DD with dashes, artifact_name non-empty,
change_type in CHANGE_TYPES, description non-empty), changelog_summary()
(total, by_change_type, breaking_changes, artifacts_covered sorted,
dry_lab_only).
CLI (openamp-foundry artifact-changelog) with --artifact, --version,
--change-type, --breaking-only, --format text|json.
make artifact-changelog target.
13 tests. 3342 total. External tools that consume OpenAMP artifacts now have a machine-readable changelog to detect breaking changes and adapt consumers. This is Loop 102 — the 102nd PR in the NEXT_100_PR_MAP series.
Changes:
docs/engineering/ARTIFACT_CHANGELOG.md(I4) — Structured changelog document with versioned entries, Unreleased section, and dry-lab-only disclaimer.src/openamp_foundry/versioning/artifact_changelog.py(I4) — Core module withCHANGE_TYPES,ChangelogEntrydataclass,ARTIFACT_CHANGELOG,get_changelog_entries(),validate_changelog(),changelog_summary().src/openamp_foundry/versioning/__init__.py(I4) — ExportedCHANGE_TYPES,ChangelogEntry,ARTIFACT_CHANGELOG,get_changelog_entries,validate_changelog,changelog_summary.src/openamp_foundry/cli/main.py(I4) — Registeredartifact-changelogsubcommand with--artifact,--version,--change-type,--breaking-only,--formatflags. Added import and dispatch.src/openamp_foundry/cli/commands/reports.py(I4) — Added_run_artifact_changelog()CLI handler with JSON and text output, filtering, validation display, and summary.Makefile(I4) — Addedartifact-changelogtarget with.PHONY.tests/versioning/test_artifact_changelog.py(I4) — 13 tests covering: at least 5 entries, all pass validation, no filter returns all, filter by artifact_name, breaking_only, change_type, catches empty artifact_name, invalid change_type, invalid version format, summary total, dry_lab_only, breaking_changes count, artifacts_covered sorted.docs/evidence/METRICS_CURRENT.md— v0.6.2 I4 changelog. Test count: 3342.tests/test_test_count_regression.py— baseline updated to 3342.
Honest boundaries:
- Changelog entries describe schema and format changes only — they do not measure biological activity, safety, or clinical value.
- All current entries are "added" and non-breaking; breaking changes are expected in future major versions.
- The changelog is a computational artifact — it records version history, not biological findings.
dry_lab_only: trueapplies to all entries — changelogs are inherently dry-lab and must never be presented as validated biological findings.
schemas/benchmark_card.schema.json (Draft 2020-12, 15 required fields:
benchmark_id, benchmark_name, version, date, metric, metric_value, baseline_name,
baseline_value, delta, beats_baseline, dataset, dataset_size, scope, caveats,
dry_lab_only). $schema, $id, title, additionalProperties: false.
src/openamp_foundry/benchmarks/ module with BenchmarkCard dataclass
(15 fields), make_benchmark_card() (auto-computes delta, beats_baseline),
validate_benchmark_card() (10 checks: non-empty benchmark_id, non-empty
benchmark_name, non-empty metric, non-empty dataset, non-empty baseline_name,
dataset_size >= 1, delta matches metric_value - baseline_value within 1e-9,
beats_baseline matches delta > 0, dry_lab_only must be True),
benchmark_card_summary() (total, beats_baseline_count, fails_baseline_count,
dry_lab_only).
CLI (openamp-foundry benchmark-card) with --benchmark-id, --benchmark-name,
--metric, --metric-value, --baseline-name, --baseline-value, --dataset,
--dataset-size, --validate, --format text|json.
make benchmark-card target.
19 tests. 3329 total. A benchmark card is the standard format for describing external benchmark results — what was benchmarked, what the baseline was, what the result was, and what claims are supported. This is Loop 101 — the 101st PR in the NEXT_100_PR_MAP series.
Changes:
schemas/benchmark_card.schema.json(I3) — Draft 2020-12 schema with 15 required fields,$id,title,additionalProperties: false.src/openamp_foundry/benchmarks/__init__.py(I3) — Package init, exportsBenchmarkCard,make_benchmark_card,validate_benchmark_card,benchmark_card_summary.src/openamp_foundry/benchmarks/benchmark_card.py(I3) — Core module withBenchmarkCarddataclass (15 fields),make_benchmark_card(),validate_benchmark_card(),benchmark_card_summary().src/openamp_foundry/cli/main.py(I3) — Registeredbenchmark-cardsubcommand with--benchmark-id,--benchmark-name,--metric,--metric-value,--baseline-name,--baseline-value,--dataset,--dataset-size,--validate,--formatflags. Added import and dispatch.src/openamp_foundry/cli/commands/reports.py(I3) — Added_run_benchmark_card()CLI handler with JSON and text output, card creation, optional validation, and error handling.Makefile(I3) — Updatedbenchmark-cardtarget with demo invocation using bench-auroc-001. Added to.PHONY.tests/benchmarks/__init__.py(I3) — Empty package init.tests/benchmarks/test_benchmark_card.py(I3) — 19 tests covering: make_benchmark_card returns BenchmarkCard, delta computed correctly, beats_baseline True/False, dry_lab_only always True, valid card passes validation, catches empty benchmark_id, empty benchmark_name, empty metric, empty dataset, empty baseline_name, dataset_size < 1, wrong delta, wrong beats_baseline, dry_lab_only=False, summary total, summary beats_baseline_count, dry_lab_only, schema file exists.docs/evidence/METRICS_CURRENT.md— v0.6.1 I3 changelog. Test count: 3329.tests/test_test_count_regression.py— baseline updated to 3329.
Honest boundaries:
- Benchmark cards describe computational benchmark results only — they do not measure biological activity, safety, or clinical value.
- Delta and beats_baseline are computed from metric_value and baseline_value, not independently measured.
- The schema is versioned (currently 1.0.0) and should be updated when fields are added or changed.
- Validation checks structural correctness and internal consistency only — it does not verify that the benchmark was correctly designed or that the results generalize.
dry_lab_only: trueis a const field — all benchmark cards are inherently dry-lab and must never be presented as validated biological findings.
schemas/candidate_manifest.schema.json (Draft 2020-12, 14 required fields:
candidate_id, sequence, evidence_level, scopes, scores, uncertainty,
source_modules, calibration_set, safety_flags, provenance_run_id, dry_lab_only,
version, created_at, notes). $schema, $id, title, description,
additionalProperties: false.
src/openamp_foundry/manifests/ module with CandidateManifest dataclass
(14 fields), make_candidate_manifest(), validate_candidate_manifest()
(8 checks: non-empty candidate_id, non-empty sequence, evidence_level 1-6,
non-empty scopes, uncertainty 0.0-1.0, non-empty source_modules,
dry_lab_only must be True, version MAJOR.MINOR.PATCH), manifest_to_dict(),
manifest_summary() (total, by_evidence_level, with_safety_flags, dry_lab_only).
CLI (openamp-foundry candidate-manifest) with --candidate-id, --sequence,
--evidence-level, --scopes, --scores-json, --uncertainty,
--source-modules, --validate, --format text|json.
make candidate-manifest target.
19 tests. 3310 total. A candidate manifest is the core interoperable artifact — it describes a dry-lab candidate (sequence, scores, evidence level, scopes, safety flags, provenance) in a machine-readable format that external tools can consume without the full OpenAMP stack. This is Loop 100 — the 100th PR in the NEXT_100_PR_MAP series.
Changes:
schemas/candidate_manifest.schema.json(I2) — Draft 2020-12 schema with 14 required fields,$id,title,description,additionalProperties: false.src/openamp_foundry/manifests/__init__.py(I2) — Package init, exportsCandidateManifest,make_candidate_manifest,validate_candidate_manifest,manifest_to_dict,manifest_summary.src/openamp_foundry/manifests/candidate_manifest.py(I2) — Core module withCandidateManifestdataclass (14 fields),make_candidate_manifest(),validate_candidate_manifest(),manifest_to_dict(),manifest_summary().src/openamp_foundry/cli/main.py(I2) — Registeredcandidate-manifestsubcommand with--candidate-id,--sequence,--evidence-level,--scopes,--scores-json,--uncertainty,--source-modules,--validate,--formatflags. Added import and dispatch.src/openamp_foundry/cli/commands/reports.py(I2) — Added_run_candidate_manifest()CLI handler with JSON and text output, manifest creation, optional validation, and error handling.Makefile(I2) — Addedcandidate-manifesttarget with demo invocation using AMP-001. Added to.PHONY.tests/manifests/__init__.py(I2) — Empty package init.tests/manifests/test_candidate_manifest.py(I2) — 19 tests covering: make_candidate_manifest returns CandidateManifest, dry_lab_only always True, valid manifest passes validation, empty candidate_id fails, empty sequence fails, evidence_level 0 or 7 fails, empty scopes fails, uncertainty out of range fails, empty source_modules fails, dry_lab_only=False fails, invalid version fails, manifest_to_dict returns all fields, manifest_summary total correct, with_safety_flags correct, dry_lab_only=True, by_evidence_level correct, schema file exists.docs/evidence/METRICS_CURRENT.md— v0.6.0 I2 changelog. Test count: 3310.tests/test_test_count_regression.py— baseline updated to 3310.
Honest boundaries:
- Candidate manifests describe dry-lab candidates only — they are computational artifacts, not biological proof.
- Scores and uncertainty are pipeline outputs, not measured biological properties.
- The manifest schema is versioned (currently 1.0.0) and should be updated when fields are added or changed.
- Validation checks structural correctness only — it does not verify biological plausibility, safety, or efficacy.
dry_lab_only: trueis a const field — all manifests are inherently dry-lab and must never be presented as validated wet-lab candidates.
ScoreCI dataclass (9 fields: module_id, score_key, point_estimate, uncertainty,
ci_lower, ci_upper, ci_width, overlaps_with, dry_lab_only).
compute_score_ci() builds CIs from SimulationResult.scores[score_key] ± uncertainty,
returns None if score_key missing. compare_cis() pairwise checks overlap condition
(a_lo <= b_hi and b_lo <= a_hi), returns new list with overlaps_with populated
(no in-place mutation). ci_report() produces full report with n_results, cis list,
any_overlap flag, and dry_lab_only=True.
CLI (openamp-foundry simulation-ci-report) with --results-json, --score-key,
--format text|json. make simulation-ci-report target with demo invocation.
Raw scores without uncertainty ranges make it impossible to judge whether two
candidates are distinguishable. The CI reporter makes uncertainty explicit and
auditable.
Changes:
src/openamp_foundry/simulation/ci_reporter.py(H7) — Core module withScoreCIdataclass (9 fields),compute_score_ci()with CI bounds from score ± uncertainty,compare_cis()with pairwise overlap detection,ci_report()with n_results, any_overlap, and dry_lab_only=True.src/openamp_foundry/simulation/__init__.py— ExportsScoreCI,compute_score_ci,compare_cis,ci_report.src/openamp_foundry/cli/main.py— Registeredsimulation-ci-reportsubcommand with--results-json,--score-key,--formatflags. Added import and dispatch.src/openamp_foundry/cli/commands/reports.py— Added_run_simulation_ci_report()CLI handler with JSON parsing, SimulationResult deserialization, text and JSON output.Makefile— Addedsimulation-ci-reporttarget with demo invocation using membrane_proxy + structure_proxy. Added to.PHONY.tests/simulation/test_ci_reporter.py— 16 tests covering: compute_score_ci returns correct bounds, ci_width = 2*uncertainty, missing key returns None, dry_lab_only always True, non-overlapping CIs empty overlaps_with, overlapping CIs populated overlaps_with, no in-place mutation, 0 results, n_results correct, dry_lab_only=True, any_overlap false/true, overlapping example, non-overlapping example.docs/evidence/METRICS_CURRENT.md— v0.5.95 H7 changelog. Test count: 3217.tests/test_test_count_regression.py— baseline updated to 3217.
Honest boundaries:
- Confidence intervals are computed from SimulationResult.uncertainty, which is self-reported by each simulation module and not independently verified.
- Overlap detection is a mathematical condition: two CIs overlapping means the scores are not statistically distinguishable at the stated uncertainty level. It does not mean the modules are biologically correct or incorrect.
- A CI with no overlaps may still be biologically meaningless — precision without accuracy is not useful.
- The any_overlap flag is a descriptive summary, not a gate. Overlap does not invalidate results; it highlights them for human review.
- All CI reports are dry-lab only and must not be presented as biological proof.
docs/engineering/ARTIFACT_VERSIONING_POLICY.md with structured versioning
policy covering scope (schemas, evidence certificates, candidate manifests,
provenance records, benchmark cards, model cards), version format
(MAJOR.MINOR.PATCH), breaking/non-breaking change definitions, deprecation
timeline (at least one minor version warning), schema $id policy, changelog
requirement, and three stability tiers (Tier 1 stable, Tier 2 experimental,
Tier 3 internal). Dry-lab-only statement included.
src/openamp_foundry/versioning/ module with ArtifactVersionInfo dataclass
(7 fields), STABILITY_TIERS dict (3 tiers), VERSIONED_ARTIFACTS list
(6 entries: candidate, lab_result, run_manifest, external_review_packet,
safety_release_decision, simulation_result — all at v1.0.0; 5 stable,
1 experimental). get_artifact_version(), list_versioned_artifacts() with
tier filtering, validate_version_format() (regex MAJOR.MINOR.PATCH),
artifact_version_summary() with total/by_tier/stable_count/experimental_count/
dry_lab_only.
CLI (openamp-foundry artifact-version) with --list, --show <name>,
--tier <stable|experimental|internal>, --format text|json.
make artifact-version target.
19 tests. 3291 total. Starts Phase I (interoperability and adoption) — external users now have stability guarantees for schemas, evidence certificates, and candidate manifests.
Changes:
docs/engineering/ARTIFACT_VERSIONING_POLICY.md(I1) — Full versioning policy document with scope, SemVer, breaking/non-breaking rules, deprecation timeline, $id policy, changelog requirement, stability tiers, dry-lab-only statement.src/openamp_foundry/versioning/__init__.py(I1) — Package init, exports all versioning symbols.src/openamp_foundry/versioning/artifact_version.py(I1) — Core module withSTABILITY_TIERSdict,ArtifactVersionInfodataclass,VERSIONED_ARTIFACTSlist (6 entries),get_artifact_version(),list_versioned_artifacts(),validate_version_format(),artifact_version_summary().src/openamp_foundry/cli/main.py— Registeredartifact-versionsubcommand with--list,--show,--tier,--formatflags. Added import and dispatch.src/openamp_foundry/cli/commands/reports.py— Added_run_artifact_version()CLI handler with text and JSON output, artifact lookup, tier filtering, and error handling.Makefile— Addedartifact-versiontarget. Added to.PHONY.tests/versioning/__init__.py— Empty package init.tests/versioning/test_artifact_version.py— 19 tests covering: at least 5 entries, all valid versions, valid stability tiers, no duplicate names, get known/unknown, list all/filtered, validate valid/invalid versions, summary dry_lab_only, summary total, stable/experimental counts, by_tier sum.docs/evidence/METRICS_CURRENT.md— v0.5.99 I1 changelog. Test count: 3291.tests/test_test_count_regression.py— baseline updated to 3291.
Honest boundaries:
- Artifact versioning describes schema and format compatibility, not biological validity, safety, or efficacy.
- The version registry is manually maintained; entries must be updated when schemas change.
validate_version_format()checks structural validity only — it does not enforce semantic version ordering or compatibility rules.- Stability tiers are policy declarations, not machine-enforced guarantees. A Tier 1 artifact may still have undiscovered bugs or incompatibilities.
- All artifacts remain dry-lab hypotheses requiring wet-lab validation regardless of version number.
SimulationEvidencePacket dataclass (12 fields: module_id, result,
requested_scopes, claimed_evidence_level, baseline_beaten, deprecation_check,
scope_check, baseline_check, adapter_gate, effective_evidence_level,
all_checks_passed, failure_reasons, dry_lab_only).
assemble_evidence_packet() runs all Phase H sub-checks (deprecation, scope,
baseline, adapter gate) and assembles into a single auditable packet with
all_checks_passed (True only if not deprecation_check["is_blocked"],
scope_check["is_fully_covered"], not baseline_check["capped"], and
adapter_gate["passed"]), failure_reasons (human-readable list of what failed),
and effective_evidence_level (from baseline_check).
evidence_packet_summary() returns compact dict with module_id,
claimed_evidence_level, effective_evidence_level, all_checks_passed,
failure_reasons, dry_lab_only.
CLI (openamp-foundry simulation-evidence-packet) with --module-id,
--result-json, --requested-scopes, --claimed-level, --baseline-beaten,
--format text|json. make simulation-evidence-packet target.
This is the capstone of Phase H — it assembles all the individual simulation
discipline checks into a single auditable evidence packet showing exactly why
a simulation result is trustworthy (or not) enough to support a given evidence
level claim.
Changes:
src/openamp_foundry/simulation/evidence_packet.py(H10) — Core module withSimulationEvidencePacketdataclass (12+ fields),assemble_evidence_packet()orchestrating all 4 sub-checks with failure aggregation,evidence_packet_summary()compact dict builder.src/openamp_foundry/simulation/__init__.py— ExportsSimulationEvidencePacket,assemble_evidence_packet,evidence_packet_summary.src/openamp_foundry/cli/main.py— Registeredsimulation-evidence-packetsubcommand with--module-id,--result-json,--requested-scopes,--claimed-level,--baseline-beaten,--formatflags. Added import and dispatch.src/openamp_foundry/cli/commands/reports.py— Added_run_simulation_evidence_packet()CLI handler with JSON parsing, SimulationResult deserialization, text and JSON output, module-id validation.Makefile— Addedsimulation-evidence-packettarget with demo invocation using membrane_proxy + bacterial_binding + baseline_beaten=false. Added to.PHONY.tests/simulation/test_evidence_packet.py— 16+ tests covering: returns packet dataclass, all_checks_passed=true/false for every sub-check, failure_reasons empty/non-empty, effective_evidence_level capped, dry_lab_only always True, summary keys and values, deprecated module, adapter timeout, membrane_proxy passes with correct scope, scope fail.docs/evidence/METRICS_CURRENT.md— v0.5.98 H10 changelog. Test count: 3271.tests/test_test_count_regression.py— baseline updated to 3271.
Honest boundaries:
- The evidence packet aggregates computational sub-checks only. It does not measure biological activity, safety, or real-world performance.
all_checks_passed=Truemeans all computational discipline checks passed, not that the simulation result is biologically meaningful.- The adapter gate uses failure signals provided by the caller; an adapter that returns plausible-looking but biologically meaningless results will pass.
- Baseline beating is a necessary condition for evidence, not a sufficient one.
- Scope coverage is based on the module registry's declared scopes, which may be incomplete relative to actual capabilities.
- All evidence packets are dry-lab only and must not be presented as biological proof.
ScopeCoverageResult dataclass (8 fields: module_id, requested_scopes,
module_scopes, covered, uncovered, coverage_fraction, is_fully_covered,
dry_lab_only). check_scope_coverage() looks up module in registry, computes
covered (intersection) and uncovered (requested scopes not in module scopes),
coverage_fraction = len(covered)/len(requested_scopes) if requested else 1.0.
check_result_scope() uses conservative intersection of registry scopes and
result.scope as effective module_scopes. scope_coverage_report() returns
full dict.
CLI (openamp-foundry simulation-scope-check) with --module-id,
--requested-scopes, --format text|json.
make simulation-scope-check target with demo invocation.
A simulation module may cover only some biological scopes. If a candidate is
evaluated for a scope the module does not cover, that result must be flagged
as out-of-scope rather than silently trusted.
Changes:
src/openamp_foundry/simulation/scope_checker.py(H9) — Core module withScopeCoverageResultdataclass (8 fields),check_scope_coverage()with registry lookup and set intersection,check_result_scope()with conservative intersection of registry and result scopes,scope_coverage_report()dict builder.src/openamp_foundry/simulation/__init__.py— ExportsScopeCoverageResult,check_scope_coverage,check_result_scope,scope_coverage_report.src/openamp_foundry/cli/main.py— Registeredsimulation-scope-checksubcommand with--module-id,--requested-scopes,--formatflags. Added import and dispatch.src/openamp_foundry/cli/commands/reports.py— Added_run_simulation_scope_check()CLI handler with text and JSON output.Makefile— Addedsimulation-scope-checktarget. Added to.PHONY.tests/simulation/test_scope_checker.py— 17 tests covering: fully covered, partially covered, no scopes requested, unknown module, dry_lab_only always True, covered/uncovered lists correct, coverage_fraction half/full/zero, check_result_scope intersection, scope_coverage_report keys and dry_lab_only, membrane_proxy covers bacterial, membrane_proxy does not cover fungal, empty module scopes all uncovered.docs/evidence/METRICS_CURRENT.md— v0.5.97 H9 changelog. Test count: 3255.tests/test_test_count_regression.py— baseline updated to 3255.
Honest boundaries:
- Scope coverage is based on the module registry's declared scopes, which may be incomplete or outdated relative to a module's actual capabilities.
check_result_scopeis conservative: it only trusts scopes that both the registry and the result agree on. This may undercount coverage if result metadata is sparse.- A fully covered scope does not mean the simulation is accurate or biologically meaningful — only that the module claims to cover the requested scope.
- All outputs are dry-lab only and must not be presented as biological proof.
DeprecationCheckResult dataclass (5 fields: module_id, status, is_blocked,
block_reason, dry_lab_only). BLOCKED_STATUSES = {"deprecated", "unavailable"}.
check_module_deprecation() looks up module in registry: not-found returns
is_blocked=True status="unknown"; deprecated/unavailable returns is_blocked=True
with reason; active/experimental returns is_blocked=False.
enforce_deprecation() filters list[SimulationResult] to only non-blocked
modules, returns dict with total_input/passed/blocked/blocked_modules/
passed_results/checks/dry_lab_only. run_deprecation_check_batch() bulk-checks
module_ids with total/blocked/allowed/any_blocked/results/dry_lab_only.
CLI (openamp-foundry simulation-deprecation-check) with --module-ids,
--format text|json. make simulation-deprecation-check target with demo
invocation. Deprecated simulation modules must not be used in production
scoring — the enforcer prevents stale or unreliable modules from tainting
evidence packets.
Changes:
src/openamp_foundry/simulation/deprecation_enforcer.py(H8) — Core module withDeprecationCheckResultdataclass,check_module_deprecation(),enforce_deprecation(),run_deprecation_check_batch().src/openamp_foundry/simulation/__init__.py— ExportsBLOCKED_STATUSES,DeprecationCheckResult,check_module_deprecation,enforce_deprecation,run_deprecation_check_batch.src/openamp_foundry/cli/main.py— Registeredsimulation-deprecation-checksubcommand with--module-ids,--formatflags. Added import and dispatch.src/openamp_foundry/cli/commands/reports.py— Added_run_simulation_deprecation_check()CLI handler.Makefile— Addedsimulation-deprecation-checktarget. Added to.PHONY.tests/simulation/test_deprecation_enforcer.py— 21 tests covering: active module not blocked, deprecated/unavailable blocked, unknown blocked with status="unknown", dry_lab_only always True, enforce_deprecation filters results, passed count, blocked_modules sorted/deduplicated, dry_lab_only flag, all-allowed blocked=0, batch total/any_blocked/not blocked.docs/evidence/METRICS_CURRENT.md— v0.5.96 H8 changelog. Test count: 3238.tests/test_test_count_regression.py— baseline updated to 3238.
Honest boundaries:
- Deprecation checks are based on registry status, not biological validity. A module may be "active" in the registry but still produce unreliable scores.
- Blocking removes results from evidence packets but does not invalidate them as research data — blocked results may still be useful for internal analysis.
- The enforcer does not evaluate whether a module's underlying science is sound; it enforces the pipeline's declared module lifecycle policy.
- All outputs are dry-lab only and must not be presented as biological proof.
EnsembleAgreementResult dataclass (9 fields: sequence, modules_checked,
agreement_level, agreement_description, mean_score, score_range, scores_by_module,
threshold, dry_lab_only). AGREEMENT_LEVELS dict (5 levels: strong/moderate/
weak/conflict/insufficient). check_ensemble_agreement() extracts score_key from
each SimulationResult's scores dict, computes score_range, classifies agreement:
strong (≥3 modules within threshold), moderate (2 modules within threshold),
weak (1 module), conflict (beyond threshold), or insufficient (no results).
run_ensemble_check_batch() aggregates multiple calls with counts and any_conflict
flag. CLI (openamp-foundry simulation-ensemble-check) with --sequence,
--results-json, --score-key, --threshold, --format text|json.
make simulation-ensemble-check target with demo invocation. When multiple
simulation modules independently agree on a candidate, that agreement is stronger
evidence than a single module alone. The ensemble checker makes this agreement
explicit and auditable.
Changes:
src/openamp_foundry/simulation/ensemble_checker.py(H6) — Core module withAGREEMENT_LEVELSdict (5 entries),EnsembleAgreementResultdataclass (9 fields),check_ensemble_agreement()with 5-path classification logic,run_ensemble_check_batch()with per-level counts and any_conflict flag.src/openamp_foundry/simulation/__init__.py— ExportsAGREEMENT_LEVELS,EnsembleAgreementResult,check_ensemble_agreement,run_ensemble_check_batch.src/openamp_foundry/cli/main.py— Registeredsimulation-ensemble-checksubcommand with--sequence,--results-json,--score-key,--threshold,--formatflags. Added import and dispatch.src/openamp_foundry/cli/commands/reports.py— Added_run_simulation_ensemble_check()CLI handler with JSON parsing, SimulationResult deserialization, text and JSON output.Makefile— Addedsimulation-ensemble-checktarget with demo invocation using AKLWKR + two module results. Added to.PHONY.tests/simulation/test_ensemble_checker.py— 20 tests covering: empty results, 1 result weak, 2 results moderate, 3+ results strong, conflict, missing score_key skipped, mean_score, score_range, dry_lab_only always True, scores_by_module, threshold parameter, modules_checked, agreement_description, to_dict fields, batch counts, batch any_conflict, batch dry_lab_only.docs/evidence/METRICS_CURRENT.md— v0.5.94 H6 changelog. Test count: 3201.tests/test_test_count_regression.py— baseline updated to 3201.
Honest boundaries:
- Agreement is a computational measure: when N modules agree within threshold, it means their scores are numerically close, not that they are biologically correct.
- The threshold is a user-parameterized float; different thresholds produce different agreement levels for the same data.
- A "strong" agreement from three weak modules is still weak evidence. The checker measures consistency, not quality.
- Missing score_key entries are silently skipped — the checker does not validate that the score_key is meaningful or calibrated.
- The dry_lab_only flag is a safety constraint, not a technical guarantee.
- Ensemble agreement does not constitute biological proof. All simulation outputs remain dry-lab hypotheses requiring wet-lab validation.
SimulationProvenanceRecord dataclass with run_id, module_id, module_version,
timestamp_utc, input_hash (SHA-256 of input sequence), result_hash (SHA-256 of
sorted scores dict), calibration_set, notes, and dry_lab_only.
make_provenance_record() computes hashes deterministically (sort_keys=True for
result_hash). validate_provenance_record() checks non-empty fields, ISO 8601
timestamp, 64-char hex hashes, and dry_lab_only=True. provenance_summary()
aggregates total, unique modules, run_ids, and dry_lab_only flag. Every simulation
result carries a traceable provenance chain so results can be audited, reproduced,
or invalidated later without relying on memory.
Changes:
src/openamp_foundry/simulation/provenance.py(H5) — Core module withSimulationProvenanceRecorddataclass (9 fields),make_provenance_record()computing SHA-256 input_hash and sorted result_hash,validate_provenance_record()with 7 integrity checks,provenance_summary()with aggregation.src/openamp_foundry/simulation/__init__.py— ExportsSimulationProvenanceRecord,make_provenance_record,validate_provenance_record,provenance_summary.src/openamp_foundry/cli/main.py— Registeredsimulation-provenancesubcommand with--run-id,--module-id,--module-version,--timestamp-utc,--input-sequence,--scores-json,--calibration-set,--formatflags. Added import and dispatch.src/openamp_foundry/cli/commands/reports.py— Added_run_simulation_provenance()CLI handler with JSON parsing, validation, text and JSON output, exit code 3 on validation error.Makefile— Addedsimulation-provenancetarget with demo invocation usingtest-run-001. Added to.PHONY.tests/simulation/test_provenance.py— 19 tests covering: record creation, deterministic hashes, dry_lab_only always True, all validation checks (empty fields, bad timestamp, wrong-length hash, dry_lab_only=False), provenance_summary with 0 and N records.docs/evidence/METRICS_CURRENT.md— v0.5.93 H5 changelog. Test count: 3181.tests/test_test_count_regression.py— baseline updated to 3181.
Honest boundaries:
- SHA-256 hashes prove content integrity, not biological activity.
- The provenance record attests that a simulation ran, not that the result is biologically meaningful.
input_hashcovers the input sequence only; other input parameters (e.g., engine settings) are not hashed.result_hashuses JSON serialisation with sort_keys=True; any future change to the serialisation format will change the hash for identical data.- Timestamps are self-reported by the caller and not independently verified.
- Provenance records are dry-lab only and must not be presented as biological proof.
FAIL_CLOSED_REASONS dict (6 keys) enumerates known adapter failure reasons.
AdapterGateResult dataclass with module_id, passed, failure_reason, failure_detail,
dry_lab_only. evaluate_adapter_gate() fail-closed: returns passed=False on ANY
failure signal with strict priority ordering (timeout > connection_refused >
invalid_response > schema_violation > module_unavailable > baseline_not_beaten).
run_adapter_gate_batch() aggregates multiple adapter calls with total/passed/failed/
any_failed/results/dry_lab_only. Avoids hidden external failures — when the adapter
to an external simulation service is down or misbehaves, the pipeline must fail
loudly rather than silently passing garbage through.
Changes:
src/openamp_foundry/simulation/adapter_gate.py(H4) — Core module withFAIL_CLOSED_REASONSdict (6 entries),AdapterGateResultdataclass (5 fields: module_id, passed, failure_reason, failure_detail, dry_lab_only),evaluate_adapter_gate()with 7-path priority logic,run_adapter_gate_batch()aggregating results with counts and any_failed flag.src/openamp_foundry/simulation/__init__.py— ExportsAdapterGateResult,FAIL_CLOSED_REASONS,evaluate_adapter_gate,run_adapter_gate_batch.src/openamp_foundry/cli/main.py— Registeredadapter-gate-checksubcommand with--module-id,--timeout,--connection-refused,--schema-errors,--module-unavailable,--baseline-beaten,--formatflags. Added import and dispatch.src/openamp_foundry/cli/commands/reports.py— Added_run_adapter_gate_check()CLI handler with text and JSON output, JSON parsing for schema errors, exit code 3 on failure.Makefile— Addedadapter-gate-checktarget with defaultmembrane_proxycheck. Added to.PHONY.tests/simulation/test_adapter_gate.py— 20 tests covering: all 6 failure reasons, all-clear pass, dry_lab_only always True, priority ordering (timeout beats connection_refused, connection_refused beats result=None, schema_errors beat module_unavailable), baseline_beaten=True passes, baseline_beaten=None does not trigger, batch counts, batch any_failed, batch dry_lab_only.docs/evidence/METRICS_CURRENT.md— v0.5.92 H4 changelog. Test count: 3161.tests/test_test_count_regression.py— baseline updated to 3161.
Honest boundaries:
- The adapter gate checks for known failure signals only. An adapter that returns plausible-looking but biologically meaningless results will pass.
- Failure detection depends on the caller correctly setting the failure flags. An adapter that silently hangs (neither timeout nor connection refused) may not be caught.
- Schema validation errors detect structural contract violations, not biological correctness. A schema-valid response can still be biologically meaningless.
- The
baseline_not_beatencheck requires the caller to run the baseline comparison externally; the gate does not compute it. - All adapter gate checks are dry-lab only and must not be presented as biological proof.
BaselineDeclaration dataclass with module_id, module_name, baseline_description,
baseline_type, evidence_level_ceiling, and notes. BASELINE_DECLARATIONS list
(4 entries: membrane_proxy, structure_proxy, dummy_membrane_proxy,
external_adapter_placeholder). get_baseline_declaration() and
list_baseline_declarations() for lookup. check_baseline_requirement() caps
effective_evidence_level to ceiling when baseline not beaten.
validate_baseline_declarations() checks module_id, baseline_description,
baseline_type, evidence_level_ceiling, and duplicate detection. Forces honest
enemy comparison — every simulation module must declare the simplest baseline
it must beat, making it easy to detect "simulation theater."
Changes:
src/openamp_foundry/simulation/baseline_registry.py(H3) — Core module withBaselineDeclarationdataclass (6 fields),BASELINE_DECLARATIONSlist (4 entries),get_baseline_declaration(),list_baseline_declarations(),check_baseline_requirement()with ceiling logic,validate_baseline_declarations()with 5 checks.src/openamp_foundry/simulation/__init__.py— Exports all baseline registry symbols.src/openamp_foundry/cli/main.py— Registeredsimulation-baseline-checksubcommand with--module-id,--claimed-level,--baseline-beaten,--formatflags. Added import and dispatch.src/openamp_foundry/cli/commands/reports.py— Added_run_simulation_baseline_check()CLI handler with text and JSON output, error handling for unknown module IDs, exit code 3 if capped.Makefile— Addedsimulation-baseline-checktarget with defaultmembrane_proxycheck. Added to.PHONY.tests/simulation/test_baseline_registry.py— 16 tests covering: at least 4 entries, validation passes, get/list lookup, required field presence, baseline type validity, check logic (beaten/not beaten/capped/uncapped), dry_lab_only always True, unknown module handling, duplicate detection, invalid baseline type detection.docs/evidence/METRICS_CURRENT.md— v0.5.91 H3 changelog. Test count: 3141.tests/test_test_count_regression.py— baseline updated to 3141.
Honest boundaries:
- Baseline declarations are self-reported by module maintainers and must be manually kept in sync with the module registry.
check_baseline_requirement()caps evidence levels based on declared ceilings, not on independent biological validation.- A module that beats its cheapest baseline may still produce biologically meaningless results — beating a heuristic baseline is a necessary condition for evidence, not a sufficient one.
- Baseline types are categorical labels; a "heuristic" baseline and a "length" baseline are not directly comparable in difficulty.
- The evidence_level_ceiling is a policy rule, not a biological guarantee. Higher ceilings should be justified by actual benchmark performance.
- All baseline comparisons are dry-lab only and must not be presented as biological proof.
schemas/simulation_result.schema.json (Draft 2020-12) validates SimulationResult
outputs with uncertainty 0.0–1.0 range and all required fields.
validate_simulation_result() checks module, version, scope, scores, uncertainty,
validated_against, notes. Strict mode rejects dummy/stub modules, uncertainty=1.0,
and empty validated_against. validate_simulation_result_batch() aggregates
results with counts and any_invalid flag. CLI (openamp-foundry validate-simulation-result) with --results-json, --strict, --out-json.
Prevents undocumented proxy output — every SimulationResult is now
machine-checkable against a formal JSON schema.
Changes:
schemas/simulation_result.schema.json(H2) — JSON Schema Draft 2020-12 for SimulationResult outputs. Required fields: module, version, scope, scores, uncertainty (min 0.0, max 1.0), calibration_set (string or null), validated_against, notes. Optionaldry_lab_contextconst "dry-lab-only".src/openamp_foundry/simulation/result_validator.py(H2) —validate_simulation_result()with 6 always-checked rules and 3 strict-mode rules.validate_simulation_result_batch()with checked/valid/invalid/ errors_by_module/any_invalid/dry_lab_only keys.src/openamp_foundry/simulation/__init__.py— Exportsvalidate_simulation_result,validate_simulation_result_batch.src/openamp_foundry/cli/main.py— Registeredvalidate-simulation-resultsubcommand with--results-json,--strict,--out-jsonflags.src/openamp_foundry/cli/commands/reports.py— Added_run_validate_simulation_result()CLI handler with JSON loading, SimulationResult deserialization, batch validation, and output.Makefile— Addedvalidate-simulation-result-schematarget to.PHONY. Fixed duplicate.PHONYentry forsimulation-registry.tests/simulation/test_result_validator.py— 19 tests covering: valid result, empty module/version, uncertainty bounds, strict mode rules, batch validation, and non-finite scores.docs/evidence/METRICS_CURRENT.md— v0.5.90 H2 changelog. Test count: 3125.tests/test_test_count_regression.py— baseline updated to 3125.
Honest boundaries:
- Schema validation checks structural correctness, not biological truth.
- A schema-valid SimulationResult may still be biologically meaningless.
- Uncertainties are self-reported by simulation modules and not independently verified by this validation layer.
- Strict mode is an additional policy layer; it does not guarantee that a passing result is biologically meaningful.
- All simulation results are dry-lab only and must not be presented as biological proof.
SIMULATION_MODULE_REGISTRY with 4 entries (membrane_proxy, structure_proxy,
dummy_membrane_proxy, external_adapter_placeholder). SimulationModuleEntry
dataclass tracks module_id, name, description, status, evidence_level,
baseline_comparison, scope, maintainer, and notes. Lookup functions:
get_module_entry(), list_module_entries() with status/min_evidence
filtering, get_active_modules(), registry_summary() with
total/by_status/by_evidence_level/active_module_ids keys.
validate_registry() checks module_id, name, baseline_comparison,
evidence_level 1-6, valid status, duplicate detection.
CLI (openamp-foundry simulation-registry) with --list, --show,
--status, --min-evidence, --format text|json.
Schema (schemas/simulation_module_registry.schema.json).
make simulation-registry target. 28 tests. 3106 total.
Starts Phase H (virtual assay discipline).
Changes:
src/openamp_foundry/simulation/module_registry.py(H1) — Core module withSimulationModuleStatusliteral type,SimulationModuleEntrydataclass (9 fields),SIMULATION_MODULE_REGISTRYlist (4 entries),get_module_entry(),list_module_entries(),get_active_modules(),registry_summary()with aggregation,validate_registry()with 6 checks. ImportsPROOF_LADDER_LEVELSfromevidence/synthetic_result_policy.py.schemas/simulation_module_registry.schema.json(H1) — JSON Schema Draft 2020-12 for the registry_summary() output. Validates total, by_status (all 4 status keys), by_evidence_level, active_module_ids.src/openamp_foundry/simulation/__init__.py— Exports all module registry symbols.src/openamp_foundry/cli/main.py— Registeredsimulation-registrysubcommand with--list,--show,--status,--min-evidence,--formatflags.src/openamp_foundry/cli/commands/reports.py— Added_run_simulation_registry()CLI handler with text and JSON output, per-module details, status/evidence filtering, and validation.Makefile— Addedsimulation-registrytarget with--listdefault. Added to.PHONY.tests/simulation/test_module_registry.py— 28 tests covering: registry size ≥ 4, all entries pass validation, required field presence, evidence level range 1-6, valid status values, get_module_entry known/unknown, list_module_entries no filter/status filter/min_evidence filter, get_active_modules returns only active, registry_summary keys and totals, validate_registry detection of empty fields, invalid level, invalid status, duplicate ids, PROOF_LADDER_LEVELS completeness.docs/evidence/METRICS_CURRENT.md— v0.5.89 H1 changelog. Test count: 3106.tests/test_test_count_regression.py— baseline updated to 3106.
Honest boundaries:
- The registry lists module status and evidence level for informational purposes only. It does not measure biological activity, safety, or real-world performance.
- Registry validation checks structural correctness, not scientific validity. A valid entry may still produce biologically meaningless results.
- The PROOF_LADDER_LEVELS mapping is a claim-level taxonomy. An evidence_level of 2 ("virtual-assay support") means the module supports computational exploration — it does not constitute biological proof.
- The registry is dry-lab only. All module entries carry dry-lab caveats regardless of their status or evidence_level.
- "active" status means the module is available for use, not that it has been biologically validated.
build_rollback_plan() produces a structured RollbackPlan with 5 rollback
triggers (RT-01 through RT-05) and 6 default rollback steps covering halt,
document, restore, verify, root-cause, and log. RollbackPlan dataclass with
plan_id, version, triggered_by, steps, notes, dry_lab_only, and to_dict().
RollbackStep dataclass with step_number, action, responsible, detail, and
dry_lab_only. CLI (openamp-foundry calibration-rollback-plan).
JSON + Markdown output. Schema (schemas/calibration_rollback_plan.schema.json).
make calibration-rollback-plan target. 15 tests. 3078 total.
This completes Phase G (G1-G10 — calibration and active-learning rigor).
Changes:
src/openamp_foundry/calibration/rollback_plan.py(G10) — Core module withROLLBACK_TRIGGERSlist (5 triggers: RT-01 through RT-05),RollbackStepdataclass (5 fields: step_number, action, responsible, detail, dry_lab_only),RollbackPlandataclass (6 fields: plan_id, version, triggered_by, steps, notes, dry_lab_only),DEFAULT_ROLLBACK_STEPSlist (6 steps),build_rollback_plan()with trigger ID validation,write_rollback_plan_json()andwrite_rollback_plan_markdown()for structured output.schemas/calibration_rollback_plan.schema.json(G10) — JSON Schema Draft 2020-12 for the rollback plan. Validates all 6 required fields including plan_id, version, triggered_by with RT-NN pattern, steps with ordered actions, and dry_lab_only const=true.src/openamp_foundry/calibration/__init__.py— Exports all rollback plan symbols.src/openamp_foundry/cli/commands/reports.py— Added_run_calibration_rollback_plan()CLI handler with--plan-id,--version,--triggered-by,--notes,--out-json,--out-mdflags.src/openamp_foundry/cli/main.py— Registeredcalibration-rollback-plansubcommand with all argument flags and dispatch to handler.Makefile— Addedcalibration-rollback-plantarget with default example writing to/tmp/rollback_plan.jsonand/tmp/rollback_plan.md. Added to.PHONY.tests/calibration/test_rollback_plan.py— 18 tests covering: valid triggers pass, unknown trigger raises ValueError, triggered_by stored correctly, steps include all default steps, extra_steps appended correctly, dry_lab_only always True, ROLLBACK_TRIGGERS count and required fields, plan_id stored correctly, version stored correctly, to_dict has required keys, notes stored correctly, default steps have correct responsible parties, JSON writer, Markdown writer.docs/evidence/METRICS_CURRENT.md— v0.5.88 G10 changelog. Test count: 3081.tests/test_test_count_regression.py— baseline updated to 3081.
Honest boundaries:
- The rollback plan restores weight configurations only. It does not undo candidate selections, synthesis decisions, or code-level regressions.
- Rollback triggers are detection rules, not guarantees. A regression that does not match any trigger may still be harmful.
- All rollback steps require human review (steps 2, 5, 6 explicitly). Automated rollback without documented human oversight is not permitted.
- The plan is a procedural framework. Actual rollback execution may require additional context-specific steps.
- Dry-lab only. Rollback affects computational scoring, not biological activity, safety, or real-world outcomes.
build_checklist() produces a structured CalibrationDecisionChecklist with 12
checklist items (10 required) covering data quality, statistical validity, safety
consistency, approval, and documentation. Each item has an id, category, question,
rationale, and required flag. CalibrationDecisionChecklist dataclass tracks
responses, notes, overall_pass, and missing_required. JSON + Markdown output.
Schema (schemas/calibration_decision_checklist.schema.json).
CLI (openamp-foundry calibration-decision-checklist).
make calibration-decision-checklist target. 14 tests. 3063 total.
Makes human review structured and auditable.
Changes:
src/openamp_foundry/calibration/decision_checklist.py(G9) — Core module withCHECKLIST_ITEMSlist (12 items),CalibrationDecisionChecklistdataclass (8 fields: checklist_id, date, reviewer, responses, notes, overall_pass, missing_required, dry_lab_only),build_checklist()applying response validation and missing-required analysis,write_checklist_json()andwrite_checklist_markdown()for structured output.schemas/calibration_decision_checklist.schema.json(G9) — JSON Schema Draft 2020-12 for the decision checklist. Validates all 8 required fields including date pattern, responses object, and dry_lab_only const=true.src/openamp_foundry/calibration/__init__.py— Exports all decision checklist symbols.src/openamp_foundry/cli/commands/reports.py— Added_run_calibration_decision_checklist()CLI handler with--checklist-id,--date,--reviewer,--responses-json,--out-json,--out-mdflags.src/openamp_foundry/cli/main.py— Registeredcalibration-decision-checklistsubcommand with all argument flags and dispatch to handler.Makefile— Addedcalibration-decision-checklisttarget with default example data writing to/tmp/checklist_output.jsonand/tmp/checklist_output.md. Added to.PHONY.tests/calibration/test_decision_checklist.py— 14 tests covering: all required pass → overall_pass=True, missing required → overall_pass=False, missing_required list correct, unknown response id raises ValueError, dry_lab_only always True, notes stored correctly, checklist_id stored correctly, reviewer stored correctly, date stored correctly, CHECKLIST_ITEMS minimum count, required items have required=True attribute, all items have required fields, JSON writer, Markdown writer with table and icons.docs/evidence/METRICS_CURRENT.md— v0.5.87 G9 changelog. Test count: 3063.tests/test_test_count_regression.py— baseline updated to 3063.
Honest boundaries:
- The checklist validates structured human-review completion, not biological correctness. A passing checklist does not confirm biological activity or safety.
- Required items are policy-defined. Missing or false required items block the overall_pass, but a pass does not guarantee that human review was thorough.
- All calibration decisions require qualified human review regardless of checklist results.
- The dry_lab_only=True constraint is an attestation, not a technical proof.
check_synthetic_result_policy() and run_policy_batch() enforce that synthetic/
simulation results cannot raise the proof-ladder level of a candidate. Levels 4+
require wet-lab evidence; synthetic or unknown sources are blocked for such proposals.
CLI (openamp-foundry synthetic-result-policy-check). Schema
(schemas/synthetic_result_policy_check.schema.json). make synthetic-result-policy-check
target. 27 tests. 3049 total. Anti-overclaim safeguard.
check_synthetic_result_policy() enforces that synthetic/simulation outputs cannot
raise a candidate's proof-ladder level. Simulation outputs are anti-overclaim —
they must not be used as evidence to move a candidate up the proof ladder.
Changes:
src/openamp_foundry/evidence/synthetic_result_policy.py(G8) — Core module withPROOF_LADDER_LEVELSdictionary (1–6 mapping to descriptions),SyntheticResultPolicyCheckdataclass (8 fields: candidate_id, current_level, proposed_level, evidence_source, policy_pass, violation, recommendation, dry_lab_only),check_synthetic_result_policy()applying multi-tier rules (synthetic cannot raise, synthetic cannot lower, levels 4+ require wet-lab evidence, invalid level raises ValueError),run_policy_batch()aggregating results with summary counts and any_violation flag,write_policy_check_json()andwrite_policy_check_markdown()for output.schemas/synthetic_result_policy_check.schema.json(G8) — JSON Schema Draft 07 for single or batch policy check results. Validates all 8 required fields including evidence_source enum constraint and dry_lab_only const=true.src/openamp_foundry/evidence/__init__.py— Exports all synthetic result policy symbols.src/openamp_foundry/cli/commands/reports.py— Added_run_synthetic_result_policy_check()CLI handler with--proposals-json,--out-json,--out-mdflags.src/openamp_foundry/cli/main.py— Registeredsynthetic-result-policy-checksubcommand with all argument flags and dispatch to handler.Makefile— Addedsynthetic-result-policy-checktarget with default example data writing to/tmp/srp_output.jsonand/tmp/srp_output.md. Added to.PHONY.tests/evidence/test_synthetic_result_policy.py— 27 tests covering: synthetic raising level, synthetic maintaining level, synthetic lowering level, lab raising level, literature raising level, proposed_level > 3 with synthetic/unknown source violation, proposed_level > 3 with lab/literature pass, invalid current_level, invalid proposed_level, unknown source normalization, unknown source + level 4 violation, dry_lab_only always True, run_policy_batch summary counts, all-pass batch, any_violation flag, to_dict output, PROOF_LADDER_LEVELS completeness, JSON writer (single + batch), Markdown writer (single + batch), recommendation non-empty for violation, recommendation for pass, empty batch list.docs/evidence/METRICS_CURRENT.md— v0.5.86 G8 changelog. Test count: 3049.tests/test_test_count_regression.py— baseline updated to 3049.
Honest boundaries:
- This policy check validates evidence-source discipline, not biological truth. A PASS does not confirm biological activity or safety.
- Synthetic evidence can still be useful for negative-result documentation and exploratory research — the policy restricts proof-ladder movement, not usage.
- Level 4+ wet-lab evidence requirement is a policy rule, not a biological guarantee. Wet-lab evidence can be wrong, inconclusive, or non-reproducible.
- The evidence_source classification relies on the submitter's honest labeling. A "lab" source may still be noisy or erroneous.
- All proof-ladder determinations require qualified human review regardless of policy check results.
v0.5.85 — Loop 85: Phase G G7 — Result-Quality Flag Propagation into Calibration Engine ✓ (2026-07-09)
assess_result_quality() and filter_results_for_calibration() propagate
result-quality flags into the calibration engine. Low-quality outcomes cannot
drive updates — garbage results must not update the scoring model.
Changes:
src/openamp_foundry/calibration/result_quality.py(G7) — Core module withQUALITY_FLAGSdictionary (8 standard flags),EXCLUDED_FLAGSset (contamination, assay_interference),ResultQualityReportdataclass (7 fields: candidate_id, flags, quality_level, can_drive_update, propagation_action, explanation, dry_lab_only),assess_result_quality()applying multi-tier rules (excluded flags → excluded, 2+ minor flags → low/excluded, 1 flag → acceptable, 0 flags → high),filter_results_for_calibration()grouping results into included/included_with_caution/excluded with summary counts,write_result_quality_json()andwrite_result_quality_markdown()for output.schemas/result_quality_report.schema.json(G7) — JSON Schema Draft 07 for per-candidate or aggregate result quality reports. Validates all 7 required fields including flag enum constraint and dry_lab_only const=true.src/openamp_foundry/calibration/__init__.py— Exports all result-quality symbols.src/openamp_foundry/cli/commands/reports.py— Added_run_result_quality_filter()CLI handler with--results-json,--out-json,--out-mdflags.src/openamp_foundry/cli/main.py— Registeredresult-quality-filtersubcommand with all argument flags and dispatch to handler.Makefile— Addedresult-quality-filtertarget with default example data writing to/tmp/rq_output.jsonand/tmp/rq_output.md. Added to.PHONY.tests/calibration/test_result_quality.py— 27 tests covering: high quality (no flags), contamination excluded, assay_interference excluded, 2 minor flags excluded (low quality), 1 minor flag include_with_caution, can_drive_update True/False for all quality levels, dry_lab_only always True, unknown flag raises ValueError, explanation non-empty, to_dict output, contamination+other flags still excluded, assay_interference+other flags still excluded, filter_results_for_calibration empty/summary counts/per-action grouping/can_drive_update_count, missing flags handling, EXCLUDED_FLAGS set, QUALITY_FLAGS descriptions and count.docs/evidence/METRICS_CURRENT.md— v0.5.85 G7 changelog. Test count: 3022.tests/test_test_count_regression.py— baseline updated to 3022.
Honest boundaries:
- Quality assessment is a computational filter on structural and metadata criteria. A "high quality" result does not confirm biological activity.
- Flag-based classification uses a pre-defined rule set. Edge cases (e.g., borderline_threshold with ambiguous_activity) are treated the same as any other 2-flag combination — excluded for caution.
- Excluded results may still contain useful scientific information and should remain available for expert review.
- The
dry_lab_only=Trueconstraint is an attestation, not a technical proof. - All calibration decisions require qualified human review regardless of result quality assessment.
check_cohort_overfit_risk() and run_overfit_check() flag when a calibration
cohort is too small relative to model parameters. Prevents false learning from
under-powered cohorts. Warns at three severity levels (critical/warning/caution)
with human-readable messages and actionable recommendations.
Changes:
src/openamp_foundry/calibration/overfit_warning.py(G6) —check_cohort_overfit_risk()assesses a single cohort's overfit risk from cohort_size, model_params, n_features, and min_recommended threshold. Returns warning_level (none/caution/warning/critical), ratio, message, and recommendation.run_overfit_check()accepts a list of cohort sizes and aggregates per-cohort results with worst_level, any_critical, any_warning flags.write_overfit_check_json()andwrite_overfit_check_markdown()produce structured output.schemas/calibration_overfit_check.schema.json(G6) — JSON Schema Draft 2020-12 for the overfit check report. Validates per_cohort array, worst_level, any_critical, any_warning, recommendation, dry_lab_only constraint.src/openamp_foundry/calibration/__init__.py— Exportscheck_cohort_overfit_risk,run_overfit_check,write_overfit_check_json,write_overfit_check_markdown.src/openamp_foundry/cli/commands/reports.py— Added_run_calibration_overfit_check()CLI handler with--cohort-sizes,--model-params,--n-features,--min-recommended,--out-json,--out-mdflags.src/openamp_foundry/cli/main.py— Registeredcalibration-overfit-checksubcommand with all argument flags and dispatch to handler.Makefile— Addedcalibration-overfit-checktarget with default params writing to/tmp/overfit_check.jsonand/tmp/overfit_check.md.tests/calibration/test_overfit_warning.py— 21 tests covering: critical threshold (<10), warning threshold (size < min_recommended AND ratio < 3.0), caution (size < min_recommended OR ratio < 5.0), none level, run_overfit_check mixed severity/all-none/all-critical, ratio calculation, message non-empty, dry_lab_only=True everywhere, worst_level logic, any_critical/any_warning flags, empty cohort list, single-cohort matching, ratio zero-division edge, JSON writer, Markdown writer.docs/evidence/METRICS_CURRENT.md— v0.5.84 G6 changelog. Test count: 2995.tests/test_test_count_regression.py— baseline updated to 2995.
Honest boundaries:
- This check evaluates statistical overfit risk only. A passing check does not confirm biological validity, safety, or real-world performance.
- Small cohorts can produce spurious correlations that appear significant in dry-lab benchmarks. The warning is a computational safeguard, not a biological guarantee.
- The severity thresholds (min_recommended=30, ratio<3.0 for warning, ratio<5.0 for caution) are heuristic rules of thumb. Specific domains may require stricter or looser thresholds.
- All calibration decisions require qualified human review regardless of overfit check results.
CLI (openamp-foundry batch-rationale) that generates a synthetic candidate pool,
runs the batch-2 selector with configurable weights, and produces a per-candidate
rationale report classifying each selected candidate into exploit / explore /
diversity / combined roles. Report includes weight configuration, role breakdown
summary, per-candidate contribution detail (ensemble×weight, uncertainty×weight,
diversity×weight), safety gate impact, and caveats. Enables reviewers to
understand why each candidate was selected in terms of the three active-learning
roles.
Changes:
src/openamp_foundry/active_learning/batch_rationale.py(G5) —build_batch_rationale_report()generates a synthetic pool, runsselect_batch_2with configurable weights, classifies each selected candidate into exploit/explore/diversity/combined roles based on which weight contribution dominates (threshold: > 0.05 above second-place), and produces aBatchRationaleReportwith per-candidate rationales, role summary, and selector metadata.PerCandidateRationaledataclass tracks scores, contributions, safety gate status, and human-readable explanation.write_rationale_json()andwrite_rationale_markdown()produce structured output.schemas/batch_rationale_report.schema.json(G5) — JSON Schema Draft 2020-12 for the batch-2 rationale report. Validates all required fields including per-candidate rationales, role summary, role descriptions, selected IDs, and notes.src/openamp_foundry/active_learning/__init__.py— ExportsBatchRationaleReport,PerCandidateRationale,build_batch_rationale_report,write_rationale_json,write_rationale_markdown.src/openamp_foundry/cli/main.py— Registeredbatch-rationalesubcommand with all argument flags and dispatch to_run_batch_rationale.src/openamp_foundry/cli/commands/selection.py— Added_run_batch_rationale()CLI handler with--n-total,--n-active,--batch-size,--safety-threshold,--selectivity-threshold,--ensemble-weight,--uncertainty-weight,--diversity-weight,--min-uncertainty-probes,--rng-seed,--out-json,--out-mdflags.Makefile— Addedbatch-rationaletarget with default params writing tooutputs/batch_rationale_report.jsonandoutputs/batch_rationale_report.md.tests/active_learning/test_batch_rationale.py— 19 tests covering: all required top-level fields, candidates selected, per-candidate required fields, valid role (exploit/explore/diversity/combined), scores in [0,1], role summary counts match candidates, selected IDs match candidate IDs, probes non-negative, notes present, weight config matches input, JSON and Markdown output writing, CLI exit 0, CLI writes files, JSON Schema conformance, high exploitation weight produces more exploit roles, all candidates have explanations with role mention, role descriptions present for all roles, empty roles not in summary.docs/evidence/METRICS_CURRENT.md— v0.5.83 G5 changelog. Test count: 2974.tests/test_test_count_regression.py— baseline updated to 2974.
Honest boundaries:
- This report uses synthetic data with known labels. Results reflect code-path integrity, not biological performance.
- Role classification is based solely on weight contributions. A candidate classified as "exploit" may also have meaningful uncertainty or diversity signal — the role label is the dominant contribution, not an exclusive category.
- The threshold (> 0.05 above second-place) is an arbitrary cutoff; candidates near the boundary are classified as "combined" to avoid false precision.
- The production selector optimises for multiple objectives (activity, safety, diversity) that a single-role label does not fully capture.
- This report is informational and requires qualified human review before influencing selection decisions.
CLI (openamp-foundry bench strategy-compare) that compares 5 selection strategies
(exploitation, exploration, diversity, combined, random) on the same synthetic pool
with identical hidden active candidates. Each strategy runs multi-round recovery of
hidden actives using the same batch-2 selector with different weights. The report
ranks strategies by recall, compares the production selector vs pure strategies and
random baseline, and produces structured JSON + Markdown output with caveats.
Prevents one-selector bias by making strategy performance transparent.
Changes:
src/openamp_foundry/active_learning/strategy_comparison.py(G4) —run_strategy_comparison()generates a synthetic pool, hides N active candidates, runs 5 strategies (exploitation, exploration, diversity, combined, random) via multi-round selection, and produces aStrategyComparisonReportwith per-strategy recovery metrics, ranking by recall, best strategy identification, and production selector comparison (vs random, exploitation, exploration, diversity).STRATEGY_WEIGHTSdict defines the weight tuples for each strategy.write_comparison_json()andwrite_comparison_markdown()produce structured output.schemas/active_learning_strategy_comparison.schema.json(G4) — JSON Schema Draft 2020-12 for the strategy comparison report. Validates all required fields including per-strategy results, ranking, production comparisons, and notes.src/openamp_foundry/active_learning/__init__.py— ExportsSTRATEGY_WEIGHTS,StrategyComparisonReport,StrategyResult,run_strategy_comparison,write_comparison_json,write_comparison_markdown.src/openamp_foundry/cli/commands/benchmark.py— Added_run_active_learning_strategy_compare()CLI handler with--n-total,--n-active,--n-hidden,--batch-size,--max-rounds,--rng-seed,--out-json,--out-mdflags.src/openamp_foundry/cli/main.py— Registeredstrategy-comparesubcommand underbenchwith all argument flags and dispatch to handler.Makefile— Addedbench-strategy-comparetarget with default params writing tooutputs/strategy_comparison.jsonandoutputs/strategy_comparison.md.tests/active_learning/test_strategy_comparison.py— 18 tests covering: all 5 strategies present, required fields (top-level + per-result), valid recall range, ranking order, production strategy name, best strategy not null, exploitation recovers actives, random baseline notes, production vs comparison fields, notes presence, JSON and Markdown output writing, CLI exit 0, CLI writes files, random baseline ranges, JSON Schema conformance, and production_outperforms_random type.docs/evidence/METRICS_CURRENT.md— v0.5.82 G4 changelog. Test count: 2955.tests/test_test_count_regression.py— baseline updated to 2955.
Honest boundaries:
- This report uses synthetic data with known active/inactive labels. Results reflect code-path integrity, not biological performance.
- All strategies run with safety/selectivity gates disabled to isolate strategy effects. Real performance may differ with gates enabled.
- Random baseline is averaged over 20 Monte Carlo trials; deterministic strategies use a single run per config.
- The production selector optimizes for multiple objectives (activity, safety, diversity) that this recall-based benchmark does not fully measure.
- A strategy that ranks highest on recall may not be the best choice for real candidate selection — domain-specific constraints, safety requirements, and material constraints matter.
- This comparison is informational and requires qualified human review before influencing selection decisions.
CLI (openamp-foundry calibration-audit) that checks consistency across the
calibration pipeline artifacts — intake report, gate verdict, engine proposal,
and combined recalibration report. Ensures a human reviewer inspecting the
calibration pipeline output can verify that all stages agree on candidate
counts, gate verdicts, weight proposals, and timestamps.
Changes:
src/openamp_foundry/calibration/audit.py(G3) —run_calibration_audit()accepts file paths or pre-loaded dicts for any combination of the four artifacts. Runs 12 consistency checks: artifact path existence, intake↔gate count matching, engine↔gate verdict agreement, engine L1 budget compliance, engine intake-link match, report↔gate verdict match, report↔engine proposal match, timestamp sanity, and intake cohort-metrics warnings. Each check has check_id, description, pass/fail, observed, expected, and severity (error/ warning/info). Returns structured dict with overall_pass, checks array, and summary.schemas/calibration_audit.schema.json(G3) — JSON Schema Draft 2020-12 for the calibration audit report. Validates report_type, schema_version, timestamp, artifacts_checked, overall_pass, checks array, and summary.src/openamp_foundry/cli/commands/reports.py— Added_run_calibration_auditCLI handler with--intake-report,--gate-verdict,--engine-proposal,--recalibration-report,--out-json,--out-mdflags.src/openamp_foundry/cli/main.py— Registeredcalibration-auditsubcommand with all argument flags and dispatch to_run_calibration_audit.Makefile— Addedcalibration-audit-exampleandcalibration-audittargets. Example target runs on synthetic intake + gate outputs.tests/calibration/test_calibration_audit.py— 18 tests covering: no artifact edge case, single artifact, intake↔gate count match/mismatch, engine↔gate verdict match/mismatch, L1 budget within/exceeds, report↔gate match, report↔engine match, future timestamp detection, cohort-metrics warning, JSON schema conformance, Markdown output, synthetic example consistency, synthetic path existence, engine without gate_passed, and nonexistent path handling.docs/evidence/METRICS_CURRENT.md— v0.5.81 G3 changelog. Test count: 2937.tests/test_test_count_regression.py— baseline updated to 2937.
Honest boundaries:
- This audit checks consistency between pipeline artifacts, not biological validity. A passing audit means the pipeline stages agreed with each other, not that calibration decisions are correct.
- All tests use synthetic dict fixtures, not real wet-lab data.
- Timestamp checks detect future timestamps but do not validate chronological ordering between artifacts (e.g., gate must precede engine). This is a known limitation for a future iteration.
- The audit does not validate artifact schema conformance (each artifact's schema validity is tested separately). It focuses on cross-artifact consistency.
CLI that reads a JSON archive of negative-result entries and checks each entry against completeness criteria: required fields, duplicate candidate_ids, content field presence, date format validity, and intake_report_id format. Prevents cherry-picking by ensuring incomplete or poorly documented entries are detected before analysis or reporting.
Changes:
scripts/check_negative_archive_completeness.py(F10) — Standalone CLI that loads negative-result entries (list or dict withentrieskey), checks each entry for: required fields present, no duplicate candidate_ids, at least one content field (assay_result, score_safety, reviewer_notes, or reason_detail), valid YYYY-MM-DD date format, and well-formed intake_report_id (INT-YYYY-NNN). Produces structured JSON + Markdown report with per-check and per-entry pass/fail. Exit 0 on all pass, 1 on any failure, 2 on input errors.schemas/negative_result_archive_completeness.schema.json(F10) — JSON Schema Draft 2020-12 for the completeness report output. Validates report_metadata, summary (total_entries, pass/fail count, pass_rate), 5 checks (required_fields, duplicate_candidate_ids, has_content_fields, date_format, intake_report_id_references) each with pass boolean and details array, per_entry_results array, and _caveat.examples/negative_result_archive_example.json(F10) — Toy example with 4 entries (lab_inactive, lab_toxic, control_failure, synthesis_failure) across 4 pipeline versions, including one entry with intake_report_id reference. Clearly marked EXAMPLE — NOT REAL DATA.tests/evidence/test_negative_archive_completeness.py— 35 tests covering: valid entries pass all checks, missing required field, duplicate candidate_id, missing content fields, invalid date format, invalid calendar date, invalid intake_report_id format, valid intake_report_id, mixed good/bad entries, empty string required field, reason_detail as content, report structure (5 keys), per-entry results matching count, empty entry handling, missing file, markdown sections (title, summary, check results, caveat, errors), example file loading and round-trip, all load_entries error modes, CLI exit codes (0, 1, 2), and JSON/Markdown output writing.Makefile— Addedcheck-negative-archive-completenesstarget.docs/evidence/METRICS_CURRENT.md— v0.5.80 F10 changelog. Test count: 2919.tests/test_test_count_regression.py— baseline updated to 2919.
Honest boundaries:
- Checks structural and formatting criteria only — a PASS does not confirm biological accuracy, pipeline correctness, or data authenticity.
- Missing content fields may reflect genuine data absence (e.g., unreviewed entries) rather than record-keeping errors.
- The intake_report_id format check validates pattern, not referential integrity — a well-formed ID may reference a non-existent intake report.
- Duplicate candidate_id detection flags structural duplicates; it cannot distinguish accidental duplicates from intentional re-entry of the same candidate under different conditions.
- All conclusions about entry quality require qualified human review.
Full details available in git history. One-line summaries below.
- Loop 79: Phase F F9 — Negative-Result Dashboard (v0.5.79)
- Loop 78: Phase F F8 — Bulk Rejection-Event Validator (v0.5.79)
- Loop 77: Phase F F7 — Calibration Link from Negative-Result Entries (v0.5.78)
- Loop 76: Phase F F6 — Negative-Result Informativeness Guide (v0.5.77)
- Loop 75: Phase F F5 — Safe-Publication Filter (v0.5.76)
- Loop 74: Phase F F4 — Failed-Candidate Report Generator (v0.5.75)
- Loop 73: Phase F F3 — Rejection Reason Taxonomy Schema (v0.5.74)
- Loop 72: Phase E E4-E6 — Safety Release, Preregistration, Packet CLI (v0.5.73)
- Loop 71: Phase E E1-E3 — External Review Packet Schemas (v0.5.72)
- Loop 70: Chain-of-Custody Hashing (v0.5.65)
- Loop 69: Active-Learning Recovery Benchmark (v0.5.46)
- Loop 68: Active-Learning Batch-2 Selector (v0.5.45)
- Loop 67: Recalibration Report (v0.5.44)
- Loop 66: Per-Family Benchmark Breakdown (v0.5.37)
- Loop 65: Recalibration Engine (v0.5.36)
- Loop 64: Cross-Dataset Generalization Benchmark (v0.5.35)
- Loop 63: Benchmark Card Consolidation (v0.5.34)
- Loop 62: Expert Ablation Re-run on Expanded Benchmark (v0.5.33)
- Loop 61: Precision@k Calibration (v0.5.32)
- Loop 60: Order-Dependent Features Benchmark (v0.5.31)
- Loop 59: Easy Baseline Benchmark (v0.5.30)
- Loop 58: Expanded 500-AMP Benchmark (v0.5.29)
- Loop 57: Multi-Negative-Set Benchmark (v0.5.28)
- Loop 56: Subpackage Public API (v0.5.25)
- Loop 55: Benchmark Regression Gate for CI (v0.5.24)
- Loop 54: Recalibration Policy + Gate (v0.5.20)
- Loop 53: Calibration Intake Module (v0.5.19)
- Loop 52: Two-Gate Triage Composite (v0.5.18)
- Loop 51: Rich Selectivity Integrated into Production Pipeline (v0.5.17)
- Loop 50: Rich Selectivity Scorer (v0.5.16)
- Loop 49: Charge-Matched Decoy Benchmark (v0.5.39)
- Loop 48: Bias-Aware Pilot Panel Floor (v0.5.38)
- Loop 47: Feature Decomposition Benchmark (v0.5.15) — feature_decomp.py; hydrophobic_fraction and amphipathicity decomposition; AUROC per feature.
- Loop 46: Wave 0.5 External Screen (v0.5.15) — Wave 0.5 complete; generic future-panel Gate 6 remains panel-specific.
- Loop 45: Chain-of-Custody Hashing (v0.5.65) — chain_of_custody.json added; --verify-pack CLI flag. These hashes verify identity and archive integrity only. Does not verify synthesis, biological activity, safety, or experimental provenance after receipt.
- Loops 1-44: Foundation phases (v0.1–v0.5.14) — see git log for details.