From 4d276e0776abd0cc5b763d9dca1d62a5d90c1d8a Mon Sep 17 00:00:00 2001 From: Codex Agent Date: Wed, 16 Sep 2026 00:13:48 +0300 Subject: [PATCH 1/4] feat: polish search review interface --- CHANGELOG.md | 2 + README.md | 6 +- backend/ingestion/minjust_cbd.py | 2 +- backend/normalization/minjust_cbd.py | 2 +- backend/search/minjust_opensearch.py | 2 +- backend/search/review.html | 145 +++++++++++++++++++-------- backend/test_search_reviews.py | 2 + docs/operations/project-status.md | 2 +- 8 files changed, 112 insertions(+), 51 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f14dbef..47b6238 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## Не выпущено +- Backend обновлён до `0.9.2`: внутренняя лаборатория получила визуальный + polish-проход и короткий повторно запускаемый tutorial для новых проверяющих. - Backend обновлён до `0.9.1`: все статусы из нормализованного корпуса доступны как отдельные фильтры, варианты конституционного закона и указа сопоставляются с подтверждённой юридической силой, неизвестные типы документов сохраняются diff --git a/README.md b/README.md index d63ed8b..51117dd 100644 --- a/README.md +++ b/README.md @@ -10,13 +10,13 @@ Telegram-бот — только часть рабочего окружения ## Текущее состояние Сейчас реализованы Telegram-бот-секретарь версии `0.2.2` и backend версии -`0.9.1`: добавлены фильтры по юридической силе и статусу, каталог сохраняет -документы с неучтёнными исходными типами. +`0.9.2`: внутренняя лаборатория получила tutorial для новых проверяющих, а +каталог сохраняет документы с неучтёнными исходными типами. | Компонент | Версия | Состояние | |---|---:|---| | Telegram-бот | `0.2.2` | на Synology работает `0.2.1`; обновление после слияния | -| Backend | `0.9.1` | фильтры поиска по юридической силе и статусу документа; неизвестные типы сохранены в индексе | +| Backend | `0.9.2` | внутренняя лаборатория получила tutorial; фильтры поиска по юридической силе и статусу документа | | Frontend | — | ещё не создан | | Сбор и обработка правовых данных | `0.8.0` | добавлены relevance set и оценка выдачи | | RAG и база знаний | — | ещё не созданы | diff --git a/backend/ingestion/minjust_cbd.py b/backend/ingestion/minjust_cbd.py index 45e0eea..b3b14b5 100644 --- a/backend/ingestion/minjust_cbd.py +++ b/backend/ingestion/minjust_cbd.py @@ -21,7 +21,7 @@ from datetime import datetime, timezone from pathlib import Path from typing import Callable, Iterable -APP_VERSION = "0.9.1" +APP_VERSION = "0.9.2" API_BASE_URL = "https://cbd.minjust.gov.kg/api/v1/OpenData/" LANGUAGES = {"Rus": "ru", "Kyr": "ky"} IMAGE_LANGUAGES = {"Russian": "ru", "Kyrgyz": "ky"} diff --git a/backend/normalization/minjust_cbd.py b/backend/normalization/minjust_cbd.py index cf8df30..ea08ba4 100644 --- a/backend/normalization/minjust_cbd.py +++ b/backend/normalization/minjust_cbd.py @@ -23,7 +23,7 @@ from pathlib import Path from typing import Callable from urllib.parse import urlsplit -APP_VERSION = "0.9.1" +APP_VERSION = "0.9.2" SCHEMA_VERSION = "1" NORMALIZER_VERSION = "1.0.0" LANGUAGES = ("ru", "ky") diff --git a/backend/search/minjust_opensearch.py b/backend/search/minjust_opensearch.py index dd153ee..11a8825 100644 --- a/backend/search/minjust_opensearch.py +++ b/backend/search/minjust_opensearch.py @@ -17,7 +17,7 @@ from typing import Iterator from search.catalog import authority_codes, legal_force_code, source_code -APP_VERSION = "0.9.1" +APP_VERSION = "0.9.2" LANGUAGES = {"ru", "ky"} DEFAULT_MAPPING = Path(__file__).with_name("minjust-fragments-index.json") diff --git a/backend/search/review.html b/backend/search/review.html index 55df233..35c3782 100644 --- a/backend/search/review.html +++ b/backend/search/review.html @@ -5,79 +5,128 @@ Оценка поисковой выдачи · Акылдаш Перейти к результатам -

