---
title: "Run a check on a new caller-provided revision and compare it with a previous check"
method: POST
path: "/v0/revision-checks"
---

# Run a check on a new caller-provided revision and compare it with a previous check

`POST /v0/revision-checks`

## Request

- Base URL: `https://exactlane.dev` (the document declares no server; this is the origin it was published from)
- URL: `https://exactlane.dev/v0/revision-checks`
- Auth: HTTP bearer

Static only. Idempotency-Key is required, and the credential needs checks:write and capabilities:write. Send the new snapshot, the same requirements, and previous.snapshot with its finished previous.report. The response carries the normal check report unchanged plus a separate revision_receipt. Exactlane re-evaluates the previous snapshot instead of trusting previous.report, and does not look up or depend on earlier issuance. The global previous-to-current comparison is authoritative; at most 32 changes are also evaluated in isolation, which cannot rule out interaction effects. Consumes one capability revision and one check. Request, report, runtime and quota limits are the same as for POST /v0/checks; the receipt is at most 16 KiB. There is no receipt lookup route. The caller owns CONTINUE, UPDATE_INTEGRATION, and HOLD.

## Headers

- `Idempotency-Key` string, required

## Request body

- RevisionCheckCreate
  - `capability_key` string, required
  - `previous` RevisionCheckPrevious, required
    - `report` CheckReport, required
      - `checks` CheckResult[], required
        - `check_id` string, required
        - `evidence_path` string
        - `expected` unknown
        - `observed` unknown
        - `reason` string
        - `result` 'PASS' | 'FAIL' | 'NOT_RUN' | 'UNSUPPORTED' | 'ERROR', required: Per-check evidence result. PASS: the condition was evaluated with supported semantics and the caller's requirement was met. FAIL: the evaluator proved a concrete incompatibility with the caller's requirement. NOT_RUN: the check did not execute because evidence was missing or stale, or because a prerequisite check could not run. UNSUPPORTED: the condition depends on semantics outside the fixed evaluator profile; this is neither proof of compatibility nor incompatibility. ERROR: a bounded internal runner, artifact, or report condition was represented as a check result.
      - `coverage` Coverage, required
        - `errors` integer, required
        - `executed` integer, required
        - `failed` integer, required
        - `not_run` integer, required
        - `passed` integer, required
        - `required` integer, required
        - `unsupported` integer, required
      - `evaluated_at` string, date-time, required
      - `lifecycle` 'QUEUED' | 'RUNNING' | 'FINISHED' | 'CANCELLED', required
      - `limitations` string[], required
      - `profile` object, required
      - `requirements_digest` string, required
      - `revision_changes` object, required
      - `run_id` string, required
      - `runner` object, required
      - `schema_version` 'exactlane.check-report/0.1', required
      - `source` object, required
        - `captured_at` string, date-time, nullable
        - `kind` 'CALLER_PROVIDED', required
        - `live_endpoint_observed` unknown, required
        - `observed_at` unknown
      - `subject` object, required
      - `trust` object, required
      - `verdict` 'PASS' | 'FAIL' | 'INCOMPLETE' | 'UNSUPPORTED' | 'SYSTEM_ERROR' | 'null', nullable, required: Finished-report aggregation precedence: any ERROR produces SYSTEM_ERROR; otherwise any FAIL produces FAIL; otherwise any UNSUPPORTED produces UNSUPPORTED; otherwise any NOT_RUN produces INCOMPLETE; otherwise the verdict is PASS. Report-level UNSUPPORTED and SYSTEM_ERROR are finished-report outcomes, not HTTP error responses.
    - `revision_receipt` RevisionReceipt: Revision analysis beside an unchanged check report. The global previous-to-current comparison is authoritative. Isolated change evaluations report DIRECT_EFFECT_OBSERVED, NO_ISOLATED_EFFECT_OBSERVED or NOT_EVALUATED and cannot rule out interaction effects.
      - `analysis` object, required
      - `baseline` object, required
        - `status` 'REEVALUATION_MATCHED' | 'REEVALUATION_MISMATCH' | 'EVALUATOR_CHANGED' | 'NOT_AVAILABLE'
      - `caller_owns_operational_decision` unknown, required
      - `changes` object, required
        - `items` object[]
          - `isolated` 'DIRECT_EFFECT_OBSERVED' | 'NO_ISOLATED_EFFECT_OBSERVED' | 'NOT_EVALUATED'
          - `scope` 'SNAPSHOT' | 'PROTOCOL' | 'REQUIRED_TOOL' | 'UNREQUIRED_TOOL'
      - `core_digest` string, required
      - `current` object, required
      - `explanation` object[], required
      - `global` object, required
        - `conclusion_transition` 'STILL_PASS' | 'NO_LONGER_PASS' | 'NOW_PASS' | 'STILL_NON_PASS_SAME_FINDINGS' | 'STILL_NON_PASS_FINDINGS_CHANGED'
        - `previous_conclusion_holds` boolean
        - `status` 'COMPLETE' | 'INCOMPLETE' | 'NOT_AVAILABLE'
        - `transitions` object[]
      - `limitations` string[], required
      - `per_change_analysis` object, required
        - `interaction_effects` 'INTERACTION_EFFECT_POSSIBLE' | 'SINGLE_CHANGE' | 'NO_CHANGES'
        - `limit` unknown
        - `status` 'COMPLETE' | 'INCOMPLETE' | 'NOT_APPLICABLE' | 'NOT_AVAILABLE'
      - `previous` object, required
      - `receipt_digest` string, required
      - `schema_version` 'exactlane.revision-receipt/0.1', required
      - `source` object, required
      - `subject` object, required
    - `snapshot` CapabilitySnapshot, required
      - `captured_at` string, date-time
      - `protocol` object
        - `name` string
        - `revision` string
        - `transport` string
      - `schema_version` string
      - `tools` CapabilityTool[]
        - `_meta` object: Accepted for tools/list compatibility and discarded before storage, digest and evaluation
        - `annotations` object: Accepted for tools/list compatibility and discarded before storage, digest and evaluation
        - `description` string: Accepted for tools/list compatibility and discarded before storage, digest and evaluation
        - `icons` unknown[]: Accepted for tools/list compatibility and discarded before storage, digest and evaluation
          - unknown
        - `inputSchema` JsonSchemaObject: JSON Schema object; the fixed profile supports only its documented keyword subset
        - `max_input_bytes` integer
        - `name` string, required
        - `outputSchema` JsonSchemaObject: JSON Schema object; the fixed profile supports only its documented keyword subset
        - `title` string: Accepted for tools/list compatibility and discarded before storage, digest and evaluation
  - `profile` ProfileRef, required
    - `id` 'mcp-consumer-fit', required
    - `version` '0.1' | '0.2' | '0.3', required
  - `requirements` union, required: Profile 0.1 uses requirements 0.1, profile 0.2 uses requirements 0.2 and profile 0.3 uses requirements 0.3. Profile 0.3 also accepts JSON Schema annotation keywords in tool schemas.
    - ConsumerRequirements
      - `exposed_tool_identifier` ExposedToolIdentifierRule: For each required tool, compare len(server_identifier + separator + tool.name) with max_characters; all parts are visible ASCII
        - `max_characters` integer, required
        - `separator` string, required
        - `server_identifier` string, required
      - `max_snapshot_age_seconds` integer
      - `protocol_revision` string, required
      - `required_tools` ToolRequirement[], required
        - `estimated_input_bytes` integer
        - `name` string, required
        - `provided_input_fields` object
        - `required_input_schema_dialect` string: Absolute visible-ASCII URI compared by exact string equality
        - `required_output_paths` object
        - `required_output_schema_dialect` string: Absolute visible-ASCII URI compared by exact string equality
      - `schema_version` 'exactlane.consumer-requirements/0.1', required
      - `transport` string, required
    - ConsumerRequirementsV02
      - `caller_profile_mode` string: Opaque caller profile mode used only for exact, case-sensitive GAP-03 applicability
      - `exposed_tool_identifier` ExposedToolIdentifierRule: For each required tool, compare len(server_identifier + separator + tool.name) with max_characters; all parts are visible ASCII
        - `max_characters` integer, required
        - `separator` string, required
        - `server_identifier` string, required
      - `max_snapshot_age_seconds` integer
      - `protocol_revision` string, required
      - `required_tools` ToolRequirementV02[], required
        - `array_item_schema_requirements` ArrayItemSchemaRequirement[]: At most one input rule and one output rule; duplicate locations are rejected
          - `applies_when_modes` CallerProfileMode[]
          - `schema_location` 'input' | 'output', required
        - `estimated_input_bytes` integer
        - `name` string, required
        - `provided_input_fields` object
        - `required_input_schema_dialect` string: Absolute visible-ASCII URI compared by exact string equality
        - `required_output_paths` object
        - `required_output_schema_dialect` string: Absolute visible-ASCII URI compared by exact string equality
      - `schema_version` 'exactlane.consumer-requirements/0.2' | 'exactlane.consumer-requirements/0.3', required: Requirements 0.2 select profile 0.2 and 0.3 select profile 0.3; the fields are the same
      - `transport` string, required
  - `revision_label` string, required
  - `snapshot` CapabilitySnapshot, required
    - `captured_at` string, date-time
    - `protocol` object
      - `name` string
      - `revision` string
      - `transport` string
    - `schema_version` string
    - `tools` CapabilityTool[]
      - `_meta` object: Accepted for tools/list compatibility and discarded before storage, digest and evaluation
      - `annotations` object: Accepted for tools/list compatibility and discarded before storage, digest and evaluation
      - `description` string: Accepted for tools/list compatibility and discarded before storage, digest and evaluation
      - `icons` unknown[]: Accepted for tools/list compatibility and discarded before storage, digest and evaluation
        - unknown
      - `inputSchema` JsonSchemaObject: JSON Schema object; the fixed profile supports only its documented keyword subset
      - `max_input_bytes` integer
      - `name` string, required
      - `outputSchema` JsonSchemaObject: JSON Schema object; the fixed profile supports only its documented keyword subset
      - `title` string: Accepted for tools/list compatibility and discarded before storage, digest and evaluation
  - `source_kind` 'CALLER_PROVIDED', required

