Commit Graph

33 Commits

Author SHA1 Message Date
Дмитрий d6ffa0a6d0 docs: ЮKassa go-live шаги 1-4а — обновлены ПИЛОТ.md и ранбук
Договор ЮKassa подписан, магазин 1392092, на проде в кластерной базе заведены legal_entities ИП id=1 + payment_gateways yookassa id=2 active + webhook payment.succeeded. Осталось включить флаг billing_yookassa_enabled + живой тест 100р. Поправка к ранбуку: после переезда на Managed PG данные приложения заводить через app/Eloquent, не через peer-psql на VM.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-26 13:59:37 +03:00
Дмитрий e84342319c docs/source-edit: §9a закрыт экраном вечерней заливки, хвосты сессии и порядок выката
Accessibility (Pa11y live) / a11y (push) Has been cancelled
SAST — Semgrep / Semgrep SAST scan (push) Has been cancelled
§9a отчёта о завершении вечерней заливки закрыт: формат — экран в админке Эпик 5 supplier_sync_runs плюс AdminSupplierIntegrationView, решение владельца 26.06.2026.

В файл хвостов добавлен итог ночной сессии до выката: полная регрессия 1750 из 1756, разбор 2 падений SchemaDelta мой починен и AutoPause чужой time-of-day квирк, вердикт нормативки правок не нужно, вердикт готовности боевого GO, порядок выката и чек-лист. Добавлен утренний хэндофф-runbook.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-26 03:35:29 +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
Дмитрий a410af41c8 docs: ранбук включения онлайн-оплаты ЮKassa на ИП для прода liderra.ru
Accessibility (Pa11y live) / a11y (push) Has been cancelled
2026-06-24 08:02:04 +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
Дмитрий 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
Дмитрий 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
Дмитрий 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
Дмитрий 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
Дмитрий 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
Дмитрий 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
Дмитрий ff29360724 docs: рунбук ручного выката gitea на прод
Пошаговый деплой-пайплайн liderra.ru: clone из gitea, npm build на проде,
artisan down, rsync overlay с исключениями, composer и optimize от www-data,
миграции через postgres superuser, up и smoke. Грабли PowerShell-ssh кавычек,
heredoc с dollar-dollar, привилегии www-data и crm_app_user, rollback.
GitHub Actions deploy.yml мёртв, аккаунт CoralMinister suspended.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 09:11:06 +03:00
Дмитрий 8ad9e1d17f fix(test): routing-snapshot today+tomorrow в CsvWebhookRaceTest + PII на slack/papertrail/stderr
C: LeadRouter.activeSnapshotDate после 21:00 МСК = завтра; снимок только на сегодня не активен -> снимки на обе даты. A: PII-процессор на остальные лог-каналы, 6/6.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 21:37:41 +03:00
Дмитрий 7f5288726a feat(security): PII-scrubbing процессор логов — Medium go-live
Monolog PiiScrubbingProcessor (телефоны/email -> [PHONE]/[EMAIL]) + ScrubPii tap на single/daily в config/logging.php. Pest 6/6 GREEN. Sentry-scrubbing (OPEN-И-16) не реализуем: sentry-laravel не установлен — open-item.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 20:43:28 +03:00
Дмитрий b81a372e8f feat(security): webhook DNS-rebind пиннинг + аддитивный HMAC supplier-webhook — edge/P2 go-live
WebhookUrlGuard::safeDeliveryIp один резолв + CURLOPT_RESOLVE пиннинг в test(); supplier-webhook принимает HMAC X-Webhook-Signature как альтернативу URL-секрету + secretless-маршрут. Аддитивно, backward-compat. 6 новых тестов GREEN; 5 падений webhook-сюиты pre-existing (Phase-3 B-regex + CsvWebhookRaceTest), подтверждено baseline без моих файлов.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 20:21:11 +03:00
Дмитрий 518d71e81f feat(security): per-IP route-throttle на auth-эндпоинтах — P1 go-live
Именованные лимитеры auth-login/auth-2fa/auth-password (perMinute 20 by IP) в AppServiceProvider; throttle-middleware на login/forgot/reset/2fa-verify/recovery в web.php. Закрывает per-IP объёмный перебор. Pest tests/Feature/Auth 97/97 GREEN.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 19:56:23 +03:00
Дмитрий 25f9016505 docs(superpowers): отчёт осмотра портала + баг-доки стены (walk/read-block) — для claude-brain
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 17:54:50 +03:00
Дмитрий 9fe5b5f229 imitation phase1 merge
# Conflicts:
#	app/app/Console/Commands/PhoneRangesImportCommand.php
#	app/app/Jobs/RouteSupplierLeadJob.php
#	app/app/Services/LeadRegionResolver.php
#	app/database/migrations/2026_05_31_100000_create_phone_ranges_and_resolution_log.php
#	app/tests/Feature/Console/PhoneRangesImportCommandTest.php
#	app/tests/Feature/Jobs/RouteSupplierLeadJobTest.php
#	app/tests/Feature/PartitionsCreateMonthsTest.php
#	cspell-words.txt
#	docs/observer/STATUS.md
#	tools/enforce-powershell-gate.test.mjs
#	tools/enforce-router-gate.mjs
#	tools/enforce-router-gate.test.mjs
#	tools/enforce-tdd-gate.test.mjs
#	tools/enforce-tdd-real-test-verifier.mjs
#	tools/enforce-tdd-real-test-verifier.test.mjs
#	tools/enforce-verify-record.test.mjs
#	tools/mcp-tool-classifier.test.mjs
#	tools/shell-content-rules.test.mjs
2026-06-17 08:03:35 +03:00
Дмитрий 293edb3e07 docs session 2026-06-16: F-4 baseline, gitea push, wall push lesson, mentor bug, F-1 deploy runbook, lead-region already-in-main finding, etalon update 2026-06-16 15:57:06 +03:00
Дмитрий 328ac009d6 fix(mentor): smoke этап 4 пройден — деталь ошибки транспорта в catch вердикта + env ROUTER_LLM_BASE_URL в дефолте callAnthropicAPI (смена оператора на aitunnel) + контракт массива строк в промпте plan_points_addressed (F-C3); runbook этап 4 + env-таблица + блок смены оператора; smoke-план; cspell +aitunnel и словоформы. Регрессия tools 3753 GREEN 2026-06-12 07:55:31 +03:00
Дмитрий f677c6651f feat(strict-llm-keys): оба строго — судья только ROUTER_JUDGE_LLM_KEY, наставник только ROUTER_MENTOR_LLM_KEY, общий ROUTER_LLM_KEY не фолбэк (решение владельца 2026-06-12; resolveJudgeLlmKey/resolveMentorLlmKey + env-тесты строгости + runbook-таблица ключей) 2026-06-12 06:39:17 +03:00
Дмитрий 8293ca2ce6 feat(mentor-activation): активационная обёртка наставника — рубильник SEAM + journal/verdict store + export PLAN_PATH_RE + контекст-в-плане + producer-хук PostToolUse + freeze-gate зубы в печать судьи (план T1-T7 + sharp-edges W-1..W-4) 2026-06-12 05:51:41 +03:00
Дмитрий 7b6f5cbd15 docs(mentor): runbook активации роутера-наставника — 5 этапов для владельца (обёртка → флаг → регистрация → smoke → обкатка) 2026-06-11 20:15:29 +03:00
Дмитрий 364da6bf48 docs(phase8): refresh снимок+runbook + paste-ready settings.json блок
После закрытия M6 FIX-5 и верификации тест-гейта §9.2:

