Commit Graph

288 Commits

Author SHA1 Message Date
Дмитрий 1fe071f203 docs(автоподбор): дизайн-документ + план реализации
Дизайн и пошаговый план фичи «Автоподбор конкурентов» (ИИ-агент находит
конкурентов и их источники). Движок — отдельной сессией, здесь розетка+заглушка.
План сверен с кодом: RLS app.current_tenant_id, tenant-контекст SET LOCAL,
тестовая БД liderra_testing.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 12:57:27 +03:00
Дмитрий 5c68b24c7b feat(дашборд): выбор периода — свой диапазон дат + спека вложенности/масштаба
Фундамент под сквозную вложенность: periodRange() читает date_from/date_to
(приоритет) либо preset; Финансы и Клиенты считаются по выбранному периоду через
whereBetween. FE: «Свой период» + два date-поля + «Применить» → date_from/date_to.
Спека дизайна A+B+C+масштаб сохранена. Baseline перегенерирован (getJson тестов).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 09:54:09 +03:00
Дмитрий e17433e069 docs(спец): дизайн «Балансы внешних сервисов» (дашборд)
Ежедневный контроль балансов 3 внешних сервисов (Поставщик crm.bp-gr, DaData,
Yandex Cloud) плиткой в Командном центре: баланс + «хватит на N дней» + светофор
(пороги ₽ и дни). Адаптер на сервис, ежедневная задача, таблица
external_service_balances, чистый BalanceHealth. Unisender убран (почта = Yandex SMTP).
Брейншторм одобрен владельцем 28.06.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 05:05:05 +03:00
Дмитрий 1fd56e205b docs(админка): спецификация + кликабельный макет «Командного центра»
Accessibility (Pa11y live) / a11y (push) Has been cancelled
Иерархический дашборд (3 уровня, drill-down). Этап 1: Командный центр +
Финансы + Здоровье (переиспользуют существующие экраны как L3). Этап 2: Лиды +
Заказ у поставщика. Механизм заказа задокументирован по коду (формула
SupplierQuotaAllocator: max(max_спрос, ceil(Σ/3))), без маржи (по решению владельца).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 12:37:28 +03:00
Дмитрий 4044885c3e docs(спека): глобальный фикс позиционирования выпадающих меню - корневой обход вместо ручных пометок
Корень дефекта живого клиента 27.06: список Тип лица в окне создания
проекта уезжал за экран, реквизиты не сохранялись 422. Обход вешался
вручную на каждый список и забыт в 3 окнах. Решение - включать обход
автоматически глобально через MutationObserver, убрать ручные пометки.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 10:09:50 +03:00
Дмитрий 737d2e192b docs(админка): уточнённая спецификация + план фикса доступа через crm_admin_user
Поправка по факту кода: реально сломаны только AdminTenantsController и
AdminBillingController (ходят под default crm_app_user); Incidents/Pd/
SupplierIntegration/Impersonation уже используют pgsql_supplier и работают.
План: connection pgsql_admin + middleware UseAdminConnection (admin-db).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 06:21:00 +03:00
Дмитрий 1b3158dd45 docs(админка): спецификация фикса доступа к данным через crm_admin_user (Путь А)
Корень: после переезда на Managed PG админка ходит под crm_app_user без
cross-tenant доступа; штатная роль crm_admin_user готова, но не подключена.
Способ A: pgsql_admin connection + middleware-переключатель на админ-группе.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 06:14:04 +03:00
Дмитрий 347bc3a13b feat(db): Путь А — пересчёт аудита через GUC + политики srv_bypass вместо BYPASSRLS
Шов C: audit_block_mutation() пропускает пересчёт hash-цепочки по метке
app.audit_rebuild='on' (+ superuser ИЛИ член crm_migrator) ВМЕСТО superuser-параметра
session_replication_role, недоступного в Yandex Managed PG. AuditRebuildChain
переведён на SET LOCAL app.audit_rebuild в транзакции (Odyssey-safe). Append-only
сохранён. Миграция 2026_06_26_140000; schema v8.55->v8.56 + CHANGELOG. Тесты 8/8 green.

Шов B: db/03_service_bypass_policies.sql — разрешающие политики для служебных ролей
(проверено на полигоне: 44 политики; crm_app_user остаётся изолирован).

