feat(search): add legal force filter and topic taxonomy draft #31

Merged
admin merged 4 commits from feature/search-catalog-v1 into main 2026-09-14 07:56:15 +00:00
Owner

Реализован фильтр Search API v1 по юридической силе с группировкой типов НПА и подготовлен отдельный черновик полной тематической иерархии GeneralClassifiers. Тематический фильтр в API v1 не добавлялся по решению продукта.

Черновик содержит 2 065 исходных узлов; 328 корневых рубрик отложены для ручной проверки (77 неоднозначны, для 251 правило не найдено), у 1 524 узлов отсутствует KY-подпись в источнике. До ручного утверждения темы не являются публичными кодами API. Пересборка завершается ошибкой при отсутствующих, повреждённых или структурно неполных данных источника.

Проверки: PYTHONPATH=backend python3 -m unittest discover -s backend -v — 26 пройдены, один OpenSearch integration test пропущен (итого 27), так как AKYLDASH_OPENSEARCH_URL не задан; структура JSON-каталога проверена.

Реализован фильтр Search API v1 по юридической силе с группировкой типов НПА и подготовлен отдельный черновик полной тематической иерархии `GeneralClassifiers`. Тематический фильтр в API v1 не добавлялся по решению продукта. Черновик содержит 2 065 исходных узлов; 328 корневых рубрик отложены для ручной проверки (77 неоднозначны, для 251 правило не найдено), у 1 524 узлов отсутствует KY-подпись в источнике. До ручного утверждения темы не являются публичными кодами API. Пересборка завершается ошибкой при отсутствующих, повреждённых или структурно неполных данных источника. Проверки: `PYTHONPATH=backend python3 -m unittest discover -s backend -v` — 26 пройдены, один OpenSearch integration test пропущен (итого 27), так как `AKYLDASH_OPENSEARCH_URL` не задан; структура JSON-каталога проверена.
agent added 1 commit 2026-09-14 07:26:42 +00:00
Author
Owner

Независимый review: есть блокирующие замечания.

  1. tools/build_search_topic_taxonomy.py:57–60 и docs/product/search-catalog-v1.md:108–110: group_for выбирает первый regex match, не проверяя остальные. В JSON 77 корневых рубрик совпадают с несколькими правилами; например «Иностранные инвестиции» совпадает с international и economy, но автоматически попадает в первую группу. Поэтому утверждение, что неоднозначные рубрики направляются в review_required, неверно. Нужно явно отправлять multi-match на ручную проверку либо обосновать и проверить приоритеты, затем обновить экспорт и счётчики.

  2. tools/build_search_topic_taxonomy.py:120–126: отсутствующий, нечитаемый или невалидный document.json превращается в пустой список, а processed всё равно увеличивается. Пересборка может молча выпустить неполную таксономию с завышенным числом обработанных документов. Ошибка должна останавливать экспорт либо явно фиксироваться и отражаться в счётчиках.

Проверки прошли: backend suite — 23 теста, 1 OpenSearch integration test пропущен без AKYLDASH_OPENSEARCH_URL; повторный экспорт совпал с закоммиченным JSON по содержимому. Остальные проверенные изменения API/legal-force и версионирование/changelog блокирующих замечаний не вызвали.

Независимый review: есть блокирующие замечания. 1. `tools/build_search_topic_taxonomy.py:57–60` и `docs/product/search-catalog-v1.md:108–110`: `group_for` выбирает первый regex match, не проверяя остальные. В JSON 77 корневых рубрик совпадают с несколькими правилами; например «Иностранные инвестиции» совпадает с `international` и `economy`, но автоматически попадает в первую группу. Поэтому утверждение, что неоднозначные рубрики направляются в `review_required`, неверно. Нужно явно отправлять multi-match на ручную проверку либо обосновать и проверить приоритеты, затем обновить экспорт и счётчики. 2. `tools/build_search_topic_taxonomy.py:120–126`: отсутствующий, нечитаемый или невалидный `document.json` превращается в пустой список, а `processed` всё равно увеличивается. Пересборка может молча выпустить неполную таксономию с завышенным числом обработанных документов. Ошибка должна останавливать экспорт либо явно фиксироваться и отражаться в счётчиках. Проверки прошли: backend suite — 23 теста, 1 OpenSearch integration test пропущен без `AKYLDASH_OPENSEARCH_URL`; повторный экспорт совпал с закоммиченным JSON по содержимому. Остальные проверенные изменения API/legal-force и версионирование/changelog блокирующих замечаний не вызвали.
agent added 1 commit 2026-09-14 07:31:53 +00:00
Author
Owner

Повторный независимый review: оба предыдущих замечания исправлены — неоднозначные regex-совпадения теперь попадают в review_required, а отсутствующий/битый JSON successful-записи останавливает сборку.

