# Dispatch Contract Template — Anti-Hallucination V2

# Dispatch Contract Template — Anti-Hallucination V2

**Extracted from:** Anti-Hallucination Evidence Verification Protocol V2 (§3, §4)  
**MC:** #99732  
**Published:** 2026-05-22  
**Use for:** All UAT/QA dispatches where a verdict will be issued to CEO

## Overview

This template defines the mandatory fields and structure for any dispatch that will result in a GO-LIVE-READY verdict. It implements ZAKON #29, #29.1, #29.2, and #30.

## Pre-Dispatch Checklist (Mehanik Gate)

- **AC-1:** No OR clauses in any acceptance criterion. Each OR-clause AC must be rewritten as two separate ACs with independent evidence requirements.
- **AC-2:** URL assertions use exact paths (e.g., `finalUrl equals /dashboard/overview`, NOT "dashboard reached").
- **AC-3:** Each AC names a specific evidence type and field.
- **AC-4:** Wiggle-resistance test passed: agent cannot argue PASS while the intent fails.
- **GATE-FIELD:** `wiggle_risk: false` confirmed for all ACs. If any AC has `wiggle_risk: true`, dispatch BLOCKED pending rewrite.

## Verdict JSON Contract (Mandatory Fields)

```
{
  "verdict": "PASS | FAIL | PARTIAL | BLOCKED | REFUSED",
  "mc": "<task_id>",
  "agent": "<agent_slug>",
  "timestamp": "<ISO8601>",
  "expires_at": "<ISO8601, timestamp + 15min default>",
  "machine_check_count": 5,
  "machine_checks_executed": 5,
  "evidence_files": [
    {
      "path": "<absolute path or GCS URI>",
      "type": "playwright-trace | curl-output | json-response | screenshot | log",
      "field": "<specific field, e.g. finalUrl, http_code, claims.sub>",
      "value": "<actual value observed>",
      "expected": "<expected value from AC>",
      "match": true,
      "sha256": "<hex>"
    }
  ],
  "claims": [
    {
      "claim_id": "C1",
      "ac_text": "<verbatim AC text>",
      "evidence_ref": "evidence_files[0]",
      "machine_check": "<exact bash command to reproduce>",
      "intent_proof": "<one sentence: how evidence proves AC intent>",
      "result": "PASS"
    }
  ],
  "refused_reason": "<required if verdict=REFUSED; must cite specific missing evidence>"
}
```

## REFUSED Verdict Rules (ZAKON #29.1)

An agent MUST emit REFUSED (not PARTIAL or BLOCKED) when ground-truth evidence is insufficient to determine if the AC intent is satisfied, the reproducer cannot run, or evidence files cannot be captured.

REFUSED handling: does NOT count as FAIL; DOES auto-escalate to CEO via Slack within 15 minutes; DOES suspend dependent task completions until CEO arbitrates.

## Orchestrator Read-Your-Writes Obligation (ZAKON #29.2)

After receiving a PASS verdict from Proveo, John MUST execute the `machine_check` command from at least 2 critical claims independently (NOT re-delegating to Proveo), then append `john_reproducer_output` to the final GO-LIVE-READY summary. If `matches_verdict: false` — GO-LIVE is BLOCKED regardless of Proveo verdict, sha256 match, or CEO\_APPROVED token.

## Quorum Requirement for GO-LIVE-READY (ZAKON #30)

GO-LIVE-READY requires 2-of-3 paths confirmed:

<table id="bkmrk-pathactorevidence-ap"><thead><tr><th>Path</th><th>Actor</th><th>Evidence</th></tr></thead><tbody><tr><td>A</td><td>Proveo tester</td><td>PASS verdict + evidence\_files + sha256</td></tr><tr><td>B</td><td>John reproducer</td><td>john\_reproducer\_output.matches\_verdict = true</td></tr><tr><td>C</td><td>evidence-verifier MLX</td><td>CONFIRMED from gemma-4-26b-mlx, cross-checks sha256 + intent\_proof</td></tr></tbody></table>

Single-path PASS = PARTIAL, not GO-LIVE-READY. A fencing token (monotonic integer) expires at `expires_at` — expired tokens are NULL regardless of quorum.

## GCS Evidence Chain of Custody

1. Proveo writes evidence to: `gs://alai-audit-evidence/<mc_id>/<timestamp>/<filename>`
2. GCS bucket: object versioning enabled, no-delete IAM
3. Orchestrator reads from GCS URI, not /tmp path
4. /tmp is computation-only; final evidence always lands in GCS before verdict

*Source: Anti-Hallucination V2 spec §3-4 | MC #99732 | Cross-ref: BookStack page 2995 (full spec)*