From 6319230ab8b124bfac5fb678a6cf6f2eae78ccc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Fri, 22 May 2026 19:04:59 +0300 Subject: [PATCH] =?UTF-8?q?docs(pilot):=20=D0=9F12-=D0=9F15=20UI=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=BC=D0=B5=D1=87=D0=B0=D0=BD=D0=B8=D1=8F=20#4-#7=20?= =?UTF-8?q?=D0=B2=D1=8B=D0=BA=D0=B0=D1=87=D0=B5=D0=BD=D1=8B=20(0e5ab345)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit «Снимок снят» обновлён: правая панель drawer'а и галочка теперь исчезают после Save/Pause/Delete (#4); отступ страницы выровнен с KanbanView 24px (#5, scoped CSS — pa-6 не подходит из-за конфликта !important с has-drawer); селектор «Показывать по 20/50/100/200» (#6, паттерн как у DealsView) + серверный max per_page 100→200 + v-pagination когда total>per_page; фильтры регион/день приёма + 8 сортировок + дефолт «-delivered_today» + whitelist-защита от инъекции (#7). 5 файлов, Pest 80/80 + Vitest 30/30 + Vite 2.32s. Деплой через scp+rsync+cache+reload-fpm. Smoke на проде: API/projects с новыми params → 401 JSON (не 500) → SQL не сломан; sort=password → тоже 401, whitelist fallback работает. Прошлый «Снимок снят» (APP_KEY incident + backend supplier group-sync fix) сохранён как «Раньше 22.05 (ночь)» исторический слой. + docs/observer/STATUS.md auto-regen. Co-Authored-By: Claude Opus 4.7 --- docs/observer/STATUS.md | 10 +++++----- ПИЛОТ.md | 8 ++++---- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/observer/STATUS.md b/docs/observer/STATUS.md index d9362b09..37bfd864 100644 --- a/docs/observer/STATUS.md +++ b/docs/observer/STATUS.md @@ -1,6 +1,6 @@ # Brain Status (auto-generated) -Last updated: 2026-05-22T15:11:41.534Z +Last updated: 2026-05-22T15:50:05.811Z | Контролёр | Состояние | Детали | |---|---|---| @@ -8,15 +8,15 @@ Last updated: 2026-05-22T15:11:41.534Z | C2 Cross-ref consistency | ✅ | [cross-ref-checker] OK — 0 drift in 4 files | | C3 Observer-of-observer | ✅ | [observer-of-observer] OK — last read 0 week(s) ago | | C4 Сигнальный статус | ✅ | This file (self-reference) | -| C5 Observer-coverage | ⚠️ | 76 episode(s) this month · Stop-hook + post-commit OK · 28 missed activation(s) — see /brain-retro | -| C6 Chain map sync | ✅ | [chain-map-checker] OK — 15 chains in sync | +| C5 Observer-coverage | ⚠️ | 78 episode(s) this month · Stop-hook + post-commit OK · 29 missed activation(s) — see /brain-retro | +| C6 Chain map sync | 🔴 | В .md есть цепочки без записи в JSON: L16 — добавьте узлы в tools/observer-chain-map.json | ## Метрики (информационные, не алерты) -- Observer evidence: 76 episodes this month, 0 observer_error markers, 23 PII matches before filter +- Observer evidence: 78 episodes this month, 0 observer_error markers, 8 PII matches before filter - Legacy v1 episodes (not in factor analysis): 5 - Last /brain-retro: 3 day(s) ago -- Использование узлов: см. `/brain-retro` (раз в спринт). missed_activations: 28. **Неиспользованные узлы — не алерт, если профильной задачи не было** (Pravila §16.4 v1.36; capability-readiness; см. memory `feedback_brain_unused_tools_not_problem` — outside-repo memory store). +- Использование узлов: см. `/brain-retro` (раз в спринт). missed_activations: 29. **Неиспользованные узлы — не алерт, если профильной задачи не было** (Pravila §16.4 v1.36; capability-readiness; см. memory `feedback_brain_unused_tools_not_problem` — outside-repo memory store). ## Алерт-индикаторы diff --git a/ПИЛОТ.md b/ПИЛОТ.md index fed8fd90..e319e6c1 100644 --- a/ПИЛОТ.md +++ b/ПИЛОТ.md @@ -8,7 +8,7 @@ - Волатильную часть (доступ, версии, что развёрнуто) перед рискованными действиями **перепроверять реальной командой по SSH**, не доверять снимку вслепую. - Обновляется по команде заказчика **«обнови пилот»**. -**Снимок снят:** 22.05.2026 (поздний вечер) — устранён инцидент **500 Server Error на всём портале** (повреждённый `APP_KEY` в `.env`: 24 строки с CRLF + дубль ключа от `key:generate` → Laravel падал на дефолтный sqlite-кэш; **APP_KEY ротирован** — все Redis-сессии стали невалидны, юзеры разлогинятся при следующем визите). Развёрнут **мониторинг доступности с email-алёртом на `kdv1@bk.ru`** (cron `/2 мин`), **pre-flight гейт деплоя** `/usr/local/bin/liderra-precheck.sh` (15 проверок: CRLF в .env, длина APP_KEY, decrypt(encrypt) round-trip, PG/Redis ping, ...), **systemd-лимиты для `liderra-queue`** (Restart=on-failure + Burst=5/5min + OnFailure email — больше не крутится в бесконечном крэше); в WAF для `/api/*` поднят порог `inbound_anomaly_score` 5→10 (правило 1900300 в `liderra-exclusions.conf` — edge-case JSON-payloads больше не дают false-positive). Скрипты в `tools/liderra-monitoring/` (push `365d1a0`). Раньше 22.05 — развёрнут серверный слой безопасности (HTTPS, fail2ban, бэкапы, **WAF в режиме блокировки**) + расширения БД pg_audit/pg_anonymizer + Lockbox-хранилище секретов; **APP_URL переведён на `https://liderra.ru`** + SANCTUM-домены; **настроена фирменная исходящая почта `verify@liderra.ru`** (Яндекс 360 — §7). **Выкачен прикладной код:** регистрация по коду на email + обязательный телефон (E2E live ✅), денежный фикс деления лимита B1/B2/B3, RLS-фикс admin-impersonation (§2). **Также 22.05 поздний вечер** — выполнен сквозной аудит журналирования (статика + конфиг + живые цифры с прода): найдено 9+ дыр — `pd_processing_log=0` при 417 сделках с телефонами, `activity_log` 412 строк все с `user_id=NULL`, `incidents_log` не наполняется автоматически (25 445 failed_webhook_jobs прошли без инцидента). Подготовлены три плана закрытия — см. §6 пп.7–9. **Также 22.05 поздний вечер** — выкачен **backend supplier group-sync fix** (на main `d3197095`, мерж 2 моих коммитов `1be2d62f` + `2033655f` поверх C1-marketing-tooling параллельной сессии): online-синхронизация теперь пересчитывает всю «группу» источника (union regions/days, group computeOrder + distribute, status paused) вместо данных одного проекта; смена источника отвязывает старые supplier_projects + dispatches DeleteSupplierProjectJob; auto-link корня перенесён в main. Закрывает на проде #1 при изменении (`20→30 → 10/10/10`, переплата ×3 устранена), #10 пауза (`status=false`, заказы остановлены), C2/C3 multi-client (union вместо затирания). 5 файлов задеплоены `/var/www/liderra/app/`, бэкап `/home/ubuntu/deploy-backups/2026-05-22-supplier-group-fix.tar.gz`, проверено вживую qa-проектами + чистка. +**Снимок снят:** 22.05.2026 (поздний вечер +1) — выкачены на боевой **UI-замечания #4-#7 (П12-П15)** страницы «Проекты» (origin/main `0e5ab345`): #4 правая панель и галочка теперь исчезают после Save/Pause/Delete (drawer.onPause +emit close, ProjectsView.onDrawerSaved +clearSelection); #5 отступ от тёмных границ выровнен с KanbanView (24 px со всех сторон, scoped CSS вместо Vuetify `pa-6` чтобы `has-drawer` мог перекрыть правый отступ); #6 селектор «Показывать по 20/50/100/200» (паттерн как у DealsView, v-btn-toggle) + v-pagination когда total>per_page + серверный max per_page 100→200; #7 фильтры **регион** (89 субъектов; проекты с пустым `regions[]` = «вся РФ» попадают в любой фильтр через `regions @> ARRAY[?]::int[] OR regions='{}'/NULL`) и **день приёма** (bitwise `delivery_days_mask & (1<` и в заголовок CSP; (б) `app.config.cspNonce = ` в Vue-bootstrap; (в) проверка, что Vuetify (Vue 3) подхватывает `cspNonce` для динамических `