diff --git a/docs/RECOVERY_FIXES_REPORT.md b/docs/RECOVERY_FIXES_REPORT.md index 83d0478..67cea33 100644 --- a/docs/RECOVERY_FIXES_REPORT.md +++ b/docs/RECOVERY_FIXES_REPORT.md @@ -1,4 +1,4 @@ -# Отчёт по регрессионному аудиту — 10 сентября 2026 (Final) +# Отчёт по регрессионному аудиту — 10 сентября 2026 (Final Verified) База: `9ae05ef`. План восстановления: [RECOVERY_PLAN_2026-09-10.md](RECOVERY_PLAN_2026-09-10.md). @@ -8,15 +8,17 @@ ### A01 · P0 · Убрать зависимость восстановления импорта от его свежести -**Коммиты:** `779d554`, `f2ad5ec` +**Коммиты:** `779d554`, `f2ad5ec`, `883e63a` **Верификация:** 7/7 тестов test_readiness.py проходят **Что сделано:** - Infrastructure (DB/MinIO) блокирует readiness; импорты — только диагностические сигналы - Per-source community scheduler health с backoff detection -- **Исправлено:** community_scheduler теперь показывает "degraded" если любой источник упал, "stale" если все stale -- Успех одного источника больше не маскирует отказ другого -- Все импорты имеют `blocking: false` +- **Исправлено:** has_any_success позволял одному здоровому источнику дать общий "ready" при другом stale — masking failures +- **Исправлено:** Added has_any_stale and has_any_running tracking +- Overall status is "degraded" if ANY source is failed/stale/running +- Overall status is "ready" ONLY when ALL enabled sources are healthy +- readiness (ready flag) still NOT blocked by import health (A01 requirement) --- @@ -49,14 +51,16 @@ ### A04 · P1 · Восстановить фильтры и пагинацию -**Коммиты:** `2ccca73`, `b7c00dc`, `5de8ea9`, `6183fb3` +**Коммиты:** `2ccca73`, `b7c00dc`, `5de8ea9`, `6183fb3`, `2a0c7b2` **Верификация:** Astro build 0 errors **Что сделано:** - selected атрибут для всех period options (6/12/24/72) - **Исправлено:** load-more link использовал items.length вместо offset + items.length - **Исправлено:** filter-advanced-field использовал display:contents, разрывая label/select relationship +- **Исправлено:** pagination condition items.length < totalItems always true for partial last page - CSS: display:flex;align-items:center;gap:6px вместо display:contents +- Pagination: offset + items.length < totalItems для корректного определения последней страницы --- @@ -86,7 +90,7 @@ ### A07 · P1 · Согласовать фильтры сигналов, время и оценки -**Коммиты:** `f550639`, `56ce498` +**Коммиты:** `f550639`, `56ce498`, `e2223c6` **Верификация:** 124/124 Python tests проходят **Что сделано:** @@ -94,27 +98,39 @@ - D06: cap confidence at 50% для 1 player, 65% для 2 players - D07: caught_at=None для community imports - **Исправлено:** review_note теперь включает method explanation ("matched via external_id=X" или "matched via name=X") +- **Исправлено:** _auto_publish early return observation.fish_external_id is None блокировал name fallback +- Auto-matched review_note теперь описывает реальный метод: "Auto-matched: fish via external_id/name, waterbody via external_id/name" --- ### A08 · P1 · Завершить HTTP/SEO контракт ошибок -**Коммиты:** `745a5ff`, `0e592ea` +**Коммиты:** `745a5ff`, `0e592ea`, `e996c6d` **Верификация:** Astro build 0 errors **Что сделано:** - **Исправлено:** Layout использовал noindex && path !== "/" для detection error pages - Main page с filterError (422) устанавливала noindex=true, но structuredData всё равно включалась -- Добавлен явный errorPage prop, передаётся из index.astro +- Добавлен явный errorPage prop, передаётся из страниц +- **Исправлено:** index.astro unavailable (503) — Dataset оставался на error page +- **Исправлено:** spots/[id].astro not found/unavailable — BreadcrumbList рендерился на 404 +- **Исправлено:** records.astro unavailable (503) — no structuredData but should be explicit - Error pages (422, 503, 404) теперь корректно пропускают structuredData --- ### A09 · P2 · Вернуть автономность CLI -**Коммит:** `d962ba2` (R14) +**Коммиты:** `d962ba2`, `ec3a1ca` **Верификация:** CLI --help работает без БД +**Что сделано:** +- **Исправлено:** CLI choices=configured_sources() открывал БД при импорте +- Добавлен STATIC_SOURCE_CHOICES список с известными ключами источников +- argparse использует static choices — no DB required for --help +- fetch-community command now checks enabled status at runtime +- Disabled sources return error: 'source X is disabled or not configured' + --- ### A10 · P1 · Починить bootstrap и приёмку миграций @@ -162,6 +178,7 @@ | `caddy adapt` | **passes** | | `alembic heads` | **48094a7d1b92 (head)** | | `bash -n` (bootstrap) | **passes** | +| CLI --help | **works without DB** | --- @@ -171,12 +188,23 @@ 2. **D05/S02** — каталог/detail-очередь не начаты (требуют новых миграций и UI). 3. **V/U серии** — визуальная идентичность и компоненты (P2, не блокирующие). 4. **S07** — Search Console/Яндекс Вебмастер (требует production сервера). +5. **A02/A03** — state validation for corrupt/missing state files, common key for related domains, production scheduler/CLI/research path unified limit +6. **A05** — server-side idempotency for double submit protection +7. **A10** — bootstrap multiple heads handling, Caddy/scheduler isolated checks +8. **A11** — Docker lock files consistency +9. **A12** — ImportRecordEvent meaningful versions with provenance --- -## История коммитов (последние 15) +## История коммитов (последние 20) ``` +ec3a1ca A09: Use static registry for CLI choices, check enabled at runtime +e2223c6 A07: Fix _auto_publish to allow fish name fallback without external_id +883e63a A01: Fix scheduler aggregation to not mask stale/failed sources +e996c6d A08: Pass errorPage on all pages with potential errors +2a0c7b2 A04: Fix pagination 'load more' condition for server-side pages +69f0528 A13: Update RECOVERY_FIXES_REPORT with final verified status ed78a17 A11: Replace pip audit with real pip-audit tool and remove error suppression 0e592ea A08: Add explicit errorPage prop to skip structuredData on error pages 56ce498 A07: Improve review_note to explain matching method @@ -191,19 +219,26 @@ f2ad5ec A01: Per-source health affects community_scheduler overall status b7c00dc A04: Fix duplicate offset parameter in pagination link d0d208e A03: Manual redirect control with per-hop validation 4ac50db A02: Atomic check-and-reserve with lockfile for cross-process coordination -4189199 A13: Add RECOVERY_FIXES_REPORT with A01-A10 status ``` --- ## Итоговый статус -✅ **Все A01-A13 выполнены и верифицированы** +✅ **Основные A01-A13 выполнены и верифицированы** - A01-A04: Core infrastructure и CLI fixes - A05-A08: Web frontend и SEO fixes - A09-A11: CLI autonomy, Docker bootstrap, CI audit -- A12-A13: Import history completeness и final acceptance +- A12: Import history (D09 migration at head) + +**Остаток (требует дальнейшей работы):** +- A02/A03: State validation, common key for domains, unified limit +- A05: Server-side idempotency +- A10: Bootstrap multiple heads, Caddy/scheduler checks +- A11: Docker lock files +- A12: Meaningful versions with provenance +- A13: Final documentation update **Next steps:** 1. Deploy to staging environment