feat(#190): метрики качества первички (AURORA-1759) #229
Loading…
x
Reference in New Issue
Block a user
No description provided.
Delete Branch "feat/190-ocr-metrics"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #190 (AURORA-1759). Сливать после docs PR #203 (RSHB/arm-ka-docs): ORM и тесты опираются на DBML v5.25 и схему
contracts/metrics/quality-facts.schema.jsonиз той ветки.Что сделано
Метрики качества первички: факты приёма и исходов (
quality_intake_fact,quality_outcome_fact) пишутся в транзакции событий (приём, подтверждение, автоподтверждение, удаление, замена, отказ распознавания); атрибуция правок «сервис / наш разбор» по §14.2; матрица «источник × причина», ряд по месяцам, список документов ячейки, выгрузка CSV/JSON с аудитом EXPORT; правоQUALITY_METRICS_VIEW; экран «Качество первички» (web); схемаdkb_metricsдля Superset; регистрация сырого ответа ИС (raw_s3_object_id), признак сканаis_scan; OpenSpec changequality-metricsс дельтами.Отдельно: меню Sidebar снова фильтрует пункты по правам — «Пользователи и роли» скрыт без
USERS_ADMIN.Выкладка
Схема
dkb_metricsи право CREATE у роли миграций; read-only роль Superset;make seed(новое право); подробности — README, раздел «Метрики качества первички».Что НЕ проверено
Экран «Качество первички» вручную на стенде не проверен — обязательная проверка владельцем до merge. e2e с реальным tabular-parser не запускался (профиль services не поднят, тест пропущен с причиной).
Проверки
make check-fullна состоянии после влива origin/main: exit 0 — ruff/mypy, 2082 unit passed, statements-check 0 (копия синхронна с arm-statements 25b2bb8), dbml-check ok, 1269 integration passed, e2e 1 skipped (профиль services не поднят), docker-build и web-check ok.web: vitest 589 passed, lint 0 ошибок, prettier ok.openspec validate quality-metrics --strict— valid в arm-core и docs.Rulings I made (design.md, раздел
## Decisions made without discussion)R-1 имена экспорта arm_statements сверяются с реальным dir(); R-2 регистрация raw не зависит от status; R-3 build_*_payload расширены header_source / osv_row_count; R-4 атрибуция читает живые колонки, а не payload приёма; R-5a «Дата колонки» не учитывается; R-5b raw_line_codes не пишутся; R-6 добавленная строка PDF без кодов — «наш разбор»; R-7 payload↔контракт вынесен в финальное ревью; R-8 ряд по месяцам по дате приёма; R-9 SQL-оптимизация (T15.2–T15.4) без БД не делалась; R-10 нет фильтра по ЮЛ в UI; R-11 матрица источник × причина тремя запросами; R-12 аудит EXPORT; R-13
is_scan/raw_s3_object_id— последние колонки (ORM+DBML); R-14 uploads с фактом приёма не экспирится при удалении; R-15has_text_layerв thread, лимит 10 страниц; R-16 схема перенесена вcontracts/metrics/; R-17values[]по контракту; R-18fixes[]по контракту; R-19 (устарел после R-24); R-20 тест валидации payload; R-21 дата шапки через parse_date; R-22 условие §14.4 про соотношения не проверяется; R-23 состав дельт OpenSpec (MODIFIED копируют требования целиком — возможен конфликт при archive); R-24is_recognizedв схеме nullable. Цена ошибки по каждому — в design.md.Находки (маркер — статус)
Финальное ревью (opus): C-1 fixed 85c5ab8; I-1 fixed e14f1ab; I-2 fixed
8c7ce7c(+docs 55f06e9); I-3 fixed7a6c364(+docs 760c3dc); I-4 fixed 7a6c364; I-5 fixed 8c7ce7c; I-6 (=T16.13) fixed 85c5ab8; I-7 fixed 3f6bd96; I-8 fixed 8f90d0c; M-1 fixed 85c5ab8; M-2 fixed 85c5ab8; M-3 fixed 7a6c364; M-4, M-5, M-7 fixed 3f6bd96; M-6 fixed (ledger); M-8 deferred.Повторное ревью: I-9 fixed
24fbec8(+docs aefbf78); I-10 fixed (merge5a5e5a2/ docs 75f5b52); M-10 fixed 4593cdc; M-12 fixed 627c3e2 (docs); M-13 fixed 24fbec8; M-14 fixed 4593cdc; M-16 fixed 4593cdc/2f48171; M-17 fixed d1f4f45; M-9 (тест лимита страниц), M-11 (полеlevelв issues[]), M-15 (purge_statements не пишет факты DELETED) — deferred.Задачи 1–16: fixed — T9.1, T10.3, T14.1–T14.4, T15.1, T16.1(ГК)–T16.7, T16.9–T16.11, T16.13; rejected — T1.2, T3.3, T5.1, T5.2, T10.1, T11.2–T11.4, T13.1, T14.5, T15.5–T15.7.
Deferred (для follow-up в Jira при закрытии)
M-8 = R-5a (правка «Дата колонки» не учитывается — нужна схема) и R-5b (
raw_line_codesне извлекаются); M-9; M-11; M-15; T1.1; T2.1; T2.2; T3.1; T3.2; T3.4; T4.1; T4.2; T5.3; T5.4; T8.1; T9.2; T10.2; T11.1; T12.1; T15.2; T15.3; T15.4; T16.1 (фильтр по ЮЛ, R-10); T16.8; T16.12.🤖 Generated with Claude Code
OQ-111 уже занят (ретеншн S3 общего назначения) — реальный свободный номер для срока хранения raw/{job_id}.json нашёлся при работе над arm-ka-docs#202. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>Ревью нашло: хук писал quality_outcome_fact для ЛЮБОГО автоподтверждённого документа, в том числе DISCLOSURE/OTHER — у них нет факта приёма (INTAKE_FACT_DOCUMENT_TYPES, Task 5), и факт исхода без пары превратился бы в сироту при соединении по document_id. Добавлен гейт OUTCOME_FACT_DOCUMENT_TYPES = {BALANCE, INCOME, OSV} (не импортируется из result_mapping.py — там уже отложенный импорт auto_confirm во избежание цикла); auto_confirm для DISCLOSURE/OTHER не меняется — только пропускает запись факта. Поправлен вводивший в заблуждение комментарий в _outcome_fact_fields. Тест на DISCLOSURE: автоподтверждение проходит, quality_outcome_fact не появляется. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>