## Why Единая нормализация ББ/ОФР (docs change `unified-statement-normalization`, RSHB/arm-ka-docs#116): шаги 2–8 разбора вынесены в общий пакет `arm_statements`, контракт результата распознавания поднят до 2.0. Шлюз оставляет у себя обмен с ИС Сканирование и адаптер «таблица json ИС → `FormCandidate`», а собственный нормализатор и справочники удаляет. Требования — спека docs `specs/scan-gateway/spec.md` (требования «Адаптер json ИС шага 1», «Ошибки набора json», «Что уходит из шлюза») и `specs/recognition-contract/spec.md`. ## What Changes - Адаптер `normalizer/ocr/adapter.py`: каждая таблица каждого успешного json — один `FormCandidate` (шапка json копируется в шапку каждой таблицы, `label` — заголовок в `evidence`, плотная сетка, `Cell.ref = row:`, `locator = file:<имя json>;table:`). - Обход набора json (`normalizer/ocr/answer_set.py`, `normalizer/files.py`): предупреждения файла `JSON_FAILED`, `TABLE_PARSE_ERROR`; `TABLE_LOST` / `TABLE_SKIPPED` — от пакета; статус — `envelope_status` пакета. - Контракт результата 2.0: `schema_version = "2.0"` у файла и конверта (включая ack), структурные `metrics.warnings`, `service.statements_version` в файле результата; перевод в контракт — `to_contract` / `warning_to_contract` пакета. - Удаление собственного нормализатора шагов 2–8 (`normalizer/ocr/text|dates|amounts|layout|rows|header|document`), `normalizer/rules.py`, `api/rules/*.yaml` и `SCAN_RULES_DIR`; словари — `default_rules()` пакета. - Golden `fixtures/ocr/expected_normalize/*` пересобираются (отдельная ветка и PR в fixtures). ## Порядок выкладки Шаг 5 выкладки «сначала ядро» (docs `proposal.md`): слияние PR шлюза — только по команде человека и только после выкладки на контур arm-core, принимающего `2.0`. Golden в fixtures сливается первым, PR scan-gateway — сразу за ним (окно, в котором golden в `main` красный, держать минимальным). Запрос `recognition-request` остаётся `1.x`. ## Non-goals - Горячие папки, опрос, settle, склейка `raw/{job_id}.json`, очистка, таймауты, эмулятор не меняются. - Копия `api/arm_statements/` не правится (её раскладывает `sync-statements`); тест идентичности контракта не меняется. ## Impact - `api/src/normalizer/**`, `api/src/contract/**`, `api/src/core/worker`, настройки (`SCAN_RULES_DIR` удалён), `api/rules/` (удалён), `api/contracts/` (копия схем 2.0), тесты, `CLAUDE.md`/README. - Issue: RSHB/arm-scan-gateway#46; план — `docs/openspec/changes/unified-statement-normalization/plans/2026-10-18-plan-5-scan-gateway.md`.