← все проекты

LeadForge AI

Платформа лидгена: Авито-машина, Директ-машина, email-аутрич, мультитенант. Ядро лидгена MyVision.

repo: aitodo:/mnt/docker-data/leadforge-ai (git на сервере)server: aitodo, pm2 leadforge-*, lf-postgres:5437docs: docs/YD-PIPELINE.md, docs/etalons/память: leadforge-avito-mechanics, leadforge-yd-pipeline, leadforge-offer-system
готовS1 · Tenant Identity (1A.0.5)1/5

Цель: Идентичность тенантов

Tenant identity
✓ закрыт ранее
feature
Вход одной кнопкой вместо Client ID и Secret
Предпринимателю нечего делать со словами Client Secret. У всех трёх площадок вход кнопкой возможен: Авито — OAuth2 authorization_code; Яндекс Директ — страница Яндекс ID с кнопкой «Разрешить»; ВК — либо agency_client_credentials (клиент не вводит ничего, просто передаёт кабинет агентству), либо authorization_code по заявке в ads_api@vk.team. Нужно: зарегистрировать наши приложения на трёх площадках (одноразово, действие владельца), потом написать /oauth/<платформа>/start и callback по образцу существующего amocrm.
feature
Причесать интерфейс кабинета: адаптив
Кабинет плохо адаптируется под узкие экраны. Проверить настройки, рекламные кабинеты, дашборд на 390, 768, 1024.
feature
Авито ISKRA: кабинет подключён, изоляция проверена
Кабинет клиента подключён и читается его же доступом. Пересечений с нашим ноль: у Искры 34 объявления, у нас 15, фиды пишутся в разные папки по компаниям. Что у них: все по 990 руб, заголовки-ключи через слэши, размножены по 14 городам, покрыты футбол/хоккей/баскетбол/волейбол/регби/лёгкая атлетика. ПРОБЛЕМА: рубрики смешаны — часть в «Спорт и отдых», часть в «Предложение услуг», при том что категория важнее ключевых слов.
feature
ВК ISKRA: рекламного кабинета нет, прислали токен сообщества
Сотрудник клиента прислал ключ vk1.a... — это токен сообщества «ISKRA | Производитель спортивной формы» (iskra_sport, id 240149869), для рекламы не годится: ads.getAccounts отвечает «method is unavailable with group auth». Callback API, который ему показали, — про уведомления сообщества, не про рекламу. НУЖНО: клиент создаёт рекламный кабинет на ads.vk.com, затем Общие настройки → Доступ к API → Запросить доступ, и присылает Client ID и Secret. Токен сообщества сохранён — пригодится для лид-форм и сообщений, но это отдельная задача.
feature
готовS2 · Multi-tenancy + RLS (1A.1)2/2

Цель: Полная изоляция тенантов

RLS-политики
✓ pen-test 72/0
feature
jose JWT + SET LOCAL
feature
готовS3 · Авито-машина v28/8

Цель: Автономный конвейер Авито

Фикс kill-правила (слепота к чат-лидам)
✓ strategist.ts: leads7d обязателен
feature
Статус-синк с Авито
✓ каждые 6ч; авто-restore выключен после дублей
feature
Бюджет-гейт (аванс<500р)
✓ avito-spend-gate.ts
feature
Дедуп-гард + библиотека картинок
✓ новые без фото не публикуются
feature
Лайфсайкл: тексты→обложка→цена→вывод с уроком
✓ уроки в TG
feature
Пул 31 оффер-направление из штаба
✓ sync_agency_offers.py
feature
Санитайзер суррогатов LLM (0xd0)
feature
Чистка дублей Консультаций
✓ фид пересобран
feature
В РАБОТЕS4 · Директ-машина17/18

Цель: Директ как у сильного директолога

Директолог-аналитик (разбор в TG)
✓ yd-analyst.worker
feature
Аналитик YD Фаза 1: анализатор по всем данным + автономия + бэкофис
✓ yd-dimensions (ключ/слот-позиция/пол×возраст/устройства/гео + пороговые находки), политика автономии yd-autonomy (safe→auto, spending→approval, переключатель assisted→full), таблица yd_insights, подключён в еженедельный воркер, вкладка «Директолог» в бэкофисе. Проверено на живых кампаниях.
feature
Уроки аудита B2B-Директа вшиты в пайплайн
✓ Компилированный интент-фильтр семантики (yd-keyword-intent, интегрирован в expandKeywordsViaWordstat), комбинаторные 7+3 объявления в yd-executor (search+РСЯ), 272 минус-фразы, эталон Э9. Задеплоено (pm2 restart).
feature
КЗ: стратегия «максимум конверсий» + цели registration/purchase; разметка сайтов
✓ КЗ 712193779 → WB_MAXIMUM_CONVERSION_RATE по цели формы (лимит 1500/нед). Созданы цели registration+purchase в Метрике КЗ. Разметка MyVision+LeadForge сайтов (form_open+lead_form reachGoal) на проде.
feature
Миграция кабинета под 24leadforge.ru/app
✓ nginx path /app + прокси /api на aitodo через https, куки host-only. Вход проверен живым логином. Сброшен пароль владельца.
feature
Редизайн посадки 24leadforge.ru: сервис + реальные скрины + форма регистрации
✓ Позиционирование сервис-платформа (не внедрение). Реальные скрины кабинета (Реклама/Директолог, Лиды, Агенты) через headless. Форма «заявка на регистрацию» без гейта 200к, цель registration. Тестовые лиды для скрина заведены и удалены.
feature
Корректировки аудитории через API (bidmodifiers)
✓ Разгадан bidmodifiers API: get требует Levels ВНУТРИ SelectionCriteria (без него молча падает 8000), add отдаёт Ids массивом. Вшито в yandex-direct.ts: +IncomeGradeAdjustments (платёжеспособность), Ids-парсинг, ошибки из AddResults[].Details, новый getBidModifiers(+Levels). Применены B2B-корректировки на КЗ/MyVision/LeadForge: income VERY_HIGH=+30%/HIGH=+15% (Топ платёжеспособных), КЗ демо искл<18 + -50% на 25-34. Confirmed end-to-end через сам клиент.
feature
↑ Запуск кампаний разблокирован: замкнут цикл предполётной проверки
Гейт требовал запись в campaign_preflight_runs и был fail-closed, а runPreflight() не вызывался ниоткуда — таблица пустовала, любой запуск блокировался навсегда. Теперь гейт сам проводит проверку по фактическому состоянию кампании; врезка внутри call(), поэтому закрыты все пути запуска.
✓ preflight/yd-collect.ts + врезка в yd-guard; проверено на живом кабинете (91 кампания)
feature
↑ Предполётная проверка перестала давать ложные нарушения
ads.get не запрашивал SitelinkSetId, поля CalloutIds не существует (уточнения в AdExtensions), хеш картинки выдавался за креатив из банка.
✓ на кампании 58516629: было 143 нарушения, стало 73 — все настоящие
feature
↑ Семантика Вордстата сохраняется и привязывается к кампании
Семантику собирали для контекста модели и теряли: отчёт читался и удалялся, номер наружу не отдавался, поэтому проверка считала фразы выдуманными.
✓ yd-semantics.ts + wordstatWithReportId; сквозной прогон: отчёт 1446706021, 22704 показов → проверка видит
feature
↑ Карта механики Директа + самопроверка
docs/YD-MACHINE.md (ловушки полей, устройство гейта, пороги, грабли) и scripts/yd-selftest.mjs, крон понедельник 08:00, расхождения в телеграм.
✓ 9 проверок, прогон зелёный; правило входа вшито в CLAUDE.md проекта и глобальный
feature
Синк кабинета (+77) + защита клиентских
✓ managed_by_ai гейт
feature
Метрика: счётчики/цели/reachGoal
✓ мёртвый 56222857 заменён
feature
Пайплайн + 5 скиллов + 8 эталонов
✓ docs/YD-PIPELINE.md
feature
КЗ-кампании v2: 243 фразы, 9 групп
✓ 500р/день каждая
feature
Модерация 14 объявлений + показы
✓ Проверено 09.08 через API: 13 активных объявлений, все в статусе active — отклонённых и заблокированных нет. За 14 дней 336 показов и 9 уникальных обращений. Модерация пройдена, показы идут.
feature
Перепривязка счётчиков старых кампаний
✓ Скрипт yd-fix-counters разбирает 91 кампанию: счётчик по посадочной странице, без --apply только показ. Мёртвый 56222857 в настройках уже не встречается. Четырём черновикам привязан 109681054 (цель 585238631), архивные пропускаются. Одиннадцать кампаний с чужими счётчиками (200476 Пульс цен и др.) не тронуты: кабинет общий, это решение владельца.
feature
РСЯ на оплату за конверсии (10+/нед)
feature
блокS5 · Email-реанимация (2428 лидов)0/3

Цель: Деньги из спящей базы

SMTP-релей (VK порезал SMTP)
feature
DNS: DKIM/SPF в Тильде
feature
Кампания seg:trade 634 (автокарточки)
dry-run → превью → 3/час
feature
ревьюS6 · Оффер-система (107 офферов)10/12

Цель: Сильные офферы по фреймворкам + критик-цикл, персона, 4 длины под площадки; вшито в креативы+лендинг (gated)

Фреймворки+критик+getBestOffer
✓ Фреймворки 4U/ODC/PmPHS/Хормози/BAB/AIDA/FAB + критик-рубрика 0-100 + getBestOffer (генерация→критик→≤3 круга→лучший). Compiled-AI: overall/планка считает код. Ветка sprint-6, 116 тестов зелёные.
feature
Ресерч + база 107 case-backed офферов
✓ 18 verified_case с реальными URL-кейсами, 10 strong_example, 79 framework_template; 7 фреймворков, 15 ниш; seed-offer-bank-v2 на проде (Demo org).
feature
gpt-5-mini + фикс reasoning-ловушки
✓ reasoning_effort проброшен в общий chat() (guard gpt-5/o*), лимиты токенов подняты; nano отвергнут — выдумывал цифры и не ловил их критиком.
feature
Калибровка: outcome-first + персона + критик buyer_outcome_clarity
✓ Критик +7-е измерение (вес 0.22): механика в заголовке («пилот/агент») проваливается. Персона покупателя зашита ДАННЫМИ. Правила: фича→выгода, бей по статус-кво (ChatGPT).
feature
4 длины оффера под площадки
✓ headline≤24 (креатив), adTitle≤40 (Директ), heroOffer≤60 (лендинг-hero), fullOffer≤160 (тело); clampLen по границе слова, без висящих союзов.
feature
differentiation: план Б (узкий угол) + путь для кейсов (план А)
✓ Узкий угол always-on без кейсов (квалификация/ночь-выходные/первая линия). Поле cases течёт в оффер (план А). Потолок ~70% честный для generic-позиционирования.
feature
Движок вшит в креативы+лендинг (gated OFF) + фикс nginx /landings/
✓ ad-creative-generate + generateLanding под флагом useOfferEngine (default off). Демо-лендинг: hero=оффер. Починен nginx location /landings/ (был SPA-заглушка → чёрный экран).
feature
↑ merge sprint-6 → main + рестарт pm2 (deploy)
Флаги useOfferEngine остаются OFF — включение движка на реальной кампании отдельным шагом.
✓ ff-merge sprint-6 → main (686d1da); pm2 restart leadforge-workers+api — online, здоровы. Флаги useOfferEngine OFF, поведение кампаний не изменилось.
feature
↑ Онбординг: захват кейсов клиента → cases (план А)
Вопрос про кейсы в опрос о компании/услугах; кейсы поднимают differentiation. Путь данных готов (loadBusiness читает cases).
✓ orgs PATCH /me + алиас /current (починен 404 сохранения шага «О компании»), принимает cases[] → merge в business_profile.cases (jsonb). Онбординг: поле «Кейсы и результаты» → отправка массивом. Дашборд пересобран, live отдаёт новый билд. loadBusiness читает cases → офферы усиливаются (план А замкнут).
feature
Включить движок на реальной кампании (трата LLM)
Прогнан на живой услуге (gpt-5-mini, 3 варианта, 2 круга, несколько рублей). Работает: критик оценивает по 7 измерениям, слабые уходят на переделку. Нашлось важное — планку 90 не взял ни один вариант, а движок всё равно отдавал «лучший», и креативы с лендингом его брали. Добавлены passed и bar, слабый оффер больше не идёт в рекламу. Включать на кампании имеет смысл после того, как хоть один вариант возьмёт планку.
feature
↑ Офферы не берут планку 90: поднять конкретность и отличие
На прогоне все шесть вариантов провалились по concreteness (20-50) и differentiation (30-60). Причина скорее в исходных данных, чем в модели: без цифр результата и без кейсов оффер нечем сделать конкретным. Проверить на профиле с заполненными cases.
✓ Нашлась причина в коде: критик считал weakest (какие мерки провалены), а код это выбрасывал — на переделку уходил общий список замечаний, и круг за кругом чинилось не то. Теперь переделка получает провалившиеся мерки как требования. Добавлен досмотр кодом до дорогой оценки: общее место в заголовке + ни одной цифры = предсказуемый провал, платить критику незачем. Замер: отличие 47→53, конкретность 56→62, результат покупателя 62→74, лучший 78→79, круги растут 72→75→79. Планку 90 не берёт, и причина честная: при пустых кейсах и выгодах отличаться нечем, а выдумывать запрещено. Движок теперь так и отвечает (blockedBy) вместо молчаливой выдачи слабого оффера — это вопрос к онбордингу. 15 тестов.
feature
Wire + deploy в live
ждёт «да»
feature
планS7 · Roadmap: 1A.2–1A.40/3

Цель: Trigger.dev / KG / Critic

1A.2 Trigger.dev
feature
1A.3 Knowledge Graph
feature
1A.4 Critic
feature
В РАБОТЕS8 · Avito: машина роста Ф1 + песочница + vision-судья17/18

Цель: Автономный A/B-рост объявлений + офлайн-тренажёр агентов + критик картинок

2 объявления в эфир: «Дашборд с ИИ» 150к + «ИИ-директолог» 75к
Карусели 6 карточек через Kie gpt-image-2-text-to-image; INSERT avito_ad_map + rebuildFeed; на живом аккаунте 408820630
✓ Карусели 6 карточек через Kie gpt-image-2-text-to-image; INSERT avito_ad_map + rebuildFeed; на живом аккаунте 408820630
feature
Ф1-execute: автономная генерация A/B
growth-loop генерит предложения (текст OpenRouter / картинки Kie) → ready_to_apply → apply-proposals (критик+спенд-гейт) → measure (вердикт+урок). Флаг AVITO_GROWTH_AUTOAPPLY (ВЫКЛ), капы 2/запуск+40р/сут, дедуп, контакт-гард. apply/measure расширены на cover/carousel
✓ growth-loop генерит предложения (текст OpenRouter / картинки Kie) → ready_to_apply → apply-proposals (критик+спенд-гейт)
feature
Дизайнер: текст в safe-area
Заголовок смещён в центр (верх/низ 15% режутся в превью-рубрике). Фикс coverPrompt/carouselPrompt
✓ Заголовок смещён в центр (верх/низ 15% режутся в превью-рубрике). Фикс coverPrompt/carouselPrompt
feature
Песочница v1: офлайн-турнир агентов
ген→3 судьи→адверс.критик→self-play→дистилл в avito_playbook. 1-й прогон 2 сферы: 12 уроков + правила формата, ~$0.15. Сжали недели тестов в минуты
✓ ген→3 судьи→адверс.критик→self-play→дистилл в avito_playbook. 1-й прогон 2 сферы: 12 уроков + правила формата, ~$0.15. С
feature
Vision-судья на картинки (OpenRouter multimodal)
Построен, ловит off-topic/кринж/чужой стиль (6/10 брак на живом create-mquiy4b7, выцепил кросс-объявленческое замешивание). Осталось вшить в growth-loop+apply+разовый проход
✓ Судья gpt-4o+detail:high встроен ПЕРЕД avito_add_image (junk → отказ + удаление файла), в критерии добавлены не-русский текст и выдуманные домены. Коммит 2771e23.
feature
Почистить мусорные карусели старых объявлений
Старые объявления с шаблонными зелёными картинками (опечатки, чужие лица) — пересобрать начисто в неон-стиле по теме ПЕРЕД A/B
✓ Карусели живых объявлений вычищены: убраны англ. инфографика и фейк-домен, дубли, восстановлена обложка Дашборда, обложка Консультации взята из банка (0 руб). В фиде 4 объявления, офферы первыми, дублей нет.
feature
Связать песочницу с продакшеном
Паттерны success/failure из playbook + бан-жаргон → в промпт генератора заголовков (сейчас приор только считает уроки, не подаёт текст)
✓ Приоры складывали уроки песочницы и замеры в эфире поровну: шесть выводов симуляции весили как шесть замеров. Теперь прод полновесно, песочница со своей уверенностью 0.35, при расхождении побеждает эфир; где замеров нет, подсказка прямо говорит «это догадка». На живых данных по заголовкам было 7✓/6✗ (замер один из тринадцати), стало 3✓/2✗.
feature
Включить AVITO_GROWTH_AUTOAPPLY
После тренировки в песочнице + чистки каруселей — включить автономку
feature
↑ Карта механики Авито + самопроверка
Механику разбирали трижды с нуля. docs/AVITO-MACHINE.md + scripts/avito-selftest.mjs, крон, алерты.
✓ самопроверка ловит расхождения; правило входа в CLAUDE.md + скилл avito-work
feature
↑ Продвижение: найдено, что оно не включалось ни разу
Все 102 объявления стояли AdStatus=Free. Услуг x2/x5/x10 в категории услуг больше нет — там аукцион цены просмотра; минимальная ставка 42 ₽ даёт нулевой прогноз показов.
✓ лестница ставок на cpxpromo setAuto/setManual, пороги в коде; тест 2100 ₽/нед на «Дашборде»
feature
↑ Связка объявления с номером Авито (объявления были невидимы для машины)
После публикации через фид avito_item_id оставался пустым — механизма связки не существовало, поэтому не работали статистика, ставки, лестница, сверка и снятие.
✓ lib/avito-link-ids.ts в status-sync; связано 8 из 8, самопроверка показывает 11/11
feature
↑ 8 продуктовых объявлений опубликованы
Позиционирование владельца: разрабатываем ИТ-продукты с ИИ, разовые агентские услуги не берём. Разнесены по четырём подкатегориям вместо одной.
✓ все 8 активны и управляемы из кода; 30 черновиков-клонов снесены
feature
↑ Ф0. Триаж + нормы (keystone)
yd_norms (базлайны/пороги по нише, обучение baseline), дневной код-гейт в yd-analyst.worker: норма→ИИ не зовём (0 токенов), аномалия→триггер сбора. Гейт холодного старта. Немедленный алерт на выброс расхода.
✓ Ф0 LIVE. yd_norms (нормы/пороги, RLS, сид отказа: КЗ<78 freemium, MV/LF<55 b2b) + learned baseline (mean±2σ из снапшотов, cpl/cpc/ctr/spend). yd-triage.ts: воронка из ad_analytics_snapshots + отказ из Метрики (per-counter токен из metrica_counters), cold-start гейт (моложе 7д ИЛИ <100 кликов/14д), детект аномалий, spend-алерт (sendAlert critical), запись в yd_insights period.kind=triage. Вшит в дневной крон 09:00 MSK (до apply 11:00). Попутно фикс латентного бага: getCampaigns не просил CounterIds → отказ был слеп и в weekly insights. Тест: КЗ отказ 76.3%<78=норма (ИИ не зван), MyVision АНОМАЛИЯ отказ 77.1%>55 (записана), LeadForge cold-skip. aiCalls=0. Числа только кодом.
feature
↑ Ф1. Замкнуть петлю
Контракт HYPOTHESIS аналитик→директолог, запись правки как yd_experiment + before_state, двугоризонтный вердикт (T+1 отказы/трафик, T+3..7 CPL/конверсии) + guardrail-метрики, откат при регрессии.
✓ Ф1 LIVE (queue-only, деньги-гейт). Замкнута петля: аномалия(триаж)→разрезы(analyzeDimensions)→ГИПОТЕЗА(ИИ chatJSON, только на аномалии, кормится числами кода)→автономия→safe+reversible применить+эксперимент ИЛИ очередь yd_actions на аппрув. Вердикт (расширен yd-experiment-evaluate): 2 горизонта (fast отказы/трафик T+1, slow CPL/конв T+3..7), guardrail (трафик не умер), ОТКАТ при регрессии (revertAction по before_state). Файлы: yd-hypothesis.ts, yd-loop.ts, +evaluateLoopExperiment/bounceWindow в evaluate-воркере. Крон yd-loop-daily 09:30 MSK. Money-gate: YD_LOOP_AUTOAPPLY по умолчанию OFF → всё в очередь на аппрув, живые кампании авто НЕ меняются; включение флага = safe+reversible авто. Попутно: фикс getCampaigns (NegativeKeywords — read-modify-write минусов не перезатирается), приоритет loop-эксперимента в выборке вердикта (бэклог 461 не голодит). Проверено: гипотеза на MyVision (отказ 77%→add_negatives с реальным мусором), вердикт улучшение→winner / регресс→откат(reverted=true, no-op), queue-only прогон положил гипотезу в yd_actions.
feature
Ф2. База уроков yd_playbook
niche·symptom·diagnosis·action·outcome·confidence. Каждый закрытый эксперимент пишет строку. Приор перед LLM (компиляция) — режет токены.
✓ yd_playbook под RLS + запись урока при закрытии эксперимента (обе ветки вердикта) + чтение ДО модели. Накопился уверенный ответ — гипотеза берётся из базы без вызова ИИ (компиляция). Нет ответа — модель зовём, но передаём грабли: что уже проваливалось. Уверенность считается кодом по доле побед и объёму (порог 0.7 при 3+ наблюдениях), а не называется моделью. Проверено пятью случаями.
feature
Ф3. collectFullReport() — кнопка полной таблицы
Переиспользуемая КОД-функция (не ИИ), вызывается при любом разборе: разрезы аудитории/ключи/запросы/площадки/офферы/объявления/креативы/время/гео/устройство со всеми метриками. Разметка строк работает/мало данных/плохо. + недельный режим.
✓ Девять разрезов одним вызовом, каждая строка размечена работает/мало данных/плохо кодом, а не моделью. Недельный режим — то же окно в 7 дней. Нашлось: отчёты запрашивались разом, Директ ставил часть в очередь, и «готовится» принималось за «пусто» — объявления молча терялись. И пустой разрез теперь объясняется, а не читается как «проблем нет». 7 тестов.
feature
Ф4. Создающая сторона A/B
Заведение контролируемых тестов: новое объявление/группа/ключи из Вордстата. Bandit (комбинаторные) vs Директ.Эксперименты/holdout для измерения лифта.
✓ Способ выбирается предметом: креативы — комбинаторные (площадка перебирает быстрее нас), ставки/стратегия/посадочная/аудитория — только с контрольной группой. Без контроля тест не заводится: это была бы правка под видом эксперимента. Вердикт осторожный — меньше 100 кликов или 5 обращений молчим, разница меньше 10% это шум. Итоги подводятся вместе с экспериментами, урок уходит в базу знаний. 8 проверок.
feature
Ф5. Эскалация/алерты
Немедленный алерт (TG) на расход/обнуление конверсий/0 показов. Эскалация человеку после N кругов без нормы.
✓ yd-escalation: три тихие беды, которых не видно по расходу — показы обнулились (кампания активна, денег не тратит, никто не замечает), конверсии обнулились при живом трафике (платим за клики без заявок), петля крутится вхолостую. Плюс остановка авто-правок после N кругов без результата: isLoopStuck спрашивается ПЕРЕД разбором. Всё считается кодом, крон 09:40 МСК, молчит когда всё в порядке. Проверено на подставных данных: 3 из 3 находок, здоровая кампания не задета.
feature
готовS9 · S1. Лиды клиента — клиенту4/4

Цель: Заявка с формы клиента попадает в ЕГО компанию и падает ему в телеграм. Фундамент SaaS-разделения.

Ключ формы у каждой компании (capture_key) + роутинг в capture.ts
✓ organizations.capture_key + роутинг в capture.ts. Проверено боем: с ключом → компания клиента, без ключа → мы, левый ключ → мы (не падает).
feature
Привязка телеграма клиента по коду (/start <код>) → chat_id компании
✓ Код в кабинете (POST /orgs/me/notify/telegram-code) + /start lfXXXXXX в боте пишет chat_id компании.
feature
Карточка лида уходит владельцу компании, а не нам
✓ capture шлёт карточку в чат компании; чат не привязан — падает нам, чтобы заявка не потерялась.
feature
Проверка: лид клиента виден только ему (пен-тест изоляции)
✓ Проверено входом в кабинет живой тестовой компанией: клиентское меню без внутренней кухни, панель уведомлений отдаёт свой ключ и код, привязка чата + заявка по ключу легли в компанию клиента.
feature
готовS10 · S2. Свои ИИ-агенты у каждого клиента4/4

Цель: При заведении компании создаётся её собственный набор агентов — копии наших эталонов, с настройками под её бизнес.

Эталонный набор агентов (шаблон из нашей орги, 9 шт)
✓ Девять ролей перенесены из нашей орги как эталон, а не копия: копия притащила бы клиенту наши тексты, цены и запреты.
feature
Клонирование агентов при создании компании
✓ Заводятся при регистрации черновиками. Повтор не плодит дублей, а обновляет настройки. Ошибка заведения не роняет регистрацию. Проверено живой регистрацией: 9 из 9.
feature
Настройки под клиента из онбординга: тон, офферы, о чём нельзя говорить
✓ configFor подставляет тон, офферы, услуги, гео и запреты из бизнес-профиля и брифа. Чего нет — помечается «не хватает», а не выдумывается.
feature
Изоляция знаний: агент клиента не видит наши базы
✓ Агенты живут под RLS компании; проверено на временной компании — агенты других компаний не видны.
feature
готовS11 · S3. Реклама клиента в его кабинетах4/4

Цель: Клиент подключает свои кабинеты, кампании реально запускаются.

Кабинеты per-org (ad_accounts + провайдер + экран)
feature
Починить preflight: кампанию сейчас НЕЛЬЗЯ запустить
✓ Гейт сам запускает предполётную проверку в assertYdCallAllowed — закрыты все 4 пути запуска. Ложные нарушения убраны (SitelinkSetId, CalloutIds, хеш картинки): было 143, осталось 73 реальных.
feature
Гео и бюджет из брифа клиента вместо хардкода
✓ Посадочная, счётчик Метрики и гео берутся из данных компании и брифа. Раньше всё трое были зашиты на наши сайты и на Москву с Петербургом. Нет сайта или счётчика — бриф уходит в blocked с причиной, а не собирает кампанию не туда.
feature
Проверка баланса кабинета перед запуском
✓ Три исхода вместо двух: хватает — запускаем, пусто — блокируем, неизвестно — предупреждаем но пропускаем. Блокировать запуск потому, что площадка не отдала цифру, значит наказывать клиента за устройство чужого API. Выяснено по факту: у Директа accounts.get в v5 не существует, AccountManagement в v4 требует подключённого общего счёта, Funds при SHARED_ACCOUNT_FUNDS остатка не содержит. Авито отдаёт аванс.
feature
готовS12 · S4. Контент и SEO под клиента (слит в S17)0/1

Цель: Контент-машина и лендинги работают на сайт клиента, а не только на наш.

Контент-машина per-org (сейчас только наш контур на cfru)
✓ дубль: то же самое в S17 «Перенести механику из bo-seo-team.mjs в мультиарендный вид»
feature
готовS13 · S5. Приёмка SaaS3/3

Цель: Проверка изоляции на живых клиентах + тариф и лимиты.

Пен-тест изоляции на 2 живых компаниях
Автопроверка scripts/lint-tenant-isolation.sh гоняется и после правок чистая (кроме наших разовых скриптов и сборки). Осталось живьём: пен-тест на двух реальных компаниях, когда заведём клиента.
✓ scripts/pentest-isolation.sh: две компании через настоящий API, вторая пытается достать данные первой. 8 из 8 — лиды, счётчик Метрики, кабинеты, очередь решений, рекламный расход, фид, подмена компании заголовком, запрос без токена. Гонять перед заведением каждого клиента, денег не тратит.
feature
Лимиты и тариф: что входит, где стоп
✓ Таблица ai_usage: расход пишется внутри chat() и на каждой готовой картинке, компания берётся из контекста выполнения. Цены статикой в коде, подписочный Клод по нулю, незнакомая модель помечается. Точность 4 знака (при двух тысячи дешёвых вызовов давали ноль). Потолок себестоимости в тарифах: trial 500, start 1500, business 4500, pro 12000, enterprise 40000 руб/мес; компания сверх потолка пропускается обходом целиком. Клиенту цифры не видны: /admin/usage под операторским ключом. 10 тестов прайса + 9 сквозных проверок.
feature
Снять заглушку crm-sync или реализовать amoCRM/Битрикс
✓ Настоящая выгрузка заявок: Битрикс24 через входящий вебхук, amoCRM через долгоживущий токен (сделка+контакт одним запросом). Защита от дублей с двух сторон: поиск карточки по телефону и почте, номер заведённой запоминается в enrichment_data. Сломанный доступ (401) отключает интеграцию, а не повторяется вечно. Приём ИЗ CRM отвечает честным отказом. Два пути: кнопка в кабинете и обход каждые 30 минут. Доступ проверяется при подключении. 12 сквозных проверок.
feature
В РАБОТЕS14 · План развития платформы (волны 1-7)12/16

