# Synthetic evidence drill: one protected predicate, one policy

Package `demo.handbook.evidence_admission` protects a single predicate,
`paid`, behind policy `PaymentProofV1`: a bank confirmation about the same
purchase, from the trusted issuer, sound on availability, currency, status
and a hash-bound verification. A bank reversal about the same purchase is
accepted on the refuting side. Not a formalization of any act.

## Run

Tool `law` 0.1.0, semantics law.core/0.2 (published build):

```sh
$ law test docs/handbook/files/fixtures/evidence-admission
law test demo.handbook.evidence_admission: world demo.handbook.evidence_admission
  ok   [demo.handbook.evidence_admission#authored] tests/admission.lawtest / admitted support establishes
  ok   [demo.handbook.evidence_admission#authored] tests/admission.lawtest / rejected support leaves undecided
  ok   [demo.handbook.evidence_admission#authored] tests/admission.lawtest / hash mismatch leaves undecided
  ok   [demo.handbook.evidence_admission#authored] tests/admission.lawtest / bare claim of protected fact is blocked
  ok   [demo.handbook.evidence_admission#authored] tests/admission.lawtest / admitted refuting support denies
  ok   [demo.handbook.evidence_admission#authored] tests/admission.lawtest / admitted for and against conflict
total: 6 checked, 6 passed, 0 failed, 0 not run; code 0
```

## What each scene shows

- Admitted: confirmation of purchase 42 with matching hash check →
  `paid(42)` TRUE_ONLY. The policy's `AcceptPayment` fired; nothing else
  could establish the protected fact.
- Rejected: a genuine confirmation about purchase 99 aimed at 42 →
  NEITHER. The identity conjunct (`doc_purchase(d, p)`) fails, the support
  is not accepted, and the rejection proves no denial.
- Hash mismatch: the verification pins a hash the document does not carry
  → NEITHER. `ev_authentic` never projects, `SoundDocument` fails, and the
  support dies one rule earlier than the identity case.
- Blocked bare: `assert paid(42)` with no document → NEITHER. The policy
  is selected, the predicate is protected, and the bare claim contributes
  no support.
- Denied: an accepted reversal alone → FALSE_ONLY. Denial needed its own
  admitted support; no rejection anywhere in this scene proves anything.
- Conflict: an accepted confirmation and an accepted reversal of the same
  purchase → BOTH. Two admitted supports on opposite sides; the engine
  reports the conflict instead of picking a side.

The lock was written by the pinned tool itself
(`law engine lock . --write`).
