Property-based escalation

After a concrete Case is VERIFIED, Exhibit A may ask Codex to generalize its single example into a broader property. The generator works read-only and may return either a Hypothesis @given test when that dependency already exists or a pytest parametrization with at least three explicit examples. It may also decline.

cd engine
python3 -m exhibit_a.cli property case.json /path/to/buggy \
  --fixed /path/to/fixed --source package/module.py

The property candidate passes the normal test-path, command, tamper, vacuity, infrastructure, signature, determinism, and fail-to-pass gates in flip_check.py. Optional --source paths run the existing disposable mutation score against the property on the fixed state. The report retains the concrete Case’s descriptive strength score alongside the property mutation kill rate; v1 does not combine or recalibrate them.

Reports use property-escalation/v1. verified_property_flip means the generalized test itself produced a real flip over the declared domain. The original concrete test remains canonical Case evidence. A declined or rejected escalation cannot weaken it, and a verified property cannot override the original verdict.

Pytest parametrization is a bounded domain sample, not universal quantification. Hypothesis coverage is likewise governed by its configured search strategy. The report’s property_kind and human-readable domain keep that distinction explicit.