# Reviewer corrections

> Reviewers can correct values read from uploaded documents — only before a final decision, with a full audit trail.

Source: https://docs.okyc.stream/concepts/reviewer-corrections

OCR sometimes misreads a field. In the dashboard, a reviewer can correct document-derived values on the session
page while the session is waiting for a decision.

## Rules

* **Before a final decision only.** Corrections are refused while checks are `processing` and once the session is
  approved, declined, expired or cancelled — for every role, admins included.
* **Only document data.** Values from document extraction (`document.extract`) and ID-card OCR can be corrected.
  Government-verified results (PAN, Aadhaar, GSTIN, MCA) are locked. Checks verified
  [manually](https://docs.okyc.stream/concepts/manual-verification.md) are confirmed or rejected instead; correct the document's values
  first if they were misread.
* **Nothing is overwritten.** The originally extracted value is kept next to the correction, with who changed it,
  when, and the reason.
* **Same guarantees.** A corrected value goes through the same validation, normalisation and masking as an
  extracted one.
* **Roles:** owner, admin and reviewer.

## What happens

The corrected values rebuild the applicant profile for that source, so name, date-of-birth and address matching
use the corrected data. The dashboard shows what the rules would decide now (a preview; nothing is recorded)
before the reviewer approves or declines. The audit log records `check.fields_corrected` with field keys and
reasons, never the values.

## Errors

| Code                 | When                                         |
| -------------------- | -------------------------------------------- |
| `decision_final`     | The session already has a final decision.    |
| `session_processing` | Checks are still running; try again shortly. |
| `not_correctable`    | The check is government-verified.            |
| `unknown_field`      | The field isn't part of that document.       |
| `no_changes`         | The request had nothing to change.           |
