# Parity Report Format

All parity check agents return results in this JSON structure.

## Schema

```json
{
  "check_type": "<one of: feature-command-parity, feature-query-parity, feature-model-parity, command-model-consistency>",
  "module": "<module-name>",
  "gaps": [
    {
      "source": "<source doc path>",
      "target": "<target doc path or 'missing'>",
      "check": "<check_id from the agent's parity checks table>",
      "status": "pass | fail | skip",
      "detail": "<human-readable description of the finding>"
    }
  ],
  "inconsistencies": [
    {
      "type": "<inconsistency type, e.g. state_transition_mismatch>",
      "location": "<source vs target description>",
      "detail": "<human-readable description>"
    }
  ],
  "summary": {
    "total_checks": 0,
    "passed": 0,
    "failed": 0,
    "skipped": 0
  }
}
```

## Field Reference

### gaps[]

One entry per parity check performed. `status` is:

- `pass`: source and target are consistent
- `fail`: gap or mismatch found
- `skip`: target docs missing or empty, check could not run

### inconsistencies[]

Cross-cutting issues found during the check that don't fit a single gap entry (e.g., naming violations, state mismatches across multiple docs).

### summary

Aggregate counts. `total_checks = passed + failed + skipped`.

## Router-Level Severity and Verdict

The router (SKILL.md Step 3) assigns severity to each non-pass finding after collecting all agent results. Agents do NOT assign severity — they only report `status` and `detail`.

The router classifies each finding as:

- `critical`: blocks progress — missing required doc, fundamental design mismatch
- `major`: should fix — incomplete coverage, unclear mapping, missing business rules
- `nit`: nice to have — minor naming inconsistency, optional doc improvement, cosmetic issue

Verdict rule:

- `APPROVED`: zero `critical` and zero `major` findings (nits only, or all pass)
- `NEEDS_CHANGES`: one or more `critical` or `major` findings