- 2026-06-10-phase8-state-snapshot.md: HEAD 4dd2098e→5be1cd6e; M6 FIX-5 из
  «отложено» → закрыто (key-gated); D-3 доска live → закрыта (84231a14);
  регрессия 3449→3478; §9.2 верифицирован зелёным (предусловие C закрыто).
- 2026-06-09-phase8-deployment-runbook.md: Prerequisites регрессия →3478 +
  §9.2 verified; +строка History 2026-06-10.
- 2026-06-10-phase8-settings-paste-block.md (новый): paste-ready записи для
  settings.json — 13 хуков защитного контура (PreToolUse 10 / PostToolUse 2 /
  Stop 1) + companion + список снятия зоопарка (~20). Merge-not-replace, атомарно,
  пол #1 ДО снятия router-gate. Референс для владельца (Claude settings.json не пишет).

Только docs. Активация Фазы 8 (settings.json/keychain/ENV) — шаги владельца.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-10 05:52:32 +03:00
Дмитрий cc77a5817e docs(phase8): owner deployment runbook for M7 zoo dissolution + activation 2026-06-09 13:03:56 +03:00
Дмитрий 487a6f1db9 docs(router-mentor): A1 judge gate2 activation note (implementation-specific) 2026-06-09 08:55:33 +03:00
Дмитрий 681c2b8abc docs(router-mentor): activation runbook A1 A6 A7 2026-06-09 07:50:42 +03:00
Дмитрий 932360b526 docs(imitation): phase 1 runbook + results report
Manual UI walkthrough, imitation:seed usage, natural-cycle observation, report template, and the filled Phase 1 results: imitation suite 54/54 GREEN; findings (F1 seedPhoneRange fixed, F2/F3 plan-vs-resolver tag/unknown, money bcmath kopeck-clean, step-3 substitution, orphan-lead resting place); regression note (22 single-process failures are pre-existing pollution, confirmed green in isolation; imitation prod changes verified).
2026-06-04 05:20:22 +03:00
Дмитрий c959c03f55 docs(region): rollout runbook + session progress 2026-06-01 07:21:24 +03:00
Дмитрий cebd6bcebb docs(router-gate-v4): Stream H Task 1 fix — correct module references in recovery-procedures.md (code-quality review)
Code-quality reviewer flagged 2 IMPORTANT factual inaccuracies in
recovery-procedures.md (commit 3ce73a68):

