The two collision scenarios were long-lived collide-a/collide-b branches on
this shared upstream repository. Deleting them (to release stale head
reservations) broke the sandbox. Store each scenario as an immutable annotated
tag (fixture-v1-agent-a/-b) instead, and materialize the branches into the
user's own fork on demand — no scenario branch ever lives upstream again.
- demo-manifest.json: schemaVersion 2.0.0; scenarios carry sourceRef/
sourceCommit/outputBranch; add fixtureMode, reproducibleFixture, and split
recordedRun into historicalRecordedRun (#1/#2) and currentLiveProof (#13/#14).
- scripts/materialize_fixtures.py: verify source commit/base/diff/tests, then
create branches on the fork only. Idempotent, never force-pushes, refuses the
upstream repo, fails closed on a dirty tree, prints no tokens or credentials.
- scripts/verify_fixtures.py: verify the immutable tags/commits, not branches.
- check_docs.py, README.md, orders/pricing.py, fixtures.yml: new contract; CI
fetches tags and asserts the materializer refuses upstream.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Summary
The two collision scenarios used to be long-lived
collide-a/collide-bbranches on this shared upstream repository. Deleting those branches (to release
stale head reservations) broke the public sandbox:
verify_fixtures.py,check_docs.py, and CI all required the branches to exist.This replaces "long-lived upstream branches" with immutable tags + a fork
materializer, so anyone can reproduce the walkthrough without a scenario
branch ever living on this shared repo again.
Scope
demo-manifest.json— schemaVersion2.0.0. Each scenario now carriessourceRef/sourceCommit/outputBranchinstead ofbranch; addsfixtureMode: materializeandreproducibleFixture; splits the oldrecordedRunintohistoricalRecordedRun(Agent A: 5% bulk discount #1/Agent B: flat $10 large-cart discount #2, closed) andcurrentLiveProof(Agent A: 5% bulk discount over $100 #13/Agent B: flat $10 large-cart discount #14, open). Public contract stays1.0.0.scripts/materialize_fixtures.py— new. Verifies each sourcecommit/base/diff/tests, then creates the scenario branches in the user's own
fork. Idempotent, never force-pushes, refuses to target this upstream repo,
fails closed on a dirty tree, and prints no tokens or credential URLs. Sends
nothing to Veripsa.
scripts/verify_fixtures.py— verifies the immutablefixture-v1-*tags andtheir exact commits, not deleted branches.
scripts/check_docs.py,README.md,orders/pricing.py— updated to the newcontract and the fork-materialize walkthrough.
Validation
Local (Python 3.9):
pytest(5 passed),check_docs.py(parity ok),verify_fixtures.py(both tags verified against base/diff/tests). Clean-roomend-to-end against a main-only fork: dry-run plan →
--pushcreated bothbranches at the exact source SHAs → idempotent re-run was a no-op → an induced
divergence made the materializer stop without force-pushing. Guard tests:
refuses upstream by slug and by URL even with a dirty tree; strips credentials
from URLs.
Deployment
Docs/fixtures only — no runtime component. The immutable source is the annotated
tags
fixture-v1-agent-a(f21bd2b) andfixture-v1-agent-b(d589350),already pushed. CI (
.github/workflows/fixtures.yml) fetches the tags andasserts the materializer refuses the upstream repository.