Files
portal/docs/superpowers/plans/2026-06-20-acceptance-02-second-round-plan.md
T
Дмитрий 83f0b88d3e docs(приёмка): ещё 11 планов-отчётов — движок добит + UI-блок
Движок Фазы 3: 02 второй круг, 04 лимит/пауза под локом, 06 каналы/парсинг,
12 денежный аудит, 11 лента денег/калькуляторы, 15 сделки переживают удаление,
16 изоляция. UI-блок R3b: 19 гейт реквизитов+ИНН, 20 колокольчик+дайджест,
22 отчёты, 23 импорт CSV.

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

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 15:36:30 +03:00

8.0 KiB
Raw Blame History

Приёмка liderra.ru — ПУНКТ №2: Второй круг (серия заявок раздаётся всем честно)

Для исполнителя: формат PR1 (одобрен 20.06). Каждый шаг = 🔧 Код-факт (file:line) · 🎬 Действие · 📋 ОТЧЁТ (было→ожидали→стало + 📸/📝) · ❌ Если не так. Техника «под капотом»; владельцу — человеческие карточки.

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

Что снимаем глазами: Сделки и Баланс всех 7 клиентов — у каждого появились заявки, ни у кого не больше лимита. Живые 📸.

Источник сценария: свод проверок №2 (D-ROUND); R3 «движок».


🔧 Код-факты (подтверждено чтением 20.06)

  • Жребий выравнивает по остатку лимита — кандидаты сортируются ORDER BY (snap.daily_limit projects.delivered_today) DESCLeadRouter.php:154-157; взвешенный отбор: вероятность ∝ остатку лимита, мелкие не отрезаются — weightedPick :171.
  • Дневной лимит не превышается — в отбор попадают только delivered_today < daily_limit:145.
  • CAP=3 на каждую заявкуLeadDistributor.php:22: за серию из N заявок суммарно до N×3 доставок, распределённых по 7 клиентам в рамках их лимитов.
  • Счётчик delivered_today растёт при каждой доставке — снижает шанс «перегруженного» клиента в следующих заявках.

Шаг 2-1 — Влить серию (~15 заявок) на источник всех 7

🔧 Код: отбор/жребий — LeadRouter :104-171; CAP — LeadDistributor :22-43. 🎬 Действие (лок): влить ~15 заявок подряд на источник, где подходят все 7 клиентов (это сценарий засева imitation:seed --clients=7 --leads=15).

📋 ОТЧЁТ:

Что Было Ожидалось Стало (факт) Чем подтверждаем
Получили заявки 0 все 7 клиентов обслужены (никто не пустой) (слот прогона) 📸 Сделки каждого из 7 (есть заявки)
Распределение примерно равномерно (жребий по остатку лимита) (слот) 📸 сводка по 7 (близкие числа)
Всего доставок ≈ 15×3 = 45 (по 3 на заявку) (слот) 📝 SQL COUNT deals за серию

💡 Что внутри: когда заявки идут потоком, портал следит, чтобы они доставались всем по очереди, а не оседали у первых. Он отдаёт предпочтение тем, у кого ещё много свободных мест на сегодня — поэтому отстающие догоняют, и через серию заявки получают все семеро примерно поровну.

Если не так: часть клиентов осталась без заявок при свободном лимите → перекос раздачи.


Шаг 2-2 — Никто не получил больше своего дневного лимита

🔧 Код: фильтр лимита — LeadRouter :145. 🎬 Действие (лок): у каждого из 7 сверить число полученных за день с его дневным лимитом.

📋 ОТЧЁТ:

Что Было Ожидалось Стало (факт) Чем подтверждаем
Доставлено за день каждому ≤ дневного лимита у всех (слот) 📸 Сделки/счётчик дня; 📝 SQL delivered_today ≤ daily_limit
Клиент у лимита по достижении лимита больше не получает (слот) 📸 его список перестал расти

💡 Что внутри: у каждого клиента есть дневной потолок — сколько заявок в день он готов взять. Портал его соблюдает: как только клиент набрал свой лимит, новые заявки идут другим, а не сверх оплаченного объёма.

Если не так: кто-то получил сверх лимита → дефект (клиент платит за лишнее).


Шаг 2-3 — Деньги по серии сходятся у всех

🔧 Код: списание — LedgerService :53-95. 🎬 Действие (лок): у нескольких клиентов сверить: число сделок × цена = уменьшение баланса.

📋 ОТЧЁТ:

Что Было Ожидалось Стало (факт) Чем подтверждаем
Баланс vs сделки у каждого: списано = (число сделок × цена ступени) (слот) 📸 Баланс + Сделки клиента

Если не так: баланс не бьётся с числом сделок → денежный дефект (связка с №7).


Verification №2 (выход из пункта)

  • 📸 Все 7 клиентов получили заявки (никто не пустой при свободном лимите).
  • 📸 Распределение примерно равномерное (жребий по остатку лимита).
  • 📸/📝 Никто не превысил дневной лимит.
  • 📸 Деньги сходятся у каждого (сделки × цена = списано).

📸 vs 📝 в этом пункте

  • 📸 Скриншот: Сделки и Баланс всех 7 (или сводка), счётчик дня у клиента-у-лимита.
  • 📝 Текст: COUNT deals, delivered_today vs daily_limit — частично текстом.

Грабли

  • Жребий случайный — равномерность приблизительная, не точная; смотрим, что все обслужены и лимиты целы, а не идеальное равенство.
  • Дневной лимит — отдельная страховка; «пауза на лету» — пункт №4.
  • Связка с №1 (CAP на одну заявку) — здесь проверяем поведение на серии.