# COR Prover – External Validation Framework

**Status:** Design → Testnet Phase-4 roll-out (Router v2)\
**Surfaces:** REST (now), x402 (edge), MCP (agent runtimes)\
**Trust Rails:** PoI (quantitative), PoUW (qualitative), Attestations (JWS / EIP-712), optional ERC-8004 artifacts\
**Backbone:** Reuses Cortensor **Session / SessionQueue / Validator** with delegated sessions (no core protocol change)

***

### 1) What it does

* **Redundant re-inference (k-redundant)** of a candidate result on Cortensor miners.
* **PoI (Proof of Inference)**: embedding-distance + dispersion to detect inconsistency.
* **PoUW (Proof of Useful Work)**: LLM-verifier rubric to score usefulness/quality.
* **Attestation**: Signed JWS (optional EIP-712) + evidence bundle (IPFS/Arweave).
* **Anchoring (optional)**: Write a `ValidationResponse` to an ERC-8004-compatible registry.

Use it to validate:

* LLM outputs (text/multimodal);
* Structured results (JSON/specs) with rule checks;
* Hybrid flows (rule → LLM rubric).

***

### 2) High-level flow

```
Client → [Edge/x402] → Router v2 /validate
                 │
           (x402 settle)
                 ▼
        Delegated Session (Cortensor)
            ├─ k redundant re-inference
            ├─ PoI (embedding stats)
            ├─ PoUW (LLM-verifier, rubric)
            └─ TaskRoot → SessionRoot update
                 ▼
      Signed Attestation (JWS/EIP-712)
                 ├─ Evidence (IPFS/Arweave)
                 └─ (optional) 8004 Validation write
```

***

### 3) API (REST, v1)

#### 3.1 `POST /v1/prover/validate`

**Purpose:** Submit input + candidate for validation. Optionally pick policies (k, eval rubric).\
**Auth/Payment:**

* **Now:** API key (test) or allowlist; optional 402 stub for sandbox.
* **Phase-4:** **x402** at edge → receipt verified → credit session (direct) or staking pool.
* **MCP:** mirrored tool method (see §8).

**Request (JSON)**

```json
{
  "job": {
    "input": { "prompt": "Explain PoI vs PoUW to a dev." },
    "candidate": { "text": "PoI checks consistency; PoUW checks usefulness." }
  },
  "policy": {
    "k": 5,
    "poi": { "embedding_model": "all-MiniLM-L6-v2", "distance": "cosine", "dispersion_threshold": 0.25 },
    "pouw": {
      "rubric": ["factuality","consistency","relevance","format_adherence"],
      "verifier_model": "gpt-4o-mini-like",
      "score_threshold": 0.75
    },
    "rules": {
      "schema": { "type": "object", "properties": { "text": { "type": "string" } }, "required": ["text"] },
      "max_tokens": 2048
    },
    "finalize": { "attestation": "JWS", "anchor_8004": false }
  },
  "metadata": {
    "buyer":"0xabc...","trace_id":"req_123","ttl_sec":120
  }
}
```

**Response (202 Accepted)**

```json
{ "jobId": "job_9f2f...", "status": "queued", "k": 5, "eta_sec": 20 }
```

#### 3.2 `GET /v1/prover/jobs/{jobId}`

Returns state and partial metrics while running. Jobs will be reading from Session Queue module.

```json
{
  "jobId": "job_9f2f...",
  "status": "running",
  "progress": { "assigned": 5, "completed": 3 },
  "poi": { "dispersion": 0.31, "outliers": ["miner_12"] },
  "pouw": { "sampled": 2, "avg_score": 0.78 }
}
```

#### 3.3 `GET /v1/prover/jobs/{jobId}/attestation`

Final results + signed proof. If `anchor_8004=true`, includes registry pointer(s).

