Effort: thorough
scidex/atlas/artifact_registry.py:240-340 already records
processing_steps (source/target artifact, method, parameters,
input_hash, started_at, completed_at) on every transformation, and
the deterministic-replay sandbox from wave-1
(q-sand-deterministic-replay) captures env_hash +
requirements.lock per analysis. The two halves don't yet meet:
nothing walks processing_steps backwards from a target artifact,
gathers the recorded inputs/methods/env, and re-executes the chain
to produce a byte-identical replay. Ship scidex rerun-artifact <id>
that closes the loop.
scidex rerun-artifact <id> [--from <step_id>]processing_steps graph rooted at target_artifact_id=<id>step_type (see below) toscidex/atlas/replay_handlers.py. One handler perstep_type currently in use (read distinct values from prod;def handler(step, source_payload) -> ReplayedArtifact.unreplayable in the reportcontent_hash. If it differs frominput_hash recorded in the step, --strict aborts;env_hash (from the wave-1 deterministic sandbox), requireforge/runtime.py deterministic-mode subprocess that pinsrequirements.lock. Fall through to a warning if neither--diff, byte-compare the replayedcontent_hash; print the--out/manifest.json:(step_id, step_type, input_hash,
output_hash_live, output_hash_replayed, ok, reason). Thetests/test_rerun_artifact.py:--from skips upstream steps and replays from the namedstep_type values in prodSELECT DISTINCT step_type, COUNT(*) FROM processing_steps);replay_handlers/atlas.py, replay_handlers/agora.py).
q-sand-deterministic-replay work; cite that spec in the workcli.py; web button is one template change totemplates/artifact_detail_base.html.q-sand-deterministic-replay (wave-1) — env_hash + requirements.lockscidex/atlas/artifact_registry.py:338 — _upsert_processing_stepq-obs-trace-id-propagation — trace_id used to find the originalq-repro-audit-trail-completeness consumes the replay manifest.scidex/atlas/rerun_artifact.py (353 lines): BFS chain walking, frozen-input check, manifest generationscidex/atlas/replay_handlers.py (155 lines): registry with cite/fork handlers, unreplayable stubstests/test_rerun_artifact.py (355 lines): 5 tests covering all acceptance criteriacli.py: Added rerun-artifact subcommand with --from/--out/--strict/--diff flagsapi.py: Added POST /api/artifacts/{artifact_id}/rerun endpoint with background execution; added Rerun button to artifact detail page (version panel + versions tab)0ac5ca425 — [Forge] Add scidex rerun-artifact CLI + API + web button [task:402dd97b-9476-4d6c-9efc-8e17af395221]