feat(bot): ответственность за источник — новая статья + сторож

Правило владельца 13.07.2026. Лидерра отдаёт ВСЕ номера, прошедшие через
выбранный клиентом источник (и входящие, и исходящие), и не сортирует людей
по темам. Источник конкурента может быть шире ниши клиента (клиника с 30
врачами против одной стоматологии); конкурент может расширить профиль,
ошибиться в рекламе или прозванивать купленную базу — это вне нашего контроля.

Заявка не по теме = не брак, замены за неё нет; но тон мягкий — объяснить
и развернуть клиента к работе с ИСТОЧНИКОМ (сузить, сменить, пауза).

Статья kachestvo-istochnika.md + мягкие напоминания в трёх местах, где речь
заходит об источниках. Сторож AnswerGuard::promisesNicheRelevance режет
обещания «только целевые / отсеиваем нецелевых / гарантируем трафик».
50 статей, тесты 153/153.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Дмитрий
2026-07-13 09:49:31 +03:00
parent 7f8b245b0c
commit 8c3fa9a96b
7 changed files with 138 additions and 0 deletions
@@ -472,3 +472,38 @@ it('честное «круглосуточно» сторож не трогае
expect($guard->clean('Поддержка отвечает круглосуточно, пишите в любое время.', $context))
->toBe('Поддержка отвечает круглосуточно, пишите в любое время.');
});
/**
* Правило владельца 13.07.2026 (ответственность за источник). Лидерра отдаёт ВСЕ номера,
* прошедшие через выбранный источник, и входящие, и исходящие. Что за люди идут через
* этот источник, решает не Лидерра: клиника конкурента может лечить 30 болезней, а наш
* клиент только зубы; конкурент может расширить профиль, ошибиться в настройках рекламы
* или купить плохую базу для обзвона. Поэтому бот НЕ ИМЕЕТ ПРАВА обещать, что заявки будут
* строго по нише клиента, что мы «отсеиваем нецелевых» или «гарантируем целевой трафик»
* этого мы обеспечить не можем, а за обещание придёт претензия.
*/
it('сторож режет обещание, что заявки будут строго по нише клиента', function () {
$guard = app(AnswerGuard::class);
$context = 'Мы передаём контакты людей, интересовавшихся темой по указанному вами источнику.';
$cases = [
'Все заявки будут строго по вашей нише.',
'Мы отсеиваем нецелевые заявки — придут только ваши клиенты.',
'Мы гарантируем целевой трафик по вашей теме.',
'Нерелевантные контакты к вам не попадут.',
];
foreach ($cases as $sentence) {
expect($guard->clean('Заявки приходят по указанному источнику. '.$sentence, $context))
->toBe('Заявки приходят по указанному источнику.');
}
});
/** Честное объяснение про источник — НЕ обещание, резать его нельзя. */
it('честное объяснение про широкий источник сторож не трогает', function () {
$guard = app(AnswerGuard::class);
$context = 'Заявки идут по выбранному источнику; если источник шире вашей ниши, придут и не ваши темы.';
$text = 'Если источник шире вашей темы, часть заявок будет не по вашей нише — источник выбираете вы.';
expect($guard->clean($text, $context))->toBe($text);
});