Паритет поведінки — це observable contract
Доказ паритету порівнює source і target на однакових representative inputs, а не лише перевіряє, що target компілюється. Контракт може містити outputs, errors, status codes, side effects, ordering, timing, idempotency, retries і persistence behavior — лише ті виміри, які справді observable для споживача.
Порівняння має розділяти expected equivalence, допустиму різницю і blocking discrepancy. Якщо oracle або baseline відсутні, результат не «паритет», а Unknown.
Матриця source-to-target comparison
| Dimension | Source baseline | Target observation | Decision |
|---|---|---|---|
| Inputs | representative request/state | same controlled input | підтвердити coverage |
| Output | value, status, shape | target value, status, shape | equivalent або investigate |
| Errors | type, code, message boundary | target error behavior | blocking при contract drift |
| Side effects | writes/events/notifications | target effects and count | перевірити idempotency |
| Ordering/timing | observable sequence/latency class | target sequence/latency class | лише якщо contract requires |
| Evidence | command, test, log, fixture | matching anchor | Unknown без anchors |
Порядок збирання доказу
- Визначте representative cases і зафіксуйте source revision та environment assumptions.
- Запишіть observable contract: inputs, outputs, errors, side effects та invariants.
- Повторіть ті самі cases на target у контрольованій поверхні.
- Порівняйте results за кожною dimension, не зводячи все до одного score.
- Збережіть evidence anchors, discrepancy, confidence і owner наступного рішення.
- Зупиніться або зробіть HOLD при непоясненій різниці чи відсутньому oracle.
Що не доводить паритет
- успішний build без runtime або contract checks;
- один happy-path case без errors і side effects;
- однаковий internal implementation або class names;
- загальний statement «сумісно» без source/target observations;
- заповнений template без фактичних command/test outputs.
Канонічне джерело уроку · JavaRush
Відкрити матеріал JavaRush