docs(autopodbor): handoff сессии 04-05.07 - что сделано по #2, что открыто (#1 прогресс, баг городов, похожесть)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -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` — ЧУЖИЕ отладочные скрипты прошлых сессий, НЕ мои, НЕ коммичены (могут содержать ключи).
|
||||
- Коммит — только по «эскейп»/«коммить» от владельца.
|
||||
Reference in New Issue
Block a user