Остался блокирующий случай полноты: tools/build_search_topic_taxonomy.py:128 принимает объект без general_classifiers (например {}) как пустую иерархию; неверный тип поля также молча игнорируется в add_nodes. Я проверил: такая successful-запись даёт успешный результат documents=1, nodes=0. Нормализатор всегда записывает general_classifiers как список, поэтому при отсутствии поля или неверном типе сборка должна завершаться ошибкой; добавьте проверку и тест.

Проверки: backend suite — 25 тестов пройдены, один OpenSearch integration test пропущен без AKYLDASH_OPENSEARCH_URL; полный экспорт повторён и семантически совпадает с JSON в PR (209958 документов, 2065 узлов, 687 корней, 328 на ручной проверке). API/legal-force, версия и changelog при повторной проверке без новых блокирующих замечаний.

Повторный независимый review: оба предыдущих замечания исправлены — неоднозначные regex-совпадения теперь попадают в `review_required`, а отсутствующий/битый JSON successful-записи останавливает сборку. Остался блокирующий случай полноты: `tools/build_search_topic_taxonomy.py:128` принимает объект без `general_classifiers` (например `{}`) как пустую иерархию; неверный тип поля также молча игнорируется в `add_nodes`. Я проверил: такая successful-запись даёт успешный результат `documents=1, nodes=0`. Нормализатор всегда записывает `general_classifiers` как список, поэтому при отсутствии поля или неверном типе сборка должна завершаться ошибкой; добавьте проверку и тест. Проверки: backend suite — 25 тестов пройдены, один OpenSearch integration test пропущен без `AKYLDASH_OPENSEARCH_URL`; полный экспорт повторён и семантически совпадает с JSON в PR (209958 документов, 2065 узлов, 687 корней, 328 на ручной проверке). API/legal-force, версия и changelog при повторной проверке без новых блокирующих замечаний.
agent added 1 commit 2026-09-14 07:36:15 +00:00
Author
Owner

Повторный независимый review текущего PR f8f98df: прежние замечания устранены. Все три проверки подтверждены: неоднозначные правила ведут в review_required; missing/corrupt/non-object normalized JSON и отсутствующий/не-list general_classifiers завершают build ошибкой; неверный тип вложенного GeneralClassifiers и не-object узлы также отклоняются. None для дочерней ветви остаётся допустимым листом, что соответствует нормализатору.

Полный backend suite: 27 тестов пройдены, один OpenSearch integration test пропущен без AKYLDASH_OPENSEARCH_URL; git diff --check чистый. Повторно просмотрел остальной diff: API/legal-force, индексация, версия и changelog без блокирующих замечаний. Review завершён без блокирующих замечаний.

Повторный независимый review текущего PR `f8f98df`: прежние замечания устранены. Все три проверки подтверждены: неоднозначные правила ведут в `review_required`; missing/corrupt/non-object normalized JSON и отсутствующий/не-list `general_classifiers` завершают build ошибкой; неверный тип вложенного `GeneralClassifiers` и не-object узлы также отклоняются. `None` для дочерней ветви остаётся допустимым листом, что соответствует нормализатору. Полный backend suite: 27 тестов пройдены, один OpenSearch integration test пропущен без `AKYLDASH_OPENSEARCH_URL`; `git diff --check` чистый. Повторно просмотрел остальной diff: API/legal-force, индексация, версия и changelog без блокирующих замечаний. Review завершён без блокирующих замечаний.
agent added 1 commit 2026-09-14 07:38:05 +00:00
Author
Owner

Финальный независимый review текущего PR 000cf46: без блокирующих замечаний. Все три прежних findings по классификации и полноте экспорта остаются решёнными: неоднозначные совпадения идут в review_required; missing/corrupt/non-object JSON, отсутствующий или неверного типа general_classifiers, а также повреждённые вложенные ветви/узлы останавливают сборку. Точечные проверки этих сценариев прошли.

Changelog уточнён под итоговый scope: описывает фильтр юридической силы и экспорт полной иерархии как черновика, отдельно фиксируя, что тематическая навигация отложена до ручного утверждения. Backend suite: 27 passed, 1 OpenSearch integration test skipped без AKYLDASH_OPENSEARCH_URL; git diff --check чистый. Review завершён без блокирующих замечаний.

Финальный независимый review текущего PR `000cf46`: без блокирующих замечаний. Все три прежних findings по классификации и полноте экспорта остаются решёнными: неоднозначные совпадения идут в `review_required`; missing/corrupt/non-object JSON, отсутствующий или неверного типа `general_classifiers`, а также повреждённые вложенные ветви/узлы останавливают сборку. Точечные проверки этих сценариев прошли. Changelog уточнён под итоговый scope: описывает фильтр юридической силы и экспорт полной иерархии как черновика, отдельно фиксируя, что тематическая навигация отложена до ручного утверждения. Backend suite: 27 passed, 1 OpenSearch integration test skipped без `AKYLDASH_OPENSEARCH_URL`; `git diff --check` чистый. Review завершён без блокирующих замечаний.
admin merged commit bb5edf3ae2 into main 2026-09-14 07:56:15 +00: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: agent/akyldash#31