```json
{
  "attestation": {
    "format": "JWS",
    "payload": {
      "iss":"cor-prover",
      "sub":"job_9f2f",
      "session_id":"sess_4c7a",
      "task_ids":["t1","t2","t3","t4","t5"],
      "input_hash":"0x....",
      "candidate_hash":"0x....",
      "policy":{"k":5,"poi":{"distance":"cosine"},"pouw":{"rubric":["factuality","..."]}},
      "poi":{"method":"cluster-median","dispersion":0.22,"anomalies":["miner_12"]},
      "pouw":{"score":0.84,"rubric_scores":{"factuality":0.86,"consistency":0.82,"relevance":0.85,"format_adherence":0.82}},
      "task_root":"0xTASKROOT",
      "session_root":"0xSESSIONROOT",
      "evidence":{"ipfs":"ipfs://bafk..."},
      "settlement":{"invoice":"inv_xyz","amount":"0.0002","currency":"ETH","chain_id":"42161"},
      "iat": 1762065600,
      "exp": 1762069200
    },
    "signature":"eyJhbGciOi..."
  },
  "anchors": {
    "erc8004": {
      "validation_tx": null,
      "offchain_ref": "https://registry.example/val/0x..."
    }
  }
}
```

**Errors** (examples)

* `402 Payment Required` (with **x402** headers – Phase-4)
* `422 Unprocessable` (schema mismatch / invalid policy)
* `429 Too Many Requests` (rate-limits / pass quota)
* `504 Timeout` (SLA breach; includes refund token when applicable)

***

### 4) Validation methods

#### 4.1 Quantitative (PoI)

* **What:** Compare k re-inference outputs using **embedding vectors**; compute **pairwise/cluster** stats.
* **Signals:** dispersion (median/IQR), centroid distance, anomaly miners, agreement ratio.
* **Pass/Fail:** policy threshold on dispersion; flag if outliers dominate.
* **Storage:** per-job metrics, plus node-level accumulation into **QuantitativeStats / QuantitativeReputation**.

#### 4.2 Qualitative (PoUW)

* **What:** **LLM-verifier** scores candidate (and/or re-runs) on rubric: factuality, consistency, relevance, format, safety.
* **Sampling:** on all k results or on high-dispersion subsets to save budget.
* **Pass/Fail:** aggregated rubric score ≥ threshold; keep rubric breakdowns.
* **Storage:** **QualitativeStats / QualitativeReputation** with time-series roll-ups.

#### 4.3 Rule checks (optional)

* **Schema/format** (JSON schema), **numeric ranges**, **required fields**, **regex**, **max token length**, **safety keywords**.
* **Order:** rules → (if pass) PoI → (if needed) PoUW → final decision.

***

### 5) Proofs & Merkle roots

* **TaskRoot (per task)**: Merkle root of leaves\
  `H(taskId, minerId, modelId, inputHash, outputHash, meta)`
* **SessionRoot (rolling)**: updates as each **TaskRoot** is sealed — a moving commitment ledger for an open session.
* **Attestation** includes both; **Evidence bundle** (optional) holds anonymized leaf material (hashes, metrics, redactable).

***

### 6) x402 integration (Phase-4 edge)

* **Edge behavior:** If unpaid/underfunded → return `402 Payment Required` with **x-402** challenge:

  ```
  WWW-Authenticate: X402 ver="1"; amount="0.0002"; currency="ETH"; chain_id="42161";
  pay_to="0xCOR_TREASURY"; invoice="inv_..."; scope="POST:/v1/prover/validate#job=<H(input,candidate,policy)>";
  exp="<+60s>"; proof="jws"; callback="https://api.cortensor.dev/x402/webhook"
  ```
* **Client pays** (facilitator/on-chain), retries with receipt; **Receipt Verifier** mints internal credit and forwards.
* **Accounting:** `PaymentReceived(x402, invoice, jobId, amount)` → Indexer/Dashboard.
* **Settlement target:** **SessionPayment** (direct) or **SessionPaymentStaking** pool (stake-to-use).

***

### 7) ERC-8004 alignment (optional in Phase-4)

* **Identity:** Register COR Prover as an agent (Router v2).
* **Validation:** Write `ValidationResponse` entries referencing **TaskRoot/SessionRoot** and evidence URL.
* **Reputation (later):** Feed summary scores to 8004 Reputation; keep node/session-level detail in Cortensor reputation modules.

**Mapping**

* `AgentServerID` ⟶ `SessionID` (aggregates miners internally)
* `AgentValidatorID` ⟶ COR Prover validator service
* `DataHash` ⟶ `TaskRoot` / `SessionRoot`

***

### 8) MCP tool (mirrors REST)

**Server advertises tools:**

* `cortensor.prover.validate(input, candidate, policy?) → jobId`
* `cortensor.prover.attestation(jobId) → attestation`

