Commit Graph

1119 Commits

Author SHA1 Message Date
Дмитрий 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
Дмитрий ecbbf84ccc docs(billing): план реализации онлайн-пополнения ЮKassa Часть 1+2
10 TDD-задач: модели существующих таблиц, флаги, драйвер ЮKassa,
OnlineTopupService, развилка по флагу, идемпотентный webhook,
админ-ввод ключей, фронт пресеты+редирект, ручная проверка песочницы.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 19:33:14 +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
Дмитрий cf63eea4b0 docs(пилот): снимок 22.06 — приёмочный тест боевого GO + FN-RESET (сброс пароля сломан)
Accessibility (Pa11y live) / a11y (push) Has been cancelled
Полный приёмочный прогон R1–R5 на боевом liderra.ru: ядро PASS, омега цела
1835400/1013, teardown+F3 зелёный. FN-RESET: сброс пароля сломан для всех
(route password.reset не определён) — чинить до передачи продажникам.
Новый тариф T1=70₽ с 22.06. tenant 24 онбординг оставлен.
+cspell: онбординг, DOUBLEPROJ, INSUFF в словарь.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 07:26:20 +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
Дмитрий 6e903d5f5a docs(приёмка): онбординг через реальную капчу — владелец решает вручную
Accessibility (Pa11y live) / a11y (push) Has been cancelled
R3b §A: капча на проде реальная (Yandex, test=false) — два способа пройти
онбординг (владелец сам регистрируется ИЛИ решает капчу в видимом Playwright);
массовый провижининг — SQL (R1). Удалённые ящики kdv1@/stels_info@ убраны из текста.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 19:24:18 +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
Дмитрий c1b7cb7d61 fix(i18n): русские сообщения валидации — lang/ru/validation.php
Accessibility (Pa11y live) / a11y (push) Has been cancelled
UI-аудит раунд 2: APP_LOCALE=ru, но директории lang/ не было → Laravel отдавал
сырой ключ «validation.required» во все формы без кастомных messages() (профиль,
создание проекта, реквизиты для оплаты и т.д.). Auth-формы свой messages() имеют.

Добавлен каноничный ru-перевод (laravel-lang) + секция attributes с русскими
именами полей продукта (Имя/Телефон/Лимит лидов в день/ИНН/…).

Верификация: trans(validation.required)→«Поле … обязательно для заполнения.»;
форма профиля в Playwright показывает «Поле Имя обязательно для заполнения.»
вместо «validation.required».

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 14:37:33 +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
Дмитрий 6039715923 docs(приёмка): шаг вечерней заморозки §20.2 в план №9 (cover-freeze)
Ревью раунда 1 (полнота): инвариант §20.2 не имел шага ни в одном плане.
Добавлен Шаг 9-4: вечерний BalancePreflightSweepJob @18:00 смотрит на ЗАВТРА
(тенант мёрзнет с «+» балансом), разморозка снимает только наши паузы
(paused_at >= frozen_at_was), ручные паузы клиента сохраняются. Код-факты
сверены по BalancePreflightSweepJob.php:62/70-85/97-108 + routes/console.php.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 05:55:26 +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
Дмитрий e0fb6e4633 docs(приёмка): починка runbook-SQL по находкам N-1/N-2/N-3/N-5/N-7/N-8
R5 teardown/сверки (сверено по db/schema.sql):
- N-1 (CRITICAL): TD3 падал — supplier_lead_costs БЕЗ tenant_id (→ через deal_id,
  до deals) + DELETE FROM reminders по дропнутой таблице (убрано). Прежде вся
  транзакция откатывалась → тест-данные оставались на боевом.
- N-2: + DELETE pd_processing_log/tenant_operations_log (по tenant_id) + нота про
  orphan-таблицы инъекции без tenant_id (чистить по манифесту R2).
- N-3: нота — НЕ удалять глобальные auth_log/saas_admin_audit_log (разрыв
  hash-цепочки → F3 красный); per-tenant цепочки рвутся безопасно.
- N-8: F4 маржа — supplier_lead_costs.cost_kopecks→cost_rub + JOIN deals;
  lead_charges.price_kopecks→price_per_lead_kopecks (ревьюер ошибся, сверено).