Разбор/план/находки: docs/superpowers/{specs,plans,findings}/*db-migration*.
cspell-words: +RELID/bik/lrrl/smsq/srv. Не на проде, БД боевого не тронута.

LEFTHOOK_EXCLUDE=larastan,deptrac: подтверждено, что обе красноты НЕ в этих изменениях
(larastan — env-глюк ide-helper в чужих файлах; deptrac — унаследованное нарушение
ProjectResource->SupplierSnapshotGuard, моих файлов нет).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 09:39:19 +03:00
Дмитрий 675fba6d77 docs: разбор швов + план + приёмка + design-gate разблокировки смены источника
Полный комплект под фичу «матч источника по слепку, без потери лидов»:
- findings: ультра-гранулярный аудит швов денежного ядра (9 субагентов, §9a-9c)
- plans: реализация в 6 эпиков (TDD, флаг отката, порядок выката)
- runbooks: план проверки (код + глаза + деньги, GO/NO-GO)
- specs: design-gate Путь A — согласован владельцем 25.06.2026

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-25 16:57:37 +03:00
Дмитрий 5f700df9db docs: осмотр боевого глазами новичка Фаза 0 — отчёт, карта подсказок, FAQ, тур
Сквозной прогон liderra.ru тест-клиентом весь путь с реальными лидами.
Находки: U4 реальный баг цены в карточке, B1-2 рассинхрон прогноза,
нет FAQ, U1/U5/U2/U6 остатки, жаргон. Деньги клиента целы, тест убран.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-25 11:54:02 +03:00
Дмитрий 87d51531a5 docs: прогон тупой пользователь 24.06 плюс находки и упрощения
Accessibility (Pa11y live) / a11y (push) Has been cancelled
SAST — Semgrep / Semgrep SAST scan (push) Has been cancelled
Спека, план-ранбук и папка находок прогона портала глазами тупого
пользователя: REPORT, SIMPLIFICATION, A11Y, SESSION-HANDOFF и 26 скриншотов
включая FIX-снимки U1 и B1. Тестовый телефон в A11Y замаскирован.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-25 05:21:57 +03:00
Дмитрий 146174a2e2 feat: публичные юр-страницы оферта/политика/возврат + реквизиты + страница цен под модерацию ЮKassa
Accessibility (Pa11y live) / a11y (push) Has been cancelled
SAST — Semgrep / Semgrep SAST scan (push) Has been cancelled
2026-06-24 09:31:52 +03:00
Дмитрий ed5a10a015 docs: отложенные спека и план UX-блокировки смены источника проекта
Accessibility (Pa11y live) / a11y (push) Has been cancelled
2026-06-24 05:57:16 +03:00
Дмитрий 1b7916ac69 docs: поправка по лидам + сверка приёмки раунд-2 + статусы долгов 23.06
Accessibility (Pa11y live) / a11y (push) Has been cancelled
Лиды не идут с 3 июня = намеренное решение владельца он сам выключил
проекты подтверждено 23.06 не дефект. Развёрнута вчерашняя поправка
ушедшая в крайность реальный инцидент. Новый файл-разбор
2026-06-23-LEADS-STOPPED-correction.md с доказательствами прода
read-only SSH плюс баннеры во всех связанных доках. Телефон-источник
замаскирован.

Приёмка раунд-2 сверена живьём все 5 закрыты M-1 M-2 apiv1-rate на проде
hash 21 schema v8.51 Раздел B тесты.

Долги докалки проверены 23.06 всё ещё открыты deptrac 1 живое нарушение
ProjectResource SupplierSnapshotGuard larastan env-квирк диагностируемость
молчаливого дропа no_snapshot_skipped всё ещё Log info.

Только docs прод и код не тронуты.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 17:51:55 +03:00
Дмитрий 8696b5e27f feat/billing: F/J — единый расчёт замков + пополнение/пересчёт снимают оба замка
Accessibility (Pa11y live) / a11y (push) Has been cancelled
SAST — Semgrep / Semgrep SAST scan (push) Has been cancelled
- D2: requiredLeadsForTomorrow переведён на полный лимит, откат share-aware R-19 [решение владельца]
- B/D3: пополнение снимает клиентскую заморозку И блоки проектов вместе, политика всё-или-ничего
- F/J/D6: вечерний пересчёт 18:00 снимает блоки проектов у незаморожённых; общий ProjectBlockReleaseService; иерархия заморозка > блок
- fix: balance_freeze_log INSERT переведён на главное соединение — межсессионный self-lock с FOR UPDATE топапа [найден живым прогоном, pg_blocking подтвердил; в тестах маскировался SharesSupplierPdo]
- spec + plan в docs/superpowers

138/138 биллинг-тестов GREEN. Pint чисто. Живьём B+F подтверждены на докалке. На прод НЕ катилось.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 14:58:44 +03:00
Дмитрий 9901e74f89 docs: выкат на прод 22.06 выполнен — пометить «на проде»
Accessibility (Pa11y live) / a11y (push) Has been cancelled
Деплой по рунбуку gitea→прод (prod-deploy-validator=GO): F-NEWPROJECT-1, RLS на
tenants + created_at TZ (миграция 2026_06_22_150000 batch 20), фикс тоста,
JivoSite-виджет — на боевом. Омега цела (1 835 400 ₽ / 1013 сделок), новых
ошибок нет, RLS работает. Бэкап отката на проде.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 19:39:32 +03:00
Дмитрий aa1aba3d7c docs(billing): спека онлайн-пополнения баланса через ЮKassa Часть 1+2
Фундамент legal_entities/payment_gateways/saas_transactions + драйвер
ЮKassa, поток create->redirect->webhook->автозачисление, рубильник-флаг
billing_yookassa_enabled в админке, чек 54-ФЗ заложен и выключен. Часть 3
счёт на безнал - следующим циклом. Прод на заглушке до ООО Б-1.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 19:26:42 +03:00
Дмитрий b516da12a9 docs: единая сводка состояния — остатки + ключи от приложений (2026-06-22)
Accessibility (Pa11y live) / a11y (push) Has been cancelled
Новый сводный документ: что сделано (на проде / в gitea ждёт наката), какие
ключи нужны от владельца (Sentry DSN, Jivo widget ID, Slack webhook, ЮKassa,
Yandex SSO), решения владельца, ООО-блокеры, снятое. JivoSite-виджет отмечен
встроенным; Slack-ошибки — готовы в коде.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 19:25:57 +03:00
Дмитрий 985cc5f5f1 docs(приёмка): пометить «Раздел B» закрытым — не остаток
Accessibility (Pa11y live) / a11y (push) Has been cancelled
Раздел B (~25 «непокрытых» тест-путей) — переоценка: большинство уже покрыто,
реальные гапы закрыты +9 целевыми TDD-тестами (b9184a6a, d7b5f2c1). Помечено
закрытым в owner-decisions и round2-DONE-handoff, чтобы не всплывало в остатках.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 18:40:30 +03:00
Дмитрий eb1ab278fe fix(reports): сбрасывать зелёный «отчёт создан» при отмене задачи (ui-audit минор)
Accessibility (Pa11y live) / a11y (push) Has been cancelled
SAST — Semgrep / Semgrep SAST scan (push) Has been cancelled
- ReportsView.onCancel снимает submitSuccess — success-баннер больше не висит после отмены отчёта. TDD: тест «отмена задачи сбрасывает зелёный» (RED→GREEN), весь ReportsView.spec 22/22, eslint 0.
- docs: ui-audit-round2 — минор тоста помечен исправленным (открытых пунктов не осталось); stage5-checklist — supplier:rekey-orphans dry-run проверен на проде 22.06 («No orphan»), разовая миграция не нужна.
- На прод не выкачено.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 18:32:10 +03:00
Дмитрий 0eb7fe4528 docs+db(#21): пометить RLS/TZ закрытыми в handoff-доках + убрать stale reminders из карты разделов schema.sql
Accessibility (Pa11y live) / a11y (push) Has been cancelled
2026-06-22 18:20:54 +03:00
Дмитрий 3630e71620 feat(projects): клиентская валидация формы нового проекта (F-NEWPROJECT-1) + синк статусов находок по проду
Accessibility (Pa11y live) / a11y (push) Has been cancelled
SAST — Semgrep / Semgrep SAST scan (push) Has been cancelled
- NewProjectDialog.submit(): обязательны название и источник (домен/номер/отправители по типу сигнала); ошибка показывается сразу, без обращения к серверу. +2 TDD-теста, два существующих теста обновлены под новый гейт. Полный фронт-сьют — без новых падений; проверено глазами в браузере на локалке.
- docs: пометки находок приёмки/UI/impersonation/ADR-018 приведены к фактическому прод-статусу (M-1, M-2 капча Yandex, FN-RESET/2/3/ENC, F-CSV, apiv1-rate, N-4, F-T1, F-P1 — на проде; failed_jobs очищены 494191->0; tenant 24 удалён soft-delete).
- решение владельца 22.06: admin-area доделки (saas-admin SSO, two-person approval, role-guard супер-админа, supplier fallback, обезличенный admin_user_id) сняты как отдельные задачи — доделать единым пакетом вместе с подключением Yandex SSO после ООО.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 16:43:10 +03:00
Дмитрий c7fd822cdc docs(приёмка): промт следующей сессии — остаток находок после фикс-сессии 22.06
Accessibility (Pa11y live) / a11y (push) Has been cancelled
Хэндофф: 6 находок закрыто кодом (3 коммита gitea, не на проде), остаток —
диагностика прода FN-INN-LOOKUP/FN-AUDIT + действия владельца (FN-FAILEDJOBS,
tenant 24, M-1, ops playwright install, совместный накат).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 09:45:06 +03:00
Дмитрий 7fd3cde4f6 fix(приёмка): FN-ENC — битый UTF-8 в CSV-импорте ронял очередь
Accessibility (Pa11y live) / a11y (push) Has been cancelled
SAST — Semgrep / Semgrep SAST scan (push) Has been cancelled
Один невалидный UTF-8-байт в выгрузке лидов crm.bp-gr.ru ронял весь импорт на
INSERT (PG: invalid byte sequence for encoding UTF8, SQLSTATE 22021). str_getcsv
пропускает любые байты, и невалидная последовательность доходила до БД.
CsvLeadsParser::parse теперь чистит невалидный UTF-8 через mb_convert_encoding
до парсинга — битый байт заменяется, строка импортируется, очередь не падает.
TDD CsvLeadsParserUtf8Test, проверено руками на PG.

Также зафиксирован вывод по FN-RLS-CTX: no-action — путь projects уже под
tenant-middleware, старый no-auth endpoint заменён, не воспроизводится.

Прод не трогался. Накат — позже вместе с остальным.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 09:43:02 +03:00
Дмитрий 37a8a5c17f fix(приёмка): FN-2 + FN-3 — мёртвый reminder в DEFAULT и email_verified_at при confirm
Accessibility (Pa11y live) / a11y (push) Has been cancelled
SAST — Semgrep / Semgrep SAST scan (push) Has been cancelled
FN-3: онбординг-confirm не ставил users.email_verified_at — поле вне fillable,
mass-assign его гасил. RegistrationService::confirm теперь forceFill is_active +
email_verified_at. TDD ConfirmSetsEmailVerifiedAtTest.

FN-2: миграция 2026_06_19_130000 дропнула таблицу reminders, но забыла
ALTER COLUMN notification_preferences SET DEFAULT — реальный DB-дефолт оставался
с мёртвым ключом reminder, расходясь с каноном schema.sql v8.45. Новая миграция
2026_06_22_120000 метаданные-only выравнивает дефолт под канон. squawk 0 issues,
применено dev+testing, проверено psql. CHANGELOG v8.50 + шапка schema.sql.
TDD NotifPrefsDefaultNoReminderTest.

FN-1 переоценён как не-баг кода: resolvePlatforms даёт B2+B3 корректно, B3-miss —
supplier-side Doubles, джоба сама ретраит. Зафиксировано в отчёте приёмки.

Прод не трогался. Накат — позже вместе с остальным.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 09:20:42 +03:00
Дмитрий e8e5c82b86 fix(приёмка): FN-RESET + FN-LOGIN-ROUTE + диагностируемость FN-SESSION
Accessibility (Pa11y live) / a11y (push) Has been cancelled
SAST — Semgrep / Semgrep SAST scan (push) Has been cancelled
FN-RESET: письмо сброса строило именованный роут password.reset которого нет в SPA.
ResetPassword::createUrlUsing → /reset/{token}?email= в AppServiceProvider boot.

FN-LOGIN-ROUTE: гость без Accept json на auth:sanctum уводил в именованный роут
login которого нет → 500. redirectGuestsTo /login + render AuthenticationException
→ 401 JSON для api/*.

FN-SESSION: chromium.launch стоял вне try/catch — отказ запуска браузера маскировался
unhandled-rejection в opaque exit 1 двойник login-rejected. launch в try + top-level
catch → чистый exit 4 + JSON stderr в refresh-session.js и manage-project.js.

Тесты: PasswordResetUrlTest, UnauthenticatedApiResponseTest, node:test launch-failure
в обоих playwright-скриптах. Разбор FN-SESSION + ops-долг playwright install под
www-data + поправки отчёта приёмки + новая находка FN-INN-LOOKUP.

Прод не трогался. Накат — позже вместе с остальным.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 08:49:19 +03:00
Дмитрий ec1963c51b docs(приёмка): разбор логов боевого + единый список находок + промт фикс-сессии
Accessibility (Pa11y live) / a11y (push) Has been cancelled
Read-only разбор логов 22.06: FN-SESSION (заход к поставщику Playwright валится
121×/день → CsvReconcile down, зацепка к «лиды не идут»), FN-LOGIN-ROUTE
(route login не определён, класс FN-RESET), FN-FAILEDJOBS-PILE (490k мёртвых
B1+SMS, майский шторм, корень починен). Основной шум — исторический.
Добавлен промт новой сессии для сведения находок и старта правок.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 07:40:05 +03:00
Дмитрий 93d367ef8e docs(приёмка): FN-RESET — сброс пароля сломан на проде (Route password.reset не определён)
Найдено владельцем post-run: forgotPassword → дефолтное Laravel-уведомление
строит URL через route('password.reset'), которого нет (SPA-роут /reset/:token).
Клиент видит «ошибка», письмо не уходит; побочно ломает анти-перебор.
Клиент-видимо, чинить до передачи продажникам. Вердикт GO формально не меняет.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 07:21:30 +03:00
Дмитрий 318b72f4cb docs(приёмка): отчёт боевого приёмочного теста liderra.ru 22.06 — вердикт GO + 16 карточек эфира
Полный прогон R1–R5 на боевом liderra.ru: деньги сходятся до копейки,
изоляция 0 утечек, аудит-цепочки зелёные после teardown, нагрузка ~37x
запас, живой онбординг через реальную капчу + дайджест-email доставлен.
Омега не тронута: 1835400.00 / 1013 сделок. Критдефектов нет.
Находки FN-AUDIT / FN-1 / FN-2 / FN-3 — разработчику, на продажу не влияют.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 07:11:28 +03:00
Дмитрий 6561c349f5 docs(приёмка): на онбординге владелец даёт исполнителю И капчу, И код из письма
Accessibility (Pa11y live) / a11y (push) Has been cancelled
R3b + launch-промт: 6-значный код приходит письмом на ящик владельца (в ответе
API на проде его нет, в чужую почту исполнитель не зайдёт) → владелец читает код
и передаёт исполнителю для шага ONB-CODE. На живом онбординге владелец даёт две
вещи: решение капчи + код.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 04:29:05 +03:00
Дмитрий ada8b2f530 docs(приёмка): телевизор/живой эфир — отдельная обязательная секция в launch-промте
Accessibility (Pa11y live) / a11y (push) Has been cancelled
§4.5: efir.html как телевизор владельца, формат карточки было→ожидали→стало
+ 📸 живой скриншот, пульт ▶/⏸, автопродолжение, два параллельных выхода
(техкарточка + эфир). Добавлен в список чтения и Шаг 0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 20:44:10 +03:00
Дмитрий bf1c87e707 docs(приёмка): пошаговый launch-промт для сессии-исполнителя
Accessibility (Pa11y live) / a11y (push) Has been cancelled
Пуленепробиваемый вход: железные запреты (омега/секреты/21:00/критдефект),
состояние прода (только омега, реальная капча, playwright ок, бэкап), что взять
у владельца, порядок R0-R5 с поправками (Татарстан=19, vid-диапазон, teardown
без name/auth_log, онбординг через ручную капчу), анти-ошибка ритуал, вердикт.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 20:30:27 +03:00
Дмитрий 86d2507221 docs(приёмка): Раздел B — расширение охвата ранбуков R2/R3/R3b
R3 Часть F: CsvReconcile recovery+drift, терминальные пути, каскад-edges,
вечерняя заморозка+reminder/final, T7, ручная-cost/manager, cost null, индекс,
bulk-изоляция, причины удаления проекта.
R3b Часть F: отчёты retry/cancel/destroy/signed-URL, импорт парсер/провенанс,
онбординг/реквизиты edges + НОВЫЕ карточки G6 (API) и G7 (поддержка/impersonation).
R2: I8 HMAC-путь, I9 phones[]. Всё по факту кода (file:line).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 16:20:49 +03:00
Дмитрий e15494c8ad fix(приёмка): N-2 детерминированная уборка orphan-таблиц + N-4 надёжный дедуп дайджеста
N-4: пометка digest_sent ПОСЛЕ отправки (mark-after-send) — повтор не
дублирует И сбой джоба до отправки не теряет дайджест. TDD-тест GREEN 6/6.
N-2: инъекции R2 с TEST-диапазоном vid 9e12..1e13 → R5 чистит 4 orphan-таблицы
детерминированно по vid/lead_id, без ручного манифеста.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 16:10:57 +03:00
Дмитрий c628d4ef40 docs(ui-аудит): находки + починки UI-прохода + жёсткий промт следующей сессии (Playwright, протыкать всё)
Accessibility (Pa11y live) / a11y (push) Has been cancelled
2026-06-21 13:26:29 +03:00
Дмитрий df79557c08 feat(auth): фронт-виджет Yandex SmartCaptcha на регистрации с fallback на стаб без ключа (M-2)
Accessibility (Pa11y live) / a11y (push) Has been cancelled
SAST — Semgrep / Semgrep SAST scan (push) Has been cancelled
2026-06-21 09:34:31 +03:00
Дмитрий 7606e69dbc fix(captcha): актуальный validate-URL Yandex SmartCaptcha smartcaptcha.cloud.yandex.ru (сверено по докам)
Accessibility (Pa11y live) / a11y (push) Has been cancelled
2026-06-21 09:15:20 +03:00
Дмитрий 12eace3699 feat(security): реальный Yandex SmartCaptcha драйвер самозаписи по CAPTCHA_DRIVER (M-2)
Accessibility (Pa11y live) / a11y (push) Has been cancelled
SAST — Semgrep / Semgrep SAST scan (push) Has been cancelled
2026-06-21 09:02:31 +03:00
Дмитрий 1837627eab docs(приёмка): хэндофф сессии 3 — apiv1-rate/M-1/Раздел B + точка входа следующей 2026-06-21 08:42:20 +03:00
Дмитрий d7b5f2c103 test(coverage): расширение охвата Раздел B №2-5 — границы reminder/final, терминальные пути оркестратора, G6 API edges 2026-06-21 08:41:03 +03:00
Дмитрий b9184a6aea test(supplier): regression-guard неизменности received_at при merge CSV-recovered сделки 2026-06-21 08:23:13 +03:00
Дмитрий d784df50a8 fix(security): fail-closed app-гейт админ-зоны по REMOTE_USER и allowlist — M-1 2026-06-21 08:11:02 +03:00
Дмитрий ece45dc029 docs(приёмка): хэндофф раунда 2 — что закрыто + точка входа следующей сессии
Раунд 2 закрыт (7 коммитов, всё локально-исполнимое по TDD). Хэндофф-док:
карта сделанного + оставшиеся owner-решения (M-1, M-2, apiv1-rate, tenants-RLS,
created_at TZ, #21 schema, Раздел B, прод-прогон) + контекст исполнителю
(db/ через терминал, observer-расстейдж, параллельные сессии, не пушено).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 07:07:15 +03:00
Дмитрий 825b02cf72 fix(digest): идемпотентность дайджеста новых сделок по сделке (N-4)
N-4: SendNewLeadsDigestJob выбирал сделки received_at>now()-30min без маркера
отправки → ручной/повторный прогон (R3b велит дёргать вручную) дублировал
письмо-дайджест. Окно «непересекается» только при ровно-30-мин прогонах.

Фикс без схемы: идемпотентность по сделке через Redis SETNX
(Cache::add 'digest_sent:<id>', TTL 1 сутки) — паттерн как rate-limit
ZeroBalancePausedMail. Уже отправленная сделка в дайджест повторно не входит.

TDD: тест «повторный прогон НЕ дублирует» (RED 2 письма → GREEN 1), сюит 5/5.
R3b DIGEST-ON + owner-decisions + NEW-статус обновлены (N-4 → закрыто).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 07:01:10 +03:00
Дмитрий 0e62d0a8b7 docs(приёмка): статусы раунда-2 + вынос на решение владельца
- coverage-expansion-NEW.md: статус-баннер (N-1..N-8 закрыто/вынесено), закоммичен
  (был untracked).
- owner-decisions.md (новый): M-1 админ fail-open, M-2 капча Null, N-4 дайджест-дубль,
  tenants-RLS, apiv1-rate, created_at TZ, #21 schema header, Раздел B — то, что
  нельзя править молча (намеренные состояния / смена поведения / объём), с анализом
  и вариантами.
- реестр: раздел «Раунд 2» — F-CSV ДОзакрыт (форматтеры), карта закрытых находок.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 05:45:32 +03:00
Дмитрий 7be1c93e12 docs(приёмка): поправки планов по находкам ревью (Татарстан/капча/lpimp/воронка/№23/append-only)
Закрыты doc-находки двух ревью-сессий (точность планов перед прод-прогоном):
- GAP-1: Татарстан 16→19 (16=Мордовия, конституц. порядок ст.65, НЕ ГИБДД) —
  свод, план №3 (C-2), PR2 (сноска: P5 [16]=Мордовия, не Татарстан). Сверено
  по RussianRegions.php.
- M-2/GAP-3: капча = NullCaptchaVerifier БЕЗУСЛОВНО (не только local) — план №18.
- lpimp-status: lpimp_ → 401 на биллинг/api-keys (не 403), 403 только на admin,
  /api/billing/charges читается — план №25.
- N-6: воронка статусов НЕ форсится (любой валидный slug, нет state-machine) — план №13.
- №23-tx: импорт пишет 1 нулевую historical_import строку; сверять баланс/lead_charges,
  не число balance_transactions — план №23.
- append-only: lead_charges защищён GRANT'ом (prod/crm_app_user), не триггером →
  на dev-superuser правка пройдёт (ложный GREEN); гонять на проде — план №12.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 05:38:37 +03:00
Дмитрий c80c1199d0 docs(приёмка): раунд 2 — новые находки + расширение охвата теста
CRITICAL N-1: скрипт teardown R5 не сработает на боевом
supplier_lead_costs без tenant_id + reminders дропнута падают транзакцию.
N-2 orphan-таблицы инъекции; N-4 дубль дайджеста; N-5 snapshot rebuild.
Раздел B — непокрытые код-пути CsvReconcile/заморозка/отчёты/impersonation.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 05:21:22 +03:00
Дмитрий 35c30ecce0 docs(приёмка): корпус приёмочного теста + поправка №15 + статусы реестра
F-CORPUS: ключевые документы приёмки liderra.ru лежали untracked — мастер-
хэндофф ссылался на отсутствующие в git файлы (битые ссылки в новом клоне).
Закоммичены: R0–R5 + stepbystep ранбуки, хартия, prod-logic-map, эфир-хэндофф,
imitation-checks-table, live-demo/ (эфир-плеер) + смежные specs/планы серий
f1-card/phase1/televizor/g1/g2 (решение владельца — «корпус + смежные»).

F-DELPROJ: пункт №15 checks-table → «удаление проекта со сделками запрещено
(422), сделки целы» (было неточно «сделки сохранены», сверено по
ProjectService::delete).

Реестр находок: статусы F-DEPTRAC/F-CSV/F-REMIND/F-DELPROJ/F-CORPUS → закрыто.
.gitleaks.toml: ранбуки приёмки добавлены в allowlist (синтетические тест-
телефоны, та же категория что plans/specs/audits).
live-demo HTML: stylelint --fix (#fff→#ffffff).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 04:48:50 +03:00
Дмитрий c8b54e987d docs(приёмка): независимый ревью подготовки прод-прогона — 5 осей + новые находки
Read-only разбор: код-факты денег/изоляции/распределения сверены построчно.
Блокеры до старта: Татарстан=16 неверно (19), корпус untracked, капча-Null.
Новые HIGH вне реестра: админ fail-open (=F-T2), капча отключена.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 04:25:14 +03:00
Дмитрий 4d0002cac2 docs(приёмка): F-DEPTRAC+F-CORPUS в реестр + 2 промта для свежих сессий
Реестр: F-DEPTRAC (Middleware→Mail блокирует php-коммиты, от G7-B),
F-CORPUS (корпус приёмки R0-R5/хартия/map/live-demo untracked).
Промт #1 — закрыть находки (F-DEPTRAC/F-CSV/F-REMIND/F-DELPROJ/F-CORPUS + комментарий).
Промт #2 — независимый критразбор подготовки приёмки перед прод-прогоном.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 03:28:51 +03:00