Цель: docs/PLATFORM-PLAN.md: стабильность рекламы, очередь решений, качество, MCP, ВК, лендинги, тарифы

Волна 1. Стабильность рекламы: запуск Директа разблокирован
✓ Гейт сам гоняет предполётную проверку, ложные нарушения убраны, карта YD-MACHINE.md + самопроверка по крону
feature
Волна 2. Единая очередь решений (таблица decisions)
✓ Авито (лестница+стратег) и Директ (запуск через предполётную) пишут в одну таблицу; замер раз в 6 ч; GET /api/v1/decisions/*; карта docs/DECISIONS-QUEUE.md
feature
Волна 2 хвост: перенести ВК в очередь решений
У канала пока нет своих решений о тратах — переносить будет что после запуска ВК
✓ vk-decisions.ts: запуск ВК попадает в единую очередь, отказ гейта ложится в gates того же формата, что у Авито и Директа. Проверено — заблокированный запуск виден в сводке как rejected с недельной суммой.
feature
Волна 2 хвост: честный замер для Директа
Сейчас каналы кроме Авито закрываются пометкой «замер вручную». Нужен разбор статистики кампании против baseline
✓ Решения Директа замеряются по снимкам за неделю против baseline: обращение подешевело, подорожало или не сдвинулось. Отдельно оговорён случай «нечего мерить» — не выдумываем вердикт при нулевом расходе.
feature
Волна 3. Качество как отдельный слой
Текстовые правила вынесены в quality/ad-text-rules и подключены к Директу и Авито. Осталось: судья картинок и банк креативов.
✓ Слой качества собран: судья креативов в общем пакете (Авито, Директ, ВК) с правилами по каналам, текстовые правила ad-text-rules, критик ВК с дешёвой проверкой текста до дорогого разбора картинки, досмотр офферов кодом. Проверено на живом объявлении и 12+15 тестами.
feature
Волна 4. Клиентские инструменты через MCP
✓ MCP-сервер на /api/v1/mcp (JSON-RPC: initialize, tools/list, tools/call). Пять инструментов: заявки по источникам, расход на рекламу, кампании, очередь решений, предложение изменения. Предложение НЕ выполняется — ложится в очередь со статусом proposed. Инструментов, тратящих деньги или меняющих живые кампании, нет намеренно. Себестоимость для нас не отдаётся. Ключ выдаётся в кабинете, показывается один раз, в базе только sha256; новый ключ отзывает старый. 7 проверок на живом сервере, включая изоляцию между компаниями.
feature
Волна 5. ВКонтакте как полноценный канал
✓ ВК доведён до канала: клиент нового кабинета ads.vk.com, гейт трат обоих кабинетов, лид-формы и автосбор заявок, аудитории и счётчики ретаргетинга, плюс стратег кампаний (план из брифа, число групп от бюджета, порог обучения 300 руб/группа, доли считает код) и критик креативов. Пустой бриф не превращается в выдуманный план. 12 проверок. Остаётся прогнать самопроверку на реальных доступах клиента.
feature
Волна 6. Лендинги под кампанию
✓ Страница собирается из обещания кампании: заголовки объявлений и запросы идут в задание, hero повторяет обещание теми же словами. Связка кампания-страница в campaign_landings, заявки считаются по метке кампании. Попутно вычищено: в подвале было наше имя и «auto-generated by LeadForge AI»; счётчик Метрики брался мимо настройки клиента; generate_landing и generate_proposal звались без orgId (страница и КП собирались по данным чужой компании); маршрут был прибит к SYSTEM_ORG_ID; убран мёртвый /public/lead-capture, который при переформатировании файла включил бы приём заявок без ключа в первую попавшуюся компанию. 7 проверок.
feature
Волна 7. Тарифы и квоты
Перенесено в конец по решению владельца
✓ Таблица ai_usage: расход пишется внутри chat() и на каждой готовой картинке, компания берётся из контекста выполнения. Потолки себестоимости в тарифах (trial 500, start 1500, business 4500, pro 12000, enterprise 40000 руб/мес), компания сверх потолка пропускается обходом целиком. Клиенту цифры не видны: /admin/usage под операторским ключом. 10 тестов прайса + 9 сквозных проверок.
feature
ТЕСТ dueDate
✓ Тестовая задача, заводилась для проверки механики сроков. Закрыта как мусорная.
check
↑ Свой кабинет Директа вместо общего с Пульс Ценами
Лимиты Директа считаются на логин: 1000 отчётов Вордстата в сутки делятся с чужими инструментами в том же кабинете e-16707300. Плюс правило «MV/LF не палить» в общем кабинете. Отдельный кабинет снимает и то, и другое; per-org кабинеты в ad_accounts уже поддержаны.
decision
Заявка на отдельный Wordstat API (api.wordstat.yandex.net)
Отдельный бесплатный API со своей квотой на OAuth-токен, не ест тысячу Директа. Нужна заявка в поддержку Директа с логином и ClientId приложения. Снимает потолок на сбор семантики для клиентских кампаний.
decision
Ключевые цели Метрики на кампаниях: выбрать стратегию
Счётчики на кампаниях есть, PriorityGoals пусты. Постановка целей осмысленна вместе со сменой стратегии: сейчас WB_MAXIMUM_CLICKS (максимум кликов). Решение владельца: остаться на кликах или переводить на конверсии по цели формы.
feature
Волна 3. Качество текста в общий пакет
✓ quality/ad-text-rules: обещания и внешние контакты запрещены везде, англицизмы — замечание, длины только там, где подтверждены. Директ получил проверку ad_text_quality, критик Авито перешёл с копии на общие правила. 15 тестов.
feature
Волна 3 хвост: судья картинок и банк креативов в общий пакет
Текстовые правила вынесены. Осталось vision-судья (сейчас в avito-ad-critic) и банк креативов — их ждут ВК и Директ.
✓ Судья креативов переехал в packages/ai/src/quality/creative-judge — теперь общий для Авито, Директа и ВК. Правила по каналам разведены явно: у Авито важен порядок слайдов, у Директа связь картинки с заголовком, у ВК считываемость за секунду. Без картинок возвращает null и не тратит вызов модели. Проверено на живом объявлении: вердикт publish, 6 картинок, стиль единый.
feature
Статистика объявлений Авито пишется только для нашего кабинета
Найдено 19.08. Поля last_stats_views, last_stats_contacts и версии _7d в avito_ad_map заполняются единственным местом — apps/api/src/index.ts, где организация зашита константой ORG = 92f39df0 (наш кабинет). Для ISKRA и любого следующего клиента они пустые. ПОСЛЕДСТВИЯ: авто-улучшение объявлений сортирует кандидатов по COALESCE(last_stats_views_7d, 0), и при сплошных NULL это выбор наугад, а не «худшее объявление». Истории по объявлениям клиента нет вовсе: дневной таблицы статистики Авито в базе не существует, кабинет показывает цифры только на лету из API. ЧТО НУЖНО: сбор по всем организациям через forEachOrg на расписании плюс дневная таблица, иначе динамику объявления показать нечем, а тесты рубрик меряются вручную.
feature
В РАБОТЕS15 · Проверки по сроку51/54

Цель: Задачи вида «через неделю посмотреть, сработало ли». Срок на задаче (dueDate), напоминание в ТГ раз в сутки.

↑ Авито: цена обращения по двум циклам продвижения (2800 ₽)
Цель владельца — 500-700 ₽ за лид. Если выйдет дороже 1500 ₽, лестница сама снимет продвижение. ssh aitodo "docker exec lf-postgres psql -U leadforge -d leadforge -c \"SELECT object_ref, cost_rub, outcome FROM decisions WHERE channel='avito' AND status='measured';\""
✓ За 14 дней 9 уникальных обращений. При заявленных 2800 руб за два цикла это 311 руб за обращение — вдвое дешевле цели 500-700 руб. ВАЖНО: история операций Авито за те же 14 дней показывает лишь 550 руб с пометкой «Продвижение» плюс 3000 руб подписки; цифра 4900 руб/нед по API не подтверждается. Если реальная трата 550 руб, обращение стоит 61 руб. Точную сумму продвижения видно только в кабинете.
check
↑ Очередь решений: замер отработал, ничего не застряло
Если решения висят в applied после срока — крон замера сломался и молчит. ssh aitodo "docker exec lf-postgres psql -U leadforge -d leadforge -c \"SELECT status, count(*) FROM decisions GROUP BY status;\"" Карта: docs/DECISIONS-QUEUE.md
✓ Проверено 09.08: applied 3, proposed 2, rejected 1. Старше 10 дней в applied/gated нет ничего — замер не сломан. Самое старое applied от 08.08, окно замера ещё не наступило.
check
↑ Директ: разобрать 73 нарушения предполётной по «Ретаргетинг»
Пока не закрыты — кампанию не запустить, гейт держит. ssh aitodo "cd /mnt/docker-data/leadforge-ai && set -a && . ./.env && set +a && node scripts/yd-selftest.mjs" Карта: docs/YD-MACHINE.md
✓ Разобрано: 4 из 5 видов нарушений оказались ложными (номера объявлений теряли точность, не запрашивались BiddingStrategy и PriorityGoals, минус-слова сверялись построчно против нормализованной формы Директа). Кампания «Ретаргетинг» — чужая архивная из общего кабинета Пульс Цен, чинить её незачем. Настоящая мишень — 8 наших (LF): у кандидата 712889425 осталось 2 нарушения, оба требуют решения владельца.
check
Авито: значения Specialty для 5 объявлений в запасных категориях
Проверено 09.08: справочника Specialty нет ни в одном машинном виде. API: /autoload/v1/user-docs/node/, /core/v1/items/categories, /autoload/v2/categories — все 404. Файлы автозагрузки all.xml, tree.xml, Goods.xml — 404. Страница шаблонов отдаёт только ссылку в поддержку. Значение достаётся ГЛАЗАМИ из формы подачи объявления в кабинете — действие владельца, кодом не обходится. Записано в docs/AVITO-MACHINE.md, не исследовать заново.
✓ Решено 13.08 другим путём. Справочника Specialty в API действительно нет, но значение берётся с ЖИВОГО объявления клиента: страница отдаёт ботам 439, поэтому открывать браузером (Playwright) и читать блок параметров. Так получены все поля для пошива формы: Specialty Пошив одежды, Sewing Крупный, Materials, ProvidesMaterials, Prepayment, WorkExperience, WorkWithLegalEntities. Записано в docs/AVITO-MACHINE.md и в память iskra-avito-autoload-blocked.
check
Авито: аванс не кончился (продвижение ест 4900 ₽/нед)
ПРОВЕРЕНО 10.08. Аванс 1610.94 руб (было 2032 на 09.08, 3274 на 08.08). Фактический расход за 14 дней: 4414 руб — подписка 3000, продвижение 1090 (550+540), целевые действия 324. В среднем 315 руб/день, аванса хватит примерно на 5 дней. Цифра «4900 руб/нед» НЕ подтвердилась: продвижение стоит около 550 руб/нед. ОТДАЧА за 14 дней: 291 показ, 7 обращений, из них 6 — на объявление «Поиск партнера в ит стартап» (создано руками, машиной не управляется, не про услуги). Наши управляемые объявления дали 1 обращение. Последние 6 дней (04–09.08) — ноль обращений. 9 из 11 объявлений без обращений вообще. ЖДЁТ РЕШЕНИЯ ВЛАДЕЛЬЦА: (1) снять продвижение и не жечь аванс, (2) менять рубрики и офферы — показов 18/день на 11 объявлений, нас просто не находят, (3) оставить и смотреть ещё неделю. Проверка: ssh aitodo "cd /mnt/docker-data/leadforge-ai && set -a && . ./.env && set +a && node scripts/avito-selftest.mjs"
✓ Проверено 14.08: аванс 2698.82 руб, кабинет пополнили (было 1610 на 10.08). Кошелёк 1767 руб так и не переведён в аванс - сам он не тратится. Объявлений 18 активных, 5 из них вне управления автозагрузкой.
check
↑ Директ: дозамерить семантику 5 кампаний (упёрлись в суточный лимит Вордстата)
Прогон 09.08: замерено ранее 3 кампании, к замеру 5. На второй кампании (712700771, 236 фраз, 24 отчёта) снова упёрлись в суточный лимит Вордстата — он уже был израсходован сегодня. Замер возобновляемый, продолжит с этой кампании. ssh aitodo "cd /mnt/docker-data/leadforge-ai/apps/workers && node --env-file=/mnt/docker-data/leadforge-ai/.env --import tsx src/yd-collect-semantics.ts all"
✓ Ночная смена 01-02.10.2026. yd-collect-semantics all: уже было замерено 3 кампании, за ночь добраны остальные четыре — 712700771 (236 фраз, охват 91 652 показа/мес, мёртвых 1), 712700685 (332, 306 756, мёртвых 3), 712450408 (392, 221 841, мёртвых 7), 712387283 (258, 87 595, мёртвых 7). Суточный лимит Вордстата не упёрся, отчёты сохранены в базе.
check
↑ Директ: быстрые ссылки и минус-площадки для 7 остальных кампаний
У кампании 712889425 сделано (5 ссылок с описаниями). Остальные ведут на другие сайты, набор ссылок и якоря нужно проверять по каждому сайту отдельно, вслепую копировать нельзя. РСЯ дополнительно требует минус-площадки: сейчас их нет ни у одной.
✓ Минус-площадки (1030 записей) поставлены 5 нашим сетевым кампаниям; 3 чужие в общем кабинете не тронуты, одна из них работает. Быстрые ссылки поставлены 3 кампаниям без них (Контент-завод, My Vision, LeadForge) — наборы собраны по якорям, снятым с живых сайтов; 2 кампании Пульс Цен пропущены, сайт не наш. Попутно найдена слепота: getCampaigns не запрашивал ExcludedSites, поэтому проверка «стоят ли запреты» всегда видела ноль.
check
ISKRA: блог зашёл в индекс Яндекса и Google
Блог и 2 статьи опубликованы 10.08 на 1skra.ru, в sitemap.xml есть. Проверка: site:1skra.ru/blog в Яндексе и Google; в Вебмастере - Индексирование -> Страницы в поиске. Если через 2 недели ноль страниц - проверить robots.txt (Disallow только /api/), доступность sitemap и отправить страницы на переобход. Заодно посмотреть в Метрике 109572218, есть ли заходы на /blog/.
✓ Проверено 24.08 по свежей выгрузке Вебмастера (9-22 августа, залита в seo_search_positions, теперь 202 запроса против 138). Блог В ИНДЕКСЕ: раздел /blog/ дал 48 показов за неделю по двум запросам, средняя позиция 8.4. Показы сайта выросли с 5 в день (9.08) до 34 (22.08), запросов в выдаче с 5 до 13-26 в день, средняя позиция держится 7-9. Появились небрендовые коммерческие запросы, которых раньше не было: командная форма на заказ (позиция 5), заявка на спортивную форму (6), спортивная форма с логотипом на заказ (12), экипировка на заказ спортивная (8), форма для тренеров Владивосток на заказ (12). Клики пока редкие, 0-5 в день: позиции во второй половине первой страницы, CTR низкий. Вывод: индексация и видимость работают, следующий рычаг - подъём позиций и заголовки под клик.
check
ISKRA: показать статьи владельцу и после ок опубликовать
Завод делает 2 статьи в день автоматом (10:10 и 16:10 МСК), они копятся в статусе ready и на сайт не уходят - цель публикации намеренно не заведена. К среде накопится 4-6 штук. Проверка: обновить https://myvisionagency.ru/lab/iskra-articles свежими статьями, показать владельцу, получить ок и только тогда публиковать. Команда: psql -c "SET app.current_org_id='a59c3c22-107c-432f-953a-70e679420fbe'; SELECT title, created_at FROM seo_articles ORDER BY created_at;" ВАЖНО: публикатор кладёт плоские .html, а блог собран папками /blog/<адрес>/ - перед публикацией это надо привести к одному виду.
✓ Опубликованы 2 статьи, блог 1skra.ru теперь из 4 штук. По дороге вскрылось три вещи: завод не видел двух ручных статей и написал дубли про ткани (обе отбракованы, ручные занесены в базу); воркер работал на коде 44-часовой давности, поэтому правки каркаса и жанра не применялись; на всём блоге не было счётчика Метрики - трафик не считался с запуска. Всё исправлено, статьи перевыпущены на Sonnet 4.6 (5578 и 5315 знаков против 2400 у gpt-4o-mini).
check
SEO-завод: первые статьи крона на Sonnet 4.6
12.08 модель статей переключена на anthropic/claude-sonnet-4.6 (SEO_ARTICLE_MODEL в .env), воркер перезапущен. До этого gpt-4o-mini упирался в 3200 знаков и не проходил проверку объёма. Кроны: 10:10 и 16:10 МСК. Надо увидеть, что крон реально выпускает статьи, а не падает на проверках, и что уровень держится. Команда: ssh aitodo "docker exec lf-postgres psql -U leadforge -d leadforge -t -A -c \"SET app.current_org_id='a59c3c22-107c-432f-953a-70e679420fbe'; SELECT created_at, status, length(html), title FROM seo_articles ORDER BY created_at DESC LIMIT 4;\"" — свежие должны быть в ready, длиной от 15000 знаков страницы. Смотреть также логи: pm2 logs leadforge-workers --lines 200 | grep seo-article. Публиковать сборщиком iskra_blog.py, память iskra-blog-publishing.
✓ Проверено 13.08: крон на Sonnet отработал вхолостую и вскрыл две поломки, обе мои. Первая - критик Авито блокировал статью за упоминание домена (правило про увод с площадки), хотя статья живёт на сайте самой компании; теперь замечание про домен для статей пропускается, телефоны и почта по-прежнему запрещены. Вторая - отбраковав дубли, я вернул их фразы в очередь, и завод каждый день брал закрытую тему, писал статью и тут же отклонял: 11 и 13 августа так сгорели впустую. Фразы с занятым ядром сняты с очереди (3 штуки), плюс ядро уход теперь ловит слово ухаживать - раньше не ловило, и вторая статья про стирку могла пройти. После правок две статьи написаны с ПЕРВОЙ попытки: 7811 и 7224 знака, по 4 раздела, обложки сгенерировались автоматически.
check
ISKRA Авито: отдача двух новых объявлений
Опубликованы 12.08: 8353601405 хоккей, 8353626334 школа. На старте 6 и 2 просмотра, ноль обращений - первый день, судить рано. Через неделю сравнить с направлениями клиента: в среднем по кабинету 13.5 процента из просмотра в контакт, у флагов 28, у дорогих объявлений по 990 руб всего 2-3. Команда: ssh aitodo 'cd /mnt/docker-data/leadforge-ai/apps/workers && set -a && . /mnt/docker-data/leadforge-ai/.env && set +a && node --import tsx src/scripts/iskra-stats.mjs 7'. Если обращений ноль при живых просмотрах - проверять цену в карточке: гипотеза, что 990 руб отсекает обращения, а 100-150 руб их даёт.
✓ Поглощена более полной проверкой на 21.08: там все пять наших объявлений плюс отдача продвижения. Отдельно два первых смотреть смысла нет.
check
ISKRA Авито: отдача пяти объявлений и продвижения
14.08 залиты три новых объявления (волейбол 8353562259, баскетбол 8353113372, регби 8353655753) плюс два прежних. Все пять по 990 руб - владелец решил цену не снижать. На хоккейное 8353601405 включено продвижение 350 руб/день авто-бюджетом. Аванс клиента был 10059 руб. Смотреть: сколько съело продвижение и дало ли оно обращения против четырёх объявлений без него. Команда: ssh aitodo 'cd /mnt/docker-data/leadforge-ai/apps/workers && set -a && . /mnt/docker-data/leadforge-ai/.env && set +a && node --import tsx src/scripts/ours-avito.mjs'. Продвижение проверять по auto.budgetPenny в getBids - поля isActive там нет.
✓ Проверено 19.08. Продвижение в услуговой рубрике не работает: на хоккейном 8353601405 авто-бюджет 350 руб/день стоял с 14.08 — за неделю НОЛЬ списаний и 20 показов, 1 обращение. Пакетов больше просмотров в услугах нет вовсе, vas/prices отдаёт пять услуг по 1-2 руб. В товарной рубрике пакеты есть: x2_1 150 руб, x5_1 290, x10_1 500. Куплено продвижение x2_1 на футбол 8353542067 и волейбол 8353383502, списано 300 руб с кошелька. Механика записана в docs/AVITO-MACHINE.md: PUT /core/v2/accounts/{uid}/items/{id}/vas_packages телом package_id, старый /vas для пакетов даёт 400.
check
Директ ISKRA: пополнили ли счёт для теста на 15 000
16.08 проверено: на счёте 713437598 (логин directiskra) ноль рублей, деньги не поступали. Кампании настроены под тест и ждут только пополнения: Поиск 5000 руб/нед, РСЯ 2500 руб/нед, итого 7500 в неделю или 15000 за две. Цели проставлены: Оставил заявку (564605606) и Клик на телефон (564605730). Обе кампании в состоянии OFF. Проверка баланса: ssh aitodo 'cd /mnt/docker-data/leadforge-ai/apps/workers && set -a && . /mnt/docker-data/leadforge-ai/.env && set +a && node --import tsx src/scripts/yd-balance-probe.mjs'. Как появятся деньги - включать campaigns.resume и через две недели считать расход делить на конверсии.
✓ Закрыта досрочно: 16.08 деньги на счету обнаружены (24590 руб), кампании Поиск и РСЯ запущены. Дальнейшее отслеживание перешло в проверку про модерацию на 17.08 и итог теста на 30.08.
check
Директ ISKRA: прошла ли модерация и пошли ли показы
16.08 запущены Поиск (713475036) и РСЯ (713475097): State ON, Status MODERATION, 169 объявлений отправлено на модерацию. Проверить что Status стал ACCEPTED и пошли показы. Команда: ssh aitodo 'cd /mnt/docker-data/leadforge-ai/apps/workers && set -a && . /mnt/docker-data/leadforge-ai/.env && set +a && node --import tsx src/scripts/yd-state.mjs'. Если модерация отклонила - смотреть причины по объявлениям через ads.get с полем StatusClarification.
✓ Проверено 16.08 досрочно: обе кампании ACCEPTED, State ON. Показы пошли: Поиск 287 показов / 17 кликов / 451 руб, РСЯ 835 показов / 24 клика / 95 руб, 28 достижений целей. Все цифры уже подтягиваются в кабинет клиента.
check
Директ ISKRA: итог теста на 15 000 — цена заявки
Тест на две недели: Поиск 5000 руб/нед, РСЯ 2500 руб/нед, итого 15000 за 14 дней. Цели для подсчёта: 564605606 Оставил заявку и 564605730 Клик на телефон. Посчитать расход делить на конверсии по каждой кампании отдельно - поиск и РСЯ дают разную цену, усреднять их бессмысленно. Данные: отчёт CAMPAIGN_PERFORMANCE_REPORT с полями Cost и Conversions, либо ad_analytics_snapshots после сбора. Сравнить с целевой планкой владельца 500-700 руб за обращение.
✓ Ночная смена 01-02.10.2026. Дат теста в задаче нет, принял 25.08–07.09 (две недели). Поиск: 17 140 показов, 758 кликов, 18 065 ₽, 6 заявок + 2 звонка — обращение 2258 ₽. РСЯ: 1391 показ, 18 кликов, 2474 ₽, обращений ноль. Итого 20 539 ₽ за 8 обращений = 2567 ₽ против твоей планки 500–700 ₽: в 3,5–5 раз дороже. Если даты теста другие — скажи, пересчитаю одной командой.
check
Авито: что покажет исправленный замер экспериментов
16.08 исправлено измерение: результат мерился окном в 3 дня против базового в 7, из-за чего 365 правок из 389 признаны провальными арифметически. Теперь окно 7 дней, вердикт по доле обращений на просмотр, на малых числах не судим. Проверить: появились ли настоящие победители и сработал ли авто-откат хоть раз (за всю историю ноль откатов при 365 ухудшениях). Команда: docker exec lf-postgres psql -U leadforge -d leadforge -c "SELECT winner, count(*) FROM avito_experiments WHERE applied_at > '2026-08-16' GROUP BY 1;" Разбор: myvisionagency.ru/lab/avito-mehanika
✓ Ночная смена 01-02.10.2026. avito_experiments с 16.08 по 01.10: 184 правки, победителей 31, провальных 137, без вердикта 16; авто-откатов 23 (раньше за всю историю ноль). Исправленный замер даёт настоящих победителей и откатывает ухудшения.
check
SEO ISKRA: новая выгрузка Вебмастера, сравнить позиции
16.08 загружена первая выгрузка Вебмастера по 1skra.ru за 01-14.08: 138 запросов, 261 показ, 42 перехода, у блога 15 показов и позиция 5.7. Через две недели взять новую выгрузку в Вебмастере (Поисковые запросы -> Управление группами -> выгрузка XLSX) и залить, чтобы увидеть динамику позиций после статей. КОМАНДА ЗАГРУЗКИ: 1) Скачать XLSX из Вебмастера 2) Локально: python webmaster-to-json.py && python load-webmaster.py (скрипты в scratchpad сессии 16.08) 3) scp webmaster-load.sql aitodo:/tmp/ && ssh aitodo "docker exec -i lf-postgres psql -U leadforge -d leadforge < /tmp/webmaster-load.sql" 4) Проверить в кабинете: https://24leadforge.ru/app/dashboard/analytics, блок «Поиск и статьи» СМОТРЕТЬ: выросли ли показы у /blog/, появились ли новые запросы, куда сдвинулась средняя позиция.
✓ Сделано 31.08-01.09. Загружена вторая выгрузка Вебмастера (01-29.08, 284 строки, 299 запросов). Динамика: показы за день выросли с 17.9 до 34.2 (до первой статьи 1-7.08 против 8-29.08), запросов с 71 до 238, у блога 15 показов против 53. Появился 161 новый запрос, из них 26 коммерческих без бренда с 2+ показами — 182 показа: заявка на спортивную форму 24, командная форма на заказ 10, изготовление спортивной формы 4. Две заявки пришли из органики, одна по запросу искра производство спортивной формы. Отчёт клиенту: myvisionagency.ru/lab/iskra-otchet-avgust
check
Авито ISKRA: товарная рубрика против услуг — где обращения дешевле
19.08 опубликованы три объявления в товарной рубрике «Спорт и отдых»: футбол 8353542067, волейбол 8353383502, баскетбол 8353161233. Размещение бесплатное, продвижение НЕ включали. Волейбол и баскетбол намеренно повторяют наши же темы из услуг, поэтому сравнение честное: одна тема в двух рубриках. КОМАНДА ПРОВЕРКИ: ssh aitodo, папка /mnt/docker-data/leadforge-ai/apps/workers, скрипт src/scripts/iskra-goods-test.ts (создан 19.08): выводит показы и обращения по трём товарным и двум услуговым объявлениям за период. Запуск: set -a && . ../../.env && set +a && node --import tsx src/scripts/iskra-goods-test.ts ЧТО СЧИТАТЬ: обращений на объявление в товарах против наших волейбола 8353562259 и баскетбола 8353113372 в услугах за тот же период. БАЗОВАЯ ЛИНИЯ (замер 19.08 за 01.08–18.08): наши пять объявлений в услугах получили суммарно 22 показа и 1 обращение за 18 дней — то есть они почти не показываются. Волейбол 3 показа и 1 обращение, баскетбол 1 показ, хоккей 13, спортшкола 3, регби 2. Если товарные объявления дадут заметно больше показов, дело было в рубрике; если столько же — упираемся не в рубрику, а в видимость без продвижения, и тогда следующий шаг другой.
✓ Ночная смена 01-02.10.2026. iskra-goods-test: товары — 3 объявления, 155 показов, 18 обращений, 6,0 на объявление, конверсия 11,6%; услуги — 5 объявлений, 159 показов, 21 обращение, 4,2 на объявление, 13,2%. Товарная рубрика даёт в полтора раза больше обращений на объявление при той же конверсии. Показов в обеих рубриках мало: упираемся не в рубрику, а в видимость без продвижения.
check
Директ ISKRA: помогли ли минус-слова и отключение сетей
21.08 сделано: цена конверсии поднята с 1000 до 1300 руб в обеих кампаниях, добавлено 39 минус-слов (стало 225, было 186). РСЯ была остановлена и по решению владельца возвращена: при оплате за конверсию она не тратит бюджет без обращений, держать включённой ничего не стоит. Работают обе кампании, ретаргет остаётся черновиком, группы не трогали. ДО ПРАВОК: отказы с рекламы 57 процентов при 681 визите, 37 процентов кликов на нецелевых запросах (логотипы 106 кликов и 66 процентов отказов, клубная атрибутика 24 и 67, вышивка 18 и 61, инвентарь 12 и 58). Сети дали 281 визит и ноль обращений. КОМАНДА ПРОВЕРКИ: ssh aitodo, папка /mnt/docker-data/leadforge-ai/apps/workers, set -a && . ../../.env && set +a, затем node --import tsx src/scripts/iskra-bounce.ts 2026-08-21 2026-08-28 и node --import tsx src/scripts/iskra-queries.ts 2026-08-21 2026-08-28 ЧТО СЧИТАТЬ: доля отказов с рекламы должна упасть с 57 процентов, доля нецелевых кликов с 37. Отдельно посмотреть, дали ли сети хоть одно обращение за неделю с чистой семантикой. Если отказы остались высокими, причина в страницах входа: футбольная давала 68 процентов при 241 визите против 46 у производства.
✓ Проверено 28.08. Минус-слова сработали: нецелевые клики упали с 37 до 18 процентов (по делу 389 кликов из 473, отказы там 27 процентов). Отказы НЕ изменились — было 57, осталось 57: причина не в семантике, а в страницах входа (главная 60 процентов при 187 визитах, производство 51 при 102). РСЯ за 16-28.08 дала 414 кликов, 4819 руб и одно обращение — ту самую мусорную заявку 24.08 с кодом +7 124 с площадки Яндекс.Картинки. Площадка запрещена 27.08. Предложено выключить РСЯ целиком. Поиск: 901 клик, 9781 руб, 6 заявок и 1 звонок, обращение по 1397 руб. Разбор: myvisionagency.ru/lab/iskra-analiz
check
Авито ISKRA: что дало продвижение трёх товарных объявлений
24.08 списалось 372 руб (по 124 на объявления 8353161233, 8353383502, 8353542067 в рубрике Спорт и отдых). За сутки 4 просмотра на троих — судить рано, отчётность Авито отстаёт на сутки. Разбор на 25.08: myvisionagency.ru/lab/iskra-avito-razbor — наши услуги дают 1.97 просмотра в день, столько же сколько клиентские, весь отрыв клиента куплен пакетами (9914 руб за 13 дней, 583 руб за контакт). Пакеты клиента истекали 25.08 — проверить, продлил ли. КОМАНДА ПРОВЕРКИ: docker exec lf-postgres psql -U leadforge -d leadforge -c "SELECT c.external_campaign_id, s.date::date, s.spent::int, s.impressions, s.conversions FROM ad_analytics_snapshots s JOIN ad_campaigns c ON c.id=s.ad_campaign_id WHERE c.external_campaign_id IN ('8353161233','8353383502','8353542067') AND s.date > '2026-08-23' ORDER BY 1,2;" Смотреть: выросли ли просмотры против 1.3 в день и появились ли контакты. Цена просмотра выше 20 руб (столько выходит у клиента на пакетах) — продвижение не оправдывается, переходить на пакет vas вместо ставки cpxpromo.
✓ Проверено 28.08. Ставка cpxpromo в товарной рубрике не работала (403 на getBids), поэтому 26.08 куплен пакет x2_7 по 500 руб на три объявления, 1500 руб с кошелька, действует до 02.09. Отдача: просмотры выросли ровно вдвое, с 1.0 до 2.0 в день, и появилось первое обращение — волейбольное 8353383502, 4 просмотра и 1 контакт за три дня. Пока 1500 руб за одно обращение, окончательный счёт 02.09 (заведена отдельная проверка). Семь наших объявлений в услугах: 2.3 просмотра в день, 1 обращение, продвижение там купить нельзя. У клиента пакеты кончились 25.08 и просмотры упали с 42 до 20 в день. Разбор: myvisionagency.ru/lab/iskra-analiz
check
Авито ISKRA: что дал пакет x2 за 1500 руб и фильтр телефона на форме
26.08 куплен пакет x2_7 (до 2 раз больше просмотров, 7 дней) на три товарных объявления 8353161233, 8353383502, 8353542067 — по 500 руб, 1500 руб с кошелька, действует до 02.09 10:36. База сравнения за 12-24.08: эти три давали 1.33 просмотра в день на объявление и ноль контактов. У клиента на пакетах выходило 20 руб за просмотр. КОМАНДА ПРОВЕРКИ (Авито): docker exec lf-postgres psql -U leadforge -d leadforge -c "SELECT c.external_campaign_id, sum(s.impressions) prosm, sum(s.conversions) kont, sum(s.spent)::int rub FROM ad_analytics_snapshots s JOIN ad_campaigns c ON c.id=s.ad_campaign_id WHERE c.external_campaign_id IN ('8353161233','8353383502','8353542067') AND s.date >= '2026-08-26' GROUP BY 1;" Считать цену просмотра: 1500 / просмотры. Дороже 20 руб — пакет не оправдался, брать x5_7 или уходить в услуги. КОМАНДА ПРОВЕРКИ (форма 1skra.ru): python E:/Temp/claude/C--Users-pc/5023dd01-b534-4708-9d97-1bcaead29ee8/scratchpad/get-leads-log.py затем analiz-leads.py Смотреть: появились ли новые причины отбоя phone_not_ru и не отбивается ли что-то живое. Если мусор пошёл с российскими номерами — ставить капчу Яндекса (обсуждали 26.08, отложили).
✓ Проверено 02.09. ПАКЕТ ОПРАВДАЛСЯ: за 26.08-01.09 три товарных объявления дали 72 просмотра и 6 обращений при 1500 руб — 250 руб за обращение, 21 руб за просмотр (у клиента на его пакетах выходило 20 руб, то есть вровень). До пакета те же три давали 1.33 просмотра в день и НОЛЬ контактов, стало 3.4 просмотра в день. Поштучно: 8353161233 — 26 просмотров и 2 контакта, 8353383502 — 28 и 1, 8353542067 — 18 и 3. За ту же неделю все наши 10 объявлений: 89 просмотров, 8 обращений, 1000 руб — 125 руб за обращение при конверсии 9.0 процента. Клиентские 27 по пошиву: 209 просмотров, 15 обращений, 4254 руб — 284 руб при конверсии 7.2 процента. Наши вдвое дешевле и конвертят лучше. ФОРМА: с 27.08 пятнадцать попыток, одиннадцать отбито (10 phone, 1 phone_not_ru), прошло четыре — три живых лида (Наталья 28.08, Софья Егорова 29.08, Решетов Никита 31.08, все с Директа, все в CRM) и один ручной спам про зип-пакеты. Ботов с зарубежных серверов нет ни одного. Капча не нужна.
check
Директ ISKRA: что изменилось после отключения РСЯ
28.08 остановлена кампания РСЯ 713475097 (ACCEPTED/SUSPENDED). База для сравнения за 16-28.08: поиск 901 клик, 9781 руб, 6 заявок и 1 звонок, обращение 1397 руб; РСЯ 414 кликов, 4819 руб, одно мусорное обращение. Поиск в недельный лимит не упирается: 5267 руб при разрешённых 10000. КОМАНДА ПРОВЕРКИ: ssh aitodo, /mnt/docker-data/leadforge-ai/apps/workers, set -a && . ../../.env && set +a node --import tsx src/scripts/iskra-yd-full.ts 2026-08-28 2026-09-04 ЧТО СЧИТАТЬ: выросло ли число обращений на поиске после отключения сети и не подорожало ли обращение. Если поиск так и не выбирает 10000 руб в неделю, обсудить с владельцем подъём цены конверсии с 1300 руб — это единственный рычаг объёма при оплате за конверсию.
✓ Ночная смена 01-02.10.2026. iskra-yd-full 28.08–04.09: Поиск 10 295 показов, 417 кликов, 13 291 ₽, 5 заявок + 1 звонок, обращение 2215 ₽; РСЯ 30 показов, 0 ₽. Против базы 16–28.08 (поиск 1397 ₽ за обращение): обращений чуть больше в день (0,75 против 0,54), но каждое дороже на 60%. Поиск за 8 дней съел 13 291 ₽ — в недельный лимит 10 000 он уже упирается. Решение владельцу: поднимать ли цену конверсии или вернуть РСЯ с чисткой площадок.
check
research-daily: сработал ли прогон 1 сентября без дублей
28.08 переделан research-daily. Было: сбор источников внутри forEachOrg, одни и те же 9 статей пересказывались на каждую из 108 организаций — 972 запроса к LLM в сутки, 1107 находок при 418 уникальных заголовках, около 45 руб/день (COST-MODEL.md закладывал 14). Стало: источники разбираются один раз за прогон, находки раскладываются по org отдельным шагом, дедуп по source_url, расписание 1 и 15 числа в 22:00 МСК, окно дайджеста расширено до 15 дней. Первый прогон по новой схеме — 1 сентября 19:00 UTC. КОМАНДА ПРОВЕРКИ: ssh aitodo "pm2 logs leadforge-workers --lines 400 --nostream | grep -i 'Sources parsed once'" ssh aitodo "docker exec lf-postgres psql -U leadforge -d leadforge -At -c \"SET row_security=off; SELECT created_at::date, count(*), count(DISTINCT title), count(DISTINCT org_id) FROM research_findings WHERE created_at > '2026-09-01' GROUP BY 1;\"" ЧТО СЧИТАТЬ: в логе должна быть строка Sources parsed once for all orgs со счётчиками articlesFetched и skippedAlreadySeen. Число запросов к LLM за прогон должно быть не больше числа новых статей (раньше 972). Если articlesFetched=0 и находок нет — это нормально, значит новых статей в источниках не появилось, дайджест берёт находки за 15 дней. Расход по ai_usage за 1 сентября по cron:research-daily должен упасть с 45 руб примерно до нуля-единиц. ЕСЛИ ПУСТО: проверить, что repeatable-job в Redis жив — docker exec lf-redis redis-cli ZRANGE 'bull:research-daily:repeat' 0 -1 WITHSCORES. Бэкапы прежнего кода лежат рядом: apps/workers/src/lib/research.ts.bak-2026-08-28 и research-extra.ts.bak-2026-08-28.
✓ Ночная смена 01-02.10.2026. research-daily работает по новой схеме: ai_usage по дням — 25-27.08 по 972 запроса и 45 ₽/день, 1 и 15 сентября по 7 запросов и 0,25 ₽. research_findings 01.09: 540 строк, 4 уникальных заголовка, 108 организаций; 15.09: 972/9/108 — находки раскладываются по организациям, а не пересказываются заново. Repeatable-job в Redis есть.
check
ISKRA: упали ли отказы после облегчения страниц и что дало гео
28.08 сделаны две вещи. 1) Гео: добавлены 7 групп Россия (кроме 8 городов), 166 ключей, 15 объявлений на модерации. 2) Страницы: 188 картинок в webp с ресайзом до 1400px, отложенная загрузка на 10 страницах. Футбольная 20.6 МБ -> 0.23 МБ на старте, загрузка 4.8 -> 1.4 сек. БАЗА ДО ПРАВОК (16-28.08, только реклама): всего 996 визитов, отказы 56 процентов. По страницам: football 243 визита и 68 процентов отказов (со смартфона 171 визит, 70 процентов, 7 секунд), basketball 68, volleyball 62, главная 54, production 48. Смартфоны 61 процент против 47 на компьютерах. КОМАНДА ПРОВЕРКИ: ssh aitodo, /mnt/docker-data/leadforge-ai/apps/workers, set -a && . ../../.env && set +a node --import tsx src/scripts/iskra-deep.ts 2026-08-29 2026-09-05 ЧТО СЧИТАТЬ: отказы на /football/ должны уйти заметно ниже 68 процентов, время на странице вырасти с 7 секунд. Если не изменилось — причина не в скорости, а в содержании страницы, и надо смотреть первый экран и оффер. Отдельно: пошли ли визиты и обращения из новых регионов (разрез по городам).
✓ Ночная смена 01-02.10.2026. iskra-deep 29.08–05.09: 189 визитов, отказов 48% (база 56%), глубина 1,2, 34 секунды на визит, 4 заявки + 2 звонка. Отказы ушли вниз на 8 пунктов, время на странице выросло с 7 секунд (мобильный football) до десятков. Разрез по городам скрипт отдаёт сводкой: визиты из новых регионов пошли (152 визита в разрезе «Города»).
check
↑ ISKRA Авито: встали ли три новых объявления и куплено ли продвижение
02.09 опубликованы три объявления нового оформления (живые фото + описание на 3500 знаков): iskra-football-live, iskra-volleyball-live, iskra-basketball-live. Прежние десять не тронуты — опыт в том, чтобы сравнить оформление при одинаковой рубрике, цене 990 и продвижении. На сервере запущено ожидание, которое само купит x2_7 по 500 руб на каждое (1500 всего), если размещение пройдёт чисто. Оно НЕ купит при ошибке 1065 (исчерпан лимит тарифа в товарной рубрике) — так уже было 24.08, деньги тогда вернулись через сутки. КОМАНДА ПРОВЕРКИ: ssh aitodo "cat /tmp/iskra-promo.log" ssh aitodo "cd /mnt/docker-data/leadforge-ai/apps/workers && node --env-file=/mnt/docker-data/leadforge-ai/.env --import tsx src/scripts/iskra-state-before.ts" ЧТО СЧИТАТЬ: в логе должны быть три строки вида 'продвижение iskra-*-live (номер): 200'. Если лог говорит про отказ размещения — разбираться с лимитом тарифа в кабинете руками, API его не отдаёт. ЕСЛИ ПУБЛИКАЦИЯ НЕ ДОЕХАЛА: фид лежит и отдаётся (13 объявлений), ручной запуск выгрузки в кабинете клиента площадка не даёт (403), значит ждать расписание. Прежний фид сохранён: public/org/a59c3c22-107c-432f-953a-70e679420fbe/avito-feeds/avito_feed.xml.bak-2026-09-02 ЧЕРЕЗ НЕДЕЛЮ: сравнить просмотры, обращения и цену обращения нового оформления против прежних десяти. Страница опыта: myvisionagency.ru/lab/iskra-avito-novye/
✓ 07.10: опубликованы 16.09 (не 02.09), x2_7 не покупался; с 16.09 вместо него bbip 150 ₽/день из кабинета на баскетболе и футболе. 03.09–06.10: три live — 328 просмотров / 4 обращения (1,2%), прежние 10 — 263 / 36 (13,7%). Новое оформление проигрывает в 10 раз по обращениям; на bbip двух live ушло ≈6 300 ₽.
⛔ Ночная смена 01-02.10.2026. Три новых объявления разместились и получили номера: football-live 8449732361, basketball-live 8449479084, volleyball-live 8449530584. Но /tmp/iskra-promo.log пуст — ожидание покупки продвижения не отработало, x2_7 не куплено. Прайс продвижения API отдаёт (x2_7 = 500 ₽). Кабинет при этом говорит «активных: 0» — похоже на исчерпанный тариф рубрики (1065). Покупка — деньги, без твоего «да» не трогаю.
check
↑ Блог ISKRA: вышли ли статьи кроном сами (после «ок» на партию 1)
ssh aitodo "python3 /mnt/docker-data/leadforge-ai/scripts/iskra-blog-autopublish.py --status; tail -20 /var/log/leadforge/iskra-blog-publish.log" Ожидание: по одной публикации в 10:10 и 16:10 МСК, статус published, страница 200. Пусто — проверить, что статьи approved.
✓ Да, крон сам выложил все 12 статей партии 1 за 14–20.09 по две в день (лог /var/log/leadforge/iskra-blog-publish.log: 12 строк ОПУБЛИКОВАНО, последняя 20.09 07:10 UTC cveta-kluba-na-forme). Очередь опустела 20.09, а сигнала об этом не было — 21.09 добавлено напоминание Лии о пустой очереди.
check
↑ Директ ISKRA: пополнил ли клиент кабинет, пошли ли показы
ssh aitodo "cd /mnt/docker-data/leadforge-ai/apps/workers && node --env-file=../../.env --import tsx src/scripts/iskra-check-sep.ts && python3 -c \"import json;d=json.load(open('/tmp/iskra-check-sep.json'));print(d['direct']['weeks'])\"" Баланс: iskra-quick.ts (AccountManagement v4). Показов за неделю меньше 3 000 — деньги не пришли.
✓ Пополнено 18.09. С 21.09 (переключение на макс. конверсий с оплатой за клики) 1100-1400 показов/день, 54-66 кликов/день; 21-23.09: 6714 руб, 181 клик, 2 заявки. Недельный лимит 10 000 при таком темпе кончается к четвергу-пятнице.
check
↑ Авито ISKRA: поднялась ли автозагрузка, вернулись ли 5 истёкших объявлений
ssh aitodo "cd /mnt/docker-data/leadforge-ai/apps/workers && node --env-file=../../.env --import tsx src/scripts/iskra-quick3.ts | head -20" Ожидание: started_at свежий в /autoload/v4/uploads, у hockey/school/basketball/volleyball/rugby-team-kit статус active.
✓ Автозагрузка работает, выгрузка раз в час (последняя 24.09 08:18 UTC). Пять истёкших вернулись 14.09, активны до 14.10. НОВОЕ: три товарных (футбол 8353542067, волейбол 8353383502, баскетбол 8353161233) истекли 23.09, продление отбито ошибкой 1065 в «Спорт и отдых» — нужен платный пакет/лимит в кабинете, решение владельца.
check
ВК ISKRA: первые 3 дня кампании 31385948 — показы, заявки, расход
Запущена 18.09 13:35 МСК, 1 800 ₽/день, баланс 20 000 ₽. Проверка: ssh aitodo "cd /mnt/docker-data/leadforge-ai/apps/workers && node --env-file=../../.env --import tsx src/scripts/iskra-vk-launch.ts --dry" (баланс и статусы) + node --env-file=../../.env --import tsx src/scripts/iskra-vk-raw.mjs GET 'v2/statistics/ad_groups/day.json?date_from=2026-09-18&date_to=2026-09-21' (расход/показы/клики по группам) + заявки: GET 'v1/lead_ads/lead_forms/994285/leads.json' или воркер vk-leadforms. Если по группе 0 показов за 3 дня — смотреть issues группы; если CPL > 1 000 ₽ — резать группу.
✓ Прогон monday-ads 21.09: план, 6 групп и 6 объявлений active/delivering/allowed, но за 18–21.09 показов 14, расход 6 ₽ при 6×300 ₽/день; показы только у двух групп по 1–5 в день. Кампания фактически не крутится — разбор ставок/аудиторий отдельной задачей (ждёт решения владельца в докладе 21.09).
check
ВК ISKRA: баланс кончается ~29.09 — итог по цене заявки и решение о продлении
20 000 ₽ при 1 800 ₽/день. Проверка: iskra-vk-launch.ts --dry (баланс) + statistics/ad_groups/day.json за 18–28.09. Свести: расход, заявки из формы 994285, CPL по группам. Владельцу: продлевать ли (клиент пополняет) и какие группы отключить.
✓ Итог: 8 заявок по ~1 500 ₽ за 24–30.09, дешевле Директа (~3 400 ₽). Баланс 01.10 — 7 244 ₽ при 1 800 ₽/день, хватит до ~04.10. Решение о пополнении передано владельцу 01.10. Замер 01.10: apps/workers/src/scripts/iskra-state-1001.ts → /tmp/iskra-state-1001.json.
check
ВК ISKRA после перестройки 21.09: пошли ли показы у 2 групп × 900 ₽
21.09 план 31385948 перестроен: группы 154829656 «Команды и спортшколы» и 154829661 «Форма под заказ и логотип» по 900 ₽/день, 4 старые группы остановлены. До этого 6 × 300 ₽ давали 21 показ за 4 дня. Проверка: ssh aitodo "cd /mnt/docker-data/leadforge-ai/apps/workers && node --env-file=../../.env --import tsx src/scripts/monday-ads.ts" → блок ISKRA/ВК (или /monday-ads). Ожидание: сотни показов в день и расход ближе к 1 800 ₽/день. Если снова единицы — проблема не в бюджете группы, менять аудиторию/цель (переходы на сайт), решение владельца.
✓ Снято проверкой 292090b7: причина была в формате картинки (1 площадка из 22), после 4 форматов показы пошли — 7–14 тыс. в день по двум группам × 900 ₽. Замер 01.10: apps/workers/src/scripts/iskra-state-1001.ts → /tmp/iskra-state-1001.json.
⛔ Замер 24.09: перестройка не помогла. 18-23.09 план 31385948: 144 показа, 0 кликов, 0 заявок, потрачено 72 руб из 1800/день (группа A 99 показов, B 45). Баланс 19 918 руб. Бюджет группы не причина. Ждёт решения владельца: сменить цель на переходы на сайт или расширить аудиторию.
check
Директ ISKRA поиск на оплате за клики: вернулись ли показы и заявки за неделю
21.09 поиск 713475036 переведён с оплаты за конверсии на «макс. конверсий с оплатой за клики», лимит 10 000 ₽/нед, цель «Оставил заявку» (iskra-yd-clicks.ts). До этого 170–250 показов/день. Проверка: /monday-ads (блок ISKRA/Директ) или ssh aitodo "cd /mnt/docker-data/leadforge-ai/apps/workers && node --env-file=../../.env --import tsx src/scripts/monday-ads.ts". Ожидание: 800+ показов/день, расход ~10 000 ₽ за неделю, 2–4 заявки. Если показов по-прежнему мало — смотреть ставки/BidCeiling и семантику, не стратегию.
✓ Показы вернулись (1 000–1 850 в день против 170–250), заявок за 21–24.09 — 4, но 25–30.09 11 182 ₽, 295 кликов и 0 заявок. Форма исправна (leads-log). 01.10 применена докрутка 25.09, дальше проверка «Директ ISKRA после докрутки 01.10». Замер 01.10: apps/workers/src/scripts/iskra-state-1001.ts → /tmp/iskra-state-1001.json.
check
Директ ISKRA: вернуть оплату за конверсии, если набралось ≥10 конверсий за неделю
Через две недели после перевода на клики (21.09). Проверить конверсии по целям 564605606+564605730 за 28.09–04.10 в Метрике 109572218. Если ≥10 за неделю — вернуть: ssh aitodo "cd /mnt/docker-data/leadforge-ai/apps/workers && node --env-file=../../.env --import tsx src/scripts/iskra-yd-clicks.ts --back" (ставит PAY_FOR_CONVERSION_MULTIPLE_GOALS + PriorityGoals 1 300 ₽). Меньше — оставить клики ещё на неделю и сказать владельцу.
✓ Условие не выполнено: максимум 4 конверсии за неделю (21–27.09), 25–30.09 ноль. Остаёмся на оплате за клики, к вопросу вернуться после проверки докрутки 08.10. Замер 01.10: apps/workers/src/scripts/iskra-state-1001.ts → /tmp/iskra-state-1001.json.
check
Блог ISKRA партии 2–3: выходят ли статьи по 2 в день и пишет ли Лия после каждой
Проверка: ssh aitodo "cd /mnt/docker-data/leadforge-ai && python3 scripts/iskra-blog-autopublish.py --status; tail -20 /var/log/leadforge/iskra-blog-publish.log". Ожидание: с даты одобрения владельцем по 2 строки ОПУБЛИКОВАНО в день (07:10 и 13:10 UTC), в Телеграме владельца сообщения от @lia_mytodo_bot «Блог ISKRA: вышла статья…» с остатком очереди. Если сообщений нет — grep telegram /var/log/leadforge/iskra-blog-publish.log и проверить LIA_BOT_TOKEN в .env. Если очередь не одобрена — статьи стоят в ready, ждём «ок» владельца на /lab/iskra-statyi-21/.
✓ Ночная смена 01-02.10.2026. Блог ISKRA выходит по две статьи в день: 25.09–28.09 по две, 01.10 13:11 UTC «ОПУБЛИКОВАНО: forma-dlya-turnira…», залиты blog/index.html, _articles.json, sitemap.xml. В логе 4 строки про отправку в Телеграм — Лия пишет после статьи.
check
ISKRA: пришёл ли недельный отчёт от Лии в понедельник 08:30 и обновилась ли /lab/iskra-nedelya/
Проверка: ssh aitodo "tail -8 /var/log/leadforge/iskra-weekly-report.log" — ожидание: строка ГОТОВО за 28.09 05:3x UTC; в Телеграме владельца сообщение @lia_mytodo_bot «Отчёт по Искре за неделю 21.09–27.09 готов». Страница https://myvisionagency.ru/lab/iskra-nedelya/ с датами 21–27 сентября. Если ОШИБКА — причина в той же строке лога и в сообщении Лии. Крон: crontab -l | grep iskra-weekly.
✓ Ночная смена 01-02.10.2026. iskra-weekly-report 28.09 05:30 UTC: сбор цифр, страница, выкладка на cfru, «ГОТОВО: https://myvisionagency.ru/lab/iskra-nedelya/». Крон отработал в срок.
check
ВК ISKRA: пошли ли показы после 4 форматов картинок
24.09 во все 6 объявлений плана 31385948 добавлены image_600x600, image_1080x1350, image_1080x607 (было только 607x1080 = 1 площадка из 22, стало 19 из 22). Объявления ушли на повторную модерацию. ПРОВЕРКА: ssh aitodo "cd /mnt/docker-data/leadforge-ai/apps/workers && node --env-file=../../.env --import tsx src/scripts/iskra-vk-raw.mjs GET 'v2/statistics/ad_groups/day.json?id=154829656,154829661&date_from=2026-09-24&date_to=2026-09-26&metrics=base'" и vk-preflight.ts a59c3c22-107c-432f-953a-70e679420fbe 31385948 (строка «площадки»). ЖДЁМ: все 6 объявлений moderation allowed, сотни-тысячи показов в день, расход ближе к 1800 руб/день, learning_progress > 0. Если показов всё равно десятки: следующий шаг — группа без интересов (только сегмент), проверка И/ИЛИ сегментов и интересов. Ставки при max_goals не рычаг (max_price 0 = без потолка).
✓ Да. После 4 форматов 24.09: 24–30.09 81 623 показа, 265 кликов, 12 126 ₽, 8 заявок из лид-форм (~1 516 ₽ за заявку). До этого 18–23.09 — 144 показа, 0 кликов. Замер 01.10: apps/workers/src/scripts/iskra-state-1001.ts → /tmp/iskra-state-1001.json.
check
Директ ISKRA после докрутки 01.10: пошли ли заявки и почём
01.10 применена докрутка поиска 713475036 (iskra-yd-tune-0925.ts --apply: минусы 225→250 без «логотип»/«школа», автотаргетинг без конкурентов/сопутствующих/брендов, ПК −50%, 55+ −50%, 45–54 −20%, 18–24 +10%, 45 объявлений → /production/, всем быстрые ссылки и уточнения) и третий вариант в 61 группу (iskra-yd-abc-0925.ts). До: 25–30.09 11 182 ₽, 295 кликов, 0 заявок. Смотреть: заявки и цена заявки за 01–07.10, прошли ли модерацию 61 новое объявление, долю показов на ПК. Если на 6 спортстраниц залит счётчик — видны ли там визиты в Метрике. Команда: ssh aitodo "cd /mnt/docker-data/leadforge-ai/apps/workers && set -a && . ../../.env && set +a && node --import tsx src/scripts/iskra-state-1001.ts" (поменять FROM/TO на 2026-10-01/2026-10-07), объявления: node --import tsx src/scripts/iskra-yd-hrefs-1001.ts
✓ 07.10: 01–07.10 (07.10 неполный) 10 493 ₽, 209 кликов, 4 заявки по цели «форма» ≈2 620 ₽/заявка (до докрутки 25–30.09: 11 182 ₽ и 0). 189/189 объявлений приняты, все 61 новое прошли модерацию. ПК 7,7% показов и 1,1% расхода. Визиты спортстраниц в Метрике видны (хоккей 24, баскетбол 13, футбол 7, волейбол 7). С CRM не сверено. Перепрогон 07.10 13:08 UTC (iskra-state-1007.ts, 01–07.10): 11 118 ₽, 221 клик, 3 135 показов, 4 конверсии по целям 564605606/564605730 (LSCCD) ≈2 780 ₽/заявка; конверсии 01.10, 03.10, 04.10, 06.10 по одной. Неделя 28.09–04.10: 5 191 ₽ / 107 кликов / 3; 05–07.10: 5 927 ₽ / 114 / 1. РСЯ SUSPENDED, ретаргет DRAFT. Визиты с рекламы в Метрике: 95 (нед. 28.09) и 103 (нед. 05.10).
check
Авито ISKRA: в каких из 15 городов встал хоккей (1065 или опубликовано)
01.10 в фид ISKRA добавлены 15 городских копий хоккейного объявления 8353601405 (xml_id iskra-hockey-team-kit-<город>, пакет docs/clients/iskra-data/hockey-goroda/cities.json), фид 28 объявлений. Проверить отчёт автозагрузки: GET /autoload/v2/reports?per_page=2 → /reports/<id>/items — раздел у каждого города («Добавлено» или «Ошибки платного размещения»/1065), номера Авито в /autoload/v4/uploads/last_successful/items, страницы avito.ru/items/<id>. allow_pay_over_limit=false — денег не спишет, города вне тарифа просто не встанут. Итог записать в AVITO-MACHINE.md (размножение по городам через Address) и сообщить владельцу список.
✓ Встали все 15. Отчёт автозагрузки 608896465 (02.10 15:07–16:07 UTC): 28 из 28 «Без изменений», у всех 15 городских копий статус active, сообщения 3002 «Объявление активировалось» и 2303 «автоподстановка телефона», номера Авито присвоены (spb 8425896988 … vrn 8480686357). 1065 нет ни у одного. Денег за размещение не списано: operations_history 01–02.10 — публикации только у трёх объявлений клиента (3×74 ₽), остальное продвижение клиента. Первые просмотры по городам 1–3 в день. У Воронежа в avito_ad_map ещё нет avito_item_id — подтянет сверка.
⛔ Ночная смена 01-02.10.2026. Отчёт автозагрузки Авито 608366818 на момент проверки в статусе processing — площадка ещё не разобрала фид с 15 городскими копиями хоккея. Профиль ISKRA: оплата сверх лимита выключена, почта отчётов logonchek@gmail.com. Проверить утром: autoload-compare.mjs или /autoload/v2/reports/608366818/items — какие города «Добавлено», какие 1065.
check
Авито ISKRA: какая из 4 обложек хоккея в городах даёт больше контактов
Тест обложек hk-city-cover-A/B/C/D (A голубой каток, B бело-оранжевый вечер, C чёрно-жёлтая арена, D голубой раздевалка), каждая в 3–4 городах, раскладка в docs/clients/iskra-data/hockey-goroda/cities.json. Сравнить просмотры и контакты на объявление по обложкам: POST /stats/v1/accounts/414744452/items (uniqViews, uniqContacts) за 02–11.10 по номерам из last_successful/items. Победителя предложить владельцу поставить во все города.
✓ Итог 02–13.10, на объявление (uniqViews / uniqContacts, сверено скриптом apps/workers/src/scripts/iskra-hk-covers.mjs): A голубой каток 6,5 просм / 0,75 конт в 4 городах; D голубая раздевалка 5,7 / 0,67 в 3; B бело-оранжевый вечер 3,3 / 0,25 в 4; C чёрно-жёлтая арена 1,0 / 0 в 4. Объём маленький (единицы просмотров на город), но C явно худшая. Действие по «делай» владельца: C → A в Екатеринбурге 8405954284, Челябинске 8356581513, Краснодаре 8350633269, Волгограде 8492937472 14.10 (avito_ad_map.image_paths[0], остальное не тронуто; B и D тест продолжают). Доказательство: песочница по объявлениям (scripts/avito-feed-diff.py) — изменились ровно 4, по одной строке обложки; боевой фид = песочница, бэкап avito_feed.xml.bak-2026-10-14; выгрузка 04:37–05:37 UTC отчёт 615587120 success: 4 «Изменено / active», 39 «Без изменений», коды только 3002/2303, ошибок и 1835 нет; на страницах Авито главное фото A у всех четырёх (Playwright 06:00 UTC); кошелёк 25 481,03 ₽ без изменений, операций за 14.10 нет. Дальше: проверка 31d6abc1 на 21.10.
check
ISKRA партия 4: вышли ли статьи 03–04.10 и видны ли на сайте
ssh aitodo "cd /mnt/docker-data/leadforge-ai && python3 scripts/iskra-blog-autopublish.py --status; tail -20 /var/log/leadforge/iskra-blog-publish.log". Ожидание: 4 статьи published (03.10 10:10/16:10, 04.10 10:10/16:10), ответы 200 по published_url, обложки на месте. Если publish_error — причина в checks.publish_error.
✓ Проверено 06.10 05:06 UTC: все 4 статьи вышли по расписанию (03.10 vlagootvodyaschaya-tkan…, kachestvo-sportivnoy-formy…; 04.10 tkan-futbolnoy-formy…, tkan-dlya-voleybolnoy-formy…), страницы 200, обложки на месте (webp). Автопубликатор работает 2/день, 05.10 тоже 2 статьи; следующая выкладка 06.10 07:10 UTC, в очереди ещё 15+.
check
ISKRA партия 4: показы статей в Вебмастере через неделю после выхода
Выгрузка Вебмастера 1skra.ru за 07–13.10 (статьи kachestvo…, dizayn-futbolnoy…, retro-forma…): появились ли показы у новых адресов; Метрика organic входы в /blog/. Сравнить с разбором 01.10 (0 показов у статей).
✓ 19.10 закрыто по данным отчёта 09–18.10 (docs/clients/iskra-data/report-1019, SEO-MACHINE «Вебмастер без API», абзац 19.10). Вебмастер отдаёт данные только по 06.10 (авария Яндекса): 06.10 статьи блога показались по 297 «живым» запросам, строк в мониторинге 499 против 116–173 раньше — статьи партии 4 вошли в выдачу. Метрика: органика 09–18.10 86 визитов (было 52), из них 56 сразу на статьи (было 22), по неделям 23 → 52 → 67. Оговорка: часть показов 06.10 — шаблонные запросы-роботы («…с чего начать кратко и понятно»), людей считать Метрикой. Данные за 07–13.10 Вебмастер ещё не отдал — досмотреть в проверке d47ae9fc (20.10).
check
Авито ISKRA: автопродление bbip снято с баскетбола, волейбол по «да» (не фидом — 1835)
06.10 поправка: теги Promo в фиде на товарных ISKRA → Авито 1835 «Настройка недоступна», теги убраны 07:05 UTC, денег не было. «150 ₽ × 1 день» = услуга bbip, АВТОПРОДЛЕНИЕ ИЗ КАБИНЕТА с 16.09 на баскетболе 8449479084 и футболе 8449732361 (300 ₽/день). Снять через API нельзя — ждёт владельца: выключить автопродление в кабинете; волейбол 8449530584 150 ₽/день — по его «да». КОМАНДА ПРОВЕРКИ (только чтение): ssh aitodo "cd /mnt/docker-data/leadforge-ai/apps/workers && set -a && . ../../.env && set +a && node --import tsx src/scripts/avito-bbip.ts state a59c3c22-107c-432f-953a-70e679420fbe 8449530584,8449479084,8449732361 && node --import tsx src/scripts/iskra-promo-who-1006.ts | tail -8" Ожидание: на баскетболе (и футболе, если решили) нет bbip, в истории нет новых «150 ₽ × 1 день» по ним; волейбол — bbip, если было «да». Отчёт выгрузки без 1835 (теги убраны). Карта: AVITO-MACHINE, раздел bbip.
✓ 23.10 avito-bbip state: на баскетболе 8449479084 и футболе-live 8449732361 bbip нет (баскетбол-live 79 → 7 просмотров за неделю), волейбол 8449530584 без bbip (да не было). Остался bbip «150 ₽ × 1 день» на футбол-товаре 8353542067 (до 23.10 10:42, неделя 1 079 ₽ / 2 контакта) — вопрос владельцу, снимать только в кабинете.
⛔ 07.10: автопродление bbip живо — 8449479084 (баскетбол) и 8449732361 (футбол) по 150 ₽/день, оплачено до 07.10 15:18 МСК; плюс 8353542067 (iskra-football-kit-goods) с 05.10. Итого 450 ₽/день денег клиента, за 01–07.10 у трёх 0 обращений. Снять можно только в кабинете клиента — владелец.
check
Блог ISKRA: пошли ли заявки с лид-магнита в статьях
06.10 в 62 статьи и шаблон добавлена форма «Покажем вашу форму до оплаты» (#article-lead, comment «Заявка из статьи: …»). Проверить leads-log (FTP api/leads-log.php): записи с page …/blog/… и comment «Заявка из статьи», без bot; Метрика цель 564605606 по startURLPath =@ /blog/. Ноль за неделю при < 10 входов в блог — норма, смотреть вместе с органикой.
✓ Проверено 19.10 по leads-log: с 06.10 ни одной живой заявки «Заявка из статьи» (только 3 наших теста 06.10 07:00, honeypot). При этом из поиска на статьи ~78 входов за 06–18.10 (Метрика, недели 36 + 42), цель формы на /blog/ 0. Лид-магнит пока не конвертит, вопрос в очередь владельцу.
check
SEO ISKRA: что дали IndexNow, пакет SEO 06.10 и лид-магнит (2 недели)
06.10: IndexNow 73 адреса (Яндекс/Bing 202), публикатор шлёт новые; спортстраницы с title «… форма на заказ», разметкой и og; описания 47 статей исправлены 01.10. Проверить: Метрика lastTrafficSource=organic по неделям (база: 29.09–05.10 = 21 визит, входы /hockey/ 6) и входы в /blog/; выгрузка Вебмастера (страниц в поиске, показы статей — 07–20.09 было 0); Bing: site:1skra.ru. Скрипт: apps/workers/src/scripts/iskra-week-1006.ts (поменять даты).
✓ Проверено 19.10 (отчёт 09–18.10): органика по неделям 28.09 23 → 05.10 52 → 12.10 67 визитов; 09–18.10 86 визитов против 52, из них 56 сразу на /blog/ (было 22), Google 34 (14). Вебмастер (данные только по 06.10 из-за аварии): 06.10 статьи в выдаче по 297 запросам без шаблонов, с 23.09 по 05.10 по 1. Часть кликов 06.10 — шаблонные запросы-роботы (SEO-MACHINE «Вебмастер без API», 19.10). Коммерческие позиции главной 28.09–04.10 без изменений (13–14).
check
Сайт ISKRA: бот «+7 (900) 123» отбивается, живые заявки доходят до CRM (неделя после правки 09.10)
КОМАНДА ПРОВЕРКИ (только чтение): ssh aitodo "python3 /tmp/iskra_leads_1008.py >/dev/null; python3 -c \"import json; L=json.load(open('/tmp/iskra-leads-1008.json')); [print(r['at'][:16], r.get('bot') or 'ЖИВАЯ', r.get('order_id'), (r.get('phone') or '')[:12], (r.get('utm') or {}).get('utm_source')) for r in L if r['at'][:10]>='2026-10-09']\"" (перед запуском поправить в /tmp/iskra_leads_1008.py верхнюю дату на сегодня). ХОРОШО: все +7 (900) 123-… с bot=spam_900123 и без сделки; живые заявки с формы (via_form) с номером сделки, из Директа есть. ПЛОХО: бот с другим номером или текстом дошёл до CRM — дописать признак в detectBot (пакет /tmp/iskra-bot-1009/, вставка байтовая); живая заявка с bot=spam_900123 — откатить из lead.php.bak-2026-10-09.
✓ Зелёная досрочно (бриф 14.10, срок был 16.10). Бот «+7 (900) 123» отбит 7 раз и в CRM не попал; все 13 живых заявок с 09.10 получили номер сделки (18438–18517). Заметка: сделки 18516 и 18517 оформил один человек, двойная отправка в 22:16.
check
Авито ISKRA: «Форма для команд и клубов» в 15 городах — просмотры и обращения за неделю, живые фото против креативов Москвы
Залито 09.10 (15 объявлений iskra-uniform-order-<город>, живые фото, обложка у каждого города своя). Проверить за 09–15.10: просмотры и контакты по каждому городу, против московского 8353194598 (креативы с надписями) и против хоккейных копий в тех же городах. Какие обложки (cities.json → cover) дали больше контактов. Команда: ssh aitodo, cd /mnt/docker-data/leadforge-ai && set -a && . ./.env && set +a && cd apps/workers; статистика — по образцу src/scripts/iskra-report-1008.ts (ONLY=avito) с номерами из avito_ad_map where xml_id like 'iskra-uniform-order-%'; статус размещения — node --import tsx src/scripts/iskra-forma-report.mjs. Пакет: docs/clients/iskra-data/forma-goroda/.
✓ 16.10: формат сработал. 09–15.10 «Форма для команд» ×15 городов: 92 просмотра, 9 контактов, 9 новых чатов в 8 городах, расход 287 ₽ = 32 ₽ за контакт, конверсия 9,8% (московские наши 510 ₽/контакт и 6%, клиентские 317 ₽, хоккей ×15 за первую неделю 56/4). По городам: Челябинск 16/0, Петербург 12/1, Ростов 11/1, Пермь 9/1, Уфа 7/2, Самара 6/1, Омск 6/0, Красноярск 5/1, Волгоград 5/0, Воронеж 4/1, Казань 3/0, Нижний 3/0, Краснодар 3/1, Новосибирск 1/0, Екатеринбург 1/0. Просмотры по дням 21→7, контакты держатся. Обложки при 0–2 контактах на город не сравнить. Попутно: размещение в услугах платное (регионы 2–4 ₽/просмотр, Москва ~45 ₽, видно только в stats/v2 allSpending) — дописано в AVITO-MACHINE и ISKRA.md. Страница myvisionagency.ru/lab/reklama-1610/. Повторный замер 23.10 — отдельная проверка.
check
Авито ISKRA: хоккей в городах после смены обложки C → A (14.10) — просмотры и контакты на объявление по обложкам за 14–20.10
14.10 фидом в четырёх городах обложка C (чёрно-жёлтая арена) заменена на A (голубой каток): Екатеринбург 8405954284, Челябинск 8356581513, Краснодар 8350633269, Волгоград 8492937472. B (Новосибирск, Красноярск, Ростов, Пермь) и D (Казань, Самара, Омск) тест продолжают, A-контроль: Петербург, Нижний, Уфа, Воронеж. База 02–13.10 на объявление: A 6,5 просм / 0,75 конт (4 гор.), D 5,7 / 0,67 (3), B 3,3 / 0,25 (4), C 1,0 / 0 (4). Сравнить за 14–20.10: (1) просмотры и контакты на объявление по обложкам; (2) бывшие-C города до/после на объявление в день против контроля «всегда A» (14.10 — день смены, A на площадке с утра). Команда: ssh aitodo "cd /mnt/docker-data/leadforge-ai/apps/workers && set -a && . ../../.env && set +a && node --import tsx src/scripts/iskra-hk-covers.mjs 2026-10-14 2026-10-20 2026-10-02 2026-10-13" (только чтение; раскладка обложек и дата смены — docs/clients/iskra-data/hockey-goroda/cities.json, поля cover / cover_was / cover_changed). Решение: бывшие-C на A подтянулись к контролю, а B снова заметно ниже A и D — предложить владельцу B → A (бесплатно, тем же путём: avito_ad_map.image_paths[0] → песочница → scripts/avito-feed-diff.py → боевая сборка → отчёт выгрузки). Объём маленький (единицы просмотров на город в неделю) — выводы с оговоркой, контакты считать штуками. Плюс деньги: аванс CPA 14.10 между 04:16 и 05:38 UTC ушёл с 17 632,64 до 17 565,44 ₽ (−67,20 ₽), кошелёк без изменений, у четырёх объявлений продвижения нет — проверить POST /core/v1/accounts/operations_history/ за 14.10, что по номерам 8405954284, 8356581513, 8350633269, 8492937472 списаний нет.
✓ 23.10, окно 14–22.10: A 2,1 просм / 0,38 конт на объявление (8 гор., 17/3), D 1,3 / 0,33 (3 гор., 4/1), B 0,5 / 0 (4 гор., 2/0). Упали все: контроль «всегда A» ×0,62 к базе 02–13.10, B ×0,21, D ×0,31; бывшие C → A ×1,67 с почти нуля (0,08 → 0,14 просм/день). Объём единичный, надёжный вывод один: B худшая. Предложено владельцу B → A (0 ₽). Списания −67,20 ₽ 14.10 не сверял.
check
↑ ВК ISKRA: сработала ли правка 14.10 (пауза Хоккей/Логотип, «Комплект целиком» в группе 656) — цена заявки и клик → заявка
Что сделали 14.10 ~07:19 МСК (бюджет тот же, 2 × 900 ₽/день): пауза 237739866 «Хоккей» и 237739871 «Логотип и номера», новое объявление 243799995 = копия «Комплект целиком» в группе 154829656. Причина подорожания: выгорание аудитории (охват 49,6 тыс., частота 4,4, новых людей 13 % показов), клик дешевле прежнего (42 против 47 ₽), упала конверсия клик → заявка 2,6 % → 0,9 %. Команда проверки (только чтение): ssh aitodo "cd /mnt/docker-data/leadforge-ai/apps/workers && node --env-file=../../.env --import tsx src/scripts/iskra-vk-diag-1014.ts до:2026-09-24:2026-10-05 после-паузы:2026-10-09:2026-10-13 после-правки:2026-10-15:2026-10-16" Смотреть: (1) клик → заявка после правки против 0,9 % (09–13.10) и 2,6 % (до остановки); (2) цена заявки против 4 496 ₽; (3) у 243799995 показы, CTR и заявки по banner_id — забирает ли он бюджет группы 656 и даёт ли заявки, как оригинал 238964214 (2 заявки 09–13.10); (4) доля новых людей; (5) баланс — при 1 800 ₽/день кончается ~17.10, решение о пополнении за владельцем. Сработало: клик → заявка ≥ 2 % или ≥ 2 заявки за 15–16.10. Не сработало: 0 заявок при ≥ 80 кликах → нужны свежие креативы/аудитория (предложение в ворклоге 14.10). Снимок до правки: aitodo docs/clients/iskra-data/vk-1014/. Откат: POST /v2/banners/<id>.json {status} (iskra-vk-raw.mjs).
✓ Проверено 19.10 (iskra-report-1019.ts): НЕ сработало. После правки 14.10 07:19: 14–17.10 144 клика, 1 заявка (14.10 18:57, «Комплект целиком» 238964214), клик → заявка 0,7 % (09–13.10 0,9 %, 24–30.09 3,0 %); 15–17.10 94 клика / 0 заявок. 9–17.10 итого 15 000 ₽ / 3 заявки = 5 000 ₽, клик 42 ₽. Копия 243799995 14,6 тыс. показов, 50 кликов, 0 заявок. Кампания стоит с 17.10 (баланс 0). Дальше за владельцем: ИС-1 свежие креативы + новая аудитория, не пополнять под старую.
check
ISKRA партия 6: вышли ли №66–69 16–17.10 с новыми обложками, вернулся ли IndexNow Яндекса
ssh aitodo "cd /mnt/docker-data/leadforge-ai && python3 scripts/iskra-blog-autopublish.py --status && grep -E 'ОПУБЛИКОВАНО|IndexNow|ошибка' /var/log/leadforge/iskra-blog-publish.log | tail -12" ; глазами https://1skra.ru/blog/ — обложки №66–69 не фото пула. Яндекс IndexNow 200/202 снова → python3 scripts/iskra_indexnow.py --all (повторить всё с 11.10).
✓ 19.10 проверено. №66–69 вышли по расписанию: 16.10 10:10 «Стоимость» (--basketball.webp), 16.10 16:10 «Готовая или пошив» (--athletics.webp), 17.10 10:10 «Ткань баскетбольной» (--basketball.webp), 17.10 16:10 «Цвет: экран и ткань» (--rugby.webp) — обложки свои (kiegen 14.10, имена slug--вид.webp в blog/_articles.json), не фото пула. Дальше №70–72 вышли 18–19.10, в очереди 3 (№73–75) до 20.10 16:10. IndexNow Яндекса ожил 15.10 07:11 UTC (202), с тех пор 200 на каждой публикации; повтор всего sitemap сделан 19.10 09:58 UTC: «адресов 99 | yandex 202, api.indexnow.org 200».
check
Авито ISKRA: «Форма для команд» ×15 городов, вторая неделя — держится ли 32 ₽ за контакт после спада подъёма новых
Первая неделя 09–15.10: 92 просмотра / 9 контактов / 287 ₽ = 32 ₽ за контакт, конверсия 9,8%; просмотры по дням падали 21→7. Проверить 16–22.10: просмотры, контакты, чаты, расход (stats/v2 allSpending — размещение в услугах платное, 2–4 ₽ за просмотр в регионах) по каждому городу; против московского 8353194598 и хоккея ×15. Если держится ≤100 ₽ за контакт — повод размножить волейбол/баскетбол/спортшколу (решение ИС-5 на myvisionagency.ru/lab/reklama-1610/). Команда: ssh aitodo, cd /mnt/docker-data/leadforge-ai && set -a && . ./.env && set +a && cd apps/workers; номера avito_ad_map where xml_id like 'iskra-uniform-order-%'; статистика по образцу src/scripts/iskra-report-1008.ts (ONLY=avito) + stats/v2 allSpending; статус node --import tsx src/scripts/iskra-forma-report.mjs.
✓ 23.10: цена держится, объём нет. 16–22.10 ×15: 33 просмотра / 4 контакта / 108 ₽ = 27 ₽ за контакт (неделей раньше 92 / 9 / 287 ₽ = 32 ₽), просмотры только в 8 городах, подъём новых кончился. Москва наши 417 ₽, клиентские 483 ₽. За 30 дней регионы 23 контакта за 718 ₽ против Москвы 42 за 19 821 ₽ — довод за ИС-5 (размножить волейбол/баскетбол/спортшколу), с оговоркой: регион живёт ~неделю после выкладки, нужен план обновления. Срез: docs/clients/ISKRA.md «23.10.2026: срез всех каналов».
check
Блог ISKRA партия 7: №76 и №77 вышли 21.10 (10:10 и 16:10 МСК)
«Ок» владельца 20.10, 10 статей approved. Проверка: ssh aitodo, cd /mnt/docker-data/leadforge-ai, python3 scripts/iskra-blog-autopublish.py --status | head -8; tail -30 /var/log/leadforge/iskra-blog-publish.log. Открыть https://1skra.ru/blog/nomera-v-hokkee-chto-oni-znachat-i-kak-igroki-vybirayut-svoy/ — обложка, крошки, Метрика 109572218 в коде.
✓ 23.10 --status: вышли nomera-v-hokkee (21.10) и nomera-v-basketbole (21.10), 22.10 ещё две; лог: ОПУБЛИКОВАНО + IndexNow yandex 200. Очередь 6 (№80–85) до 25.10 16:10, published 95.
check
Блог ISKRA: партия 8 нужна до 26.10 10:10 МСК (очередь кончается 25.10 16:10)
⏱ 23.10 · просрочено 7 дн.
Партия 7 (№76–85) выходит 21–25.10. Партию 8 начинать 23.10: темы веб-Вордстатом (API v4 выключен), сверка с базой, своя структура и голос у каждой статьи, как batch7 (C:/tmp/iskra-articles/batch7/BRIEF7.md, prep_check.py). Карта: docs/SEO-MACHINE.md, раздел «Партия 7».
check
Авито ISKRA: три товарных (футбол/волейбол/баскетбол) продлились после 24.10, без 1065
⏱ 25.10 · просрочено 5 дн.
Сроки истекали 24.10 ~12:20 МСК: 8353542067 футбол, 8353383502 волейбол, 8353161233 баскетбол. 23.09 продление этих же отбилось 1065 (лимит тарифа товарной рубрики). Проверка (только чтение): ssh aitodo "cd /mnt/docker-data/leadforge-ai/apps/workers && set -a && . ../../.env && set +a && node --import tsx src/scripts/iskra-autoload-last.ts" + getItem по трём номерам (finish_time сдвинулся на ноябрь) + getItemStats за 24–25.10 не пустой. 1065 = «сейчас не размещено», не мёртвое — карта AVITO-MACHINE «Первая публикация в товарную рубрику».
check
Директ ISKRA: остаток счёта — хватит ли до конца недели (23.10 было +8 152 ₽ без НДС)
⏱ 27.10 · просрочено 3 дн.
23.10 08:10 МСК остаток directiskra +8 152,07 ₽ без НДС, лимит поиска 10 000 ₽/нед без НДС, расход ~1 450 ₽/день без НДС → ноль около 28.10. Проверка: остаток через v4 AccountManagement (блок balance в apps/workers/src/scripts/iskra-report-1023.ts, ONLY=direct). Ниже 3 000 ₽ — сказать владельцу, чтобы предупредил клиента (клиенту про баланс в отчётах не пишем).
check
В РАБОТЕS16 · Первый живой клиент (понедельник 11.08)26/35

Цель: Завести ЛК, подключить Директ/ВК/Авито и СЕО к сайту клиента так, чтобы цифры шли и лиды фиксировались

Кампания клиента больше не рекламирует наш сайт
✓ Посадочная бралась хардкодом (myvisionagency/24contentzavod), счётчик Метрики — по списку наших доменов с запасным вариантом «наш счётчик». Теперь сайт и счётчик берутся у компании; нет их — бриф в blocked с причиной.
fix
14 мест работали нашими кабинетами за чужие компании
✓ 6 воркеров и 8 библиотек создавали клиента площадки без организации (токены из env). Переведены на кабинет компании. NoAdAccountError → forEachOrg считает компанию пропущенной, а не упавшей.
fix
Сбор цифр читал пустое поле вместо кабинета
✓ ad-analytics-collect брал доступы из ad_campaigns.platform_credentials (пусто у всех 135 кампаний), а панель пишет в ad_accounts. Теперь берёт кабинет компании.
fix
Вход клиенту: задан инвайт-код
✓ Регистрация закрыта, но REGISTRATION_INVITE_CODE не был задан — завести вход было нечем. Код в .env; сквозная проверка scripts/client-onboarding-smoke.sh, 10 шагов зелёные.
fix
🔴 ВК: подключить кабинет и проверить, что цифры идут
Доступы клиента проверены боем 10.08: это НОВЫЙ кабинет VK Реклама (ads.vk.com, OAuth2), владелец Юлия Стольная, внутри 1 кампания клиента от 10.08, показов и расхода 0. Самопроверка vk-selftest: 9 из 9, расхождений с картой 0. Клиент жаловался, что доступы не подходят - причина оказалась наша: кнопка Проверить в ЛК держала свою копию логики и всегда шла в старый api.vk.com (VK API 15: token required), из-за чего кабинет метился invalid. Копия удалена, /check теперь зовёт probeAdAccount. Статус кабинета в базе поправлен на active. ОСТАЛОСЬ: перезапустить leadforge-api, чтобы правка заработала в ЛК, и нажать Проверить глазами.
✓ Кабинет клиента подключён и читается: самопроверка 9 из 9, расхождений с картой 0. Это новый кабинет VK Реклама (ads.vk.com), владелец Юлия Стольная, внутри 1 кампания клиента от 10.08 (показов и расхода нет), 1 аудитория, лид-форм нет. По дороге починены два бага: кнопка Проверить в ЛК шла в старый api.vk.com и метила рабочий кабинет invalid; токены выписывались на каждый вызов и не сохранялись, из-за чего упёрлись в token_limit_exceeded и кабинет перестал отвечать (лечится POST /v2/oauth2/token/delete.json). Теперь токен один на компанию, лежит в ad_accounts.credentials. Карта docs/VK-MACHINE.md переведена из документации в проверенные факты.
check
🔴 СЕО и Контент-завод к сайту клиента: путь не проверен
Контент-завод — отдельный сервис на cfru, в контур LeadForge не подключён. Как именно СЕО-часть привязывается к сайту клиента и per-org ли она — НЕ проверял. Разобрать до понедельника.
✓ Способ доставки выяснен: FTP, доступ есть и проверен на деле (сайт по нему выкачивали). SSH выяснять не нужно, поддомен остаётся запасным вариантом.
check
↑ Авито: подключить кабинет клиента и проверить сбор
Развилка кабинета проверена на Директе. Для Авито нужны clientId/clientSecret клиента; проверка доступа при подключении есть (читает аванс).
✓ Кабинет 414744452 подключён и читается полностью, сбор проверен: 36 объявлений, статистика за 30 дней 2103 просмотра и 284 обращения. Автозагрузка открылась после вставки ссылки на фид в кабинете.
check
↑ Экран счётчика Метрики в кабинете клиента
Ручки GET/PUT /orgs/me/metrika готовы, поля в интерфейсе нет. Пока задаётся через API.
✓ Панель Яндекс Метрики в настройках кабинета: номер счётчика проверяется обращением к Метрике токеном самого клиента (тем же, что для Директа), показываются название счётчика, сайт и список целей, цель заявки выбирается из списка. Похожая на заявку подсказывается. Разбор ответа проверен на живом счётчике 56222857; выяснилось, что на несуществующий счётчик Метрика отвечает 403, а не 404 — подсказка покрывает обе причины. Живая сборка кабинета обновлена.
feature
ВК: поддержан новый кабинет (ads.vk.com)
✓ 80% кабинетов на нём. OAuth2 с тремя потоками, токен на сутки с самопродлением. Кабинет определяется по введённым доступам, клиента не спрашиваем.
feature
ВК: лид-формы и автосбор заявок в кабинет клиента
✓ Заявка из ленты оставалась внутри рекламного кабинета и умирала непрочитанной. Теперь падает в leads компании каждые 15 минут, без дублей, окно 3 дня.
feature
↑ ВК: критик креативов и стратег кампаний
Осталось до уровня Авито и Директа: критик объявления до публикации, судья картинок, стратег который сам ведёт кампании. Механика есть в Авито — переносить в общий пакет (Волна 3 плана).
✓ Критик ВК: сначала дешёвые правила по тексту (обещания, контакты, жаргон), потом общий судья креативов с правилами ВК — считываемость за секунду, много текста на картинке режет охват. Стратег: план кампании из брифа с делением бюджета кодом. 12 проверок, оба исхода критика.
feature
↑ Рекламный расход клиента в ЛК
Владелец: расход НА РЕКЛАМУ показывать надо (его деньги, его результат), нашу себестоимость по токенам и картинкам — нет. Собирать по каналам из ad_analytics_snapshots.
✓ дубль: сделано в задаче ниже
feature
Расход показывался в 308 раз больше реального
✓ Планировщик каждый час пересобирал окно в 30 дней, сборщик просто вставлял строки: до 66 снимков одного дня на кампанию. 20 533 891 ₽ вместо 66 668 ₽. Чтение берёт последний снимок на кампанию и день, запись очищает окно перед сбором.
fix
Рекламный расход клиента в ЛК
✓ GET /analytics/ad-spend и /ad-spend/daily: расход, клики, обращения, цена клика и обращения по каналам. Себестоимости сервиса там нет. Осталось поле в интерфейсе.
feature
↓ 645 886 старых дублей снимков: чистить или оставить
На вывод больше не влияют (чтение берёт последний за день), рост остановлен. Массовое удаление — решение владельца, само не делаю.
✓ Вычищено 620 879 дублей из 621 291 строки, уникальных было всего 412. Копия снята заранее (23 МБ), суммы после чистки совпали до рубля. Таблица 289 МБ → 208 КБ. Повтор невозможен: уникальный индекс + запись через обновление по конфликту, проверено прогоном сбора.
chore
Ещё 3 места работали нашим кабинетом за клиента
✓ apply-brief СОЗДАЁТ кампании (появились бы в нашем кабинете с нашего баланса), avito-send пишет покупателю (из нашего профиля, ответ пришёл бы нам), yd-full-refresh пересобирает кампанию целиком. Получают orgId не через цикл по компаниям, поэтому в прошлую чистку не попали.
fix
Картинки клиента лежали в общей папке
✓ Проверка изоляции нашла: сгенерированные картинки писались в /public/avito-images всем вместе, имена предсказуемы (номер объявления, ниша, время) — чужую обложку можно было угадать по адресу. Разложены по /public/org/{orgId}/, лишний путь убран в 5 местах.
fix
Фид Авито был один на всех
✓ Фиксированное имя avito_feed.xml в общей папке: второй клиент затёр бы фид первого и его объявления уехали бы в чужой кабинет. Разложен по папкам компаний; наш фид продолжает лежать и по прежнему адресу, пока не переставим его в кабинете Авито руками.
fix
Переставить адрес фида в кабинете Авито на папку компании
Оба адреса живые (проверено 09.08, оба 200): новый https://leadforge.myvisionagency.ru/org/92f39df0-46cf-46e2-a7a0-50c6b5f0c6cb/avito-feeds/avito_feed.xml, старый https://leadforge.myvisionagency.ru/feeds/avito/avito_feed.xml. Осталось одно действие владельца: вписать новый адрес в настройки автозагрузки кабинета Авито. После этого убрать из кода запись в старую папку.
chore
↑ ВК: научиться создавать кампанию, группу и объявление в новом кабинете
Разведка сделана на живом кабинете. POST /v2/banners.json и /v3/banners.json отвечают 405 supported_methods GET - объявления там не создаются, путь другой. POST /v2/ad_plans.json требует вложенный массив campaigns, каждая группа требует name и package_id - значит нужен справочник пакетов (v2/packages.json). Права в кабинете есть на всё: ad_plans, ad_groups, lead_forms, segments, counters отвечают 400 валидацией, а не 403. ВАЖНО: разведку вести на ОДНОМ токене из ad_accounts, иначе упираемся в token_limit_exceeded и кабинет перестаёт отвечать всем (лечится POST /v2/oauth2/token/delete.json).
✓ Создание кампаний написано и проверено боем: createAdPlan, setAdPlanStatus, getPackages в vk-ads-new.ts. Разобрано на живом кабинете: всё создаётся ОДНИМ запросом POST /v2/ad_plans.json, где campaigns это группы, а banners внутри них - объявления; отдельно ни группу (Invalid package), ни объявление (405, только GET) создать нельзя. package_id обязан совпадать с целью кампании, список в /v2/packages.json (limit максимум 20), у кабинета ISKRA 174 пакета. Удаления DELETE нет - только POST со статусом deleted. Тестовая кампания создавалась и убрана, в кабинете осталась только кампания клиента. Всё занесено в docs/VK-MACHINE.md разделы 0.1, 0.15, 0.2. ОСТАЛОСЬ: объявления требуют patterns (форматы пакета) - их состав ВК отдаёт в тексте ошибки, надо разобрать и собрать creative; пакеты site_conversions кабинет отвергает, похоже нужен счётчик ВК на сайте клиента.
task
↑ Директ ISKRA: кабинет подключён, ждём одобрения заявки на API
10.08 клиент завёл кабинет Директа (логин directiskra, баланс 0). OAuth пройден: токен получен и лежит в ad_accounts ISKRA, статус active, аккаунт подтверждён через login.yandex.ru (directiskra, id 2416835596). НО campaigns.get отвечает ошибкой 58 - у приложения YANDEX_OAUTH_CLIENT_ID=354e9b45660643e5b9fd8114362e90ff нет одобренной заявки на доступ к API Директа. Наш собственный токен работает, потому что он от другого аккаунта (e-16707300, кабинет eLama). Что нужно: подать заявку на доступ к API в интерфейсе Директа под аккаунтом, где зарегистрировано приложение 354e9b45, и дождаться подтверждения (до нескольких дней). Доступы клиента при этом рабочие, переподключать не нужно.
✓ Директ клиента подключён и отвечает: наш код видит кабинет directiskra, кампаний 0 (кабинет новый). Разгадка ошибки 58: заявка на доступ к API у нас ОДОБРЕНА ещё 03.04.2026 (полный доступ), но для приложения leadforge ca776098eb424a0497b9f887ad9099d0, а сервис ходил приложением 354e9b45660643e5b9fd8114362e90ff, у которого заявки нет. У одобренного приложения Redirect URI = https://oauth.yandex.ru/verification_code и сменить его Яндекс не дал, поэтому токен получен ручным путём: authorize с force_confirm под directiskra -> код на экране -> обмен на токен через POST oauth.yandex.ru/token с client_id и secret. Токен живёт год, записан в ad_accounts ISKRA (external_id=directiskra). ОСТАЛОСЬ для потока подключения других клиентов: либо подать заявку для 354e9b45 (кнопка Новая заявка в Директ -> Настройки API -> Мои заявки), либо добавить в ЛК ввод кода руками под приложение ca776098.
task
Директ: подключение по коду в кабинете
✓ Сделан второй способ подключения Директа: клиент открывает страницу Яндекса, копирует код с экрана и вставляет в кабинете. Нужен потому, что заявка на API одобрена приложению ca776098, а сменить ему Redirect URI Яндекс не даёт. GET /integrations/oauth/yandex/manual отдаёт ссылку, POST принимает код: меняет на токен, проверяет чей аккаунт через login.yandex.ru, дёргает campaigns.get и только потом пишет в ad_accounts - подключено значит работает, а не просто записано. В кабинете свёрнутая строка под основной кнопкой. Ключи приложения в .env как YANDEX_OAUTH_APPROVED_CLIENT_ID/SECRET. Кабинет пересобран и выложен на 24leadforge.ru/app, прежняя сборка в /opt/lf-lp/app.bak-20260809-1736.
task
↑ Авито ISKRA: два объявления под правки клиента
Первая версия показана клиенту (https://myvisionagency.ru/lab/iskra-avito). Клиент прислал правки 10.08: размер фото 1240x960 вместо вертикальных, по 10 фото в каждом объявлении вместо 5, цена от 990 руб, характеристики внизу текста обязательны (размер, цвет, артикул) иначе блокировки, публикуем только Москву и проверить по блокировке, телефон +7 991 143 73 70, а тираж/срок/число видов спорта клиент уточнит у Дмитрия. СДЕЛАНО: запущена генерация 20 кадров в 4:3 (по 10 на объявление), сюжеты разведены - вратарь, номера, тренировочная, сумки, детская команда, по видам спорта. ОСТАЛОСЬ: привести кадры к точным 1240x960, обновить тексты (цена от 990, телефон в тексте, расширенный блок характеристик), пересобрать страницу согласования.
✓ Оба объявления опубликованы 12.08: 8353601405 хоккей и 8353626334 школа, активны до 11.09, оба под управлением автозагрузки по нашим ключам iskra-hockey-team-kit и iskra-school-team-kit. Ссылку на фид вставили в кабинете, после этого профиль автозагрузки открылся и по API - правим тексты, картинки и цену из кода. Параметры объявления взяты с живой карточки клиента, ключевой Specialty Пошив одежды: название ветки каталога про ремонт одежды, а за выдачу отвечает этот параметр.
task
↑ Директ ISKRA: Поиск и РСЯ по 8 городам
Кабинет directiskra подключён и отвечает, кампаний 0, баланс 0. Задача: собрать семантику, поднять Поиск и РСЯ по восьми городам из брифа (Москва, Санкт-Петербург, Екатеринбург, Новосибирск, Казань, Нижний Новгород, Ростов-на-Дону, Краснодар), офферы и картинки как в Авито. Учесть: Вордстат идёт через наш кабинет порциями по 4 отчёта (у клиента своего Директа не было), у аккаунта нулевой баланс - без пополнения кампании не открутятся.
task
Директ ISKRA: 16 кампаний собраны черновиками
✓ Собрано в кабинете directiskra: 16 кампаний (Поиск и РСЯ на каждый из 8 городов), 80 групп, 193 объявления, 2336 фраз, 128 корректировок ставок. Все в состоянии OFF/DRAFT - откручиваться начнут только после пополнения и запуска владельцем. Дробление: город даёт свою кампанию (свои ставки и бюджет), направление свою группу; в Поиске 7 групп, в РСЯ 3 более крупные. В каждой кампании счётчик Метрики 109572218, 186 минус-слов, в РСЯ дополнительно 1000 минус-площадок, перенесённых из нашего кабинета. Корректировки: младше 18 отключены полностью, ядро 25-44 поднято, платёжеспособные подняты. Для РСЯ сгенерировано 15 квадратных креативов в стиле клиента (форма с ISKRA и молнией), 12 загружены в кабинет и стоят в 24 объявлениях. Быстрые ссылки набором на 4 раздела сайта. ГРАБЛИ, записать в карту: AdExtensionIds в объявлении Директ не принимает (Расширение не найдено) и роняет создание всего объявления; минус-фраза 18+ валит создание кампании целиком (в минус-словах разрешены только буквы, цифры, пробел и дефис); getAds и getKeywords принимают ID ГРУПП, а не кампаний - иначе аудит показывает нули на живых кампаниях.
task
Директ ISKRA: пересобран в 3 кампании, гео на уровне групп
✓ Переделано по замечанию владельца. Было 16 кампаний (по одной на город на каждый тип) - бюджет дробился на восемь частей и стратегии не на чем было обучаться. Стало три: [Поиск] ISKRA - Лиды (56 групп, 1328 фраз, 56 объявлений), [РСЯ] ISKRA - Лиды (24 группы, 1016 фраз, 24 объявления с картинками), [Ретаргет] ISKRA - Лиды (24 группы, 24 объявления с картинками). ГЕО задаётся полю RegionIds ГРУППЫ, кампания общая; группы называются по образцу Москва - Футбольная форма. Недельные бюджеты общие на кампанию: Поиск 7000, РСЯ 9000, Ретаргет 2000. Все три OFF/DRAFT. Прежние 16 кампаний остановлены, не удалены. Правило записано в память ad-structure-and-formats, чтобы LeadForge собирал так автоматом.
task
↑ ВК ISKRA: лид-форма и кампании упёрлись в два ручных шага
Схема лид-формы разобрана перебором и записана в docs/VK-MACHINE.md раздел 0.3: обязательные поля name, title, company_title, logo_id, contact_fields, first_screen_type, result_info, agreement; contact_fields это массив СТРОК а не объектов; logo_id принимается СТРОКОЙ. Главная ловушка: поле неверного типа превращает подробный ответ в безликий bad_request без указания поля - разбирать, посылая поля по одному. ТУПИК: загрузчика картинок в новом кабинете нет (content/static_images и images.json в трёх версиях отдают 404; lead_ads/lead_forms/logo.json отвечает bad value in query param на GET, POST и multipart), id картинок из существующего баннера logo_id не принимает (bad_value). РЕШЕНИЕ: форму создать руками в кабинете (там визуальный редактор), дальше кодом подхватить её id через getLeadForms - автосбор заявок уже написан. Текст формы подготовлен и отдан владельцу. Второй блокер: пакеты site_conversions (3104, 3105, 3113) кабинет отвергает как Invalid package - нужен счётчик VK на 1skra.ru.
task
ВК: инструкция клиенту по выдаче доступа к кабинету и API
Страница https://myvisionagency.ru/docs/vk-dostup/ (noindex). Часть 2 (API: client_id+client_secret из кабинета клиента) готова. Часть 1 (ручной доступ к кабинету) собрана под кабинет таргетолога, ID-заглушка. Проверка после решения: открыть страницу, в шаге 3 стоит реальный ID.
feature
Отчёт ISKRA за 10.09–08.10 по всем каналам (/lab/iskra-otchet-oktyabr/)
Формат сентябрьского /lab/iskra-otchet-sentyabr/. Данные: iskra-report-1008.ts, журнал формы, Вебмастер (Playwright). Пакет docs/clients/iskra-data/report-1008/.
✓ https://myvisionagency.ru/lab/iskra-otchet-oktyabr/ — пересобран 09.10 полным днём 08.10. Директ 34 932 ₽ / 14 обращений, 1–8.10 после докрутки 9 заявок по 1 528 ₽; ВК 20 000 ₽ / 11 заявок по 1 818 ₽; Авито наши 650 / 38 (было 210 / 24); органика 86 (было 62), 22 перехода на статьи 06–08.10. По просьбе владельца убраны: ВК «стоит, баланс 0», «Дальше» по ВК, фразы про поломки форм и страниц. Проверено на 1280 и 400 px.
task
SEO ISKRA: разобрать просадку главной в Яндексе с 14.09 по коммерческим запросам
Вебмастер, мониторинг запросов, главная: «форма на заказ» 8–9 → 13–16 место, «спортивная форма на заказ» и «пошив спортивной формы» показы 7–20/нед → 1 с недели 14.09. Всего показов 10.09–04.10 694 против 1 147 за 10.08–09.09. Title главной не менялся. Данные и скрипт: docs/clients/iskra-data/report-1008/seo_home.py (выгрузки в wm/). Проверить: что менялось на сайте 10–14.09 (клиент правит сам), конкуренты в выдаче по «форма на заказ», дубль http/https, H1 главной без ключа.
task
↑ Сайт ISKRA: закрыть бота «+7 (900) 123-…» в api/lead.php (клиент считал его сделки заявками)
Клиент 08.10: «вчера 7.10 было 6 заявок». По журналу формы: 3 живых из Директа (Роман дважды) + 3 сделки бота 18403, 18410, 18413. Бот с 23.09: мимо формы, номер +7 (900) 123-xx-xx, иностранная почта, сменные адреса серверов, один текст. 24 попытки с 10.09, 10 сделок в CRM.
✓ 09.10 07:17 МСК: правило spam_900123 в detectBot (мимо формы И (номер 900123 ИЛИ текст «свяжитесь со мной по электронной почте»)). Проверка на журнале с 19.08: ловит 10/10 сделок бота, 0 заявок с формы. 7 офлайн-случаев php:8-cli зелёные, дифф +16 строк, md5 на сайте совпал. Живой запрос как у бота → spam_900123 без CRM и письма; форма с ловушкой → honeypot; GET 405; сторож сайта ок. Бэкап /tmp/iskra-bot-1009/lead.php.bak-2026-10-09.
task
↑ Авито ISKRA: «Форма для команд и клубов» в 15 городах, живые фото (просьба Софьи 08.10)
Объявление 8353194598 (iskra-uniform-order) размножить на 15 городов-миллионников как хоккей, все фото живые без креативов. Москву не трогаем (решение владельца 09.10). Пакет: aitodo docs/clients/iskra-data/forma-goroda/. Страница согласования: myvisionagency.ru/lab/iskra-forma-goroda/. После «ок»: psql < insert-active.sql → песочница STORAGE_ROOT=/tmp/feedtest + diff (28 прежних байт в байт, +15) → боевая сборка → отчёт автозагрузки.
✓ 09.10 залито по «ок заливай»: песочница — 28 прежних байт в байт +15, боевой фид 43 объявления (бэкап avito_feed.xml.bak-2026-10-09). Выгрузка 06:00 UTC, отчёт 612775965: все 15 «Добавлено / active» (3002), прежние 28 без изменений, списаний нет. Номера Авито в avito_item_id. Петербург 8525124885 открыт в браузере: заголовок, 990 ₽, живые фото, контакт Елизавета. Карты ISKRA.md и AVITO-MACHINE.md дописаны.
feature
↑ Блог ISKRA партия 6 (№66–75): обложки и очередь 16–20.10
«Ок» владельца 14.10 на тексты и обложки (смета ~30 ₽). Статьи написаны вручную 07→08.10, ready без обложек. Путь: iskra-covers-jobs-1014.ts → kiegen --label iskra-blog-p6 → apply_covers_p6.py → preview_p6.py → --approve. Доки: docs/SEO-MACHINE.md «Партия 6 в очереди».
✓ 10 обложек kiegen iskra-blog-p6 (gpt-image-2 i2i 1K), --dry «НОВЫХ: 10» → 10 готово; брак №75 (волейбольная эмблема на майках киберспорта) перегенерен 1 раз → журнал: 11 оплачено, 11 с результатом ≈ 33 ₽. Каждая просмотрена глазами. preview_p6.py: 10 из 10 без замечаний (canonical, описание 144–160, #article-lead «Покажем вашу форму до оплаты», comment с заголовком, счётчик 109572218, ссылки 200, своя обложка). --approve 10 → --status: approved 14 (№62–75), выход 14–20.10 по 2 в день, последняя 20.10 16:10 МСК. Показ myvisionagency.ru/lab/iskra-statyi-1410/.
task
↑ Блог ISKRA партия 7: темы, тексты, обложки, «ок» до 21.10 10:10 МСК (очередь кончается 20.10 16:10)
⏱ 20.10 · просрочено 10 дн.
Путь партии 6 (SEO-MACHINE «Партия 6 в очереди»): existing.txt из базы + сверка основ слов ≥70%, тексты вручную в сессии, insert_articles.py --dry → ready, обложки через kiegen с гейтом «трачу?» (~3 ₽/шт), preview → /lab → «ок» → --approve. Сверяться с Рубкой (контур «Свои»). 19.10 (Рубка, задача AITODO №1116): партия 7 нигде не начата — ready-статей 0, файлов batch7 нет; в очереди approved только №73–75 (20.10 10:10, 20.10 16:10 и всё). План 50 исчерпан (34 записи в iskra-plan-50.json, все вышли или в очереди) — темы брать из мониторинга Вебмастера (499 строк, «живые» запросы 06.10) и кластеров отчёта report-1019. Задача №1116 закрыта по решению владельца 07.10 «очередь полна, партию готовить к сроку, проверку заведу» — эта задача и есть та проверка. Аргумент за продолжение блога: органика сразу на статьи 22 → 56 визитов за 09–18.10.
task
ISKRA: юр-документы и галочки согласия на 1skra.ru (политика, согласие ПДн, согласие на рекламу)
Просьба Дмитрия 22.10 («на Искру уже надо, а то штрафуют»). Сейчас на 1skra.ru политики нет вообще, под формой «соглашаетесь с обработкой» без ссылки; лид-форма ВК ссылается на 1skra.ru/policy/, там 404. Пакет готов и проверен на копии (aitodo, CRM и почта отключены): C: mp\iskra-legal-20261027 (orig = резервная копия, work = правки, build_iskra_legal.py, README.txt). 112 страниц, 119 форм: галочки над кнопкой (обязательная + по желанию), ссылки в подвале, плашка cookie, /policy/ + 2 согласия, lead.php: отказ без согласия, отметки в сделку Freedom, письмо и журнал. Ждёт «да» владельца на заливку (массовая правка живого сайта). Перед заливкой пересобрать от свежей копии: блог публикует 2 статьи в день.
feature
готовS17 · Контент, СЕО и лендинги под клиента10/10

Цель: docs/SEO-FACTORY.md: бриф → ключи по полкам НЧ/СЧ/ВЧ → статьи в стиле сайта → публикация по FTP → экран в ЛК. Плюс лендинги клиента с его формой и разметкой.

Замысел завода описан
✓ docs/SEO-FACTORY.md: бриф, три полки ключей, статья и проверки, стиль сайта, СЕО+ГЕО, четыре способа публикации, экран в ЛК, деньги и потолок, критерии готовности. Под согласование.
doc
🔴 Выяснить доступ к сайту клиента: SSH, FTP или git
Сайт на nic.ru, собран кодом, без админки. У них есть тарифы и с SSH, и без — надо посмотреть в панели клиента. Без доступа запасной вариант: блог на поддомене у нас.
✓ FTP. Доступ есть и проверен на деле — сайт по нему уже выкачивали. SSH выяснять не нужно, поддомен остаётся запасным вариантом.
check
Перенести механику из bo-seo-team.mjs в мультиарендный вид
СДЕЛАНО: схема под RLS (seo_briefs/keywords/articles/publish_targets), банк ключей с полками НЧ/СЧ/ВЧ, счёт спрос×интент×выигрываемость, сбор через Вордстат. Правило «начинаем с низкочастотных» записано кодом: nextKeyword не поднимется выше, пока на низкой есть очередь. 14 тестов на чистый счёт. Найдена и исправлена ошибка, унаследованная из bo-seo-team.mjs: надбавка за вопросные запросы не срабатывала никогда ( в JS опирается на латиницу). ОСТАЛОСЬ: генерация самой статьи с тремя проверками.
✓ Схема под RLS, банк ключей с полками НЧ/СЧ/ВЧ, счёт спрос×интент×выигрываемость, сбор через Вордстат, генерация статьи с тремя проверками, цикл с расписанием и потолком себестоимости. Правило «начинаем с низкочастотных» записано кодом. 14 тестов. Попутно исправлена ошибка из исходного движка: надбавка за вопросные запросы не срабатывала никогда ( в JS опирается на латиницу).
feature
Публикатор с копией и откатом
Адаптеры git/SSH/FTP/поддомен. Кладёт статью, дописывает в список блога, обновляет карту сайта, шлёт на переобход. Первая публикация — в черновой путь, показ клиенту.
✓ FTP с копией и откатом. Перед изменением файла копия рядом, ничего не удаляем, первая публикация в черновой путь _draft мимо живого блога. Список статей и карта сайта правятся добавляюще. Проверено на настоящем FTP-сервере: 10 из 10, включая откат и отсутствие дублей при повторе. scripts/seo-publisher-smoke.ts + seo-ftp-test-server.py
feature
Снимок стиля сайта клиента
Шрифты, цвета, ширина колонки, вид заголовков и кнопок — статья собирается в вёрстке клиента, а не в нашем шаблоне.
✓ Шрифты, цвета, ширина колонки, скругления берутся КОДОМ из разметки и стилей сайта; спрашивать у модели про фирменный цвет бессмысленно. Отдельно проверяется контраст: у обоих наших сайтов фон тёмный, а цвет текста не объявлен — статья вышла бы нечитаемой.
feature
Экран «СЕО контент-завод» в ЛК
Четыре вкладки: обзор, ключи по полкам, статьи, настройки. Смотреть и запрещать можно, запускать генерацию руками нельзя.
✓ GET /seo/overview, /keywords, /articles, /articles/:id, /brief; PUT /brief, /target (с проверкой доступа боем); POST reject для ключа и статьи. Смотреть и запрещать можно, запускать генерацию руками нельзя. Себестоимость клиенту не отдаётся.
feature
Опубликовать правки сайта клиента на живой 1skra.ru
SEO+GEO, мобильная адаптация, сжатие картинок в webp, блог и 2 статьи. Клиент дал разрешение на публикацию 10.08.
✓ Залито по FTP и проверено на живом сайте. Порядок: полный бэкап (C:/tmp/iskra-BACKUP-pered-zalivkoy, 161 файл, 57,2 МБ) -> 169 новых файлов (134 webp, блог, css/blog.css) -> 11 изменённых страниц. Проверка: 13 страниц и 119 ресурсов отдают 200, битых ссылок нет; обе формы целы (api/lead.php, GET 405); Метрика 109572218 шлёт хит; блог и 2 статьи открываются, блог в меню и sitemap; на мобильном горизонтального скролла нет. Вес 57 -> 8 МБ. Откат = вернуть 11 файлов из бэкапа, старые png/jpg на сервере не удалялись. Грабли: сразу после заливки браузер показал 28 битых картинок - это lazy-загрузка ниже экрана, считать только после прокрутки.
task
↑ SEO-завод: запустить на ISKRA (2 статьи в день)
Завод запущен на ISKRA: бриф в работе, 12 тем в очереди, кроны стоят (ключи 05:20, статьи 10:10 и 16:10 МСК). Цель публикации намеренно НЕ заведена - статьи копятся в статусе ready и на сайт не уходят, показываем владельцу на myvisionagency.ru/lab/iskra-articles. Себестоимость 8 руб за статью при потолке 4000 в месяц. ОСТАЛОСЬ: получить от клиента размерную сетку и названия тканей (без них самая ходовая тема ниши, размеры детской формы на 473 показа, не закрывается), настроить публикацию в /blog/ папками как у ручных статей, добавить RSS новостей спорта вторым источником тем.
✓ Завод выпустил и опубликовал первые 2 статьи на 1skra.ru/blog/. Проверки усилены: запрет таблиц, объём считается по телу (порог 3500 знаков), дубли ловятся по ядру темы, пропажа каркаса теперь ошибка вместо тихой подмены оформления. Модель вынесена в SEO_ARTICLE_MODEL - gpt-4o-mini упирается в 3200 знаков и в эталон не может.
task
Лендинг с формой клиента + UTM + связь с кампанией
✓ Лендинг вёл в НАШ личный телеграм: заявка уходила к нам, а не к клиенту, и переход в мессенджер не отследить. Теперь форма, отправка по ключу компании туда же, куда заявки с сайта, UTM из адреса уезжают вместе с заявкой. Проверено сквозным прогоном.
feature
Форма захвата в воркерном генераторе (сейчас ссылка на личный телеграм)
✓ Закрыто той же правкой: ссылка на телеграм заменена формой с ключом компании.
feature
готовS18 · ISKRA сентябрь: 50 статей и автопубликация8/16

Цель: Статьи по контент-плану от 09.09 (50 тем) партиями по 10 через страницу согласования; публикация по две в день кроном на сервере без участия человека.

↑ Автопубликация блога 1skra.ru кроном: очередь approved, по одной в 10:10 и 16:10 МСК
✓ scripts/iskra-blog-autopublish.py на aitodo, crontab root 10 7,13 * * * UTC. Пробный прогон 14.09: backup 49 файлов, сборка совпала с локальной байт в байт (md5), сверка «ничего не исчезает» зелёная. --approve/--status/--dry. Лог /var/log/leadforge/iskra-blog-publish.log, TG после публикации.
feature
↑ Генерация статей по плану 50: iskra-plan-50.json + iskra-plan-article.ts, ArticleOptions (skipCore, angle, ctaUrl)
✓ seo-article.ts принимает настройки статьи; призыв ведёт на свой раздел. Коммит a4bae83.
feature
↑ Партия 1 (12 статей: нанесение номеров, фамилий, эмблем + дизайн под нанесение): статья №1 «Номер на футболку» показана, ждёт «ок»
План — клиентская страница /lab/iskra-plan/ (джерси и розничные кластеры выкинуты 09.09). Статья про джерси, собранная 14.09 утром по старому разбору, снята (11 ₽ впустую).
✓ 14.09 «пока ок»: 11 статей в очереди approved, крон публикует по две в день с 15.09. №1 вышла 14.09. Замечание владельца: обложки слишком похожи — к партии 2 расширить сюжеты.
task
↑ Партия 2 (10 статей: школа, гетры и гамаши)
task
↑ Партия 3 (10 статей: манишки, эмблема, тайтсы)
task
↑ Партия 4 (10 статей: размеры, вратарская, разминочное)
task
↑ Партия 5 (10 статей: ткани и уход, сегменты)
task
↑ Лендинги под кластеры (/jersey/, /nomera/, /school/, /manishki/, /sportshkola/) и перевод призывов статей на них
task
↑ Директ ISKRA: баланс −5 434 ₽, показы встали с 8–9.09 — клиент пополняет
На овердрафте показывается, но втрое медленнее (86–459 показов/день против 850–900 до 07.09), 13.09 списание 2 062 ₽. AmountAvailableForTransfer 0.
decision
↑ Авито ISKRA: автозагрузка стоит с 22.08, 5 из 10 объявлений истекли 11–13.09 — поднять в кабинете, решить про activateItem
✓ 14.09 владелец включил тариф; в 11:50 МСК площадка забрала фид, 5 истёкших объявлений переактивировались сами (active до 14.10).
decision
↑ Агент Директа: yd_actions applied без подтверждения API, кандидаты «футбол/спорт» в минуса — починить до доверия
bug
↑ Авито: автоприменение правок ограничено нашим кабинетом (AVITO_AUTO_APPLY_ORGS), тексты ISKRA возвращены из snapshot_before
✓ scripts/iskra-restore-texts.py --apply: 15 полей; фид пересобран 14.09; эксперименты reverted. Воркеры перезапущены с новым env.
bug
↑ Обложки статей: разнообразить сюжеты и планы в seo-cover.ts до партии 2
Владелец 14.09: картинки партии 1 очень похожи друг на друга. Расширить SCENES по темам (нанесение крупным планом, цех, примерка, раздевалка, поле), менять план и среду, хранить сюжет в images[0].scene и не повторять последние 6. Память: feedback-seo-covers-variety.
task
↑ ВК ISKRA: кампания на лид-форму в новом кабинете (ключи 15.09) — заготовлена, ждёт лид-форму от владельца
Показ /lab/iskra-vk-15/. Создание: ssh aitodo "cd /mnt/docker-data/leadforge-ai/apps/workers && node --env-file=../../.env --import tsx src/scripts/iskra-vk-build-leadads.ts <formId>" — кампания blocked, 6 групп, 300 руб/день на группу. Запуск и бюджет — решение владельца.
✓ 15.09: форма 994285 создана владельцем; кампания 31385948 собрана остановленной, 6 групп по 300 руб/день, форма привязана (ad_object_type=lead_form), баннеры leadads://994285/. Запуск и бюджет — решение владельца.
task
↑ ВК ISKRA: запуск кампании 31385948 — бюджет и «да» владельца; политика /policy/ на сайт
✓ 18.09: клиент пополнил кабинет на 20 000 ₽ (GET /v2/user.json?fields=account → balance 20000). Предполёт зелёный, модерация allowed. Кампания 31385948 запущена: план, 6 групп, 6 объявлений active, все delivering. 1 800 ₽/день, ~11 дней. Гейт трат доработан (возобновление без бюджетных полей, resumesExistingNew), 45 тестов зелёные. Политика /policy/ на сайт не заливалась — форма прошла модерацию без неё.
decision
↑ ВК: стандарт сборки кампании (VK-PIPELINE.md), три слоя таргетинга, предполёт vk-preflight.ts, скилл vk-work
✓ 16.09: все 6 групп кампании 31385948 по чек-листу, vk-preflight зелёный (фразы 12-14, сообщества 9-14, интересы 3-8 на группу). Ждёт бюджет и «да» на запуск.
feature
готовS19 · Принтфлаг: разбор конкурента и подготовка запуска2/2

Цель: Вторая фабрика Дмитрия printflag.ru: разбор rusflagcity.ru, посадочные по кластерам, кампании Директа, развод запросов с ISKRA

Разбор конкурента РусФлаг: сайт, реклама в выдаче, семантика, план
✓ Страница https://myvisionagency.ru/lab/printflag-konkurent/ + Excel 8 листов. 22.09 добавлена полная база Keys.so: РусФлаг 737 объявлений/4490 запросов/222 РСЯ/8589 органика, Принтфлаг 347/1590/14 (все на главную, ставка 31 vs 12 ₽, чужие города, принтеры). Паспорт docs/clients/PRINTFLAG.md, данные clients/printflag-data/keyso/. Ждёт показа Дмитрию.
feature
Решение Дмитрия по Принтфлагу: берём ли в работу, какие обещания честные (от 1 шт, срок, DTF, лазерный крой)
✓ В работу взят: 22.09 созвон и счёт 10056 (сайт + парсер прайса РусФлага + доработка посадочных), 24.09 Дмитрий выдал доступы (база nic.ru, Метрика ShamrayGroup1, Вебмастер), решил: Тильда на promo.printflag.ru, новый сайт на основной домен. DTF исключить (22.09). Вопросы про обещания и цены перенесены в список на /lab/printflag-sait/#questions.
feature
В РАБОТЕS20 · Принтфлаг: прайс РусФлага и новый сайт114/124

Цель: Выкачать все прайсы РусФлага в Excel; спроектировать и собрать новый сайт printflag.ru (главная + разделы-лендинги, фирстиль из презентации, SEO/гео/реклама, защита от ботов), перенести на nic.ru клиента по его да.

↑ Выкачать все прайсы РусФлага в Excel
Их собственная выгрузка admin-ajax get_excel_file (excel_type=filter, url_filter=/shop/<раздел>/): полный каталог 13 885 позиций + 277 файлов по разделам + сводный Excel с колонкой раздела и ценами «от». Скрипт scratchpad/rusflag/dl_cats.py. Итог выложить на /lab/printflag-konkurent/ и в clients/printflag-data/rusflag-prices/.
✓ Выгружено штатной кнопкой РусФлага (admin-ajax get_excel_file): весь каталог 13 882 позиции + 277 из 277 разделов, 0 ошибок. Сводный Excel (Все цены с разделом, Сводка по разделам, Скидки за тираж, Флаги цена за м2), оригинал каталога и zip 277 файлов: https://myvisionagency.ru/lab/printflag-konkurent/#prajs и aitodo docs/clients/printflag-data/rusflag-prices/. Сверка: все коды разделов входят в полный файл, строк без раздела 0.
feature
↑ Архитектура сайта Принтфлага на обсуждение
Страница https://myvisionagency.ru/lab/printflag-sait/ : карта сайта, шапка и меню, блоки главной, шаблон лендинга и товара, фирстиль, техника, SEO/гео/реклама, спринты, 7 вопросов Дмитрию с дефолтами.
feature
↑ С1 Фундамент: дизайн-система, каркас, шапка/меню, главная, шаблоны, форма с антиботом, SEO-база
После «ок» владельца на архитектуру. Astro → статичный HTML, PHP только для формы. Стенд закрытый.
✓ С1 сделан: Astro 5 → статичный HTML, две сборки (бой/стенд), шапка в две строки с 5 выпадающими, главная 12 блоков, форма с антиботом и журналом (lead.php), метки 90 дней, 5 целей Метрики, robots/sitemap/llms/разметка. Проект E:/Проекты для Гитхаба/Клиенты/printflag-site.
feature
A1 Все страницы карты сайта собираются и открываются (список в `tests/spec/pages.mjs`, 34 адреса + статьи блога)
printflag-site/docs/ACCEPTANCE.md · npm run exam (static/browser) или npm run exam:form
✓ npm run exam: static 26/26 на финальной сборке 28.09 (tests/spec/static.spec.mjs)
acceptance
A2 Несуществующий адрес отдаёт страницу 404 с шапкой и ссылкой на главную; в карте сайта её нет
printflag-site/docs/ACCEPTANCE.md · npm run exam (static/browser) или npm run exam:form
✓ npm run exam: static 26/26 на финальной сборке 28.09 (tests/spec/static.spec.mjs)
acceptance
A3 На каждой странице шапка: логотип ведёт на главную, телефон `tel:+74959739090`, ссылка на мессенджер, кнопка «Рассчитать»
printflag-site/docs/ACCEPTANCE.md · npm run exam (static/browser) или npm run exam:form
✓ static зелёный; шапка в две строки, «Рассчитать заказ», телефон, Телеграм/WhatsApp/MAX видны на 1101–1920
acceptance
A4 В шапке пять выпадающих разделов (Флаги, Виндеры, Печать на ткани, Баннеры и конструкции, Текстиль и одежда); в каждом все его подразделы из карты сайта
printflag-site/docs/ACCEPTANCE.md · npm run exam (static/browser) или npm run exam:form
✓ static зелёный; шапка в две строки, «Рассчитать заказ», телефон, Телеграм/WhatsApp/MAX видны на 1101–1920
acceptance
A5 На ширине 390 px ни одна страница не прокручивается вбок; телефон виден в свёрнутой шапке; меню открывается и показывает разделы
printflag-site/docs/ACCEPTANCE.md · npm run exam (static/browser) или npm run exam:form
✓ browser A5 7/7 + ручной прогон ширин 320–1920: прокрутки вбок нет (после правки меню в круге 2)
acceptance
A6 На каждой странице ровно один H1, свой title и описание 70–170 знаков; title и описание не повторяются между страницами
printflag-site/docs/ACCEPTANCE.md · npm run exam (static/browser) или npm run exam:form
✓ npm run exam: static 26/26 на финальной сборке 28.09 (tests/spec/static.spec.mjs)
acceptance
A7 Нигде на сайте нет «DTF», «спортивная форма» и длинного тире в видимом тексте
printflag-site/docs/ACCEPTANCE.md · npm run exam (static/browser) или npm run exam:form
✓ npm run exam: static 26/26 на финальной сборке 28.09 (tests/spec/static.spec.mjs)
acceptance
A8 Главная содержит блоки: первый экран с H1 и двумя кнопками, 8 плиток направлений со ссылками на хабы, 5 цифр производства, методы, работы, клиенты, почему мы, 4 шага заказа, от 8 вопросов, форма
printflag-site/docs/ACCEPTANCE.md · npm run exam (static/browser) или npm run exam:form
✓ npm run exam: static 26/26 на финальной сборке 28.09 (tests/spec/static.spec.mjs)
acceptance
A9 Внутренние ссылки и картинки на всех страницах существуют (ни одной битой)
printflag-site/docs/ACCEPTANCE.md · npm run exam (static/browser) или npm run exam:form
✓ npm run exam: static 26/26 на финальной сборке 28.09 (tests/spec/static.spec.mjs)
acceptance
A10 У каждой картинки заданы width, height и alt; первая картинка страницы не ленивая, остальные ленивые
printflag-site/docs/ACCEPTANCE.md · npm run exam (static/browser) или npm run exam:form
✓ npm run exam: static 26/26 на финальной сборке 28.09 (tests/spec/static.spec.mjs)
acceptance
F1 Заявка с именем, российским телефоном и признаками формы принимается: ответ `status: ok, counted: true`, в журнале строка со всеми полями, страницей и метками рекламы
printflag-site/docs/ACCEPTANCE.md · npm run exam (static/browser) или npm run exam:form
✓ npm run exam:form 8/8 (php:8-cli на aitodo) + browser 7/7; доп. прогон: 50 параллельных заявок без потерь, поток с адреса режется с 11-й
acceptance
F2 Журнал пишется ДО отправки письма: если почта не ушла, заявка всё равно в журнале
printflag-site/docs/ACCEPTANCE.md · npm run exam (static/browser) или npm run exam:form
✓ npm run exam:form 8/8 (php:8-cli на aitodo) + browser 7/7; доп. прогон: 50 параллельных заявок без потерь, поток с адреса режется с 11-й
acceptance
F3 Заполненное поле-ловушка: ответ `ok`, но `counted: false`, письмо не уходит, в журнале причина `honeypot`
printflag-site/docs/ACCEPTANCE.md · npm run exam (static/browser) или npm run exam:form
✓ npm run exam:form 8/8 (php:8-cli на aitodo) + browser 7/7; доп. прогон: 50 параллельных заявок без потерь, поток с адреса режется с 11-й
acceptance
F4 Отправка быстрее 3 секунд после открытия формы отбраковывается как `too_fast` с тем же ответом `ok`
printflag-site/docs/ACCEPTANCE.md · npm run exam (static/browser) или npm run exam:form
✓ npm run exam:form 8/8 (php:8-cli на aitodo) + browser 7/7; доп. прогон: 50 параллельных заявок без потерь, поток с адреса режется с 11-й
acceptance
F5 Телефон короче 10 цифр, не российский или из одной цифры отбраковывается; в браузере форма не отправляется и подсвечивает поле
printflag-site/docs/ACCEPTANCE.md · npm run exam (static/browser) или npm run exam:form
✓ npm run exam:form 8/8 (php:8-cli на aitodo) + browser 7/7; доп. прогон: 50 параллельных заявок без потерь, поток с адреса режется с 11-й
acceptance
F6 Шестая заявка с одного адреса за час отбраковывается `rate_limit`, пятая проходит
printflag-site/docs/ACCEPTANCE.md · npm run exam (static/browser) или npm run exam:form
✓ npm run exam:form 8/8 (php:8-cli на aitodo) + browser 7/7; доп. прогон: 50 параллельных заявок без потерь, поток с адреса режется с 11-й
acceptance
F7 Файл макета до 20 МБ из разрешённых форматов (pdf, ai, eps, cdr, svg, png, jpg, jpeg, tif, tiff, psd, zip, rar) принимается и сохраняется под случайным именем; другой формат или больше 20 МБ отклоняется с понятным сообщением, заявка без файла при
printflag-site/docs/ACCEPTANCE.md · npm run exam (static/browser) или npm run exam:form
✓ npm run exam:form 8/8 (php:8-cli на aitodo) + browser 7/7; доп. прогон: 50 параллельных заявок без потерь, поток с адреса режется с 11-й
acceptance
F8 Журнал, счётчик лимита и папка файлов не открываются по прямой ссылке (пустой ответ или 403)
printflag-site/docs/ACCEPTANCE.md · npm run exam (static/browser) или npm run exam:form
✓ npm run exam:form 8/8 (php:8-cli на aitodo) + browser 7/7; доп. прогон: 50 параллельных заявок без потерь, поток с адреса режется с 11-й
acceptance
F9 Метки utm и yclid из адреса сохраняются на 90 дней по первому касанию, повторный заход с другими метками их не перезаписывает, форма отправляет их вместе с заявкой
printflag-site/docs/ACCEPTANCE.md · npm run exam (static/browser) или npm run exam:form
✓ npm run exam:form 8/8 (php:8-cli на aitodo) + browser 7/7; доп. прогон: 50 параллельных заявок без потерь, поток с адреса режется с 11-й
acceptance
F10 После успешной заявки срабатывает цель Метрики `lead_form`; для бота (`counted: false`) цель не срабатывает
printflag-site/docs/ACCEPTANCE.md · npm run exam (static/browser) или npm run exam:form
✓ npm run exam:form 8/8 (php:8-cli на aitodo) + browser 7/7; доп. прогон: 50 параллельных заявок без потерь, поток с адреса режется с 11-й
acceptance
F11 Клик по телефону даёт цель `click_tel`, по мессенджеру `click_messenger`
printflag-site/docs/ACCEPTANCE.md · npm run exam (static/browser) или npm run exam:form
✓ npm run exam:form 8/8 (php:8-cli на aitodo) + browser 7/7; доп. прогон: 50 параллельных заявок без потерь, поток с адреса режется с 11-й
acceptance
S1 robots.txt разрешает всё, в том числе OAI-SearchBot, PerplexityBot, ClaudeBot, YandexBot, и указывает карту сайта
printflag-site/docs/ACCEPTANCE.md · npm run exam (static/browser) или npm run exam:form
✓ static 26/26: robots, sitemap 36 адресов, canonical, JSON-LD, llms.txt, стенд noindex, в бою Метрика 95735007
acceptance
S2 sitemap.xml перечисляет ровно страницы сайта (без 404), адреса абсолютные `https://printflag.ru/…`
printflag-site/docs/ACCEPTANCE.md · npm run exam (static/browser) или npm run exam:form
✓ static 26/26: robots, sitemap 36 адресов, canonical, JSON-LD, llms.txt, стенд noindex, в бою Метрика 95735007
acceptance
S3 У каждой страницы canonical на свой адрес `https://printflag.ru/…`
printflag-site/docs/ACCEPTANCE.md · npm run exam (static/browser) или npm run exam:form
✓ static 26/26: robots, sitemap 36 адресов, canonical, JSON-LD, llms.txt, стенд noindex, в бою Метрика 95735007
acceptance
S4 На всех страницах разметка Organization с телефоном и адресом; на внутренних BreadcrumbList; где вопросы — FAQPage; где товары с ценой — Product с Offer
printflag-site/docs/ACCEPTANCE.md · npm run exam (static/browser) или npm run exam:form
✓ static 26/26: robots, sitemap 36 адресов, canonical, JSON-LD, llms.txt, стенд noindex, в бою Метрика 95735007
acceptance
S5 llms.txt перечисляет разделы с адресами и контакты
printflag-site/docs/ACCEPTANCE.md · npm run exam (static/browser) или npm run exam:form
✓ static 26/26: robots, sitemap 36 адресов, canonical, JSON-LD, llms.txt, стенд noindex, в бою Метрика 95735007
acceptance
S6 Сборка для стенда закрыта от индекса (noindex на каждой странице), боевая сборка открыта (noindex нигде нет) и содержит счётчик Метрики 95735007
printflag-site/docs/ACCEPTANCE.md · npm run exam (static/browser) или npm run exam:form
✓ static 26/26: robots, sitemap 36 адресов, canonical, JSON-LD, llms.txt, стенд noindex, в бою Метрика 95735007
acceptance
S7 Стенд не отдаёт исходники обработчика формы и конфиг (папки api на стенде нет)
printflag-site/docs/ACCEPTANCE.md · npm run exam (static/browser) или npm run exam:form
✓ static 26/26: robots, sitemap 36 адресов, canonical, JSON-LD, llms.txt, стенд noindex, в бою Метрика 95735007
acceptance
↑ С2 Раздел «Флаги»: хаб + 6–9 лендингов, товары с ценами по тиражу, калькулятор, прайс Excel
Картинки в единой стилистике только после гейта «трачу?» (~100 шт, 300–500 ₽).
✓ С2 сделан: хаб /flagi/ + 9 подразделов, таблицы цен по тиражам, калькулятор, «Скачать прайс» xlsx. Цены из data/prices.xlsx: 8 подтверждено, остальное черновик (в бою «Рассчитаем за 15 минут»). Картинки платной генерации не запускались (гейт).
feature
C1 Каждый лендинг раздела: H1 под запрос, строка «цена от / срок / минимальный тираж», кнопки «Рассчитать» и «Отправить макет», форма
printflag-site/docs/ACCEPTANCE.md · npm run exam (static/browser) или npm run exam:form
✓ static C1-C3,C5-C7 + browser C4,C8 зелёные; в бою черновых цен 0 (скан HTML/JSON/xlsx/llms)
acceptance
C2 Каждый хаб показывает не меньше 4 товаров, у каждого таблица цен по тиражам; каждый узкий лендинг не меньше 2
printflag-site/docs/ACCEPTANCE.md · npm run exam (static/browser) или npm run exam:form
✓ static C1-C3,C5-C7 + browser C4,C8 зелёные; в бою черновых цен 0 (скан HTML/JSON/xlsx/llms)
acceptance
C3 Каждый хаб: плитки своих подразделов и не меньше 5 вопросов
printflag-site/docs/ACCEPTANCE.md · npm run exam (static/browser) или npm run exam:form
✓ static C1-C3,C5-C7 + browser C4,C8 зелёные; в бою черновых цен 0 (скан HTML/JSON/xlsx/llms)
acceptance
C4 Калькулятор: выбор изделия, размера, ткани и тиража показывает цену за штуку и за партию, совпадающие с таблицей цен товара; границы тиража (5 и 6, 500 и 501) дают соседние ступени; 501+ показывает «спеццена» и кнопку заявки; тираж 0 или пусто цен
printflag-site/docs/ACCEPTANCE.md · npm run exam (static/browser) или npm run exam:form
✓ static C1-C3,C5-C7 + browser C4,C8 зелёные; в бою черновых цен 0 (скан HTML/JSON/xlsx/llms)
acceptance
C5 Кнопка «Скачать прайс раздела» отдаёт xlsx, в котором строк столько же, сколько вариантов товаров раздела на странице, и цены совпадают
printflag-site/docs/ACCEPTANCE.md · npm run exam (static/browser) или npm run exam:form
✓ static C1-C3,C5-C7 + browser C4,C8 зелёные; в бою черновых цен 0 (скан HTML/JSON/xlsx/llms)
acceptance
C6 Цены в боевой сборке показываются только у строк прайса со статусом «подтверждено»; у черновых вместо цифр «Рассчитаем за 15 минут»; на стенде видны все
printflag-site/docs/ACCEPTANCE.md · npm run exam (static/browser) или npm run exam:form
✓ static C1-C3,C5-C7 + browser C4,C8 зелёные; в бою черновых цен 0 (скан HTML/JSON/xlsx/llms)
acceptance
C7 Цены печати на ткани совпадают с опубликованными Принтфлагом (образец 500 ₽; 1–10 м 700 ₽ … 2001–5000 м 140 ₽; лазерный крой от 10 ₽/м)
printflag-site/docs/ACCEPTANCE.md · npm run exam (static/browser) или npm run exam:form
✓ static C1-C3,C5-C7 + browser C4,C8 зелёные; в бою черновых цен 0 (скан HTML/JSON/xlsx/llms)
acceptance
C8 Выбор в калькуляторе и кнопка «Закрепить цену» открывают форму с уже вписанным расчётом; цель `calc_used` срабатывает при первом расчёте
printflag-site/docs/ACCEPTANCE.md · npm run exam (static/browser) или npm run exam:form
✓ static C1-C3,C5-C7 + browser C4,C8 зелёные; в бою черновых цен 0 (скан HTML/JSON/xlsx/llms)
acceptance
С3 Разделы: виндеры, флагштоки, печать на ткани, баннеры и конструкции, текстиль, одежда, решения, портфолио
✓ С3 сделан: виндеры (парус, флекс, капля, бриз, флагштоки и основания), флагштоки, печать на ткани (опубликованные цены Принтфлага), баннеры, текстиль, одежда, решения, портфолио из реальных фото презентации.
feature
С4 Служебные страницы, каркас блога под SEO-завод, прогон тестером
✓ С4 сделан: о компании, как заказать, требования к макетам, доставка и оплата, контакты, политика (текст Принтфлага), блог на 2 статьи. ОТК 3 круга: экзамены 41/41, Lighthouse 98-99/96/100, 50 параллельных заявок без потерь. Стенд https://myvisionagency.ru/lab/printflag-site/
feature
B1 Страницы «О компании», «Как заказать», «Требования к макетам», «Доставка и оплата», «Контакты», «Политика» заполнены (не заглушки: от 1 500 знаков текста, кроме контактов)
printflag-site/docs/ACCEPTANCE.md · npm run exam (static/browser) или npm run exam:form
✓ static B1-B3 зелёные: служебные страницы от 1500 знаков, контакты и реквизиты, блог из src/content/blog
acceptance
B2 Контакты: адрес Москва, Автомоторная ул., 6Б, стр. 8; часы пн–пт 9:00–18:00; телефон, почта, Телеграм, WhatsApp; реквизиты ИП в подвале
printflag-site/docs/ACCEPTANCE.md · npm run exam (static/browser) или npm run exam:form
✓ static B1-B3 зелёные: служебные страницы от 1500 знаков, контакты и реквизиты, блог из src/content/blog
acceptance
B3 Блог собирается из папки статей: новая статья в папке появляется в списке и в карте сайта после сборки
printflag-site/docs/ACCEPTANCE.md · npm run exam (static/browser) или npm run exam:form
✓ static B1-B3 зелёные: служебные страницы от 1500 знаков, контакты и реквизиты, блог из src/content/blog
acceptance
P1 Главная и хаб «Флаги»: HTML + CSS + JS без картинок не больше 150 КБ; внешних запросов к чужим доменам нет, кроме Метрики
printflag-site/docs/ACCEPTANCE.md · npm run exam (static/browser) или npm run exam:form
✓ static P1: главная 79 КБ HTML + 8,6 КБ JS, чужой домен только mc.yandex.ru
acceptance
P2 Lighthouse на мобильном для главной и хаба «Флаги»: производительность от 90, доступность от 90, SEO 100
printflag-site/docs/ACCEPTANCE.md · lighthouse по стенду
✓ Lighthouse мобильный: главная 98/96/100, Флаги 99/96/100, LCP 2,0-2,1 с
acceptance
R1 Открыть главную с телефона → Выглядит как презентация Принтфлага: белое, малиновый, крупные узкие заголовки; ничего не наезжает
printflag-site/docs/ACCEPTANCE.md · руками по docs/ACCEPTANCE.md
acceptance
R2 Открыть «Флаги», выбрать флаг 90×135, шёлк, тираж 50 → Цена за штуку и за партию, кнопка «Закрепить цену» открывает форму с расчётом
printflag-site/docs/ACCEPTANCE.md · руками по docs/ACCEPTANCE.md
acceptance
R3 Пройти меню «Флаги ▾» на компьютере → Все подразделы с миниатюрами и ценой «от»
printflag-site/docs/ACCEPTANCE.md · руками по docs/ACCEPTANCE.md
acceptance
R4 Прочитать тексты главной и хаба «Флаги» → Нет внутренней кухни, нет обещаний, которых Принтфлаг не делает
printflag-site/docs/ACCEPTANCE.md · руками по docs/ACCEPTANCE.md
acceptance
С5 Переезд на nic.ru: SSL, Тильда → promo.printflag.ru, A-запись → 91.189.114.19, 301, Вебмастер, остановка старой рекламы
Только по явному «да» Дмитрия и владельца.
⛔ Сайт залит на хостинг nic.ru и проверен 28.10 (до переключения домена). Ждём от Дмитрия: ящик и пароль приложения Яндекса для писем о заявках, настройки в панели nic.ru (сертификат, gzip, кэш), привязку promo.printflag.ru в Тильде, TTL 300 и «да» на смену A-записи по плану в docs/DEPLOY.md.
feature
H1–H4 Айфон, ссылка из Телеграма: при прокрутке над шапкой белая полоса, страница не просвечивает
Экзамен printflag-site: node tests/spec/hdr.browser.spec.mjs (панель браузера изображается сдвигом шапки на 110 px). Руками: открыть стенд из Телеграма на айфоне и прокрутить.
✓ До правки H1 и H2 красные (над шапкой 7–49% страницы), после правки 4 из 4, остальные экзамены 65 из 65. Заслонка .hdr:before есть в живых страницах стенда и хостинга nic.ru. Последний шаг руками: Дмитрий открывает ссылку из Телеграма.
acceptance
↑ С6 Бэкенд и админка: заявки, цены, настройки; формы работают на стенде
Согласовано 29.09. PHP /admin/ (вход, заявки со статусами и CSV, цены с живым прайсом, настройки почты/SMTP/пароля), SQLite или MySQL. Стенд: php-контейнер на cfru за nginx.
✓ Бэкенд и админка на стенде: заявки (фильтры, поиск, карточка, CSV), цены (живой прайс из базы, выкат не затирает), настройки (почта, SMTP, пароль). SQLite и MySQL. Экзамены D1-D12 зелёные, ОТК 3 круга.
feature
D1 Заявка с формы попадает в базу: в админке она в списке со всеми полями, страницей, метками рекламы и статусом «новая»
printflag-site/docs/ACCEPTANCE.md · этап 2
✓ Экзамен D1 зелёный на SQLite и MySQL (scripts/run-admin-exam.mjs: 10/10 и 10/10). Живьём на стенде 29.09: заявка «Проверка стенда ОТК3» с формы /flagi/ в списке админки с utm stand-test/otk3.
acceptance
D2 Без входа `/admin/` и все её действия (список, карточка, файл, выгрузка, цены, настройки) отдают вход или 403; 5 неверных паролей подряд блокируют вход с адреса на 15 минут; верный пароль пускает
printflag-site/docs/ACCEPTANCE.md · этап 2
✓ D2 и D2-lockout зелёные на SQLite и MySQL: без входа всё закрыто (редирект/403), 5 неверных паролей = блок на 15 минут; смена пароля закрывает остальные сессии.
acceptance
D3 Смена статуса (новая, в работе, счёт выставлен, оплачена, отказ) и комментарий сохраняются и видны после перезагрузки; запрос без верного CSRF-токена отклоняется
printflag-site/docs/ACCEPTANCE.md · этап 2
✓ D3 зелёный (SQLite+MySQL): статус и комментарий сохраняются, POST без CSRF отклоняется.
acceptance
D4 Фильтры по статусу, периоду, источнику и поиск по имени или телефону возвращают только подходящие заявки
printflag-site/docs/ACCEPTANCE.md · этап 2
✓ D4 зелёный (SQLite+MySQL). Плюс по ОТК: поиск по цифрам телефона и без регистра кириллицы, проверено живьём на стенде (q=9165554433 и «проверка стенда отк3» находят 1 заявку).
acceptance
D5 Выгрузка CSV открывается в Excel с кириллицей (UTF-8 с BOM, разделитель «;») и содержит ровно заявки текущего фильтра
printflag-site/docs/ACCEPTANCE.md · этап 2
✓ D5 зелёный (SQLite+MySQL): BOM, «;», ровно заявки фильтра. Плюс защита от формул Excel (=,+,-,@ гасятся апострофом).
acceptance
D6 Макет из заявки скачивается из карточки только после входа; публичной ссылки на файл нигде нет (ни в письме, ни на странице)
printflag-site/docs/ACCEPTANCE.md · этап 2
✓ D6 зелёный (SQLite+MySQL): макет только через admin/file.php после входа; F8: uploads по прямой ссылке не открывается.
acceptance
D7 Цена и статус «подтверждено», изменённые в админке, сразу попадают в публичный прайс сайта; черновые строки публичный прайс не отдаёт
printflag-site/docs/ACCEPTANCE.md · этап 2
✓ D7 зелёный (SQLite+MySQL). Цены в бою живут в базе: сборка не кладёт prices-live.json, выкат не затирает цены из админки; досев при входе проверен отдельным прогоном на PHP 8.5 и 7.4 (10/10 проверок). Один товар на нескольких страницах правится разом.
acceptance
D8 Страница раздела подтягивает живой прайс: подтверждённый в админке товар показывает таблицу и цену «от» без пересборки, калькулятор считает по новым ценам
printflag-site/docs/ACCEPTANCE.md · этап 2
✓ D8 зелёный (tests/spec/ux.browser.spec.mjs 2/2): подтверждённый товар даёт таблицу, «от» и калькулятор.
acceptance
D9 Настройки: почта получателя и SMTP меняются в админке и используются при следующей заявке; пароль входа меняется, старый перестаёт работать
printflag-site/docs/ACCEPTANCE.md · этап 2
✓ D9 зелёный (SQLite+MySQL): почта получателя из настроек уходит в следующую заявку, пароль меняется.
acceptance
D10 Всё работает на SQLite и на MySQL (выбор в `api/config.php`): экзамены D1–D9 зелёные на обеих базах
printflag-site/docs/ACCEPTANCE.md · этап 2
✓ D10: run-admin-exam.mjs — sqlite 10/10, mysql (mariadb:11) 10/10 на финальной сборке 29.09. Синтаксис PHP 7.4 проверен php -l по всем api/admin.
acceptance
D11 На главной админки счётчики: заявки за 7 и 30 дней и разбивка по источникам
printflag-site/docs/ACCEPTANCE.md · этап 2
✓ D11 зелёный (SQLite+MySQL): счётчики 7 и 30 дней и разбивка по источникам.
acceptance
D12 На стенде форма реально отправляет заявку, и она появляется в админке стенда
printflag-site/docs/ACCEPTANCE.md · этап 2
✓ Живьём 29.09 на https://myvisionagency.ru/lab/printflag-site/: форма /flagi/ → lead.php 200 {status:ok, id 260929-043019-2abbb6} → заявка в админке стенда (utm stand-test/otk3).
acceptance
↑ С7 Визуал и UX: 10 фото, фото-каталог, офферы, решения, подбор за минуту
10 фото gpt-image-2 через kiegen (оплачено 10, ~50 ₽, 29.09). Убрать «Популярное» и «Для кого», добавить цветопробу, срочно, решения, квиз, оффер на хабах.
✓ 10 фото (kiegen ≈50 ₽), фото-каталог, офферы цветопроба и срочно, 4 решения, подбор за минуту; убраны лишние блоки. V1-V5 зелёные, Lighthouse главной 96. R5 (вкус руками) у владельца.
feature
V1 Обложки главной и 7 хабов — новые фото (не сцены презентации); каталог на главной — плитки с фото
printflag-site/docs/ACCEPTANCE.md · этап 2
✓ V1 зелёный (tests/spec/ux.spec.mjs 3/3): обложки главной и 7 хабов — новые фото pf-*, каталог плитками с фото. 10 фото через kiegen ≈50 ₽.
acceptance
V2 Блоков «Что заказывают чаще всего» и «Для кого» нет; логотипы клиентов идут сразу после первого экрана главной
printflag-site/docs/ACCEPTANCE.md · этап 2
✓ V2 зелёный (ux.spec.mjs): «Популярное» и «Для кого» убраны, логотипы клиентов вторым блоком.
acceptance
V3 На главной есть полосы «Бесплатная цветопроба» и «Срочно, от 1 дня» (кнопка и телефон), «Решения под задачу» из 4 фото-плиток и «Подбор за минуту»; на хабах есть оффер перед формой
printflag-site/docs/ACCEPTANCE.md · этап 2
✓ V3 зелёный (ux.spec.mjs): цветопроба, «Срочно от 1 дня» с телефоном, 4 решения с фото, подбор; на хабах оффер перед формой.
acceptance
V4 «Подбор за минуту»: 3 вопроса, после ответов форма заявки с уже вписанными ответами; срабатывает цель `quiz_done`
printflag-site/docs/ACCEPTANCE.md · этап 2
✓ V4 зелёный (ux.browser.spec.mjs): 3 вопроса → форма с вписанными ответами, цель quiz_done.
acceptance
V5 Регресс: все критерии этапа 1 зелёные, главная и «Флаги» в бюджете P1, Lighthouse производительность от 90
printflag-site/docs/ACCEPTANCE.md · этап 2
✓ V5: регресс этапа 1 зелёный — static 26/26, browser 7/7, форма 8/8. Lighthouse производительность: главная 96, «Флаги» 98, «Виндеры» 98.
acceptance
R5 Руками: главная и два раздела на телефоне и компьютере выглядят дорого, фото в фирменном стиле, ничего не наезжает
printflag-site/docs/ACCEPTANCE.md · этап 2
acceptance
С8 Правки клиента: таблицы на телефоне, без WhatsApp, SEO и гео, блог под SEO-статьи
Решение владельца 29.09. Критерии docs/ACCEPTANCE.md раздел С8 (M1-M3, G1-G6, BL1-BL6, R6).
✓ Правки клиента 29.09 на стенде: таблицы на телефоне блоками, WhatsApp убран везде, форма Звонок/Телеграм/MAX без почты, SEO и гео (og, LocalBusiness с geo, Москва в описаниях, перелинковка, robots, llms), блог под SEO-статьи (список, статья, RSS, проверка, инструкция). 80 экзаменов зелёные, ОТК 2 круга. R6 у владельца.
feature
M1 Таблицы цен на 390 px не выходят за экран; на телефоне строка таблицы = блок с размером, тканью и ценами ступеней; то же для живого прайса
✓ tests/spec/s8.browser.spec.mjs M1 зелёный: 390 px, /flagi/, /vindery/parus/, /flagshtoki/, /pechat-na-tkani/ + живой прайс; строка таблицы = блок, цены в 3 колонки с подписью тиража. Скриншоты сверены глазами.
acceptance
M2 WhatsApp нет нигде на сайте и в llms.txt
✓ s8.spec M2: ни wa.me, ни WhatsApp во всех html сборки и llms.txt. Стенд: grep по главной 0.
acceptance
M3 Форма: способы связи ровно Звонок, Телеграм, MAX; поля почты нет; рядом кнопки Телеграм и MAX
✓ s8.spec M3: способы связи ровно Звонок|Телеграм|MAX, поля почты нет, рядом кнопки Телеграм и MAX (/, /flagi/, /kontakty/).
acceptance
G1 og:image у разделов — своё фото, у статей — обложка
✓ s8.spec G1: у 24 разделов og JPG 1200×630 своего фото (public/img/og), у статей обложка (img/og/blog), генерирует scripts/make-og.mjs в сборке.
acceptance
G2 Разметка организации: логотип растром, geo, openingHoursSpecification, hasMap; WebSite на главной
✓ s8.spec G2: LocalBusiness logo icon-192.png, geo 55.852508/37.533629 (OSM, корпус 6Б), openingHoursSpecification пн-пт 9-18, hasMap Яндекс Карты; WebSite на главной.
acceptance
G3 Каждый хаб и подраздел упоминает Москву в title или описании
✓ s8.spec G3: Москва в title или описании у всех 24 разделов, 11 описаний дописаны, длина 70–170.
acceptance
G4 Каждый хаб и подраздел ссылается в main минимум на 6 других разделов или статей
✓ s8.spec G4: у каждого раздела 6+ ссылок в main на другие разделы/статьи (блок «Другие направления» с фото).
acceptance
G5 robots.txt закрывает /api/ и /admin/
✓ s8.spec G5: robots.txt Disallow /api/ и /admin/ во всех 8 блоках User-agent.
acceptance
G6 llms.txt перечисляет все статьи блога
✓ s8.spec G6: llms.txt раздел «Статьи» со ссылками на все статьи.
acceptance
BL1 Список статей: обложка, дата, раздел; фильтр по разделам
✓ s8.spec BL1: карточки с обложкой, датой, разделом; фильтр по хабам (кнопки появляются со скриптом), без JS видны все.
acceptance
BL2 Статья: крошки, H1, дата, время чтения, обложка, оглавление, блок раздела с ценой, похожие статьи, форма; Article/FAQPage
✓ s8.spec BL2: крошки, H1, дата и время чтения, обложка вне текста, оглавление, блок раздела с ценой, до 3 по теме, форма; Article (image, даты, author, publisher) + FAQPage.
acceptance
BL3 RSS /blog/rss.xml со всеми статьями, ссылка в head
✓ s8.spec BL3: /blog/rss.xml RSS 2.0, 2/2 статьи, ссылка alternate в head блога и статей. На стенде 200.
acceptance
BL4 scripts/blog-check.mjs отклоняет плохие статьи, пропускает все статьи блога
✓ s8.spec BL4: blog-check отклоняет 6 плохих случаев, пропускает хорошую и обе статьи блога. После ОТК: BOM, комментарии YAML, двоеточие без кавычек, FAQ.
acceptance
BL5 docs/BLOG.md: формат статьи, обложка, проверка, выкладка
✓ docs/BLOG.md: формат файла, обложка (scripts/blog-cover.mjs), проверка, что выкладывать на хостинг и в каком порядке.
acceptance
BL6 Регресс: прежние экзамены зелёные, Lighthouse главной и Флагов от 90
✓ Регресс 80/80 зелёные. Lighthouse мобильный на aitodo: главная 94/95/100, Флаги 98/96/100, статья 98/96/100.
acceptance
R6 Руками: таблица на телефоне, форма без WhatsApp и почты, блог выглядит как журнал производства
acceptance
С9 Цены по запросу: убрать все цены с сайта, калькулятор → форма расчёта
Решение Дмитрия и владельца 13.10. Критерии docs/ACCEPTANCE.md раздел С9 + изменённые C1,C2,C4,C5,S4,D7,M1. Каталог РусФлага выгружен Дмитрию в Excel для отметок (следующий шаг: структура 10-16 страниц).
✓ Цены убраны со всего сайта: карточки с вариантами и «Узнать цену», «Расчёт заказа» без цен, меню со сроками, без прайса для скачивания, живого прайса, раздела «Цены» в админке и разметки Product/Offer. 78 экзаменов, ОТК 2 круга. R7 у владельца.
feature
Z1 Нигде на сайте нет цен (₽, руб, суммы) в тексте, llms, rss, разметке
✓ s9.spec Z1 зелёный: ни ₽, ни руб/рублей, ни сумм в тексте, атрибутах, JSON, llms, rss, sitemap обеих сборок; регулярка проверена на «500 руб.», «700 рублей».
acceptance
C1 Лендинг: строка «Цена по запросу / срок / тираж», кнопки, форма
✓ static C1: у всех 24 разделов «Цена по запросу», срок, тираж, кнопки, форма.
acceptance
C2 Товары с вариантами без цен и кнопкой «Узнать цену»
✓ static C2: товары с вариантами-чипами, кнопка «Узнать цену» передаёт товар в форму, цен в карточках нет.
acceptance
C4 «Расчёт заказа»: выбор без цен, «Получить расчёт» вписывает выбор в форму, calc_used
✓ browser C4: «Расчёт заказа» без цен, «Получить расчёт» вписывает изделие/размер/ткань/тираж, без тиража просит указать, calc_used. Живьём на стенде заявка дошла в админку.
acceptance
C5 Нет «Скачать прайс» и prajs/*.xlsx
✓ static C5: «Скачать прайс» нет, prajs/*.xlsx в сборках нет.
acceptance
S4 Разметка без Product/Offer
✓ static S4: Organization, BreadcrumbList, FAQPage есть; Product/Offer нигде нет.
acceptance
D7 В админке нет раздела «Цены», нет prices-live.json/prices-seed.php
✓ admin D7 (SQLite и MySQL): нет пункта «Цены», страница цен и данные прайса не отдаются; s9 D7: файлов prices.php, prices-live.json, prices-seed.php в сборке нет.
acceptance
M1 Карточки и форма расчёта на 390 px не выходят за экран
✓ s8.browser M1: на 390 px карточки и форма расчёта не выходят за экран (4 раздела).
acceptance
Z2 Регресс зелёный, Lighthouse от 90
✓ Регресс 78/78. Lighthouse на aitodo: главная 97–98, Флаги 98, Парус 99, SEO 100.
acceptance
R7 Руками: раздел без цен выглядит законченно
acceptance
С10 Каталог по ответу Дмитрия 22.10: спортивная форма и аксессуары, платки/шарфы/баффы, без вымпелов
Ответ Дмитрия на черновик «10–16 страниц» (22.10): всё понятно + все разделы спортформы и спортаксессуаров (без рекламы, но в перечне страниц), минус «Вымпелы и гербы». Отменяет решение №1 очереди и меняет A7 (слово «спортивная форма» теперь разрешено). Правила ISKRA: без сроков и тиражей цифрами. Критерии docs/ACCEPTANCE.md раздел С10, экзамен tests/spec/s10.spec.mjs.
✓ Сделано на стенде /lab/printflag-site/: «Спортивная форма» (хаб + 7), «Платки, шарфы, баффы», вымпелы убраны, меню 6 разделов (компактное на 1101–1320 px). Прод ждёт FTP (С5).
feature
K1 Раздела «Вымпелы» нет: ни страницы, ни ссылок, ни в sitemap/llms, ни слова на лендингах
node tests/spec/s10.spec.mjs
✓ s10 K1 зелёный: /flagi/vympely/ нет в обеих сборках, ссылок 0, в sitemap/llms нет, слова «вымпел» на лендингах нет; на стенде 404.
acceptance
K2 «Спортивная форма»: хаб + 7 подстраниц в обеих сборках, пункт в шапке, sitemap, llms
node tests/spec/s10.spec.mjs
✓ s10 K2 зелёный: хаб + 7 подстраниц в обеих сборках, пункт «Спортивная форма» в шапке со всеми 8, все в sitemap и llms.txt.
acceptance
K3 На спортстраницах нет сроков и тиражей цифрами (правило ISKRA)
node tests/spec/s10.spec.mjs
✓ s10 K3 зелёный: в main 8 спортстраниц нет сроков и тиражей цифрами; найденное экзаменом «Срок от 1 дня» в блоке «Другие направления» убрано.
acceptance
K4 Тексты спортформы не повторяют 1skra.ru (нет совпадений из 8 слов подряд)
node tests/spec/s10.spec.mjs
✓ s10 K4 зелёный: ни одной фразы из 8 слов подряд со снимком 9 страниц 1skra.ru (fixtures/iskra-texts.json, 27.10).
acceptance
K5 На спортстраницах нет ISKRA/1skra.ru и оффера «флаг в подарок»
node tests/spec/s10.spec.mjs
✓ s10 K5 зелёный: ISKRA/1skra и «флаг в подарок» на спортстраницах нет.
acceptance
K6 Аксессуары: манишки, номера, накидки, майки-номера, нашивки, мини-форма; волейбол про пляжный, бег про лёгкую атлетику
node tests/spec/s10.spec.mjs
✓ s10 K6 зелёный: аксессуары называют все 6 видов; волейбол про пляжный, бег про лёгкую атлетику и забеги.
acceptance
K7 «Платки, шарфы, баффы»: страница, меню «Текстиль и одежда», плитка на хабе «Одежда»
node tests/spec/s10.spec.mjs
✓ s10 K7 зелёный: /odezhda/platki-sharfy-baffy/ в обеих сборках, в меню «Текстиль и одежда», плиткой на хабе «Одежда».
acceptance
K8 Регресс: прежние экзамены зелёные на новой карте страниц
npm run exam, ux, s8, s9
✓ Регресс 89/89: static 24, browser 6, С8 14, С9 2, ux 4, форма 10, админка 10+10 (SQLite/MySQL); A4/A7 и pages.mjs изменены критерием 22.10.
acceptance
RK Руками: «Спортивная форма» на телефоне и компьютере выглядит законченно
стенд /lab/printflag-site/sportivnaya-forma/
acceptance
С11 Юр-документы: политика ПДн, согласие на обработку, согласие на рекламу, галочки в форме, cookie
Дмитрий 22.10: политика, согласие на обработку ПДн, согласие на рекламу (на Искре тоже, «за это штрафуют»). 152-ФЗ в ред. 156-ФЗ (согласие отдельно с 01.09.2025), 38-ФЗ ст. 18. Оператор ИП Кириллов Д. А. Критерии docs/ACCEPTANCE.md раздел С11.
✓ Сделано на стенде: политика, согласие на обработку, согласие на рекламу, две галочки во всех формах, запись согласий в журнал/базу/письмо/админку/CSV, плашка cookie. Прод ждёт FTP (С5).
feature
L1 Три документа в обеих сборках с реквизитами оператора и датой редакции
node tests/spec/s11.spec.mjs
✓ s11 L1 зелёный: 3 документа в обеих сборках, H1, ИП Кириллов Д. А., ИНН, ОГРНИП, адрес, почта, «Редакция от 27.10.2026».
acceptance
L2 Политика: цели, данные, сроки, основания, права, отзыв, cookie и Метрика, хранение в РФ
node tests/spec/s11.spec.mjs
✓ s11 L2 зелёный: цели с данными и сроками, 152-ФЗ, основания, права, отзыв, 10 рабочих дней, cookie и Метрика, хранение в РФ, ссылки на согласия.
acceptance
L3 Согласие на обработку отдельной страницей со всеми элементами
node tests/spec/s11.spec.mjs
✓ s11 L3 зелёный: отдельная страница, все элементы ст. 9.
acceptance
L4 Согласие на рекламу: каналы, не условие заявки, прекращение по требованию
node tests/spec/s11.spec.mjs
✓ s11 L4 зелёный: 38-ФЗ, звонки/SMS/мессенджеры/почта, не условие заявки, немедленно, как отказаться.
acceptance
L5 В подвале каждой страницы ссылки на три документа
node tests/spec/s11.spec.mjs
✓ s11 L5 зелёный: в подвале всех 47 страниц ссылки на 3 документа.
acceptance
L6 В каждой форме две галочки, обе сняты; обязательная на обработку, необязательная на рекламу
node tests/spec/s11.spec.mjs
✓ s11 L6 зелёный: в каждой форме обеих сборок consent_pd (required) и consent_ads, обе сняты; фразы «Нажимая кнопку» нет.
acceptance
L7 Браузер: без галочки заявка не уходит, с галочкой уходит с consent_pd=1
node tests/spec/s11.browser.spec.mjs
✓ s11.browser L7 зелёный: без галочки запроса нет и видна ошибка; с галочкой consent_pd=1, consent_ads=1 только при отметке. Ссылки перенесены в конец подписи (перехватывали нажатие).
acceptance
L8 Обработчик: без consent_pd отказ и без записи в журнал
node scripts/run-form-exam.mjs
✓ form L8 зелёный; после ОТК отказ стоит до отсева ботов: бот без согласия получает fail и в журнал не пишется (проверено отдельным запросом).
acceptance
L9 Обработчик: в журнале consent_pd, consent_ads, версия документов
node scripts/run-form-exam.mjs
✓ form L9 зелёный: в журнале consent_pd=1, consent_ads 0/1, consent_ver=2026-10-27; на стенде строка в SQLite с теми же полями; письмо и CSV с согласиями и редакцией.
acceptance
L10 Плашка cookie: видна, скрывается после нажатия, не закрывает кнопку формы на телефоне
node tests/spec/s11.browser.spec.mjs
✓ s11.browser L10 зелёный: плашка внизу, ссылка на политику, кнопка; после нажатия не возвращается; на 390 px не закрывает кнопку отправки.
acceptance
L11 Регресс: все экзамены зелёные
все
✓ Регресс 89/89 зелёный, Lighthouse: главная 96–99, разделы 98, документы 99, SEO 100.
acceptance
RL Руками: Дмитрий сверяет реквизиты; галочки на телефоне удобно нажимаются
стенд
acceptance
В РАБОТЕS21 · Принтфлаг: карточки WB флагов2/13

Цель: Карточки Wildberries для флагов Принтфлага по образцам с площадки: обложки, затем пилот и полный объём (~100 карточек).

↑ 10 обложек WB по образцам владельца + страница клиенту
10 ссылок WB от владельца 05.10: выгрузить фото, сделать обложки в том же стиле и с тем же принтом, бюджет до 50 ₽.
✓ gpt-image-2.5 sunburst i2i по исходной обложке, 1K 3:4, 10/10 с первого раза, 30 ₽ (журнал kiegen pf-wb-covers, 10 оплат). Сверено с образцами глазами: принт, эмблемы и надписи совпадают, опечатки образцов исправлены, людей заменили другим лицом, нашивку Вагнера убрали. Страница клиенту https://myvisionagency.ru/lab/printflag-oblozhki-wb/ (просмотр крупно, скачивание по одной и архивом, сравнение с образцом), проверена на 1366 и 390 px. Файлы C: mp\printflag-covers inal\.
feature
Дмитрий подтверждает подписи на обложках (пробивка 90 %, шёлк, зеркально, без древка, усиленная прошивка, своё производство)
Подписи взяты с образцов конкурента, у Принтфлага не сверены. Список на странице в блоке «Что проверить перед загрузкой». Неподходящую правим: одна обложка около 3 ₽, промты C: mp\printflag-covers\make_jobs.py, исходники на cfru /opt/mv-home/lab/printflag-site/ref/wb-src/ (удалить после ок).
feature
100 карточек флагов по шаблону Принтфлага (5 слайдов) + макет под печать: 20 000 ₽, счёт №10057
07.10 договорились: 100 карточек за 20 000 ₽ (Саша предлагал 25 000, ≈250 ₽ за карточку: разбор, 6 картинок, макет под печать; Дмитрий попросил 20, принято), счёт №10057 от 06.10 отправлен, Дмитрий «сейчас оплачу». Референс карточки 07.10: 5 PNG 1086×1448 в фирменном стиле PRINTFLAG на флаге России (обложка с бойцом и плашками; 4 крупных плана + флаг; флаг на флагштоке + 3 значка; карман с завязками; боец + характеристики), файлы C: mp\printflag-covers ef100\, cfru /opt/aitodo-tg/sbor-dmitry/ref-100-0710/. Текст без опечаток. План: базовые 5 сцен с пустым флагом сгенерировать один раз, принт каждого флага накладывать кодом с сохранением складок (принт точный на всех слайдах), заголовок обложки по флагу; макет под печать в их стандарте 153×96,9. Нужно от Дмитрия: список 100 флагов, 5 или 6 слайдов, один боец на все или несколько вариантов. WB 265844524 (маска Якубович) — референс карточки для задачи про маски, не для флагов.
feature
3 примера макета флага под печать 135×90 (обложки 01, 07, 09)
Плоский макет без ткани и фона, 3:2, фон в край, поля 6 % под шов, левый край под карман древка. По требованиям сайта Принтфлага от 150 dpi в натуральную величину (≈7970×5310 px): gpt-image-2.5 4K + Recraft Crisp Upscale, на выходе TIFF + JPG, раздел на странице /lab/printflag-oblozhki-wb/. Задания готовы: cfru /opt/gen/pf-wb/jobs-print.json, метка kiegen pf-print-flags, сухой прогон 3 новых. Ждёт «трачу?» владельца: 4K ≈25 ₽ или 2K ≈16 ₽.
✓ Сделаны 3 макета по обложкам 01, 07, 09: gpt-image-2.5 2K 3:2 (15 ₽) + Recraft Crisp Upscale ×2 (0,75 ₽), дотянуты до 7972×5315 = 135×90 см при 150 dpi, sRGB вшит; TIFF 39–84 МБ и JPG 6–12 МБ. Раздел «Макеты под печать» на /lab/printflag-oblozhki-wb/ (просмотр крупно, скачивание, переключатель полей), проверен на 1366 и 390 px. Замер отступов: надписи от края не меньше 3,0–3,1 см (07 сверху 3,1, 09 снизу 3,0), запрошенные 6 % модель не выдержала, на странице указаны фактические 3 см и 4 см под карман. Дефект: у 09 внизу справа тёмно-синие мазки, похожие на буквы; заплатка кодом не вышла. Ждёт решения о перегенерации 09 (и 07 для запаса) ≈5–10,5 ₽.
feature
↑ Пример макета 09 в стандарте Принтфлага с техническими припусками (153×96,9 см)
Стандарт клиента 06.10 (Art): к 135×90 добавить поля сверху/справа/снизу 2,5 см, слева 12,5 см, закрасить продолжением рисунка, +2 % равномерно; итог 153×96,9 см = 9035×5722 px при 150 dpi. Образец клиента на нашем макете 01: C: mp\printflag-covers\pripusk\gotovyj.tif (их дизайнер закрасил генеративным расширением). Скрипт C: mp\printflag-covers\pripusk\pripusk.py (venv .venv): геометрия сверена с их файлом (размер 1:1, разница внутри флага 2/255). Бесплатный режим зеркалом готов (на кармане симметрия), Shift-map OpenCV отбракован (повторы, артефакты). Режим ai ждёт «трачу?»: расширение полей gpt-image-2.5 2K + апскейл ≈5,25 ₽ на макет.
✓ Сделан один пример по просьбе владельца (09 медведь): наш макет на холсте 150×100 с серыми полями → gpt-image-2.5 2K дорисовал поля и убрал мазки-«буквы» (5 ₽) → Recraft ×2 (0,25 ₽) → обрезка до 150×95 и +2 % = 9035×5722 px, 153×96,9 см при 150 dpi, как в их «Готовый макет.tif». Проверки кодом: серого в полях 0 %, надписи от краёв флага 135×90 не ближе 3,3 см. Файлы: https://myvisionagency.ru/lab/printflag-oblozhki-wb/pripusk/ (TIFF 102 МБ, JPG 12 МБ, превью с направляющими), локально C: mp\printflag-covers\pripusk\p09\. Скрипт стандарта: pripusk\pripusk.py (геометрия сверена с их файлом) и p09 inalize.py (из холста 3:2 в стандарт). 07 не делали: владелец решил показать один пример.
feature
Маски-лица по лекалам: оценка ТЗ Дмитрия (07.10) и проба на одном персонаже
07.10 Дмитрий прислал ТЗ «для агента по маскам», лекала (PDF CorelDRAW, лицо + затылок, на готовом макете затылок повёрнут на 180° с зазором 6 мм) и 4 эталона (Аллегрова, Басков, Воландеморт, Джейсон; TIFF CMYK 300 dpi ≈50×36 см). Файлы: cfru /opt/aitodo-tg/sbor-dmitry/maski-0710/, превью C: mp\printflag-covers\maski\. Оценка: делаем конвейером (лекала из PDF кодом без изменений, калибровка глаз и рта по 4 эталонам, лицо из фото персонажа с подгонкой по точкам, ИИ дорисовывает волосы, фон, припуск и затылок, сборка и CMYK кодом, автопроверка по чек-листу ТЗ п.13). Расхождения в их материалах: ТЗ 150 dpi, а эталоны 300; эталоны разной ширины 50,0/50,3/50,8 см; профиль у трёх ISO Coated v2, у Баскова Japan Color 2002 Newspaper. Риски: сходство с реальными людьми, отказ моделей на лица знаменитостей (проверить пробой), ст. 152.1 ГК и права студий на персонажей. Ждём: ответы на 3 вопроса и персонажа с фото для пробы.
✓ 07.10 тест 2 масок (Паша Техник, Шуфутинский) по ТЗ сделан, 26 ₽ из одобренных 30: лица gpt-image-2.5 2K по фото с Commons (CC BY/BY-SA), подгонка по точкам калибровки 4 эталонов, дорисовка краёв 1K, затылки 2K. Сборщик C: mp\printflag-covers\pripusk\mask_build.py (лекала из PDF без изменений, глаза/рот по эталону, затылок 180°, CMYK ISO Coated v2 из их файла, 150 dpi, проверка по чек-листу ТЗ). Итог: линия глаз ±0,3 мм, рот 0,9–1,4 мм от эталона; у Шуфутинского подбородок под бородкой на 26 мм ниже среднего, растяжение +7,5 %. Файлы https://myvisionagency.ru/lab/maski-test/ (TIFF 24 МБ, превью, отчёты). Ждём реакцию Дмитрия и ответы: 150 или 300 dpi, профиль.
feature
↑ Тест 1 карточки из топ-100: «Спи спокойно наш герой» (WB 532767978) по референсу 08.10
08.10 Дмитрий прислал Флаги_топ100.xlsx (100 карточек WB по выручке, 52 исключены как дубли и печать на заказ) и исправленный референс 5 слайдов (тафета (шелк), «Качественная обработка»). Меняется: название флага, сам флаг, по возможности фон и цвета под флаг; плюс сохранить макет. Сделан движок мокапов C: mp\printflag-covers op100\ (mockup.py, card.py): сцены = референс Дмитрия, полосы флага России служат разметкой складок, принт натягивается по ним с тенями и бликами, руки, плашки и древко остаются; заголовок обложки кодом (Montserrat Black, цвета букв из палитры флага). Проверен бесплатно на нашем макете 01: https://myvisionagency.ru/lab/pf-card-test/demo-01/all.jpg. Ждёт «трачу?»: макет флага №1 (gpt-image-2.5 2K + апскейл) и печатный файл 153×96,9 ≈ 10,5 ₽.
✓ 08.10 правки по обратной связи Дмитрия (текст + голосовое, расшифровано GigaAM): название одним цветом без триколора (шрифт оставили), фон и название подстраиваются под флаг (как его пример WB 895763652 рукав MIYAMI): theme.py берёт цвета из принта, небо перекрашивается с облаками, свечение цвета флага, подписи на фоне белые; печатный файл с чёрным контуром лазерного реза 12 px (2 мм), сверено с их «Готовый макет под лазерный рез.tif» (их прежний готовый макет + рамка, внутри совпадение до пикселя). Перегенерации не было, 0 ₽. Страница /lab/pf-card-test/ обновлена (картинки с меткой версии от кэша).
feature
↑ Партия 1: 10 карточек флагов из топ-100 + макеты под печать
09.10 по «да» владельца. Первые 10 из Флаги_топ100.xlsx (1 — тест «Спи спокойно», 9 новых). Плоские макеты gpt-image-2.5 2K по фото карточек (8 новых, 1 старый макет «Наш герой»), поля на симметричном холсте (tpl/allow.py), Recraft апскейл, печатные файлы 153×96,9 с рамкой реза; карточки tpl/compose.py. Центровка: размещение макета ≈0/0, широкая строка надписей ±0,3 см; «Наш герой» доведён сдвигом +1,6 см. Длинные названия переносятся на 2 строки. Код b1/pipeline.py, страница /lab/pf-partiya-1/. Kie: 8×5 + 9×5 + 9×0,25 = 87,25 ₽.
feature
↑ Партия 2: 10 военных флагов (позиции 11–21 без невоенных)
09.10 по просьбе владельца только военная тематика. Флаги: Спи спокойно (боль утраты), БПЛА Беспилотные войска, Штурмовик, Мой муж герой (ветеран), Мотострелковые войска, Ветеран БД (орёл), Мой брат герой, 137 ОШБр «Урал», БПЛА Военная разведка, Мой сын герой (ветеран). Пропущен Флаттершай. Орфография исправлена: «СМЕРТЬ» перегенерацией, «ОТДЕЛЬНАЯ» набрана кодом по дуге. Центровка: размещение макетов ≈0/0, широкие строки ±1 см. Страница /lab/pf-partiya-2/. Kie: 12×5 + 10×5 + 10×0,25 = 112,5 ₽.
feature
↑ Партия 3: 10 военных флагов + отступ надписей от края на партиях 1–2
09.10 замечание владельца: надпись «прилипла» к верхнему краю флага. Причина: модель не держит поля из промта. Исправлено на всех 17 флагах партий 1–2 (кроме Не умеешь, Орлята, 137 — там поля большие): рисунок уменьшен до 0,84–0,90 внутри зелёной зоны, фон дорисован, печатные файлы и слайды пересобраны. Партия 3 (позиции 22–35 военные): Путь воина, Брат герой ZOV, Сын герой с иконой, Группировка Север, Танковые войска, Морская пехота, Оператор FPV, Помним (ангел), Быть воином, Ты вечно с нами. «Морская пехота» — круговая надпись набрана кодом (ПЕХОТА с ошибкой). Kie за раунд ≈225 ₽. Страницы /lab/pf-partiya-1/, -2/, -3/.
feature
Партия 4: 10 военных флагов (позиции 35–46 без невоенных)
Страница https://myvisionagency.ru/lab/pf-partiya-4/ . Флаги: Вечная память, Спи наш герой спокойно (ангелы), Мой муж герой (герб), Наш герой (ветеран БД), Мой сын герой (икона, триколор), Андреевский (кодом), Пограничные войска, Военная разведка (кольцо кодом), Русский пират, 155 бригада МП (крест кодом). Работа: C:/tmp/printflag-covers/b4/ (pipeline.py, code_flags.py, fix_pogr.py). Расход 102 руб. Ждёт приёмки Дмитрия.
feature
Партии 5–8: все оставшиеся военные (38 флагов, позиции 47–100) + общая страница 78 карточек
Партия 5–8: https://myvisionagency.ru/lab/pf-partiya-5/ (38 флагов, номера 41–78). Общая страница всех 78 карточек одной ссылкой с архивом 215,8 МБ: https://myvisionagency.ru/lab/pf-vse-kartochki/ (1171 ссылка проверена). Позиция 54 не сделана: это баннер на люверсах, а не флаг. Поля кодом у 17 флагов (однотонные, полосы, Андреевский крест, ВМФ СССР), у 21 модель; 5 растянутых повторены, «Атлант» кольцо набрано кодом. Работа: C:/tmp/printflag-covers/b5/. Расход около 360–370 руб. Ждёт приёмки Дмитрия.
feature
Невоенные, партия 1: 10 карточек с девушкой (референс Дмитрия 09.10) + архивы по папкам
Страница https://myvisionagency.ru/lab/pf-nevoennye-1/ (номера 79–88: Имперский, ЮИД, Россия, За Россию (позиция 54), Спас нерукотворный, Башкортостан, Карачаевский, Северная Осетия, Спаси и сохрани, Португалия) + архив по папкам 85 МБ. Архив 78 военных по папкам (карточка + макет в папке флага): /lab/pf-vse-kartochki/printflag-78-flagov-po-papkam.zip, 942 МБ. Шаблон с девушкой: compose.build(style=girl), сцены tpl-s1-girl/tpl-s5-girl. Расход ≈58 руб. Ждёт ок Дмитрия, потом остальные невоенные.
feature
готовS22 · ISKRA блог: партия 8 (№86–95, 28.10)2/4

Цель: Очередь блога 1skra.ru пуста с 25.10. 10 статей по веб-Вордстату 28.10, ручные тексты, обложки ~33 ₽ после «трачу?», страница согласования /lab/, «ок» владельца → --approve.

↑ Темы и бриф партии 8: номера в футболе 15 065, волейболе 3 716, капитанская повязка 2 266, название команды, цвета клубов, номера в регби, женская баскетбольная, тренировочная майка, тайтсы, разминочная форма
C:/tmp/iskra-articles/batch8/BRIEF8.md; сверка с 132 записями ≥70% основ
✓ C:/tmp/iskra-articles/batch8/BRIEF8.md; сверка с 132 записями ≥70% основ
task
↑ 10 статей написаны (5 подагентов), prep_check 10/10, insert_articles.py → seo_articles status=ready
insert 28.10, --status: ready 10
✓ insert 28.10, --status: ready 10
task
↑ Обложки 10 × ~3 ₽ (iskra-covers-jobs по образцу партии 7) — после «трачу?» владельца
⛔ Ждёт «трачу?» владельца, ~33 ₽
task
↑ Страница согласования /lab/iskra-statyi-2810/ → «ок» владельца → iskra-blog-autopublish.py --approve
task

Ворклог (места остановки)

28.10.2026, 11:04:18 · 20 · claude

Принтфлаг: Дмитрий прислал скриншот с iPhone 14, где при прокрутке над шапкой видна картинка страницы. Причина: iOS 26 во встроенном браузере (ссылка из Телеграма) рисует страницу под стеклянной панелью сверху и ставит липкую шапку под панель. В обычном Safari панель внизу, поэтому у владельца всё было нормально. Над шапкой поставлена белая заслонка, полоса стенда поднята над ней. Экзамен hdr.browser.spec.mjs: до правки 2 из 4, после 4 из 4, регресс 65 из 65. Выложено на стенд и на хостинг nic.ru.

→ Дмитрий открывает стенд из Телеграма ещё раз и подтверждает. Дальше по С5 без изменений: ящик для заявок, TTL 300, promo в Тильде, панель nic.ru, «да» на смену A-записи.

28.10.2026, 09:36:38 · ISKRA блог: партия 8 · claude

28.10: очередь блога 1skra.ru пуста с 25.10 — партия 8 (№86–95) написана и вставлена ready. Темы веб-Вордстатом, бриф BRIEF8.md с карточками структур и голосов, 5 писателей, prep_check и insert_articles 10/10.

→ «трачу?» на обложки (~33 ₽) → сцены по образцу iskra-covers-jobs-1020.ts → apply_covers → страница /lab/ → «ок» → --approve 10 slug.

28.10.2026, 08:08:28 · ISKRA Директ х2 · claude

Разбор Директа ISKRA и план х2 обращений: myvisionagency.ru/lab/iskra-direct-x2/ (проверено на 1280 и 390). Только чтение, в кабинете ничего не менял. База 05–25.10: 11,7 обращения в неделю по 1 046 ₽ при лимите 10 000 без НДС. Футбол 20% денег / 1 обращение, прочие виды и мусор 9% / 0, джерси 10% / 11 по 469 ₽ без своей группы, общие группы ведут на главную (3,5% против 7,6–11% на страницах видов спорта). Прогноз Директа (CreateNewForecast) снова работает: по 32 фразам ~3 300 кликов в спецразмещении в месяц, берём ~1 100. Карта YD-MACHINE и самопроверка обновлены (зелёная), итог в ISKRA.md, скрипты в docs/clients/iskra-data/x2-plan/.

→ Ждёт владельца: 1) пополнение Директа сегодня, остаток 1 072 ₽ без НДС (рекомендовано 25 000 ₽); 2) «да» на шаг 1 (порядок в кампании без доплаты); 3) футбол урезать или посадочная; 4) вопросы клиенту: костюмы/единоборства, номер мессенджера, срок и тираж в объявлениях; 5) сайт: мессенджеры и посадочная; 6) бюджет х1,5 с ~10.11 при 15+ в неделю; 7) ретаргет 2 000/нед. После «да» на шаг 1 завести задачи спринта и проверку на 12.11.

28.10.2026, 04:59:56 · 20 · claude

Принтфлаг С5: получен FTP к папке printflag.ru (adv7753634_leadforge2). База adv7753634_lf2 была пустая (Искры там нет), хост localhost, MySQL 8.0, PHP 8.5 без SQLite. Залита боевая сборка 154 файла (той же, что 89/89), config.php с MySQL и новым паролем админки, .htaccess (наша 404). Скрипт выкладки scripts/deploy-ftp.py. Проверено подстановкой адреса: 46 страниц 200, 71 файл 200, 0 ошибок консоли, форма без галочки отказ (браузер и сервер), с галочками и файлом заявка в базе, админка, файл, CSV, статус. Найдено: на сервере нет сертификата для printflag.ru, www без DNS-записи, promo.printflag.ru в Тильде отдаёт 404, TTL A-записи 6 часов, без SMTP письма с nic.ru не пройдут SPF.

→ Дмитрий: ящик + пароль приложения Яндекса (вписать в админке), панель nic.ru (Let's Encrypt после смены A, редирект https, gzip, кэш), promo в Тильде, TTL 300 за день. Потом по «да»: A и www на 91.189.114.19, сертификат, проверки шага 6 DEPLOY.md, Вебмастер, Метрика, остановка старой рекламы. Проверочная заявка в базе со статусом «Отказ».

27.10.2026, 06:26:14 · Принтфлаг С10–С11 + ISKRA юр-документы · claude

Принтфлаг: по ответу Дмитрия 22.10 сделаны С10 (спортивная форма: хаб + 7 подстраниц без сроков цифрами, платки/шарфы/баффы, вымпелы убраны, меню 6 разделов) и С11 (политика ПДн, согласие на обработку, согласие на рекламу, две галочки во всех формах, запись согласий в журнал/базу/письмо/админку/CSV, плашка cookie). Экзамены до кода (17 красных), ОТК 2 круга (2 подагента Sonnet), регресс 89/89, Lighthouse 96–99. На стенде /lab/printflag-site/. Выяснено: printflag.ru на 91.189.114.19 заведён, но наш FTP видит только 1skra.ru. ISKRA: пакет юр-документов для 1skra.ru собран и проверен на копии, не залит.

→ 1) Дмитрий: FTP к папке printflag.ru (отдельный пользователь в панели nic.ru), подтвердить реквизиты, ММА, реестр РКН. 2) Залить Принтфлаг на хостинг, проверить через Host-заголовок, затем DNS (A → 91.189.114.19, Тильда → promo.printflag.ru), Метрика и Вебмастер. 3) По «да» владельца залить пакет ISKRA (пересобрать от свежей копии, проверить формы живьём, заявка доходит в Freedom).

26.10.2026, 09:36:54 · ISKRA отчёт 19–25.10 · claude

Отчёт клиенту ISKRA за 19–25.10 собран и выложен: myvisionagency.ru/lab/iskra-otchet-19-25-oktyabrya/ (клиентская версия, проверен на 1280 и 390 в тёмной теме). Директ 12 200 ₽ / 7 форм + 5 кликов по телефону = 1 017 ₽ (938), хоккей 6 из 12, общие «пошив на заказ» 58% денег / 2. ВК 0 показов 18–25.10. Авито наши 119/17 (173/19), 233 ₽ за контакт. Органика 56 (67), Яндекс 20 (38). Итоги в ISKRA.md.

→ Владельцу: ВК клиент пополнил 15 000 ₽, кампания пошла на старую аудиторию (ИС-1); Директ остаток 4 615 ₽ без НДС до ~29.10; заявки Директа помельчали (1–2 вещи); блог: очередь пуста, партия 8 не готова; отчёт отправлять клиенту только после «ок».

21.10.2026, 09:33:37 · 21 Принтфлаг: карточки WB флагов · claude

Принтфлаг, четвёртый круг правок Дмитрия (Правки 1-99.docx от 19.10): 22 флага исправлены кодом без платной генерации. Гербы 65 и 74 поставлены целиком (во втором круге их резала маска, скипетр был разорван), значки Ветеран с зазором 1,6 см до лент и по оси, знак Гвардия на 64 и 68 без потери букв, 38 заголовок и строка начисто, 42 баннер ордена и шеврон, 53 сплошное кольцо, 66 отражения медалей, 8 ДЕЙСТВИЙ по ленте, 14 шов, 21/33 буквы иконы, 35 ровный зелёный, 51 текст по центру (в третьем круге был сдвиг с ошибкой замера), 77 герб по центру. 198 файлов на сервере сверены по хешу, ссылки целы, архивы пересобраны.

→ Ждём ответа Дмитрия. 70 не трогали: текущий файл уже чистый, Дмитрий прислал скрин старой версии. 57 = дубль 17, ждём замену.

20.10.2026, 10:19:00 · · claude

Блог ISKRA партия 7 (№76–85): «ок» владельца 20.10 → 10 статей approved (iskra-blog-autopublish.py --approve). Порядок по plan_n: №75 выходит 20.10 16:10, №76–85 21–25.10 по две в день. Карта SEO-MACHINE «Партия 7» обновлена.

→ 21.10 проверить выход №76/№77 (проверка по сроку). Партия 8 нужна с «ок» до 26.10 10:10 МСК, начинать 23.10 (проверка по сроку).

20.10.2026, 08:43:15 · · claude

20.10 блог 1skra.ru (ISKRA): очередь кончилась 20.10 16:10. Партия 7 (№76–85) написана в сессии: темы веб-Вордстатом (API Директа v4 выключен, 509), каждая статья своей структурой и голосом, проверка шаблонности prep_check.py, вставлена ready (insert_articles.py 10/10), обложки kiegen iskra-blog-p7 11 шт. ≈33 ₽ (одна переделка), показ preview_p7 10/10 без замечаний. Страница согласования myvisionagency.ru/lab/iskra-statyi-2010/. Карта SEO-MACHINE: разделы «1. Спрос» (Вордстат API) и «Партия 7».

→ После «ок» владельца: iskra-blog-autopublish.py --approve <10 slug> — выйдут по две в день. Партию 8 готовить с запасом за 5 дней до конца очереди.

19.10.2026, 09:13:58 · ISKRA ВК 19.10 (AITODO 1463) · claude

Задача AITODO №1463: проверить, стоит ли реклама ВК ISKRA с 17.10. Проверено по API кабинета (только чтение, 0 ₽), снимок на 12:12 МСК 19.10 совпал с записью прошлого прогона 12:10: баланс кабинета 23289838 = 0 ₽, план 31385948 active/not_delivering, обе рабочие группы (900 ₽/день) с причиной NO_MONEY; расход 15–16.10 по 1 800 ₽, 17.10 608,40 ₽ (3 796 показов, деньги кончились до обеда), 18–19.10 0 показов / 0 ₽, заявок с 15.10 нет. Ничего не сломано и не выключено: кампания возобновится сама при пополнении, в прежнем составе и на выгоревшей аудитории (частота 4,83, новых 7 %). Запись в docs/clients/ISKRA.md, раздел «19.10.2026 ~12:10 МСК». Задача в AITODO закрыта.

→ Ждёт решения владельца ИС-1 из среза 16.10: пополнять ли ВК. Рекомендация прежняя: не пополнять под старую аудиторию, сначала 3–4 свежих объявления «комплект на всю команду» на живых фото (0 ₽, через страницу /lab/) и новая группа на непересекающиеся сегменты (iskra-vk-split-0925.ts), потом деньги. Клиенту про остановку не писали, дефолт: кабинет стоит.

19.10.2026, 08:42:45 · ISKRA отчёт 09–18.10 · claude

Отчёт клиенту ISKRA за 9–18.10 собран и выложен: myvisionagency.ru/lab/iskra-otchet-9-18-oktyabrya/ (клиентская версия, проверен на 1280/390 и в тёмной теме). Директ 15 855 ₽ / 17 обращений = 933 ₽ (1–8.10: 1 528), ВК 15 000 ₽ / 3 = 5 000 ₽, Авито наши 301/30 (было 288/16), органика 86 (52). API Директа ожил 19.10. Закрыты проверки ВК (не сработало), SEO 2 недели, лид-магнит (0 заявок). Карты: ISKRA.md, YD-MACHINE (ошибка 56), SEO-MACHINE (Вебмастер по 06.10, запросы-роботы).

→ Владельцу: Директ ISKRA −5 315 ₽ без НДС (пополнить), ВК стоит с 17.10 (ИС-1), партия 7 блога «ок» до 21.10 10:10 МСК. Проверка партии 4 в Вебмастере перенесена на 26.10 (Вебмастер отдаёт по 06.10). Авито «Форма для команд» повторный замер 23.10.

14.10.2026, 10:43:35 · 21 Принтфлаг: карточки WB флагов · claude

Принтфлаг, третий круг правок Дмитрия (Правки 1-99.docx, 14.10): 37 флагов исправлены кодом без платной генерации (двойные гербы, значки Ветеран с зазором до лент, официальный знак Гвардия на 64/68, андреевский крест начисто, фон по периметру 76/85/90/95/96/97, буквы 12/21/33/42/50/73, центровка 30/51/61). Найдена причина «обновила, но не исправлено»: папки страниц 11 флагов не пересобирались с 9–10.10, на сайте лежали старые файлы. Выложены 43 папки, 3 общие страницы и 6 архивов; 297 файлов на сервере сверены по хешу, битых ссылок нет.

→ Ждём ответа Дмитрия по третьему кругу. Открыто: 57 = дубль 17, чем заменить. 51: тексты выровнены сдвигом всего холста (солдат на 6,6 см левее центра), если не понравится, стирание текстов моделью ~5 ₽.

14.10.2026, 06:05:20 · ISKRA 14.10 · claude

Утренний бриф ISKRA + решения владельца 14.10. Авито: тест обложек хоккея 02–13.10 (на объявление A 6,5 просм/0,75 конт, D 5,7/0,67, B 3,3/0,25, C 1,0/0) → по «делай» C заменена на A в Екатеринбурге 8405954284, Челябинске 8356581513, Краснодаре 8350633269, Волгограде 8492937472 через фид (выгрузка 615587120 success, 4 «Изменено/active», 39 без изменений, без 1835, 0 ₽). Проверки: 577ed2d7 закрыта, 31d6abc1 на 21.10; eaa7fee4 (бот на сайте) закрыта досрочно. ВК: разбор подорожания (выгорание аудитории, частота 4,4, доля новых 13%), 2 объявления на паузе, «Комплект целиком» в группу шире; проверка 95f8829a на 17.10. Блог: партия 6 в очереди до 20.10, обложки ≈33 ₽. bbip на футболе 8449732361 по-прежнему продлевается (выключить только из кабинета, ждёт владельца).

→ Владелец: выключить автопродление bbip на футболе 8449732361 в кабинете; пополнение ВК (баланс ≈5 745 ₽ до ~17.10); заявки ВК в CRM клиента + кнопки в лид-форме; «ок» на партию 7 блога до 21.10. Сторож входящих lf-inbound-watcher ≈100 дней падает: IMAP mail.ru «нет доступа на тарифе».

14.10.2026, 04:27:21 · Блог ISKRA партия 6 · claude

Блог ISKRA партия 6 (№66–75) по «ок» владельца 14.10 поставлена в очередь. Обложки через kiegen iskra-blog-p6: 10 + 1 переделка (№75 киберспорт вышел с волейбольной эмблемой) = 11 оплачено ≈ 33 ₽, все просмотрены глазами. Сцены заданы по номеру плана (движок промахнулся в 8 из 10), детские и школьные без людей, образцы jpg с leadforge (добавлен athletics-hero-f.jpg). Проверка 10 из 10 без замечаний функциями публикатора, --approve: в очереди 14 статей №62–75, выход 14–20.10. Страница /lab/iskra-statyi-1410/. IndexNow Яндекса лежит с 11.10 (api.indexnow.org 200). Доки: SEO-MACHINE «Партия 6 в очереди», ISKRA.md 14.10.

→ 17.10 проверка: вышли ли №66–69 с новыми обложками. Партия 7 с «ок» до 21.10 10:10 МСК, иначе разрыв. После восстановления Яндекса — iskra_indexnow.py --all.

14.10.2026, 04:22:20 · ISKRA ВК: разбор подорожания заявки 14.10 · claude

ВК ISKRA, план 31385948: разобрал, почему заявка подорожала с 1 818 до ~4 500 ₽ (скрипт iskra-vk-diag-1014.ts, только чтение, снимок кабинета docs/clients/iskra-data/vk-1014/). Аукцион не подорожал: CPM 141 → 120 ₽, клик 47 → 42 ₽, кликов в день 35 → 43. Упала конверсия клик → заявка, и падала ещё до остановки: 24–27.09 3,9 % (заявка 1 111 ₽), 28.09–05.10 1,9 % (2 653 ₽), 09–13.10 0,9 % (4 496 ₽). Причина: выгорание аудитории и креативов: охват с запуска 49,6 тыс. человек, частота 4,4, новых людей в показах 48 % → 20 % → 13 %; таргетинг и креативы не менялись с 21–24.09, обучение групп 1 (пауза ни при чём). Форма исправна: «28»/«30» это ответы на «Сколько человек в команде?», полные заявки на большие команды. По объявлениям (заявки по banner_id): Спортшкола 9 548 ₽ / 5, Комплект целиком 7 472 ₽ / 4 (обе свежие), Логотип и номера 7 165 ₽ / 3, Хоккей 3 025 ₽ / 1, Футбол 1 223 ₽ / 0, Детские 812 ₽ / 0. Сделано (iskra-vk-tune-1014.ts --apply, бюджет не менялся, 2 × 900 ₽): пауза 237739866 Хоккей (CTR 0,21 %, худший) и 237739871 Логотип и номера (клик 56 ₽, 0 заявок на 40 кликов после паузы); копия Комплект целиком в группу 154829656 — 243799995, модерация пройдена, delivering; проверено через API. Заявки ВК до клиента: письмо ВК на Info@1skra.ru + «Лиды» LeadForge за ~15 мин (10.10 и 12.10 легли, все в статусе new); в CRM клиента не попадают. Карта VK-MACHINE (§ Статистика: лимит 2 запроса/с, summary игнорирует даты, uniques = накопленный охват, доля новых), паспорт ISKRA и скилл vk-work дописаны. Проверка 17.10 заведена.

→ 17.10 — проверка по сроку (команда в задаче): клик → заявка и цена заявки после правки, отдача 243799995. Баланс 5 745 ₽ (14.10 утро) кончится ~17.10. Ждёт владельца: 1) пополнение — неделя в том же темпе 12 600 ₽; поднимать дневной бюджет НЕ советую: больше денег на ту же аудиторию = выше частота, дороже заявка; 2) свежие креативы «комплект на всю команду» на живых фото из банка ord-live-* (кадрирование в 4 формата, 0 ₽, через страницу согласования) — если нужна генерация, ~3 ₽ за кадр через kiegen, 6 кадров ≈ 20 ₽; 3) после пополнения — группа на новую аудиторию в тех же 1 800 ₽ (сегменты без пересечения с интересами, iskra-vk-split-0925.ts готов); 4) заявки ВК в CRM клиента (сейчас только письмо на Info@1skra.ru) — доработка сборщика; 5) вопросы формы кнопками вместо свободного текста (с 06.10).

13.10.2026, 12:37:24 · ce1b46d9-e2d8-4fc4-8e21-79c1bed5bc96 · claude

Принтфлаг: второй круг правок по 1–50 и первый по 51–99 выложен на /lab/pf-vse/ (страницы партий, три общих страницы и архивы пересобраны, 1487 ссылок без ошибок, превью на сервере сверены). 46 флагов: официальные гербы (РФ/империя/ЛНР, ч/б в значках), шевроны и медали, иконы шрифтом Ponomar, кольца, ровные полосы, единый красный фон, ноги бойца 65, крест 68, центровка. Расход ≈144 руб., баланс Kie 1345 кредитов.

→ Владелец отправляет Дмитрию. Ответ Дмитрия по 57 (дубль 17). По 8/18/38 он смотрел старую версию. Дальше Дмитрий доправляет руками сам.

13.10.2026, 11:52:34 · ce1b46d9-e2d8-4fc4-8e21-79c1bed5bc96 · claude

Принтфлаг, второй круг правок (1–50) и первый по 51–99 в работе: гербы на 17 флагах заменены на официальные векторы (РФ, империя, ЛНР, чёрно-белый для значков), шевроны/медали перерисованы (42, 64, 66, 68, 72, 53), иконы 21/33 шрифтом Ponomar, кольца 46/73, «Действий» на 12, пятно 35, медальон 30, ровные полосы 52/58/71/74/94, красный фон 91/95, ноги 65, крест 68, центровка ~15 флагов. Идёт сборка печатных файлов 46 флагов. Расход ≈130 руб. из 160.

→ Дособрать печатные файлы → слайды → страницы и архивы /lab/pf-vse/, проверить и отдать владельцу. Спросить Дмитрия про 57 (дубль 17); по 8/18/38 он смотрел старую версию.

13.10.2026, 05:23:54 · 80c816ae-721b-478d-af64-ea9d49639767 · claude

Printflag 13.10: Дмитрию выгружены типы и подтипы каталога РусФлага в Excel (12 разделов, 196 строк, колонка «Оставить да/нет», черновик 15 страниц). С9: все цены убраны с сайта по решению клиента и владельца, калькулятор стал «Расчётом заказа» без цен, выбор уходит менеджеру. 78 экзаменов зелёные, Lighthouse 97/98/99, ОТК 2 круга.

→ Ждём отметок Дмитрия в Excel → пересборка меню и страниц под 10–16 лендингов (С10), новые страницы (платки/шарфы, гербы) с текстами и фото (~5 ₽ за фото, по согласованию). Для прода: «да», FTP nic.ru, пароль приложения Яндекса, Вебмастер.

12.10.2026, 15:34:04 · ce1b46d9-e2d8-4fc4-8e21-79c1bed5bc96 · claude

Принтфлаг: правки Дмитрия по флагам 1–50 сделаны и выложены. 13 гербов (щит с настоящего герба РФ), строки с запятыми и кривыми буквами перенабраны кодом (2,4,6,7,18,20,21,31,33,40,44,11), надписи по кругу 40/41/46, значки 8/12 «ДЕЙСТВИЙ», погранвойска 35, иконы 21/33, ордена 38/42, крест 24/41, ноги бойцов 8/14/17/48, центровка по высоте ~25 флагов (замер кодом). Страницы партий 1–5, /lab/pf-vse/ и архивы пересобраны. Расход ≈145 руб.

→ Владелец отправляет Дмитрию ссылку /lab/pf-vse/. Ждём правки по 51–99 и прогоняем тем же инструментом pravki/fixes.py.

12.10.2026, 07:50:47 · ce1b46d9-e2d8-4fc4-8e21-79c1bed5bc96 · claude

Принтфлаг: 99 из 100 карточек. Одна страница на всё /lab/pf-vse/ с одним архивом по папкам (Военные/Невоенные → флаг → 5 слайдов + макет), 1,1 ГБ. Доделаны военные Ахмат, Вагнер, Трон (партия 7), «Не умеешь, не исполняй» и «Орлята дошколята» переложены в шаблон с девушкой. Военные 1–82, невоенные 83–99. Расход ≈20 руб.

→ Владелец отправляет Дмитрию /lab/pf-vse/. Майкл Джексон отложен по решению владельца. После приёмки Дмитрия закрыть задачу 100 карточек (счёт №10057).