R2: N-5 — предупреждение про snapshot:rebuild (DELETE без фильтра тенанта/транзакции,
снесёт слепок дня вкл. lkomega); по умолчанию backfill с явной --date.

R1: N-7 — предусловие PR2: гейт реквизитов (422 requisites_required) + preflight
баланса (409) ДО создания проектов через портал.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 05:42:40 +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
Дмитрий 1dc633c017 docs(notifications): актуализировать докблок дефолтов уведомлений
G2-B (19.06) флипнул new_lead.email false→true — дайджест по умолчанию ВКЛ.
Докблок NotificationService ссылался на устаревший дефолт (email:false) и
старую строку schema.sql:699. Поправлено на канон-схему (email:true).
Только комментарий, без изменения логики.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 04:44:01 +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
Дмитрий b7e3af4c66 docs(приёмка): мастер-хэндофф для прод-прогона + планы 24/25/26 + поправки
Мастер-документ точки входа для свежей сессии: тест на боевом liderra.ru,
порядок R1-R5, карта 26 планов, безопасность, эфир, вердикт GO/NO-GO.
Планы 24 помощь, 25 импер­сонизация, 26 публичный API.

Поправка: F-DIGEST снята — была ошибкой чтения устаревшего комментария,
не отставанием локалки (она байт-в-байт с боевым 01a9029c). Канон-схема
db/schema.sql:796 new_lead.email:true — дайджест вкл по умолчанию. План 20
и реестр обновлены. Тесты — только на проде.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 16:47:29 +03:00
Дмитрий 674654185c docs(приёмка): реестр находок + планы 18 онбординг и 21 напоминания убраны
Реестр находок (сверка свода с кодом под планы):
F-CSV экспорт без защиты от CSV-инъекции (безопасность, под фикс),
F-DELPROJ удаление проекта со сделками запрещено (свод неточен),
F-DIGEST дефолт email-дайджеста по схеме выключен,
F-PDF штатность PDF-формата не подтверждена,
F-REMIND фронт-хвосты снятой фичи напоминаний,
F1-F5 прежние прогонные (F3 закрыта).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 15:54:03 +03:00
Дмитрий d6f008d7ba docs(приёмка): ещё 11 планов-отчётов — движок добит + UI-блок
Движок Фазы 3: 02 второй круг, 04 лимит/пауза под локом, 06 каналы/парсинг,
12 денежный аудит, 11 лента денег/калькуляторы, 15 сделки переживают удаление,
16 изоляция. UI-блок R3b: 19 гейт реквизитов+ИНН, 20 колокольчик+дайджест,
22 отчёты, 23 импорт CSV.

Расхождения свода с кодом помечены как находки под проверку:
15 удаление проекта со сделками запрещено а не сохраняется,
20 дефолт email-дайджеста по схеме выключен,
22 PDF-формат проверить на штатность.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 15:36:30 +03:00
Дмитрий bb4915ba33 docs(приёмка): 11 планов-отчётов по пунктам приёмки liderra.ru в формате PR1
Пошаговые планы было→ожидали→стало с код-фактами file:line для пунктов:
PR2 проекты, PR3 балансы, 01 распределение CAP3, 03 каскад региона,
05 идемпотентность, 07 тройная запись, 08 тариф-ступень,
09 нехватка→откат, 10 два проекта одно списание,
13 сделки лента/карточка/статусы, 14 ручная/массовые/экспорт.

NB 14: защита экспорта от CSV-инъекции в коде не найдена — помечено как находка под проверку на прогоне.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 14:11:27 +03:00
Дмитрий 739c28d296 docs(G7-B): план реализации двери impersonation + машинный ключ 2026-06-19 16:17:56 +03:00
Дмитрий 42cdd5233b docs(G7-B): спека двери impersonation + машинный ключ под ИИ + карта каналов 2026-06-19 16:09:07 +03:00
Дмитрий 93def8b6b4 docs(G7-B): хэндофф достройки impersonation — состояние брейншторма + промпт след. сессии
Accessibility (Pa11y live) / a11y (push) Has been cancelled
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 15:20:24 +03:00
Дмитрий 799d775361 docs(G7-A): план реализации клиентской «Помощь»
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 14:48:18 +03:00