From f757d8adafad5a604d93dc68f8be417eeeebcede 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: Sun, 5 Jul 2026 03:42:41 +0300 Subject: [PATCH] =?UTF-8?q?docs(autopodbor):=20handoff=20=D1=81=D0=B5?= =?UTF-8?q?=D1=81=D1=81=D0=B8=D0=B8=2004-05.07=20-=20=D1=87=D1=82=D0=BE=20?= =?UTF-8?q?=D1=81=D0=B4=D0=B5=D0=BB=D0=B0=D0=BD=D0=BE=20=D0=BF=D0=BE=20#2,?= =?UTF-8?q?=20=D1=87=D1=82=D0=BE=20=D0=BE=D1=82=D0=BA=D1=80=D1=8B=D1=82?= =?UTF-8?q?=D0=BE=20(#1=20=D0=BF=D1=80=D0=BE=D0=B3=D1=80=D0=B5=D1=81=D1=81?= =?UTF-8?q?,=20=D0=B1=D0=B0=D0=B3=20=D0=B3=D0=BE=D1=80=D0=BE=D0=B4=D0=BE?= =?UTF-8?q?=D0=B2,=20=D0=BF=D0=BE=D1=85=D0=BE=D0=B6=D0=B5=D1=81=D1=82?= =?UTF-8?q?=D1=8C)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 --- .../2026-07-05-avtopodbor-session-handoff.md | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 docs/superpowers/findings/2026-07-05-avtopodbor-session-handoff.md diff --git a/docs/superpowers/findings/2026-07-05-avtopodbor-session-handoff.md b/docs/superpowers/findings/2026-07-05-avtopodbor-session-handoff.md new file mode 100644 index 00000000..2f18d5a6 --- /dev/null +++ b/docs/superpowers/findings/2026-07-05-avtopodbor-session-handoff.md @@ -0,0 +1,53 @@ +# Автоподбор — HANDOFF сессии 04–05.07.2026 (для продолжения после компакта) + +**Ветка:** `worktree-avtopodbor` (НЕ прод). Воркстри: `c:/моя/проекты/портал crm/Документация/.claude/worktrees/avtopodbor`. +**PHP:** `C:/tools/php83/php.exe` · **dev-БД:** `liderra` @127.0.0.1 (postgres / liderra_dev_pass) · **тест-БД:** `liderra_testing`. +**Флаги:** `REAL_FIND=1`, `AUTOPODBOR_DEEP_STUDY=true`. Node: `C:\Program Files\nodejs\node.exe`. EXA-ключ — из OS-env (рабочий). +**Портал:** `php artisan serve --host=127.0.0.1 --port=8000` → отдаёт **собранный** фронт (Vite-dev нет) → после правок фронта **`npm run build`**. +**Воркер:** `php artisan queue:work redis --queue=autopodbor` (иногда сам отваливается — если «крутит и ничего», поднять заново). + +## Логины (пароль в столбце password_hash) +- `client4@liderra.local` / `Liderra2026!` — тенант 38 (чистый, я создал 04.07). +- `client3@liderra.local` / `Liderra2026!` — тенант 37 (стройка). +- `omega-demo@liderra.local` / `omega12345` — тенант 34. +- тенант 36 = client2 — ломбарды, 99 конкурентов (прогон 23 — эталон для похожести). + +## ✅ СДЕЛАНО и ЗАКОММИЧЕНО (ветка worktree-avtopodbor) +Порядок коммитов (свежие внизу списка git log): +1. `d2f3a171` fix — баг #3 (удаление источника видно сразу) + баг #4 (формы не закрываются при выделении текста, 8 оверлеев на 2 экранах). +2. `d7c63a29` feat — #2 Часть 1: модель `elements` `{name,sites[],cards[]}` + миграция+бэкфилл + слияние объединяет элементы без потерь. +3. `47bc5082` docs — находки (похожесть-погода, конкурент-из-элементов) + план. +4. `2130cd74` feat — #2 Часть 2: формы создания/правки = списки элементов (компонент `CompetitorElementsEditor.vue`); правка БОЛЬШЕ НЕ стирает карточки. Хелпер `CompetitorElements` (нормализация + вывод легаси site_url/directory_urls). +5. `50d6da59` feat — #2 Часть 3: шаг 2 (`RealCompetitorAgent::studyCompetitor` deep) строит отпечаток на КАЖДЫЙ элемент, сводит. +6. `5d19114c` feat — слияние: выбор подмножества (галочки, 2 из 3 и т.п.). +7. `bd425308` feat — карточка показывает состав холдинга (элементы). +8. `b78babe7` feat — слияние: выбор имени объединённого из найденных (селект). + +**#2 «конкурент из элементов» — ЗАКРЫТ ПОЛНОСТЬЮ.** Миграция накатана на **dev И test** БД. Фронт пересобран. +Тесты: автоподбор-бэк **369 зелёных**, автоподбор-фронт **95 зелёных**. + +Ключевые файлы #2: `app/app/Services/Autopodbor/CompetitorElements.php`, `AutopodborCompetitorMerger.php`, `Agent/RealCompetitorAgent.php`, `Http/Controllers/Api/AutopodborController.php`, `Jobs/Autopodbor/RunAutopodborStudyJob.php`, `resources/js/views/autopodbor/screens/CompetitorElementsEditor.vue` + `FieldWorkspaceScreen.vue` + `FieldProposalsScreen.vue` + `FieldCompetitorScreen.vue`, `resources/js/api/autopodbor.ts`, `stores/autopodborStore.ts`. + +## 🔴 ОТКРЫТО — на завтра/потом + +### #1 ПРОГРЕСС (следующая задача, по TDD) +Владелец: клиент сидит и гадает, идёт ли что. Нужно: **очередь «вы №N»** (когда queued) + **исполнение «этап N из M»** (когда running). Он согласился на «этап N из M» вместо точных %. +План: +- **Очередь:** в `AutopodborController::run` (GET /runs/{run}) для queued отдавать `queue_position`. Считать `AutopodborRun::whereIn('status',['queued','running'])->where('id','<',$run->id)->count()+1`. ⚠️ RLS скоупит по тенанту (позиция среди своих). Альтернатива — `Queue::size('autopodbor')` (глобально, но грубее). Решить с владельцем. +- **Этап N из M:** нужна инструментовка джобы. Добавить в `autopodbor_runs` колонку `progress` (jsonb: `{stage, stage_total, label}`) миграцией; job (search и study) пишет стадии. Search: анализ→канал А→канал В→сборка. Study(deep): по элементам / сайты→2ГИС→Яндекс. Фронт (`pollRun` onTick) обновляет currentRun; оверлеи `runCollect` в `FieldWorkspaceScreen`/`FieldCompetitorScreen` показывают позицию/этап. +- TDD: тест на queue_position (Feature, RLS), тест на прогресс-инструментовку. + +### Баг «поиск ушёл в чужие города» (диагностирован, НЕ чинён — владелец сказал «только причина») +Причина: `Agent/ChannelA/CategoryListingParser.php:36` — regex `/[a-z0-9_-]+/firm/(\d+)` берёт карточки фирм из ЛЮБОГО города, не сверяя со слагом региона. 2ГИС при тонкой нише подмешивает фирмы других городов → парсер их принимает → «вскрыть всё» (`CompetitorCardEnricher`) их качает. Фикс (если закажут): фильтровать `card_url` по слагу региона в CategoryScraper/парсере. Тот же тип, что баг 420 (нестрогое совпадение + дрейф выдачи). + +### Похожесть «показывает погоду» — ОТЛОЖЕНО («вернёмся позже») +Файл `docs/superpowers/findings/2026-07-04-avtopodbor-similarity-pogoda.md`. Вывод: текст-косинус по имени+рубрике/сайту не отличает банк/автоломбард/ломбард; докорм сайтом дал НОВУЮ погоду (повезло/нет с сайтом, 51/74). НЕ точить под займы — система универсальна. Кандидаты решения: убрать точный % → грубые группы, либо не текст-косинус (отдельная стройка). + +### Прогон 44 (Сибирская Строительная, study, тенант 38) — так и не проверил финальный статус (владелец несколько раз просил). + +## ⚠️ Квирки/грабли +- **Тесты в воркстри гонять батчами, НЕ всем набором разом** (`npx vitest run` целиком даёт каскад ~22 падений в ЧУЖИХ экранах Kanban/Settings/Deals/Projects/Error/Legal — это ПРЕДСУЩЕСТВУЮЩИЙ долг воркстри, НЕ наши правки; в одиночку тоже красные, значит просто сломаны до нас). Бэк-Pest: `php artisan test tests/Feature/Autopodbor/`. +- Тест-БД мигрировать: `DB_DATABASE=liderra_testing php artisan migrate --force`. +- `lefthook` в воркстри не в PATH — pre-commit хуки не бегут; коммит проходит. +- `app/scripts/diag-*`, `probe-*`, `sandbox-*`, `_poll35.php` — ЧУЖИЕ отладочные скрипты прошлых сессий, НЕ мои, НЕ коммичены (могут содержать ключи). +- Коммит — только по «эскейп»/«коммить» от владельца.