Оценка поисковой выдачи

Проверяйте результаты нашего OpenSearch по практическим юридическим запросам.

+
+
Внутренняя лаборатория
+

Проверка качества поиска

Помогите проверить, насколько первые результаты отвечают на юридический запрос.

+
-

Результаты

    -

    Документ

    Выберите результат, чтобы открыть текст.
    +

    Результаты поиска

    Оцените каждый документ
    1. Начните с запросаВведите юридический вопрос выше, чтобы увидеть результаты.
    +

    Просмотр документа

    Откройте результат
    Выберите название в списке, чтобы прочитать документ.
    -
    +

    Документ

    +

    Короткое знакомство

    - + diff --git a/backend/test_search_reviews.py b/backend/test_search_reviews.py index 52492e2..ffc577f 100644 --- a/backend/test_search_reviews.py +++ b/backend/test_search_reviews.py @@ -36,6 +36,8 @@ class SearchReviewTest(unittest.TestCase): page = api.review_page() self.assertIn("Оценка поисковой выдачи", page) self.assertIn("akyldash-search-review-draft", page) + self.assertIn("tutorial-dialog", page) + self.assertIn("Как это работает", page) self.assertIn("localStorage", page) diff --git a/docs/operations/project-status.md b/docs/operations/project-status.md index fec38fb..ee9e174 100644 --- a/docs/operations/project-status.md +++ b/docs/operations/project-status.md @@ -5,7 +5,7 @@ - Telegram-бот: `0.2.2` - Telegram-бот на Synology: `0.2.1` -- Backend: `0.9.1` +- Backend: `0.9.2` - Frontend: не создан ## Краткий итог -- 2.49.1 From 503cb1f0747bb12c80464559703e99eeeec3523d Mon Sep 17 00:00:00 2001 From: Codex Agent Date: Wed, 16 Sep 2026 00:20:43 +0300 Subject: [PATCH 2/4] fix: address review findings --- README.md | 2 +- backend/README.md | 4 ++-- backend/search/review.html | 18 +++++++++++------- docs/README.md | 2 +- docs/operations/project-status.md | 2 +- 5 files changed, 16 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 51117dd..6e05456 100644 --- a/README.md +++ b/README.md @@ -59,4 +59,4 @@ python3 -m unittest discover -s tools/telegram-bot -v --- -Акылдаш · Telegram-бот v0.2.2 · Backend v0.9.1 · Frontend — не создан +Акылдаш · Telegram-бот v0.2.2 · Backend v0.9.2 · Frontend — не создан diff --git a/backend/README.md b/backend/README.md index d73dfb0..2970529 100644 --- a/backend/README.md +++ b/backend/README.md @@ -1,6 +1,6 @@ # Backend Акылдаш -Версия: `0.9.1` +Версия: `0.9.2` Первая backend-область проекта — загрузка правовых документов из официального Open Data API ЦБД Минюста Кыргызской Республики. Код расположен в @@ -240,4 +240,4 @@ PYTHONPATH=backend python3 -m search.query "ЖЧК ачуу тартиби" --la --- -Акылдаш · Backend v0.9.1 · Frontend — не создан +Акылдаш · Backend v0.9.2 · Frontend — не создан diff --git a/backend/search/review.html b/backend/search/review.html index 35c3782..882df03 100644 --- a/backend/search/review.html +++ b/backend/search/review.html @@ -54,6 +54,7 @@ .review__rating label { min-width: 0; padding: .45rem .25rem; border: 1px solid #c5d0d8; border-radius: .5rem; color: var(--muted); text-align: center; font-size: .8rem; cursor: pointer; } .review__rating label:has(input:checked) { border-color: var(--brand); background: var(--brand); color: #fff; } .review__rating label:hover { border-color: #7d9aaa; } + .review__rating label:has(input:focus-visible) { outline: 3px solid var(--focus); outline-offset: 2px; } .review__rating input { position: absolute; opacity: 0; inline-size: 1px; block-size: 1px; } .review__comment { min-height: 4rem; resize: vertical; background: var(--surface); } .review__document { position: sticky; inset-block-start: 1rem; min-height: 24rem; } @@ -69,9 +70,9 @@ .review__dialog-close { float: inline-end; } .review__empty { padding: 3rem 1rem; color: var(--muted); text-align: center; } .review__empty strong { display: block; margin-block-end: .35rem; color: var(--ink); } - .review__tour-target { position: relative; z-index: 3; box-shadow: 0 0 0 5px var(--accent), 0 0 0 9px rgb(231 184 75 / .25) !important; } + .review__tour-spotlight { position: fixed; z-index: 1; pointer-events: none; border: 4px solid var(--accent); border-radius: .75rem; box-shadow: 0 0 0 100vmax rgb(10 30 40 / .58), 0 0 0 8px rgb(231 184 75 / .25); } .review__tour { width: min(34rem, calc(100% - 2rem)); padding: 0; color: var(--ink); } - .review__tour::backdrop { background: rgb(10 30 40 / .58); } + .review__tour::backdrop { background: transparent; } .review__tour-content { padding: clamp(1.25rem, 4vw, 2rem); } .review__tour-kicker { margin: 0 0 .5rem; color: var(--brand); font-size: .75rem; font-weight: 800; letter-spacing: .1em; text-transform: uppercase; } .review__tour h2 { margin: 0 0 .65rem; font-size: clamp(1.35rem, 3vw, 1.75rem); line-height: 1.1; letter-spacing: -.02em; } @@ -83,6 +84,7 @@ .review__search { grid-template-columns: 1fr 1fr; } .review__search .review__field:first-child { grid-column: 1 / -1; } .review__workspace { grid-template-columns: 1fr; } + .review__main { padding-block-end: 14rem; } .review__document { display: none; } .review__search button { grid-column: 1 / -1; } .review__actions { padding-inline: 1rem; } @@ -115,7 +117,7 @@

    Документ

    -

    Короткое знакомство

    +

    Короткое знакомство

    Акылдаш · Backend v0.9.2 · Внутренняя лаборатория релевантности
    diff --git a/docs/README.md b/docs/README.md index 8e300f6..6e7d2ad 100644 --- a/docs/README.md +++ b/docs/README.md @@ -39,4 +39,4 @@ --- -Акылдаш · Telegram-бот v0.2.2 · Backend v0.9.1 · Frontend — не создан +Акылдаш · Telegram-бот v0.2.2 · Backend v0.9.2 · Frontend — не создан diff --git a/docs/operations/project-status.md b/docs/operations/project-status.md index ee9e174..7b5bea1 100644 --- a/docs/operations/project-status.md +++ b/docs/operations/project-status.md @@ -262,4 +262,4 @@ --- -Акылдаш · Telegram-бот v0.2.2 · Backend v0.9.1 · Frontend — не создан +Акылдаш · Telegram-бот v0.2.2 · Backend v0.9.2 · Frontend — не создан -- 2.49.1 From 90298fa6cce6ffb4b9b889548f1fec854eb91f46 Mon Sep 17 00:00:00 2001 From: Codex Agent Date: Wed, 16 Sep 2026 00:26:48 +0300 Subject: [PATCH 3/4] fix: keep tutorial spotlight visible on mobile --- backend/search/review.html | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/backend/search/review.html b/backend/search/review.html index 882df03..f86c834 100644 --- a/backend/search/review.html +++ b/backend/search/review.html @@ -86,6 +86,7 @@ .review__workspace { grid-template-columns: 1fr; } .review__main { padding-block-end: 14rem; } .review__document { display: none; } + .review__document--tour-visible { display: block; } .review__search button { grid-column: 1 / -1; } .review__actions { padding-inline: 1rem; } .review__actions-inner { flex-wrap: wrap; } @@ -160,8 +161,8 @@ } $('dialog-close').addEventListener('click', () => { $('document-dialog').close(); if (state.selected) state.selected.focus(); }); let tutorialStep = 0; let tutorialReturnFocus = null; - function clearTourTarget() { $('tutorial-spotlight').hidden = true; } - function renderTutorial() { const step = TOUR_STEPS[tutorialStep]; const target = $(step.target); target.scrollIntoView({block: 'nearest', inline: 'nearest'}); const bounds = target.getBoundingClientRect(); $('tutorial-spotlight').style.cssText = `inset-block-start: ${Math.max(8, bounds.top - 4)}px; inset-inline-start: ${Math.max(8, bounds.left - 4)}px; inline-size: ${bounds.width + 8}px; block-size: ${bounds.height + 8}px;`; $('tutorial-spotlight').hidden = false; $('tutorial-heading').textContent = step.title; $('tutorial-text').textContent = step.text; $('tutorial-progress').textContent = step.label; $('tutorial-next').textContent = tutorialStep === TOUR_STEPS.length - 1 ? 'Понятно' : 'Далее'; } + function clearTourTarget() { $('tutorial-spotlight').hidden = true; $('document-panel').classList.remove('review__document--tour-visible'); } + function renderTutorial() { const step = TOUR_STEPS[tutorialStep]; const target = $(step.target); if (step.target === 'document-panel' && getComputedStyle(target).display === 'none') target.classList.add('review__document--tour-visible'); target.scrollIntoView({block: 'nearest', inline: 'nearest'}); const bounds = target.getBoundingClientRect(); $('tutorial-spotlight').style.cssText = `inset-block-start: ${Math.max(8, bounds.top - 4)}px; inset-inline-start: ${Math.max(8, bounds.left - 4)}px; inline-size: ${bounds.width + 8}px; block-size: ${bounds.height + 8}px;`; $('tutorial-spotlight').hidden = false; $('tutorial-heading').textContent = step.title; $('tutorial-text').textContent = step.text; $('tutorial-progress').textContent = step.label; $('tutorial-next').textContent = tutorialStep === TOUR_STEPS.length - 1 ? 'Понятно' : 'Далее'; } function closeTutorial() { clearTourTarget(); $('tutorial-dialog').close(); markTourSeen(); tutorialReturnFocus?.focus(); } function openTutorial() { tutorialReturnFocus = document.activeElement; tutorialStep = 0; renderTutorial(); $('tutorial-dialog').showModal(); $('tutorial-next').focus(); } $('tutorial-open').addEventListener('click', openTutorial); $('tutorial-next').addEventListener('click', () => { if (tutorialStep === TOUR_STEPS.length - 1) closeTutorial(); else { tutorialStep += 1; renderTutorial(); } }); $('tutorial-skip').addEventListener('click', closeTutorial); $('tutorial-dialog').addEventListener('cancel', (event) => { event.preventDefault(); closeTutorial(); }); -- 2.49.1 From 6a187760dbdd762923372d95884aa8ffa5203b80 Mon Sep 17 00:00:00 2001 From: Codex Agent Date: Wed, 16 Sep 2026 06:54:37 +0300 Subject: [PATCH 4/4] fix: restore local search review flow --- CHANGELOG.md | 3 +++ README.md | 6 +++--- backend/README.md | 4 ++-- backend/ingestion/minjust_cbd.py | 2 +- backend/normalization/minjust_cbd.py | 2 +- backend/search/minjust_opensearch.py | 2 +- backend/search/review.html | 17 ++++++++--------- backend/test_search_reviews.py | 1 + docs/README.md | 2 +- docs/operations/project-status.md | 4 ++-- 10 files changed, 23 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 47b6238..cabdf8a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,9 @@ ## Не выпущено +- Backend обновлён до `0.9.3`: исправлен локальный индекс production Search API, + ошибки поиска показываются в общем status-блоке, а панель сохранения и footer + выстроены в обычном порядке документа. - Backend обновлён до `0.9.2`: внутренняя лаборатория получила визуальный polish-проход и короткий повторно запускаемый tutorial для новых проверяющих. - Backend обновлён до `0.9.1`: все статусы из нормализованного корпуса доступны diff --git a/README.md b/README.md index 6e05456..4d3a518 100644 --- a/README.md +++ b/README.md @@ -10,13 +10,13 @@ Telegram-бот — только часть рабочего окружения ## Текущее состояние Сейчас реализованы Telegram-бот-секретарь версии `0.2.2` и backend версии -`0.9.2`: внутренняя лаборатория получила tutorial для новых проверяющих, а +`0.9.3`: внутренняя лаборатория получила tutorial для новых проверяющих, а каталог сохраняет документы с неучтёнными исходными типами. | Компонент | Версия | Состояние | |---|---:|---| | Telegram-бот | `0.2.2` | на Synology работает `0.2.1`; обновление после слияния | -| Backend | `0.9.2` | внутренняя лаборатория получила tutorial; фильтры поиска по юридической силе и статусу документа | +| Backend | `0.9.3` | внутренняя лаборатория получила tutorial; фильтры поиска по юридической силе и статусу документа | | Frontend | — | ещё не создан | | Сбор и обработка правовых данных | `0.8.0` | добавлены relevance set и оценка выдачи | | RAG и база знаний | — | ещё не созданы | @@ -59,4 +59,4 @@ python3 -m unittest discover -s tools/telegram-bot -v --- -Акылдаш · Telegram-бот v0.2.2 · Backend v0.9.2 · Frontend — не создан +Акылдаш · Telegram-бот v0.2.2 · Backend v0.9.3 · Frontend — не создан diff --git a/backend/README.md b/backend/README.md index 2970529..80a3617 100644 --- a/backend/README.md +++ b/backend/README.md @@ -1,6 +1,6 @@ # Backend Акылдаш -Версия: `0.9.2` +Версия: `0.9.3` Первая backend-область проекта — загрузка правовых документов из официального Open Data API ЦБД Минюста Кыргызской Республики. Код расположен в @@ -240,4 +240,4 @@ PYTHONPATH=backend python3 -m search.query "ЖЧК ачуу тартиби" --la --- -Акылдаш · Backend v0.9.2 · Frontend — не создан +Акылдаш · Backend v0.9.3 · Frontend — не создан diff --git a/backend/ingestion/minjust_cbd.py b/backend/ingestion/minjust_cbd.py index b3b14b5..bfbe5bd 100644 --- a/backend/ingestion/minjust_cbd.py +++ b/backend/ingestion/minjust_cbd.py @@ -21,7 +21,7 @@ from datetime import datetime, timezone from pathlib import Path from typing import Callable, Iterable -APP_VERSION = "0.9.2" +APP_VERSION = "0.9.3" API_BASE_URL = "https://cbd.minjust.gov.kg/api/v1/OpenData/" LANGUAGES = {"Rus": "ru", "Kyr": "ky"} IMAGE_LANGUAGES = {"Russian": "ru", "Kyrgyz": "ky"} diff --git a/backend/normalization/minjust_cbd.py b/backend/normalization/minjust_cbd.py index ea08ba4..13dec26 100644 --- a/backend/normalization/minjust_cbd.py +++ b/backend/normalization/minjust_cbd.py @@ -23,7 +23,7 @@ from pathlib import Path from typing import Callable from urllib.parse import urlsplit -APP_VERSION = "0.9.2" +APP_VERSION = "0.9.3" SCHEMA_VERSION = "1" NORMALIZER_VERSION = "1.0.0" LANGUAGES = ("ru", "ky") diff --git a/backend/search/minjust_opensearch.py b/backend/search/minjust_opensearch.py index 11a8825..3de5f16 100644 --- a/backend/search/minjust_opensearch.py +++ b/backend/search/minjust_opensearch.py @@ -17,7 +17,7 @@ from typing import Iterator from search.catalog import authority_codes, legal_force_code, source_code -APP_VERSION = "0.9.2" +APP_VERSION = "0.9.3" LANGUAGES = {"ru", "ky"} DEFAULT_MAPPING = Path(__file__).with_name("minjust-fragments-index.json") diff --git a/backend/search/review.html b/backend/search/review.html index f86c834..c6a81f8 100644 --- a/backend/search/review.html +++ b/backend/search/review.html @@ -17,7 +17,7 @@ .review__header-top { display: flex; justify-content: space-between; gap: 1rem; align-items: start; } .review__eyebrow { display: inline-flex; align-items: center; gap: .5rem; color: var(--brand); font-size: .75rem; font-weight: 800; letter-spacing: .12em; text-transform: uppercase; } .review__eyebrow::before { content: ''; width: .55rem; height: .55rem; border-radius: 50%; background: var(--accent); box-shadow: 0 0 0 4px rgb(231 184 75 / .2); } - .review__main { padding-block-end: 6rem; } + .review__main { padding-block-end: 2rem; } .review__search { display: grid; grid-template-columns: minmax(18rem, 1fr) 9rem 9rem auto; align-items: end; gap: .75rem; padding: 1.25rem; background: var(--surface); border: 1px solid var(--line); border-radius: 1rem; box-shadow: 0 1.25rem 3rem rgb(24 42 54 / .08); } .review__field { display: grid; gap: .35rem; min-width: 0; } .review__field span, .review__actions label { color: var(--muted); font-size: .8rem; font-weight: 700; } @@ -61,9 +61,9 @@ .review__document-meta { margin-block-end: 1rem; padding-block-end: 1rem; border-block-end: 1px solid var(--line); color: var(--muted); } .review__document-body { max-width: 75ch; overflow-wrap: anywhere; } .review__document-body img { max-width: 100%; height: auto; } - .review__actions { position: fixed; inset-block-end: 0; inset-inline: 0; display: flex; justify-content: center; gap: .75rem; padding: .75rem max(1rem, env(safe-area-inset-inline-start)) max(.75rem, env(safe-area-inset-bottom)); background: rgb(255 255 255 / .94); border-block-start: 1px solid var(--line); box-shadow: 0 -.75rem 2rem rgb(24 42 54 / .06); backdrop-filter: blur(12px); } - .review__actions-inner { display: flex; align-items: end; gap: .75rem; width: min(1320px, 100%); } - .review__actions label { flex: 1; } + .review__actions { max-width: 1320px; margin: 1.5rem auto 0; padding-inline: clamp(1rem, 3vw, 3rem); } + .review__actions-inner { display: flex; align-items: end; gap: .75rem; padding: 1rem; background: var(--surface); border: 1px solid var(--line); border-radius: 1rem; box-shadow: 0 .75rem 2rem rgb(24 42 54 / .05); } + .review__actions label { display: grid; gap: .35rem; flex: 1; color: var(--muted); font-size: .8rem; font-weight: 700; } .review__actions label:last-of-type { flex: 2; } dialog { max-width: min(56rem, calc(100% - 2rem)); max-height: calc(100% - 2rem); border: 1px solid var(--line); border-radius: 1rem; padding: 1.5rem; box-shadow: 0 2rem 5rem rgb(10 20 30 / .2); } dialog::backdrop { background: rgb(10 20 30 / .5); } @@ -84,7 +84,7 @@ .review__search { grid-template-columns: 1fr 1fr; } .review__search .review__field:first-child { grid-column: 1 / -1; } .review__workspace { grid-template-columns: 1fr; } - .review__main { padding-block-end: 14rem; } + .review__main { padding-block-end: 2rem; } .review__document { display: none; } .review__document--tour-visible { display: block; } .review__search button { grid-column: 1 / -1; } @@ -119,8 +119,7 @@

    Документ

    Короткое знакомство

    - -
    Акылдаш · Backend v0.9.2 · Внутренняя лаборатория релевантности
    +
    Акылдаш · Backend v0.9.3 · Внутренняя лаборатория релевантности