Автозамена: предупреждение о выпавших документах (#58) #60

Merged
aep merged 1 commits from feat/58-replace-warning into main 2026-10-07 23:36:24 +03:00
Owner

Closes #58

Что сделано

  • supersede_previous (api/src/services/result_mapping.py) принимает необязательный warnings; для каждого заменённого файла находит документы, ключа которых (document_type, osv_account_code, period_year, period_quarter, тот же _document_key, что у автозамены) нет среди документов нового файла (документ без года/квартала тоже считается выпавшим), и добавляет одно предупреждение: имя и версия заменённого файла, выпавшие документы «тип счёт период (СТАТУС)» (в т. ч. CONFIRMED), версии консолидации «в работе», с которых сняты привязки именно этих документов, в виде «ГК» год квартал, версия N.
  • map_file через _supersede_and_warn дописывает предупреждение в metrics.mapping_warnings задания нового файла; оттуда оно уходит в карточку файла и JobBrief.mapping_warnings без изменений в схемах. Возвращаемое map_file значение теперь включает и его.
  • Поведение замены не менялось: SUPERSEDED, version_no, снятие привязок, FILE_REPLACE (unbound_version_ids прежний: объединение версий выпавших и остальных документов файла), статусы документов нового файла.
  • Тесты (api/tests/test_result_mapping.py): книга «ББ + ОФР», ББ CONFIRMED и привязан к версии, затем отдельный файл только с ОФР того же периода (через process_once); автозамена без выпавших документов не даёт предупреждения; supersede_previous(warnings=…) с несколькими выпавшими документами и версией «не в работе». До правки новые тесты падали.
  • Спека openspec/specs/primary-files/spec.md (требование и сценарий) и README (раздел «Удаление и замена»). Гайд фронта (docs/dev/frontend-api-guide.md) не трогал по заданию: его обновит основная сессия после merge.

Проверки

  • make check: ruff + mypy чисто, 1217 passed, 44 skipped.
  • make check-full (с DBML=/COMPOSE_FILE= абсолютными путями и ARM_KA_FIXTURES, см. O-1): exit 0; unit 1223 passed, 38 skipped; test-integration 820 passed, 1 skipped; dbml-check, check-infra, e2e (skip без профиля services), docker-build, web-check без ошибок.

Rulings I made

  • R-1: одно предупреждение на каждый заменённый файл (а не на каждый выпавший документ), все выпавшие перечислены в нём. Если ошибка: фронту придётся разбирать длинную строку, а не список.
  • R-2: предупреждение не участвует в document_status доку��ентов нового файла (OQ-05 «нет предупреждений маппинга»): оно про прежние файлы, статусы к этому моменту посчитаны. Если ошибка: ОФР нового файла ошибочно уходил бы в NEEDS_CHECK.
  • R-3: версии в предупреждении — только те, с которых сняты привязки именно выпавших документов (снятие выпавших вынесено отдельным первым вызовом on_documents_superseded, затем остальные документы файла; unbound_version_ids в аудите — объединение, как раньше). Версии не «в работе» привязок не теряют и в предупреждении не фигурируют. Если ошибка: в предупреждении были бы версии, не связанные с выпавшими документами.
  • R-4: документ без года/квартала считается выпавшим (он снимается вместе с файлом, ключа для сопоставления у него нет); формат строки — по стилю существующих mapping_warnings (по-русски, без заглавной буквы).
  • R-5: документы заменяемых файлов для расчёта выпавших перечитываются с populate_existing, чтобы статус CONFIRMED был свежим после блокировки файла.

Находки

Маркер Что Статус
O-1 make check-full в worktree .wt/<id>/arm-core не находит ../../docs и compose (Makefile рассчитан на .wt/<срез>/ с соседним docs); ARM_KA_FIXTURES не выставлен deferred (запуск с переопределением переменных)
O-2 Первая версия правки не сохраняла предупреждение: extend по списку, на который уже ссылалось значение metrics, не менял JSONB (SQLAlchemy сравнил равные значения). Поймал тест fixed (commit этого PR: присваивается новый список)
O-3 docs/dev/frontend-api-guide.md должен показать предупреждение (пункт задачи #58) deferred (гайд обновляет основная сессия после merge)

🤖 Generated with Claude Code

https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2

Closes #58 ## Что сделано - `supersede_previous` (`api/src/services/result_mapping.py`) принимает необязательный `warnings`; для каждого заменённого файла находит документы, ключа которых (`document_type`, `osv_account_code`, `period_year`, `period_quarter`, тот же `_document_key`, что у автозамены) нет среди документов нового файла (документ без года/квартала тоже считается выпавшим), и добавляет одно предупреждение: имя и версия заменённого файла, выпавшие документы «тип счёт период (СТАТУС)» (в т. ч. `CONFIRMED`), версии консолидации «в работе», с которых сняты привязки именно этих документов, в виде «ГК» год квартал, версия N. - `map_file` через `_supersede_and_warn` дописывает предупреждение в `metrics.mapping_warnings` задания нового файла; оттуда оно уходит в карточку файла и `JobBrief.mapping_warnings` без изменений в схемах. Возвращаемое `map_file` значение теперь включает и его. - Поведение замены не менялось: `SUPERSEDED`, `version_no`, снятие привязок, `FILE_REPLACE` (`unbound_version_ids` прежний: объединение версий выпавших и остальных документов файла), статусы документов нового файла. - Тесты (`api/tests/test_result_mapping.py`): книга «ББ + ОФР», ББ `CONFIRMED` и привязан к версии, затем отдельный файл только с ОФР того же периода (через `process_once`); автозамена без выпавших документов не даёт предупреждения; `supersede_previous(warnings=…)` с несколькими выпавшими документами и версией «не в работе». До правки новые тесты падали. - Спека `openspec/specs/primary-files/spec.md` (требование и сценарий) и README (раздел «Удаление и замена»). Гайд фронта (`docs/dev/frontend-api-guide.md`) не трогал по заданию: его обновит основная сессия после merge. ## Проверки - `make check`: ruff + mypy чисто, 1217 passed, 44 skipped. - `make check-full` (с `DBML=`/`COMPOSE_FILE=` абсолютными путями и `ARM_KA_FIXTURES`, см. O-1): exit 0; unit 1223 passed, 38 skipped; `test-integration` 820 passed, 1 skipped; dbml-check, check-infra, e2e (skip без профиля `services`), docker-build, web-check без ошибок. ## Rulings I made - R-1: одно предупреждение на каждый заменённый файл (а не на каждый выпавший документ), все выпавшие перечислены в нём. Если ошибка: фронту придётся разбирать длинную строку, а не список. - R-2: предупреждение не участвует в `document_status` доку��ентов нового файла (OQ-05 «нет предупреждений маппинга»): оно про прежние файлы, статусы к этому моменту посчитаны. Если ошибка: ОФР нового файла ошибочно уходил бы в `NEEDS_CHECK`. - R-3: версии в предупреждении — только те, с которых сняты привязки именно выпавших документов (снятие выпавших вынесено отдельным первым вызовом `on_documents_superseded`, затем остальные документы файла; `unbound_version_ids` в аудите — объединение, как раньше). Версии не «в работе» привязок не теряют и в предупреждении не фигурируют. Если ошибка: в предупреждении были бы версии, не связанные с выпавшими документами. - R-4: документ без года/квартала считается выпавшим (он снимается вместе с файлом, ключа для сопоставления у него нет); формат строки — по стилю существующих `mapping_warnings` (по-русски, без заглавной буквы). - R-5: документы заменяемых файлов для расчёта выпавших перечитываются с `populate_existing`, чтобы статус `CONFIRMED` был свежим после блокировки файла. ## Находки | Маркер | Что | Статус | |---|---|---| | O-1 | `make check-full` в worktree `.wt/<id>/arm-core` не находит `../../docs` и compose (Makefile рассчитан на `.wt/<срез>/` с соседним `docs`); `ARM_KA_FIXTURES` не выставлен | deferred (запуск с переопределением переменных) | | O-2 | Первая версия правки не сохраняла предупреждение: `extend` по списку, на который уже ссылалось значение `metrics`, не менял JSONB (SQLAlchemy сравнил равные значения). Поймал тест | fixed (commit этого PR: присваивается новый список) | | O-3 | `docs/dev/frontend-api-guide.md` должен показать предупреждение (пункт задачи #58) | deferred (гайд обновляет основная сессия после merge) | 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
aep added 1 commit 2026-10-07 23:33:21 +03:00
Замена остаётся на уровне файла (§9.5 п. 3, OQ-115), но если у заменённого файла есть
документы, ключа которых (document_type, osv_account_code, год, квартал) нет среди
документов нового файла, в metrics.mapping_warnings задания нового файла добавляется
предупреждение (OQ-154): имя и версия заменённого файла, выпавшие документы (тип, счёт,
период, статус, в т. ч. CONFIRMED) и версии консолидации, с которых сняты привязки
выпавших документов. Поведение замены, FILE_REPLACE и статусы документов не меняются.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
aep merged commit d8bf5b22dc into main 2026-10-07 23:36:24 +03:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: RSHB/arm-core#60
No description provided.