> python -m unittest -v

test_complete_rollout_preserves_data (test_rehearsal.MigrationTests.test_complete_rollout_preserves_data) ... ok
test_contract_has_actual_unique_not_null_constraints (test_rehearsal.MigrationTests.test_contract_has_actual_unique_not_null_constraints) ... ok
test_duplicate_constraint_failure (test_rehearsal.MigrationTests.test_duplicate_constraint_failure) ... ok
test_empty_source_rejected (test_rehearsal.MigrationTests.test_empty_source_rejected) ... ok
test_failed_ddl_rolls_back (test_rehearsal.MigrationTests.test_failed_ddl_rolls_back) ... ok
test_legacy_write_during_overlap_updates_new_key (test_rehearsal.MigrationTests.test_legacy_write_during_overlap_updates_new_key) ... ok
test_lock_timeout_and_recovery (test_rehearsal.MigrationTests.test_lock_timeout_and_recovery) ... ok
test_null_source_fails_without_partial_batch (test_rehearsal.MigrationTests.test_null_source_fails_without_partial_batch) ... ok
test_old_app_blocks_contraction (test_rehearsal.MigrationTests.test_old_app_blocks_contraction) ... ok
test_old_query_retired_after_contract (test_rehearsal.MigrationTests.test_old_query_retired_after_contract) ... ok
test_repeated_backfill_is_noop (test_rehearsal.MigrationTests.test_repeated_backfill_is_noop) ... ok
test_resume_committed_batches_from_new_connection (test_rehearsal.MigrationTests.test_resume_committed_batches_from_new_connection) ... ok
test_runner_reports_invalid_fixture_and_cleans_temp (test_rehearsal.MigrationTests.test_runner_reports_invalid_fixture_and_cleans_temp) ... ok
test_same_named_wrong_index_rejected (test_rehearsal.MigrationTests.test_same_named_wrong_index_rejected) ... ok

----------------------------------------------------------------------
Ran 14 tests in 0.202s

OK

> python operations.py
{"checks": 10, "matched": 10, "passed": true, "report": "operations-report.html"}


