pinned_artifacts column in the analyses table (via migration) to store exact artifact versions usedverify_reproducibility() function exposed at GET /api/analysis/{id}/provenance endpointThe existing render_dashboard() in artifact_registry.py:811 already has all the {{data:KEY}} substitution infrastructure. The provenance demo needs these two additional pieces.
From scripts/test_reproducibility.py:29: verify_reproducibility(db, analysis_id) already exists but is not exposed via API. It checks that all pinned artifacts exist and their content_hash matches.
The analyses table lacks a pinned_artifacts column — provenance is currently computed live from artifact_links, which is not sufficient for reproducibility verification (links can change over time).
pinned_artifacts TEXT DEFAULT NULL to analyses table. This stores a JSON array of pinned artifact IDs with their content hashes and versions.api.py, add a new route that:
verify_reproducibility() if available (from test_reproducibility.py)scripts/archive/oneoff_scripts/assemble_provenance_demo.py already has the logic to:
analysis-SDA-PROV-DEMO-001 artifactpinned_artifacts array in the analyses DB row.GET /api/analysis/analysis-SDA-PROV-DEMO-001/provenance should return:pinned_artifacts TEXT DEFAULT NULL to analyses tableGET /api/analysis/{id}/provenance returns JSON with provenance_chain, pinned_artifacts, reproducible statusanalysis-SDA-PROV-DEMO-001 (or similar) has pinned_artifacts populated in the analyses tablescripts/test_reproducibility.py (already exists, verify_reproducibility(db, analysis_id))scripts/archive/oneoff_scripts/assemble_provenance_demo.py (already exists, builds the chain)artifact_registry.py:register_artifact() (already supports artifact_type='analysis')_Not started yet_