# ADCR conformance profile 0.1.0

This profile lists the suites a verifier runs to claim conformance, which rules each suite exercises, and the verdict vocabulary.

## Verdicts

`verified`, `failed`, `unverified`, `refused`. A verifier MUST return exactly one verdict per export and a findings array (SPEC.md EXP-04). `refused` means a required pinned input was not supplied (the time-stamping trust anchors, for an export that carries tokens) and nothing was evaluated. `unverified` means every finding is informational or a step the verifier could not run; any other finding is `failed`.

## Suites

| Suite | Class | Cases | Rules exercised | Required |
|---|---|---|---|---|
| `record_v1` | Record | 29 | REC-01..08, REC-10..14, REC-16..19 (including `legal_hold` records), CMT-01, CMT-02, CMT-04, ANC-05 | yes for class Record |
| `law_v1` | Law | 10 | LAW-01..06, LAW-08, REC-15 | yes for class Law |
| `chain_v1` | Chain | 9 | CHN-01..04, EXP-02 | yes for class Chain |
| `anchor_v1` | Anchor | 14 | ANC-01, ANC-02 (every token step; real RFC 3161 tokens except where a case breaks the token), EXP-01 coverage | yes for class Anchor |
| `oversight_v1` | Oversight | 13 | OVS-01..05, REC-08 (`reviewer`) | yes for class Oversight |
| `rights_v1` | Rights | 20 | RGT-01..07, LAW-07, REC-08 (`subject`) | yes for class Rights |
| `export_v1` | Export | 7 | EXP-01, EXP-05, CHN-05, REC-02, REC-04 (envelope) | yes for class Export |
| `profile_v1` | all | 10 | PRF-01, REC-19 classes, REC-20, CMT-02 tags, CMT-05, CMT-06 | yes: every claim names a profile (PRF-03) |
| `interactions_v1` | all | 5 | combined failure axes | advisory |

Every suite is required for its class except `interactions_v1`; `profile_v1` is required for every claim. REC-09 has no case: whether a person is an employee is attested by the producer, and its consequence is exercised by the `rights_v1` cases for RGT-02. [COVERAGE.md](COVERAGE.md) lists, per MUST, the cases that exercise it.

## Pinned inputs

Each suite's `expected.json` names the trust anchors to pin (`trust_anchors`, relative to the suite directory: `../keys/trust-anchors.pem`, the test root). A case may override it; `null` means "run without trust anchors" and the verdict is `refused`. A `profile_v1` case also names a producer profile (`profile`, under `profiles/`), and the verifier runs with `--profile`. The token signature and trust steps need OpenSSL 1.1 or later; a runner without it skips every case that carries a token and pins trust anchors, and says so, never counting it as passed.

## Case naming

One failure axis per case, snake_case, the suite first and the axis after it: `chain_hash_mismatch`, `anchor_token_imprint`, `oversight_dual_verification_missing`, `rights_notice_given_incomplete`. A positive case is `<suite>_valid`, or names what it shows (`oversight_reviewer_rates_for_evaluation`). Axes combine only in `interactions_v1`.

## Layout

```
conformance/
  PROFILE.md
  COVERAGE.md               per MUST, the cases that exercise it
  adcr_verify.py            reference verifier (standard library, plus OpenSSL for the token signature and trust steps)
  generate_vectors.py       regenerates every vector from fixed inputs; refuses a case that breaks more or less than it declares
  make_test_authority.py    creates the test timestamp authority under vectors/keys/ (run once)
  run_vectors.py            runs the verifier over every suite, prints JSON, exits non-zero on failure
  vectors/
    README.md
    keys/                   test root and TSA certificates, trust-anchors.pem, tokens/ (no private keys)
    <suite>_v1/
      cases/<case>.json
      profiles/<case>.json  (profile_v1: the producer profile the case is checked against)
      expected.json
```

## Claim format

`Conforms to ADCR 0.1.0, classes <list>, vector set 0.1.0, run on <date>, implementation <identifier>`, where `<list>` names only classes whose required suites pass in full, with no case skipped.
