# calibration — Calibration Corpus

## Purpose

Corpus persistent, auto-suficient pentru clasificarea culorilor și regresia FSM.
Sursa de adevăr pentru ce „vede" detectorul.

## Ownership

`frames/`, `calibration_labels.json`, `scenarios.json`.

## Local Contracts

- **`frames/`** — PNG raw `{ts}_{color}.png` scrise **automat** de live loop la
  fiecare schimbare de culoare. Filename = culoarea detectată, **poate fi greșită**.
  Nu trata filename-ul ca ground truth.
- **`calibration_labels.json`** — ground truth **manual**. Gate offline pentru
  `atm validate-calibration`. Pui culoarea pe care ai văzut-o TU pe chart, nu cea
  din filename.
- **`scenarios.json`** — secvențe FSM pentru `tests/test_scenarios_regression.py`.

## Work Guidance

**Workflow după sesiune:** review frame-urile noi din `frames/` → adaugi entry-uri
în `calibration_labels.json` cu culoarea reală → rulezi validate-calibration.

### Palette gotcha (recalibrare 2026-04-21)

Indicatorii M2D pictează cele patru culori bright la saturație near-pure:
turquoise `(0,253,253)`, yellow `(253,253,0)`, light_green `(0,255,0)`,
light_red `(255,0,0)`. Dacă Tk-wizard eșantionează un pixel ușor desaturat,
clasificatorul întoarce `UNKNOWN` (distanță > tolerance=60) → FSM nu vede trigger
→ stuck în PRIMED → scheduler polls la infinit. **Mereu** rulează
validate-calibration după recalibrare. Config activ: vezi `configs/current.txt`.

## Verification

```bash
atm validate-calibration calibration/calibration_labels.json   # color gate offline
pytest tests/test_scenarios_regression.py -v
```

## Child DOX Index

(none — leaf)