## Response `201`

Finished check report plus revision receipt; incomplete analysis is marked, never omitted

- RevisionCheckResponse
  - `check` CheckReport, required
    - `checks` CheckResult[], required
      - `check_id` string, required
      - `evidence_path` string
      - `expected` unknown
      - `observed` unknown
      - `reason` string
      - `result` 'PASS' | 'FAIL' | 'NOT_RUN' | 'UNSUPPORTED' | 'ERROR', required: Per-check evidence result. PASS: the condition was evaluated with supported semantics and the caller's requirement was met. FAIL: the evaluator proved a concrete incompatibility with the caller's requirement. NOT_RUN: the check did not execute because evidence was missing or stale, or because a prerequisite check could not run. UNSUPPORTED: the condition depends on semantics outside the fixed evaluator profile; this is neither proof of compatibility nor incompatibility. ERROR: a bounded internal runner, artifact, or report condition was represented as a check result.
    - `coverage` Coverage, required
      - `errors` integer, required
      - `executed` integer, required
      - `failed` integer, required
      - `not_run` integer, required
      - `passed` integer, required
      - `required` integer, required
      - `unsupported` integer, required
    - `evaluated_at` string, date-time, required
    - `lifecycle` 'QUEUED' | 'RUNNING' | 'FINISHED' | 'CANCELLED', required
    - `limitations` string[], required
    - `profile` object, required
    - `requirements_digest` string, required
    - `revision_changes` object, required
    - `run_id` string, required
    - `runner` object, required
    - `schema_version` 'exactlane.check-report/0.1', required
    - `source` object, required
      - `captured_at` string, date-time, nullable
      - `kind` 'CALLER_PROVIDED', required
      - `live_endpoint_observed` unknown, required
      - `observed_at` unknown
    - `subject` object, required
    - `trust` object, required
    - `verdict` 'PASS' | 'FAIL' | 'INCOMPLETE' | 'UNSUPPORTED' | 'SYSTEM_ERROR' | 'null', nullable, required: Finished-report aggregation precedence: any ERROR produces SYSTEM_ERROR; otherwise any FAIL produces FAIL; otherwise any UNSUPPORTED produces UNSUPPORTED; otherwise any NOT_RUN produces INCOMPLETE; otherwise the verdict is PASS. Report-level UNSUPPORTED and SYSTEM_ERROR are finished-report outcomes, not HTTP error responses.
  - `revision_receipt` RevisionReceipt, required: Revision analysis beside an unchanged check report. The global previous-to-current comparison is authoritative. Isolated change evaluations report DIRECT_EFFECT_OBSERVED, NO_ISOLATED_EFFECT_OBSERVED or NOT_EVALUATED and cannot rule out interaction effects.
    - `analysis` object, required
    - `baseline` object, required
      - `status` 'REEVALUATION_MATCHED' | 'REEVALUATION_MISMATCH' | 'EVALUATOR_CHANGED' | 'NOT_AVAILABLE'
    - `caller_owns_operational_decision` unknown, required
    - `changes` object, required
      - `items` object[]
        - `isolated` 'DIRECT_EFFECT_OBSERVED' | 'NO_ISOLATED_EFFECT_OBSERVED' | 'NOT_EVALUATED'
        - `scope` 'SNAPSHOT' | 'PROTOCOL' | 'REQUIRED_TOOL' | 'UNREQUIRED_TOOL'
    - `core_digest` string, required
    - `current` object, required
    - `explanation` object[], required
    - `global` object, required
      - `conclusion_transition` 'STILL_PASS' | 'NO_LONGER_PASS' | 'NOW_PASS' | 'STILL_NON_PASS_SAME_FINDINGS' | 'STILL_NON_PASS_FINDINGS_CHANGED'
      - `previous_conclusion_holds` boolean
      - `status` 'COMPLETE' | 'INCOMPLETE' | 'NOT_AVAILABLE'
      - `transitions` object[]
    - `limitations` string[], required
    - `per_change_analysis` object, required
      - `interaction_effects` 'INTERACTION_EFFECT_POSSIBLE' | 'SINGLE_CHANGE' | 'NO_CHANGES'
      - `limit` unknown
      - `status` 'COMPLETE' | 'INCOMPLETE' | 'NOT_APPLICABLE' | 'NOT_AVAILABLE'
    - `previous` object, required
    - `receipt_digest` string, required
    - `schema_version` 'exactlane.revision-receipt/0.1', required
    - `source` object, required
    - `subject` object, required

## Other responses

- `400`: Malformed request or idempotency key
- `401`: Missing or invalid credential
- `403`: Insufficient scope or disabled live mode
- `404`: Resource absent or not owned
- `409`: Idempotency or unique-event conflict
- `411`: Content-Length is required
- `413`: Request exceeds a hard bound, including PREVIOUS_REPORT_TOO_LARGE and PREVIOUS_RECEIPT_TOO_LARGE above 16 KiB
- `415`: Media type or content encoding is unsupported
- `422`: Request rejected before a report exists, including PREVIOUS_SNAPSHOT_MISMATCH, REQUIREMENTS_CHANGED, REVISION_COMPARISON_MISMATCH, PREVIOUS_REPORT_INVALID, PREVIOUS_RECEIPT_INVALID and PREVIOUS_RECEIPT_MISMATCH
- `429`: Principal quota exceeded
- `500`: Bounded internal failure

---

[API](https://skmtc.dev/exactlane/apis/exactlane-preflight-phase-0a.md) · [All operations](https://skmtc.dev/exactlane/apis/exactlane-preflight-phase-0a/llms.txt) · [OpenAPI document](https://skmtc.dev/exactlane/apis/exactlane-preflight-phase-0a/revisions/544a503598aa?raw)
