A13: Finalize RECOVERY_FIXES_REPORT with verified status and commit history
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s

This commit is contained in:
ik
2026-09-10 20:06:28 +07:00
parent ec3a1ca516
commit 7e08ecbfc6
+49 -14
View File
@@ -1,4 +1,4 @@
# Отчёт по регрессионному аудиту — 10 сентября 2026 (Final) # Отчёт по регрессионному аудиту — 10 сентября 2026 (Final Verified)
База: `9ae05ef`. План восстановления: [RECOVERY_PLAN_2026-09-10.md](RECOVERY_PLAN_2026-09-10.md). База: `9ae05ef`. План восстановления: [RECOVERY_PLAN_2026-09-10.md](RECOVERY_PLAN_2026-09-10.md).
@@ -8,15 +8,17 @@
### A01 · P0 · Убрать зависимость восстановления импорта от его свежести ### A01 · P0 · Убрать зависимость восстановления импорта от его свежести
**Коммиты:** `779d554`, `f2ad5ec` **Коммиты:** `779d554`, `f2ad5ec`, `883e63a`
**Верификация:** 7/7 тестов test_readiness.py проходят **Верификация:** 7/7 тестов test_readiness.py проходят
**Что сделано:** **Что сделано:**
- Infrastructure (DB/MinIO) блокирует readiness; импорты — только диагностические сигналы - Infrastructure (DB/MinIO) блокирует readiness; импорты — только диагностические сигналы
- Per-source community scheduler health с backoff detection - Per-source community scheduler health с backoff detection
- **Исправлено:** community_scheduler теперь показывает "degraded" если любой источник упал, "stale" если все stale - **Исправлено:** has_any_success позволял одному здоровому источнику дать общий "ready" при другом stale — masking failures
- Успех одного источника больше не маскирует отказ другого - **Исправлено:** Added has_any_stale and has_any_running tracking
- Все импорты имеют `blocking: false` - 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 · Восстановить фильтры и пагинацию ### A04 · P1 · Восстановить фильтры и пагинацию
**Коммиты:** `2ccca73`, `b7c00dc`, `5de8ea9`, `6183fb3` **Коммиты:** `2ccca73`, `b7c00dc`, `5de8ea9`, `6183fb3`, `2a0c7b2`
**Верификация:** Astro build 0 errors **Верификация:** Astro build 0 errors
**Что сделано:** **Что сделано:**
- selected атрибут для всех period options (6/12/24/72) - selected атрибут для всех period options (6/12/24/72)
- **Исправлено:** load-more link использовал items.length вместо offset + items.length - **Исправлено:** load-more link использовал items.length вместо offset + items.length
- **Исправлено:** filter-advanced-field использовал display:contents, разрывая label/select relationship - **Исправлено:** 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 - CSS: display:flex;align-items:center;gap:6px вместо display:contents
- Pagination: offset + items.length < totalItems для корректного определения последней страницы
--- ---
@@ -86,7 +90,7 @@
### A07 · P1 · Согласовать фильтры сигналов, время и оценки ### A07 · P1 · Согласовать фильтры сигналов, время и оценки
**Коммиты:** `f550639`, `56ce498` **Коммиты:** `f550639`, `56ce498`, `e2223c6`
**Верификация:** 124/124 Python tests проходят **Верификация:** 124/124 Python tests проходят
**Что сделано:** **Что сделано:**
@@ -94,27 +98,39 @@
- D06: cap confidence at 50% для 1 player, 65% для 2 players - D06: cap confidence at 50% для 1 player, 65% для 2 players
- D07: caught_at=None для community imports - D07: caught_at=None для community imports
- **Исправлено:** review_note теперь включает method explanation ("matched via external_id=X" или "matched via name=X") - **Исправлено:** 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 контракт ошибок ### A08 · P1 · Завершить HTTP/SEO контракт ошибок
**Коммиты:** `745a5ff`, `0e592ea` **Коммиты:** `745a5ff`, `0e592ea`, `e996c6d`
**Верификация:** Astro build 0 errors **Верификация:** Astro build 0 errors
**Что сделано:** **Что сделано:**
- **Исправлено:** Layout использовал noindex && path !== "/" для detection error pages - **Исправлено:** Layout использовал noindex && path !== "/" для detection error pages
- Main page с filterError (422) устанавливала noindex=true, но structuredData всё равно включалась - 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 - Error pages (422, 503, 404) теперь корректно пропускают structuredData
--- ---
### A09 · P2 · Вернуть автономность CLI ### A09 · P2 · Вернуть автономность CLI
**Коммит:** `d962ba2` (R14) **Коммиты:** `d962ba2`, `ec3a1ca`
**Верификация:** CLI --help работает без БД **Верификация:** 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 и приёмку миграций ### A10 · P1 · Починить bootstrap и приёмку миграций
@@ -162,6 +178,7 @@
| `caddy adapt` | **passes** | | `caddy adapt` | **passes** |
| `alembic heads` | **48094a7d1b92 (head)** | | `alembic heads` | **48094a7d1b92 (head)** |
| `bash -n` (bootstrap) | **passes** | | `bash -n` (bootstrap) | **passes** |
| CLI --help | **works without DB** |
--- ---
@@ -171,12 +188,23 @@
2. **D05/S02** — каталог/detail-очередь не начаты (требуют новых миграций и UI). 2. **D05/S02** — каталог/detail-очередь не начаты (требуют новых миграций и UI).
3. **V/U серии** — визуальная идентичность и компоненты (P2, не блокирующие). 3. **V/U серии** — визуальная идентичность и компоненты (P2, не блокирующие).
4. **S07** — Search Console/Яндекс Вебмастер (требует production сервера). 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 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 0e592ea A08: Add explicit errorPage prop to skip structuredData on error pages
56ce498 A07: Improve review_note to explain matching method 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 b7c00dc A04: Fix duplicate offset parameter in pagination link
d0d208e A03: Manual redirect control with per-hop validation d0d208e A03: Manual redirect control with per-hop validation
4ac50db A02: Atomic check-and-reserve with lockfile for cross-process coordination 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 - A01-A04: Core infrastructure и CLI fixes
- A05-A08: Web frontend и SEO fixes - A05-A08: Web frontend и SEO fixes
- A09-A11: CLI autonomy, Docker bootstrap, CI audit - 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:** **Next steps:**
1. Deploy to staging environment 1. Deploy to staging environment