The lineup

Compatibility matrix of a real run · the consumer before and after the fix × the upstream contract v1 and v2
Open this case file Upstream change
Upstream v1Old contract (base) Upstream v2New contract (head) Consumer before the fixIts code at the head commit
Clean The contract this consumer was written for: S1 found no change at the base commit.
Broken S1 found 9 breaking changes (REST 3, gRPC 3, DB 3); S2 + the Tracer: 3 endpoints break.
  • ✗ POST /invoices/{order_id} · LOUDOrderDTO validation fails when customer_name and total_price are missing in v2 REST payload; additionally, NOT_PAYABLE status set misses AWAITING_PAYMENT.
  • ✗ GET /payments/{order_id}/status · SILENTgRPC OrderSummary removed total_price field; proto3 defaults missing fields to 0.0, resulting in amount_minor silently calculating as 0.
  • ✗ GET /reports/revenue · LOUDrevenue.sql selects orders.total_price column which was dropped in migration 0002_money_customer_status.
Consumer after the fixBranch syncsnitch/w-20261027-155558-7c9a
Clean 5/5 passed
  • ✓ test_invoice_paid_order
  • ✓ test_unpaid_order_is_not_invoiced
  • ✓ test_payment_status_uses_real_amount
  • ✓ test_revenue_report
  • ✓ test_rest_contract_examples_parse
Clean 5/5 passed
  • ✓ test_invoice_paid_order
  • ✓ test_unpaid_order_is_not_invoiced
  • ✓ test_payment_status_uses_real_amount
  • ✓ test_revenue_report
  • ✓ test_rest_contract_examples_parse

Every cell comes from run w-20261027-155558-7c9a on kshiti26-11/demo: before × v1 is the contract the consumer was built for; before × v2 is what S1 detect, S2 trace and the Tracer found; after × v1 and after × v2 are the Docker checks V3 and V4 of the fix, test by test.

Before you open a case

What a repo needs

Requirements for the full S1–S9 run · one GitHub repo with both services

1 · The upstream service Owns the contract

  • REST: contracts/openapi.yaml in the service folder (or the repo root).
  • gRPC: a .proto file directly in contracts/.
  • Database: Alembic migrations in migrations/versions/*.py (new files between base and head).
  • A change to compare: a commit that edits those contracts. Paste a /pull/<n> or /compare/<base>...<head> link, or SyncSnitch picks the latest contract commit.

2 · The consumer service Gets the fix

  • Another folder in the same repo with a pyproject.toml (a Python project).
  • Tests that run with uv run pytest -q: the Transformer and check V1 use exactly this.
  • Real usage of the changed fields in .py, .sql, .proto files or JSON fixtures under tests/. No usage means no breaking change for it, and the agents have nothing to fix.

3 · Optional Stronger proof, private repos

  • A Dockerfile in both services and Docker on the machine running the site: V3–V5 run in containers. Without them they are reported as skipped, never as passed.
  • Private repos: the server needs GITHUB_TOKEN; opening the draft PR needs gh logged in with push access.

Not supported yet: consumers in other languages than Python, and contracts in other paths. The cold cases on the home page (kshiti26-11/demo: orders-service → billing-service) meet every requirement.