{
  "$note": "ACAM exception-class taxonomy v1 as data (work package A3). One release unit with acam/ACAM-EXCEPTIONS.md (the normative prose half), acam/acam-procedures.json, ACAM-SPEC.md, and acam-core.json; all version together. Keys recursively sorted (deterministic byte form); ASCII only. Classes are machine-decidable, mutually exclusive (MX-1..MX-3 in the prose half), severity-free (consequence_class is a pure function of class_id, never authored), and traceable to procedure IDs. Each example is a derive-from-data seed for the B5 defective-dossier corpus on the conformance-vectors pattern: {input_fragment, expected: {fires: true}}.",
  "acam_version": "0.1.0-draft",
  "b1_field_requirements": [
    {
      "field": "workpapers[].evidence_role",
      "needed_by": [
        "EXC-08",
        "EXC-11"
      ],
      "purpose": "Design-vs-operating evidence discriminator; SPEC 10-11 distinguish the roles throughout but never name the field.",
      "type": "enum {design, operating}"
    },
    {
      "field": "workpapers[].evidence_class",
      "needed_by": [
        "EXC-08",
        "EXC-09"
      ],
      "purpose": "Per-item reliability class; SPEC 10.2 names the rank vocabulary, not the per-item field.",
      "type": "enum = reliability_rank (acam-core.json)"
    },
    {
      "field": "workpapers[].collected_on",
      "needed_by": [
        "EXC-11"
      ],
      "purpose": "Evidence item date; SPEC 11.3 says 'dated' without naming the field.",
      "type": "date"
    },
    {
      "field": "workpapers[].w2_justification",
      "needed_by": [
        "EXC-11"
      ],
      "purpose": "The W2 recorded justification for design evidence predating the window by 90 days or less.",
      "type": "string (recorded justification)"
    },
    {
      "field": "workpapers[].freshness_override",
      "needed_by": [
        "EXC-11",
        "EXC-12"
      ],
      "purpose": "Recorded override object naming the freshness-table row permitting it; the CAP-13 cover count counts these.",
      "type": "object"
    },
    {
      "field": "sampling.minimum_n_key",
      "needed_by": [
        "EXC-06"
      ],
      "purpose": "Lookup key into the A2 acam-sampling.json minimum-n table (or the derivable pair frequency x risk band).",
      "type": "string key"
    },
    {
      "field": "sampling.selection_rationale",
      "needed_by": [
        "EXC-06"
      ],
      "purpose": "CAP-07's judgmental-with-rationale needs the recorded rationale field.",
      "type": "string"
    },
    {
      "field": "sampling.corroborating_count",
      "needed_by": [
        "EXC-05"
      ],
      "purpose": "CAP-14's 'where one was obtainable' must be a recorded fact, not an inference.",
      "type": "object {value, source, obtainable}"
    },
    {
      "field": "sampling.variances[]",
      "needed_by": [
        "EXC-04"
      ],
      "purpose": "amount and evidence_ref make 'arithmetically unaccounted' and 'unevidenced' computable (SPEC 11.1 quantitative accounting).",
      "type": "array of {reason, amount, evidence_ref}"
    },
    {
      "field": "controls[].content_sha256",
      "needed_by": [
        "EXC-02"
      ],
      "purpose": "SPEC 3 pins controls by corpus version AND content hash; the per-control hash field recomputes against object_hashes.json.",
      "type": "sha256 hex"
    },
    {
      "field": "header.identity_binding",
      "needed_by": [
        "EXC-03"
      ],
      "purpose": "ID-1 names the mechanisms; the recorded binding object makes resolution recomputable.",
      "type": "object {method in {dns-txt, well-known}, domain, key_id, verified_on}"
    },
    {
      "field": "cover.declared_evidence_inventory",
      "needed_by": [
        "EXC-10"
      ],
      "purpose": "The CAP-19 sum target.",
      "type": "integer count"
    },
    {
      "field": "cover.evidence_digest_coverage",
      "needed_by": [
        "EXC-10"
      ],
      "purpose": "Canonical field names for the SPEC 10.3 three-part fraction.",
      "type": "object {hashed, metadata_with_declared_reason, unaccounted}"
    },
    {
      "field": "cover.{population_consistency_line, override_count, corpus_currency, out_of_scope_with_rationale}",
      "needed_by": [
        "EXC-12"
      ],
      "purpose": "The mandatory computed cover disclosures as recorded (regenerable) fields.",
      "type": "computed fields"
    },
    {
      "field": "scorecard.<figure> siblings {numerator, denominator, scope_enumeration_ref}",
      "needed_by": [
        "EXC-12"
      ],
      "purpose": "SC-2's schema constraint needs the sibling field names.",
      "type": "sibling fields per rendered percentage"
    }
  ],
  "class_count": 12,
  "classes": [
    {
      "cap_rules": [
        "CAP-04 (absence branch)"
      ],
      "class_id": "EXC-01",
      "consequence_class": "record-invalid",
      "example": {
        "expected": {
          "fires": true
        },
        "input_fragment": {
          "controls": [
            {
              "control_uri": "apeiris://model/controls/CR-08",
              "design": "evaluated-sound",
              "operating": "held"
            }
          ]
        },
        "why": "'held' is not a member of the closed operating enum {not-tested, tested-held, tested-exception}."
      },
      "exclusivity": "Takes only violations no specific class enumerates (MX-2). CAP-04 absence (contradictory_or_limiting_observations missing entirely) classifies here.",
      "family": "A",
      "name": "schema-or-type",
      "predicate": {
        "condition": "The artifact fails validation against the published B1/B2 JSON Schema at its pinned version (parse failure, missing required, type mismatch, out-of-enum), EXCLUDING every constraint claimed by a specific class under MX-2: the EXC-03 identity/conflicts constraints, the EXC-04 variance constraints, the EXC-09 conditional ipe_basis requirement, the EXC-10 digest-fraction sum, and the EXC-12 disclosure-sibling constraints. Residual structural class.",
        "fields": [
          "<entire dossier or composite contribution>"
        ]
      },
      "procedure_id": "PROC-01"
    },
    {
      "cap_rules": [],
      "class_id": "EXC-02",
      "consequence_class": "recomputation-blocked",
      "example": {
        "expected": {
          "fires": true
        },
        "input_fragment": {
          "header": {
            "corpus_version": "2026.07.30",
            "manifest_sha256": "0000000000000000000000000000000000000000000000000000000000000000"
          }
        },
        "why": "The recorded manifest_sha256 is not the SHA-256 of the published 2026.07.30 manifest."
      },
      "exclusivity": "Claims version/hash/URI resolution facts (digest recomputation). Signature verification failures are EXC-03. A stale-but-correctly-pinned corpus is not this class: unstamped staleness is EXC-12(c).",
      "family": "A",
      "name": "corpus-anchor-version-hash",
      "predicate": {
        "condition": "Any of: a pin (corpus_version, manifest_sha256, acam_version, sampling annex once A2 ships) absent or not resolvable to a published release; manifest_sha256 != sha256 of the published manifest for the pinned corpus_version; a per-control content_sha256 != the pinned object_hashes.json value for that control_uri; a control_uri that does not resolve in the pinned corpus.",
        "fields": [
          "header.corpus_version",
          "header.manifest_sha256",
          "header.acam_version",
          "header.sampling_annex_version",
          "controls[].control_uri",
          "controls[].content_sha256"
        ]
      },
      "procedure_id": "PROC-02"
    },
    {
      "cap_rules": [
        "CAP-23"
      ],
      "class_id": "EXC-03",
      "consequence_class": "recomputation-blocked",
      "example": {
        "expected": {
          "fires": true
        },
        "input_fragment": {
          "header": {
            "conflicts_declaration": {
              "designed_or_operated_in_scope_control": false,
              "fee_contingent_on_outcome": null
            },
            "identity_binding": {
              "domain": "assessor.example",
              "key_id": "ed25519-ab12cd34",
              "method": "dns-txt"
            }
          }
        },
        "why": "conflicts_declaration.fee_contingent_on_outcome is present but unanswered (null)."
      },
      "exclusivity": "Claims cryptographic-verification and identity/conflicts facts; MX-2 takes these from EXC-01 even though they are also schema requireds. Hash mismatches belong to EXC-02. Reviewer-side resolution impossibility is a scope-limitation record, not this class.",
      "family": "A",
      "name": "signature-or-identity",
      "predicate": {
        "condition": "Any of: producer Ed25519 signature over the JCS-canonical payload fails verification against the declared key; identity binding (dns-txt / well-known) does not resolve or does not match the declared organization/key (ID-1); conflicts declaration absent or any question unanswered (CAP-23, shipped with identity per ID-2); a declaration matches the published bright-line prohibited-conflicts list (ID-3; entries are A5); reviewed_by = assessor_of_record (RV-1); on a composite, a contributor signature fails or the contribution-manifest binding does not recompute (CO-5).",
        "fields": [
          "signature",
          "header.identity_binding",
          "header.conflicts_declaration",
          "header.assessor_of_record",
          "header.reviewed_by",
          "composite.contributions[].signature",
          "composite.contribution_manifest"
        ]
      },
      "procedure_id": "PROC-03"
    },
    {
      "amended": "Round-3 B3 amendment: fires on absent / out-of-enum / arithmetically-unaccounted / unevidenced variance (the free-text hole closed). Free text may accompany a typed variance, never substitute for one.",
      "cap_rules": [
        "CAP-15"
      ],
      "class_id": "EXC-04",
      "consequence_class": "denominator-unreliable",
      "example": {
        "expected": {
          "fires": true
        },
        "input_fragment": {
          "controls": [
            {
              "control_uri": "apeiris://identity/controls/II-01",
              "sampling": {
                "population_size": 1200,
                "variances": [
                  {
                    "amount": 30,
                    "evidence_ref": "wp-041",
                    "reason": "timing-difference"
                  }
                ]
              }
            }
          ],
          "header": {
            "sor_counts": [
              {
                "count": 1250,
                "population": "workforce-identities"
              }
            ]
          }
        },
        "why": "Variance is 50; typed variances account for 30; 20 is arithmetically unaccounted."
      },
      "exclusivity": "Claims reconciliation arithmetic and variance typing (incl. the out-of-enum schema overlap per MX-2). Defects in the enumeration basis itself are EXC-05. An unapplied CAP-15 rung delta is a counted dimension of the same finding, never a second finding. Establishes internal consistency against a declared basis, never population-completeness assurance.",
      "family": "B",
      "name": "population-reconciliation",
      "predicate": {
        "condition": "On a population-governing control, a declared count differs from the reconciled or corroborating count AND the recorded variance set is any of: absent (no variances[] entry covering the difference); out-of-enum (variances[].reason not in the closed variance_reason enum - there is deliberately no 'other'); arithmetically unaccounted (sum of variances[].amount != declared minus reconciled); unevidenced (a variances[] entry with no resolving evidence_ref).",
        "fields": [
          "header.sor_counts[]",
          "controls[].sampling.population_size",
          "controls[].sampling.variances[].reason",
          "controls[].sampling.variances[].amount",
          "controls[].sampling.variances[].evidence_ref"
        ]
      },
      "procedure_id": "PROC-04"
    },
    {
      "cap_rules": [
        "CAP-06",
        "CAP-14"
      ],
      "class_id": "EXC-05",
      "consequence_class": "denominator-unreliable",
      "example": {
        "expected": {
          "fires": true
        },
        "input_fragment": {
          "controls": [
            {
              "control_uri": "apeiris://identity/controls/II-01",
              "effective_rung": "tested",
              "sampling": {
                "population_enumeration_basis": "interview-assertion"
              }
            }
          ]
        },
        "why": "interview-assertion caps affected controls at documented; recorded tested exceeds it."
      },
      "exclusivity": "Claims the basis field's value/support; EXC-04 claims the count arithmetic. One population can raise both - as two defects at two targets (MX-1).",
      "family": "B",
      "name": "unsupported-enumeration-basis",
      "predicate": {
        "condition": "On a population-governing control, any of: population_enumeration_basis absent while effective_rung > documented (CAP-06 unapplied); basis in {interview-assertion, estimate} while effective_rung > documented (CAP-14 unapplied); corroborating_count absent where corroborating_count.obtainable records true, while effective_rung > documented (CAP-14 unapplied). Ladder order per acam-core.json.",
        "fields": [
          "controls[].sampling.population_enumeration_basis",
          "controls[].sampling.corroborating_count",
          "controls[].effective_rung"
        ]
      },
      "procedure_id": "PROC-05"
    },
    {
      "cap_rules": [
        "CAP-05",
        "CAP-07",
        "CAP-08"
      ],
      "class_id": "EXC-06",
      "consequence_class": "cap-unapplied",
      "example": {
        "expected": {
          "fires": true
        },
        "input_fragment": {
          "controls": [
            {
              "control_uri": "apeiris://security/controls/IA-02",
              "effective_rung": "effective",
              "sampling": {
                "minimum_n_key": "daily/standard",
                "sample_size": 5
              }
            }
          ],
          "pinned_minimum_n": 25
        },
        "why": "effective recorded on n=5 against a pinned minimum of 25 (illustrative value pending A2); CAP-05 was not applied. The 11.2 headline line is non-zero exactly when this branch fires."
      },
      "exclusivity": "Claims the SPEC 11.2 sampling-cap set (CAP-05/07/08); the class name is the round-3 canonical token, its scope the full sampling-cap family (a documented A3 scoping decision). Time-inadmissible evidence supporting a rung is EXC-11; the deciding condition is which cap rule the recomputation applied. Predicate binds by reference to the A2 annex; B5 specimens pin an explicit table stub until A2 ships.",
      "family": "B",
      "name": "sample-below-minimum-uncapped",
      "predicate": {
        "condition": "The recorded effective_rung exceeds the ceiling a SPEC 11.2 sampling cap computes: sample_size < minimum_n(minimum_n_key) per the pinned acam-sampling.json while effective_rung = effective (CAP-05); selection_method = management-selected, or judgmental-with-rationale with selection_rationale absent, while effective_rung > tested (CAP-07); deviations_found > 0 on a control with blocking_effect in {blocks-deployment, blocks-runtime-action} with no tested-exception token and no appended extended-testing sub-record (CAP-08).",
        "fields": [
          "controls[].sampling.sample_size",
          "controls[].sampling.minimum_n_key",
          "controls[].sampling.selection_method",
          "controls[].sampling.selection_rationale",
          "controls[].sampling.deviations_found",
          "controls[].effective_rung",
          "corpus:control.blocking_effect"
        ]
      },
      "procedure_id": "PROC-06"
    },
    {
      "cap_rules": [
        "CAP-01",
        "CAP-02",
        "CAP-22"
      ],
      "class_id": "EXC-07",
      "consequence_class": "cap-unapplied",
      "example": {
        "expected": {
          "fires": true
        },
        "input_fragment": {
          "controls": [
            {
              "control_uri": "apeiris://agentic/controls/AA-01",
              "effective_rung": "documented",
              "workpapers": [
                {
                  "procedure_performed": "none-assertion-only"
                },
                {
                  "procedure_performed": "none-assertion-only"
                },
                {
                  "procedure_performed": "none-assertion-only"
                }
              ]
            }
          ]
        },
        "why": "All-assertion-only evidence caps the control at mapped; recorded documented exceeds it."
      },
      "exclusivity": "Claims procedure-block qualification (CAP-01/02/22). Reliability-class floors are EXC-08; time admissibility is EXC-11. The lane recomputes over recorded workpaper fields only - dossier conformance, never effectiveness.",
      "family": "C",
      "name": "assertion-only-uncapped",
      "predicate": {
        "condition": "A recorded effective_rung exceeds what the procedure blocks support: every workpaper has procedure_performed = none-assertion-only and no execution_log_ref while effective_rung > mapped (CAP-01 unapplied); a workpaper cited for documented-or-above has an empty observation and recomputing without it yields a lower rung than recorded (CAP-02 unapplied); claimed_rung present with no qualifying workpaper while effective_rung != mapped (CAP-22 unapplied).",
        "fields": [
          "controls[].workpapers[].procedure_performed",
          "controls[].workpapers[].execution_log_ref",
          "controls[].workpapers[].observation",
          "controls[].claimed_rung",
          "controls[].effective_rung"
        ]
      },
      "procedure_id": "PROC-07"
    },
    {
      "cap_rules": [
        "CAP-03",
        "CAP-12"
      ],
      "class_id": "EXC-08",
      "consequence_class": "cap-unapplied",
      "example": {
        "expected": {
          "fires": true
        },
        "input_fragment": {
          "controls": [
            {
              "control_uri": "apeiris://security/controls/RT-02",
              "effective_rung": "tested",
              "workpapers": [
                {
                  "evidence_class": "attested",
                  "evidence_role": "operating",
                  "procedure_performed": "inspection"
                },
                {
                  "evidence_class": "attested",
                  "evidence_role": "operating",
                  "procedure_performed": "inspection"
                }
              ]
            }
          ]
        },
        "why": "Operationally-scoped control with no automated- or third-party-class operating item; recorded tested exceeds the design-effective ceiling."
      },
      "exclusivity": "Claims the reliability-class floors (CAP-03/12). Procedure-block qualification is EXC-07; staleness of an otherwise-adequate class is EXC-11. The operational-objective flag comes from the pinned corpus control, not assessor judgment.",
      "family": "C",
      "name": "reliability-floor-breach",
      "predicate": {
        "condition": "Either: the control's pinned validation_objective concerns operation, no operating-role evidence item carries evidence_class in {automated, third-party}, and effective_rung > design-effective (CAP-03 unapplied); or on a control with blocking_effect in {blocks-deployment, blocks-runtime-action}, interview notes (procedure_performed = inquiry) are the sole support and the rung was not recomputed as unevidenced (CAP-12 unapplied - non-overridable).",
        "fields": [
          "controls[].workpapers[].evidence_role",
          "controls[].workpapers[].evidence_class",
          "controls[].workpapers[].procedure_performed",
          "controls[].effective_rung",
          "corpus:control.validation_objective",
          "corpus:control.blocking_effect"
        ]
      },
      "procedure_id": "PROC-08"
    },
    {
      "cap_rules": [],
      "class_id": "EXC-09",
      "consequence_class": "declaration-incomplete",
      "example": {
        "expected": {
          "fires": true
        },
        "input_fragment": {
          "controls": [
            {
              "control_uri": "apeiris://data/controls/DX-03",
              "workpapers": [
                {
                  "evidence_class": "automated",
                  "execution_log_ref": "logstore://runs/118"
                }
              ]
            }
          ]
        },
        "why": "Automated-class item with an execution-log reference and no recorded ipe_basis."
      },
      "exclusivity": "The conditional ipe_basis requirement is claimed here, not by EXC-01 (MX-2), and not by EXC-04 even on the SoR count: field absence is EXC-09, count arithmetic is EXC-04.",
      "family": "C",
      "name": "ipe-basis-absent",
      "predicate": {
        "condition": "ipe_basis absent where conditionally required: on an evidence item with evidence_class = automated or an execution_log_ref; or on the scoping-header system-of-record count where that count is automated. Fires on omission regardless of whether any rung changed.",
        "fields": [
          "controls[].workpapers[].ipe_basis",
          "controls[].workpapers[].evidence_class",
          "controls[].workpapers[].execution_log_ref",
          "header.sor_counts[].ipe_basis"
        ]
      },
      "procedure_id": "PROC-09"
    },
    {
      "cap_rules": [
        "CAP-16",
        "CAP-17",
        "CAP-19"
      ],
      "class_id": "EXC-10",
      "consequence_class": "coverage-misstated",
      "example": {
        "expected": {
          "fires": true
        },
        "input_fragment": {
          "cover": {
            "declared_evidence_inventory": 40,
            "evidence_digest_coverage": {
              "hashed": 30,
              "metadata_with_declared_reason": 6,
              "unaccounted": 0
            }
          }
        },
        "why": "30 + 6 + 0 = 36 != 40: the fraction under-accounts the declared inventory (CAP-19 branch)."
      },
      "exclusivity": "Claims all digest-coverage arithmetic and admissibility, incl. the CAP-19 sum (MX-2). A boundary-limited system admitted without its scope-limitation record (CAP-18) is EXC-12(g); the digest fields themselves are this class. The lane recomputes counts, never artifact bytes.",
      "family": "C",
      "fires_both_directions": true,
      "name": "digest-scope-miscount",
      "predicate": {
        "condition": "Any of: the declared three-part coverage fraction != its recomputation from the per-item digest_scope records - over-counted or under-counted alike; the three parts do not sum to declared_evidence_inventory (CAP-19); a metadata-only item counted toward content-integrity (gating) coverage (CAP-16 unapplied); a metadata-only item with digest_unavailable_reason absent or inconsistent with its component_operator (CAP-17).",
        "fields": [
          "cover.declared_evidence_inventory",
          "cover.evidence_digest_coverage.hashed",
          "cover.evidence_digest_coverage.metadata_with_declared_reason",
          "cover.evidence_digest_coverage.unaccounted",
          "controls[].workpapers[].digest_scope",
          "controls[].workpapers[].digest_unavailable_reason",
          "controls[].workpapers[].component_operator"
        ]
      },
      "procedure_id": "PROC-10"
    },
    {
      "cap_rules": [
        "CAP-09",
        "CAP-10",
        "CAP-11",
        "CAP-13",
        "CAP-25"
      ],
      "class_id": "EXC-11",
      "consequence_class": "admissibility-misapplied",
      "example": {
        "expected": {
          "fires": true
        },
        "input_fragment": {
          "controls": [
            {
              "control_uri": "apeiris://resilience/controls/RV-04",
              "effective_rung": "effective",
              "workpapers": [
                {
                  "collected_on": "2025-11-14",
                  "evidence_role": "operating",
                  "procedure_performed": "inspection"
                }
              ]
            }
          ],
          "header": {
            "assessment_window": {
              "end": "2026-06-30",
              "start": "2026-01-01"
            }
          }
        },
        "why": "The sole operating item predates the window; W1 admits no override, so effective cannot rest on it."
      },
      "exclusivity": "Claims time admissibility (CAP-09/10/11/25 arithmetic + the CAP-13 non-overridable boundary). Sampling-cap deltas are EXC-06. The COUNT of permitted overrides on the cover is EXC-12(b): admissibility of evidence vs disclosure of the override. Freshness-table branch binds by reference to the A2 annex.",
      "family": "D",
      "name": "window-or-freshness",
      "predicate": {
        "condition": "Any of: an operating-role item with collected_on outside assessment_window supports a recorded tested/effective (CAP-09 / W1, no override); a design-role item predating the window by more than 90 days, or by 90 days or less with w2_justification absent, was admitted (CAP-10 / W2); an item stale under the pinned freshness table supports the recorded rung unchanged (CAP-11 unapplied); assessment_window longer than 12 months, or dossier_expires != assessment_window.end + 12 months (CAP-25 arithmetic - authored, not computed); a freshness override recorded against W1 or CAP-12 (non-overridable, CAP-13 boundary).",
        "fields": [
          "header.assessment_window.start",
          "header.assessment_window.end",
          "header.dossier_expires",
          "controls[].workpapers[].evidence_role",
          "controls[].workpapers[].collected_on",
          "controls[].workpapers[].w2_justification",
          "controls[].workpapers[].freshness_override",
          "controls[].effective_rung"
        ]
      },
      "procedure_id": "PROC-11"
    },
    {
      "cap_rules": [
        "CAP-13",
        "CAP-18",
        "CAP-24"
      ],
      "class_id": "EXC-12",
      "consequence_class": "disclosure-incomplete",
      "example": {
        "expected": {
          "fires": true
        },
        "input_fragment": {
          "scorecard": {
            "coverage_percent": 63.5
          }
        },
        "why": "A percentage rendered without its numerator/denominator/scope-enumeration siblings (SC-2)."
      },
      "exclusivity": "Claims every mandatory-disclosure constraint (MX-2 takes the SC-2 siblings from EXC-01). The underlying facts belong to their own classes: an undisclosed stale corpus is this class, a mispinned corpus is EXC-02; an inadmissible override is EXC-11, a miscounted override is this class.",
      "family": "D",
      "name": "disclosure",
      "predicate": {
        "condition": "A mandatory computed disclosure is absent from, or contradicts recomputation on, the rendered record: the 11.1 cover consistency line absent or != its regeneration; the freshness-override count absent or != the count of override records (CAP-13); the corpus-currency stamp or scoped version delta absent where the pinned release was not current at signature (CAP-24 unapplied); a percentage without numerator/denominator/scope-enumeration siblings, or out_of_scope_with_rationale absent (SC-2); failure-token counts absent from a scorecard aggregate (DOM-4/SC-4); claimed_rung not rendered beside effective_rung (R-1), Assurance Basis not co-rendered (AB-2), Tier-S effective not labeled self-attested (AB-4), or review_extent/review_date absent from the face (RV-2); a boundary-limited system admitted without its mandatory scope-limitation record (CAP-18 disclosure half); a prohibited term present in the rendered language (SPEC 16.4).",
        "fields": [
          "cover.population_consistency_line",
          "cover.override_count",
          "cover.corpus_currency",
          "cover.out_of_scope_with_rationale",
          "scorecard.<figure>_percent",
          "scorecard.<figure>_numerator",
          "scorecard.<figure>_denominator",
          "scorecard.failure_token_counts",
          "controls[].claimed_rung",
          "controls[].effective_rung",
          "header.assurance_basis",
          "header.review_extent",
          "header.review_date",
          "<rendered artifact language>"
        ]
      },
      "procedure_id": "PROC-12"
    }
  ],
  "completion_status_binding": {
    "$note": "Completion status describes procedure execution, never favorability (CS-2). A family-A finding forces unable-to-complete only when it makes downstream procedures unexecutable; the deciding fact is recorded per procedure (not-performed + blocked_by), never inferred (CS-1).",
    "procedure_result_enum": [
      "no-exception",
      "exception-recorded",
      "scope-limited",
      "not-performed"
    ],
    "statuses": [
      {
        "compatible_classes": "EXC-01..EXC-12 (any)",
        "new_findings": true,
        "requires": {
          "procedure_results": "all in {no-exception, exception-recorded}",
          "scope_limitation_records": 0
        },
        "status": "procedures-completed"
      },
      {
        "compatible_classes": "EXC-01..EXC-12 (any)",
        "new_findings": true,
        "requires": {
          "procedure_results": "all in {no-exception, exception-recorded, scope-limited}",
          "scope_limitation_records": ">=1"
        },
        "status": "procedures-completed-with-scope-limitation"
      },
      {
        "compatible_classes": "classes of executed procedures only",
        "new_findings": true,
        "requires": {
          "procedure_results": ">=1 not-performed; the blocking finding or scope-limitation named via blocked_by",
          "scope_limitation_records": ">=0"
        },
        "status": "unable-to-complete"
      },
      {
        "compatible_classes": "rendered frozen as at signing",
        "new_findings": false,
        "requires": {
          "procedure_results": "none executed post-issuance",
          "scope_limitation_records": "frozen"
        },
        "status": "expired"
      },
      {
        "compatible_classes": "rendered frozen as at signing",
        "new_findings": false,
        "requires": {
          "procedure_results": "none executed post-issuance",
          "scope_limitation_records": "frozen"
        },
        "status": "revoked"
      }
    ]
  },
  "consequence_classes": {
    "$note": "Closed enum; consequence_class is derived per class (CQ-1), never authored; no 'other', no free text, no override. Counted dimensions (affected_control_count, affected_blocking_control_count, affected_population_count) are computed by the detecting procedure and carried on the finding, never folded into the class.",
    "enum": [
      "record-invalid",
      "recomputation-blocked",
      "denominator-unreliable",
      "cap-unapplied",
      "declaration-incomplete",
      "coverage-misstated",
      "admissibility-misapplied",
      "disclosure-incomplete"
    ]
  },
  "count_rendering": {
    "rule": "K of 12 exception classes triggered across N procedures - K = distinct class_ids with at least one finding, N = procedures with result != not-performed. Record types are excluded from K by construction.",
    "zero_case": "0 of 12 exception classes triggered across N procedures - rendered as a count, never an enum token (SPEC RC-1)."
  },
  "families": {
    "A": "structural-cryptographic",
    "B": "population-sampling",
    "C": "evidence-procedure",
    "D": "window-freshness-disclosure"
  },
  "license": "CC BY 4.0",
  "procedures": "acam/acam-procedures.json",
  "prose": "acam/ACAM-EXCEPTIONS.md",
  "record_types": {
    "$note": "Displayed at identical prominence, never counted: excluded from the 'K of 12' numerator and every class breakdown by construction. Both carry procedure_id and target; neither carries class_id or consequence_class (B3 schema oneOf).",
    "observation": {
      "counts": false,
      "meaning": "A fact about the DOSSIER worth surfacing that breaches no published predicate. Canonical case: the SPEC 10.4 all-nil screen - hundreds of controls with zero contradictory-or-limiting observations anywhere is itself the reviewable finding, yet no rule is violated.",
      "rationale": "Keeps the lane honest without inflating counted exceptions into judgment calls."
    },
    "scope-limitation": {
      "counts": false,
      "meaning": "A fact about the CHECK, not the client: a published procedure (or part of one) could not be executed for reviewer-side reasons (access, tooling, boundary - e.g. provider-held bytes cannot be re-presented for a digest recount).",
      "rationale": "An Apeiris-side fact, not a client fact: counting a reviewer-side inability as a client exception would misattribute the client's posture; silently dropping it would overstate the check. It displays, moves the completion status, names the affected procedure_id(s), and never counts."
    }
  },
  "source_section": "SPEC 7.4, 16.3; plan 7 and 14 B3; round-3 B3",
  "spec": "acam/ACAM-SPEC.md"
}
