docs(#116): *_original_value шапки как прежде, архитектура — механика копии arm_statements

- DBML и §9.5 п. 2: inn_original_value = inn, report_date_original_value = report_date_text, units_original_value =
  units_text; сырой текст и уверенность всех полей — header_source (K-3)
- 03-architecture: путь копии, VERSION, коды sync-statements --check, перечень кодов в contracts/ (K-9, K-5)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BJKMLHdxMwSUeYcdkwqX4W
This commit is contained in:
Andrey Epifancev 2026-10-18 02:17:36 +04:00
parent 2b094ffe0b
commit 2a37a70189
3 changed files with 8 additions and 5 deletions

View File

@ -169,8 +169,10 @@ advisory-lock по `(ЮЛ, sha256)` (двойной клик не проскак
Шаги 2–8 нормализации форм (раскладка, статусы строк, значения, код и наименование, сборка документа, проверки §7,
`needs_review`, статус и предупреждения) и их словари живут в отдельном репозитории `arm-statements` пакетом
`arm_statements/` (Р-1: платформа не собирает Python-пакеты). В tabular-parser, scan-gateway и arm-core пакет лежит
**копией** с тестами, импортируется по имени `arm_statements`; копию раскладывает и проверяет `sync-statements` в docs
(`--check`, код 20 при прямой правке; вызывается из `make check-full`, не из `make check`). Сервисы держат только адаптер
**копией** (`api/arm_statements/`, маркер версии — `api/arm_statements/VERSION`) с тестами, импортируется по имени
`arm_statements`; копию раскладывает и проверяет `sync-statements` в docs (`--check`: 0 — синхронно, 10 — отстала, 20 —
прямая правка, 2 — нет checkout; вызывается из `make check-full`, не из `make check`; механика — `dev/checks.md`).
Упорядоченные перечни кодов форм — данные `contracts/statement-code-orders.yaml`, в пакете — их байтовая копия. Сервисы держат только адаптер
шага 1 (json ИС / лист Excel → `FormCandidate`); ядро считает тем же кодом после правок аналитика и не держит своих
копий словаря §7. Словарь «код → наименование» — только в ядре. Правила — `05-domain-rules.md` §11; маркер версии
копии — `service.statements_version` результата → `recognition_job.statements_version`. Порядок выкладки — «сначала

View File

@ -766,8 +766,9 @@ replay: dlq → queued (`attempt + 1`). `max_attempts`: OCR 1, парсер 3; `
(родитель `detail`), `needs_review`; повтор кода — законный случай, хранятся все
строки (Р-4; строки без кода хранятся — Р-8, отменяет OQ-36 / OQ-141). Значения — с `source_text` (`values[].text`) и
`needs_review`; колонки — с `period_kind` и `label_confidence`; шапка — с `form_variant`, `needs_review_fields` и
`header_source` (`<поле>_text` и `<поле>_confidence` всех полей; `*_original_value` = разобранное значение,
`inn_confidence` = `inn_confidence` результата, `organization_name_original_value` = `organization_name`); `checks`
`header_source` (`<поле>_text` и `<поле>_confidence` всех полей; `*_original_value` — как прежде: `inn`,
`report_date_text`, `units_text`; `inn_confidence` результата, `organization_name_original_value` =
`organization_name`); `checks`
и предупреждения документа — в `document_issue` (источник `service`; нарушение — `kind = relation`, `code =
RELATION_FAILED`, `error` или `kind = soft`, `code = RELATION_SOFT`, `info`, с `codes`, `relation`, `expected`,
`actual`, `column_id`; предупреждение о столбце вне колонок формы — с `column_index`) вместе с проверками ядра уровня

View File

@ -980,7 +980,7 @@ Table financial_statement_meta {
checks_accepted_comment text
form_variant statement_form_variant [note: 'v5.19: full | simplified — по структуре кодов (§11.7); выбирает набор соотношений §7; NULL — документ до v5.19 или результат 1.x: набор полный']
needs_review_fields jsonb [note: 'v5.19: имена полей шапки, требующих проверки (["report_date"]), как пришло от сервиса; правка поля или подтверждение тем же значением убирает его из списка']
header_source jsonb [note: 'v5.19: шапка результата как пришла — {"<поле>": {"text": <поле>_text, "confidence": <поле>_confidence}} для organization_name, inn, report_date, units, okud, okpo, okopf, okfs, okei, address; не меняется. *_original_value — разобранное значение из результата (inn_original_value = inn и т. д.), inn_confidence = header_source.inn.confidence']
header_source jsonb [note: 'v5.19: шапка результата как пришла — {"<поле>": {"text": <поле>_text, "confidence": <поле>_confidence}} для organization_name, inn, report_date, units, okud, okpo, okopf, okfs, okei, address; не меняется. *_original_value — как прежде: inn_original_value = inn, report_date_original_value = report_date_text, units_original_value = units_text; inn_confidence = header_source.inn.confidence']
organization_name_original_value varchar [note: 'v5.19: наименование организации из результата; правками не меняется']
organization_name_modified boolean [note: 'v5.19: наименование правилось аналитиком (PATCH шапки)']
Note: 'Шапка распознанной формы ББ/ОФР. v5.19: результат проверок §7 и предупреждения хранятся в document_issue как пришли от сервиса и пересчитываются ядром только после правок (пересматривает «не хранятся — считаются на лету»)'