1. Phase 53 — Eval Admin API (proxy admin-backend → agent)

— AdminEvalController с 16 endpoints 1:1 проксирует /api/admin/eval/* на agent: cases CRUD (list/create/get/update/publish/archive/history/bulk-import), runs (list/create/get/cancel/results/diff), stats, fsnb/validate, fsnb/search-autocomplete

— SSE pass-through для /runs/{id}/stream через SseEmitter (30-мин таймаут, virtual-thread executor)

— AgentEvalClient: admin JWT на admin-side, X-Service-Token + X-Admin-User-Id на agent-side, fallback на AGENT_INTERNAL_BASE_URL, 503 если токен не сконфигурирован

— Файлы: AdminEvalController.java (234 строк), AgentEvalClient.java (142 строк), версия v2.3.30

2. Phase 53 — Eval Admin UI каркас (Vue 3)

— 5 экранов под /admin/eval/* через proxy admin-backend: EvalDashboardView (карточки stats), CasesListView (таблица с фильтрами status/difficulty/q + пагинация 50), CaseEditorView (2-колоночный редактор vor_text+context+metadata vs эталон items с FSNB code validation, auto-save через 3-сек debounce), RunsListView (modal «новый прогон»), RunDetailView (SSE-прогрессбар через fetch+ReadableStream)

— evalApi в src/api/index.js с 17 методами, streamRun возвращает async iterator (EventSource не поддерживает JWT)

— Без Pinia, локальный reactive() state, версия v2.3.45 (843 добавленных строк UI-кода)

3. Phase 53 — баг-фиксы Eval UI

— v2.3.46: правка shape stats под реальный ответ агента (total_cases/by_status/by_difficulty/by_category/target вместо несуществующих stats.cases.total)

— v2.3.47: validateFsnb теперь читает r.exists, payload POST /cases с дефолтами difficulty=’medium’ и source=’expert_designed’ (agent отвергал null с 422)

— v2.3.50: дефолт фильтра статуса «любой» вместо draft-only, превью ВОР читает vor_text_preview из listCases

— v2.3.51: отмена отложенного auto-save при уходе со страницы (onBeforeUnmount + clearTimeout), решение create/update по form.value.id вместо isNew, пропуск auto-save при loading=true

4. Phase 56.A — таксономия осей характеристик ФСНБ (user-backend + admin-backend + admin-frontend)

— KoefCharacteristicMeta расширен полями applicable_to_fsnb (bool), fsnb_sbornik_codes (jsonb), value_synonyms (jsonb

для авто-извлечения из ВОР)

— Сидер CharacteristicMetaSeeder добавил 11 ФСНБ-осей в 4 группах: POVERKHNOST (3), FSNB_MATERIALY (4), FSNB_SLOZHNOST (2), FSNB_DEMONTAZH (2)

— Endpoints: GET /api/agent/characteristics/fsnb-axes[?sbornikCode=15], GET …/values, GET /api/characteristics/fsnb-axes для UI калькулятора

— Admin: CharacteristicMetaAdminController с CRUD осей + значений + синонимов (8 endpoints)

— Frontend: CharacteristicAxesView + CharacteristicAxisValues — справочник с фильтром «только ФСНБ», inline-редактор enum-значений и синонимов через tag input

— Версии v2.3.65 / v2.3.31 / v2.3.48

5. Phase 56.B — хранение характеристик ФСНБ-расценок

— Две новые таблицы привязки по стабильному fsnb_code (а не fsnb_rabota.id, который меняется при квартальном обновлении): fsnb_rabota_characteristic и fsnb_gruppa_characteristic (наследуется на расценки по gruppa_code prefix)

— FsnbCharacteristicService: getByCode с inheritance (rabota override-ит gruppa по той же оси), setForCode / setForGruppaCode (bulk-replace оси), findCodesByCharacteristics (пересечение по нескольким осям), coverage, approve, clearRequireReview

— Admin: AdminFsnbCharacteristicsController с 7 endpoints (rabota/by-code, gruppa/by-code, approve, clear-require-review, bulk, coverage, pending-review) + entity-зеркала в admin-backend

— Frontend: FsnbCharacteristicsView — coverage dashboard (3 карточки) + редактор по fsnb_code/gruppa_code (toggle) с multi-select значений, визуальный тег источника (manual/dict/llm/по группе), inheritance через override

— Версии v2.3.66 / v2.3.32 / v2.3.49

6. Phase 56.D — agent API + user API характеристик ФСНБ

— 3 agent-endpoints под /api/agent/fsnb/ (service-token): GET /rabota/by-code/{code}/characteristics с inherited_from_code, POST /raboty/characteristics/batch-by-code для списка кодов, POST /search-by-characteristics с must_be/exclude/scope/min_score

— Поиск обогащается именем расценки, sbornik_tip, razdel_name, fsnb_rabota_id для активной версии ФСНБ через JDBC JOIN rabota→gruppa→razdel→sbornik_fsnb

— searchByCharacteristics: пересечение rabota- и gruppa-уровневых матчей с inheritance, partial-match через match_score = matched_axes/total_rules с порогом min_score (дефолт 0.5)

— Группы раскрываются через `rabota.kod LIKE ‘gruppa-%’` — коды без своих rabota-записей корректно матчатся по унаследованным значениям

— Версия v2.3.67

7. Документация — stub-файлы и контракты phase56

— 6 docs-коммитов: stub-указатели на полные ТЗ в smeta-agent-claude, обновлены контракты с переходом на fsnb_code (стабильный между квартальными обновлениями)

— Эстимейты: admin-backend ~9ч, user-backend ~34ч

— Прописан FsnbVersionImportListener с флагом require_review при импорте новой версии ФСНБ (отложено в реализации)

Сводная статистика по коду:

Проект | Добавлено | Удалено | Коммитов

smeta_admin_backend | 1182 | 16 | 6

smeta_admin_frontend | 1829 | 40 | 10

smeta-user-backend | 1292 | 15 | 5

Итого | 4303 | 71 | 21

Оценка трудозатрат:

Задача | ~Часы

Phase 53 backend (AdminEvalController, AgentEvalClient, SSE) | 6

Phase 53 frontend (5 экранов, evalApi, SSE-стрим) | 10

Phase 53 баг-фиксы Eval UI (4 коммита) | 3

Phase 56.A backend (таксономия + CRUD admin) | 5

Phase 56.A frontend (CharacteristicAxes UI) | 5

Phase 56.B backend (entity, сервис, AdminController) | 7

Phase 56.B frontend (FsnbCharacteristicsView) | 4

Phase 56.D backend (agent API, search, обогащение) | 5

Stub-документы и контракты phase56 | 1

Итого | ~46 час