**Payment over MCP:** First call emits **x402 challenge event**; client returns receipt in `tool/use` metadata. **Passes/quotas** supported post-Testnet.

***

### 9) Policies & tuning

* **k-redundancy:** default 3; tiers (1/3/5) by SLA/price.
* **Dispersion threshold:** default 0.25 cosine; adjustable per domain.
* **Rubric:** default 4-criteria; domain packs (code, math, support).
* **Sampling:** `eval=auto|always|never`; `auto` triggers PoUW when PoI dispersion high.
* **Time budget:** commit/reveal windows per task; global **job TTL**.
* **Privacy:** hash inputs; store raw evidence off-chain; role-gated bundle access.

***

### 10) Security, rate limits, and abuse controls

* **Single-use receipts** (Redis), **short TTL** (≤60s), **scope** bound to `jobHash`.
* **DPoP/cnf** binding for agent callers (post-Testnet).
* **Payload caps** (input size, model hints), **min/max k** per buyer.
* **Refund tokens** for timeouts/SLA violations.
* **Audit**: all decisions + hashes + pricing version recorded.

***

### 11) Minimal data model (sketch)

* **jobs**: `job_id, job_hash, buyer, session_id, k, policy_json, status, created_at, completed_at`
* **metrics\_poi**: `job_id, dispersion, centroid, outliers[]`
* **metrics\_pouw**: `job_id, score, rubric_scores{}`, `verifier_model`
* **attestations**: `job_id, jws, eip712?, evidence_uri, task_root, session_root`
* **invoices**: `invoice_id, scope_hash, amount, currency, chain_id, pay_to, tx_hash, status, used_at`

***

### 12) Example: hybrid validation (rule → PoI → PoUW)

**Request**

```json
{
  "job": {
    "input": {"prompt":"Summarize our privacy key-exchange methods."},
    "candidate": {"text":"Method 1 uses ECDH with commitments; Method 2 uses a coordinator."}
  },
  "policy": {
    "k": 3,
    "rules": {
      "schema":{"type":"object","properties":{"text":{"type":"string"}},"required":["text"]},
      "max_tokens": 1000
    },
    "poi":{"embedding_model":"text-embed-lite","distance":"cosine","dispersion_threshold":0.3},
    "pouw":{"verifier_model":"gpt-4o-mini-like","rubric":["factuality","relevance"],"score_threshold":0.8},
    "finalize":{"attestation":"JWS","anchor_8004":false}
  }
}
```

**Final (attestation payload excerpt)**

```json
{
  "poi":{"dispersion":0.21,"anomalies":[]},
  "pouw":{"score":0.86,"rubric_scores":{"factuality":0.88,"relevance":0.84}},
  "decision":{"valid":true,"reasons":["rules_pass","poi_low_dispersion","pouw_score>=0.8"]}
}
```

***

### 13) Operational notes

* **SLA tiers (example):**
  * k=1 (cheap/fast, no eval): p50 5–10s
  * k=3 (balanced, eval on high dispersion): p50 15–25s
  * k=5 (critical, eval always): p50 ≤30s
* **Gas/L2 optimization:** minimize on-chain writes; batch anchors; compress event logs; prefer off-chain bundles with anchored roots.
* **Observability:** job timelines, miner dispersion histograms, verifier latency, receipt-verify success.

***

### 14) Roadmap fit

* **Testnet Phase-4:** Ship Router v2 `/validate` with x402 edge, delegated sessions, PoI+PoUW, JWS attestation, optional 8004 off-chain write.
* **Post-Testnet (Integration Phases 2–3):** Passes/quotas, default 8004 writes, agent-bound flows, Router v3 (inference + validation), MCP first-class.

***

#### TL;DR for integrators

* Call **`POST /v1/prover/validate`** with `{input, candidate, policy}`.
* Handle **402/x402** (Phase-4) or use test key.
* Poll **`/jobs/{id}`**, then fetch **`/jobs/{id}/attestation`**.
* Verify **JWS**; (optionally) look up **ERC-8004** validation reference.
* Trust the numbers: **PoI** (consistency) + **PoUW** (quality) + **TaskRoot/SessionRoot** (proof).


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.cortensor.network/technical-architecture/designs-wip/cor-prover-external-validation-framework.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
