feat(jivo-bot): статья «Откуда берутся заявки и законно ли это» (формулировка владельца)

Владелец 12.07.2026 дал суть: номера передают операторы связи, и только по тем
абонентам, кто дал согласие на передачу данных третьим лицам и на рекламные
предложения. Раньше бот на «а где вы берёте эти номера?» честно эскалировал —
теперь отвечает сам, юридически корректно.

+ otkuda-zayavki.md: источник данных (операторы связи), согласие абонента как
основание, 152-ФЗ, никаких «слитых» баз; практика для клиента (звонить можно
и нужно быстро, вежливо завершать при отказе); честная оговорка «заявка —
интерес, не гарантия продажи»; юрвопросы → живой специалист.

Границы держатся (проверено живьём): «какой конкретно оператор — Билайн? МТС?» →
эскалация; «эти номера только мне достаются?» → эскалация (эксклюзивность —
жёсткая стоп-тема). Поставщик и модель распределения не раскрываются.

TDD: тест на РЕАЛЬНОЙ базе знаний (3 формулировки вопроса → статья про операторов).
42/42 зелёные.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Дмитрий
2026-07-12 11:18:11 +03:00
parent 340375a47f
commit d6526bdadf
2 changed files with 49 additions and 0 deletions
@@ -60,6 +60,20 @@ it('на РЕАЛЬНОЙ базе знаний «зачем нужна Лиде
->and(mb_strtolower($hits[0]->title))->toContain('сервис');
});
it('«где вы берёте эти номера» → статья о происхождении данных и согласии абонента', function () {
// Живой урок 12.07.2026 (формулировка владельца): номера передают операторы связи,
// и только по тем абонентам, кто дал согласие на передачу данных третьим лицам
// и на рекламные предложения. Раньше бот эскалировал этот частый вопрос.
KnowledgeChunk::query()->delete();
$this->artisan('help:rebuild-knowledge')->assertExitCode(0);
foreach (['а где вы берёте эти номера?', 'откуда у вас данные людей', 'это законно вообще?'] as $q) {
$hits = app(KnowledgeSearch::class)->search($q, 3);
expect($hits)->not->toBeEmpty()
->and(collect($hits)->pluck('content')->implode(' '))->toContain('оператор');
}
});
it('на вопрос не по теме возвращает пусто', function () {
expect(app(KnowledgeSearch::class)->search('какая погода в москве', 3))->toBeEmpty();
});