1. Section 6 RECOMMENDED code example imported resolvePathNormalize from
   the wrong module path (tools/shell-content-rules.mjs). Actual exporter
   is tools/enforce-router-gate.mjs (verified via Grep at line 174).
   shell-content-rules.mjs only exports defaultPathNormalize. A future
   reader copying the RECOMMENDED pattern would get an import error.
   Also corrected the call signature: resolvePathNormalize() takes no
   arguments and is async — returns the normalize function directly.

2. Section 4 (Stale-process) cited tools/enforce-bash-content-gate.mjs —
   no such file exists in tools/ (verified via Glob). Correct hook
   filenames are enforce-router-gate.mjs (Bash) and
   enforce-powershell-gate.mjs (PowerShell).

Fix: replace both module references with the verified correct filenames
(Grep'd against tools/ exports + Glob'd file existence). Also includes
the lefthook MD032 blank-lines-around-lists auto-format diff carried
over from the previous commit's post-commit hook.

Surgical edit — no new content, no restructuring.
2026-05-30 10:13:16 +03:00
Дмитрий 3ce73a68ff docs(router-gate-v4): Stream H Task 1 — recovery-procedures.md (3 levels + stale-process + 7 fabrications + test methodology + smoke methodology)
Adds first-time recovery runbook with:
- 3 self-recovery levels (Level 1 ≤5min sentinel reset, Level 2 ≤15min VS Code
  restart, Level 3 destructive workspace rebuild)
- Stale-process / hook reload trap (Smoke 5 chistaa-session hypothesis +
  refutation method); key takeaway: live restart-test is the only way to
  confirm a hook-modifying fix landed
- Self-fabrication patterns — 7 cases enumerated from Smokes 3/4/5/7 with
  pattern signature, detection signal, mitigation for each
- Test methodology lesson — Smoke 5 root cause showed unit tests with inline
  mocks can give false-green if they bypass the live resolver function; debug
  scripts have the same trap
- Smoke methodology — statusline-setup system prompt overrides user tasks
  (Smoke 9 Run 1); use semgrep-scanner for echo-probes, statusline-setup OK
  for gate-inheritance smokes

Docs-only change; verified via docs-only short-circuit in enforce-verify-
before-push (§5 п.13 CLAUDE.md).

Stream H Task 1 of 11. Plan: docs/superpowers/plans/2026-05-30-router-gate-v4-stream-H.md
2026-05-30 09:58:38 +03:00