9ff19f3cc3
feat(bot): всеобъемлющая инструкция (36 статей) + 31 узкая экскурсия, которая открывает окна Живой урок владельца 12.07.2026: «дубли чистятся в 2-х местах, а бот выдумал третье», «стыдно такого бота показывать», «видео показываем полное, а я спрашиваю про одно — надо резать», «надо не только кнопку показывать, а и что за ней». База знаний: 17 обзорных статей → 36 узких по темам. Портал обойдён целиком (5 агентов): все экраны, окна, подсказки «(?)», тексты ошибок, внутренние правила. Новое, чего бот не знал: дубли в ДВУХ местах (Поле и Предложения) + окно «источник уже есть»; правило 18:00; почему приходит меньше лимита; оплата по счёту и акты; списания; безопасность и 2FA; отчёты; массовые действия; регистрация. Экскурсии: 15 → 31, каждая на свою тему (3–7 шагов). Раннер GuidedTour научен шагу `open` — сам открывает окно/вкладку и подсвечивает то, что ВНУТРИ (окно дублей, форму подбора, диалог пополнения, панель тарифов, карточку сделки). 99 новых якорей data-tour расставлено по всему порталу (4 агента). Поиск: веса в tsvector (заголовок A / синонимы B / текст C) — иначе на «чистка дублей» первой всплывала статья «Списания» из-за мимоходного упоминания «поля». Тесты: Pest бот 39/39, Vitest 1222/1222. Новые сторожа: у каждой статьи есть экскурсия; экскурсия не короче 3 и не длиннее 7 шагов; каждая цель экскурсии реально существует в разметке; экскурсии про действия обязаны открывать окно. Живая проверка в браузере: экскурсия про дубли сама открыла окно объединения и перешла на второе место чистки. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> @
27 lines
1.6 KiB
PHP
27 lines
1.6 KiB
PHP
<?php
|
||
|
||
declare(strict_types=1);
|
||
|
||
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||
use Illuminate\Support\Facades\DB;
|
||
|
||
uses(RefreshDatabase::class);
|
||
|
||
it('перечитывает resources/help и заполняет knowledge_chunks с нуля', function () {
|
||
// Мусорная строка от прошлой индексации — должна исчезнуть (полная перезаливка).
|
||
DB::table('knowledge_chunks')->insert([
|
||
'source_path' => 'help/deleted-article.md', 'title' => 'Старая', 'topics' => '',
|
||
'chunk_index' => 0, 'content' => 'мусор', 'created_at' => now(), 'updated_at' => now(),
|
||
]);
|
||
|
||
$this->artisan('help:rebuild-knowledge')->assertExitCode(0);
|
||
|
||
expect(DB::table('knowledge_chunks')->where('source_path', 'help/deleted-article.md')->count())->toBe(0)
|
||
->and(DB::table('knowledge_chunks')->where('title', 'like', 'Создать проект%')->count())->toBeGreaterThan(0)
|
||
->and(DB::table('knowledge_chunks')->where('title', 'like', 'Тарифы%')->count())->toBeGreaterThan(0)
|
||
->and(DB::table('knowledge_chunks')->where('title', 'like', 'Дубли конкурентов%')->count())->toBeGreaterThan(0)
|
||
// Инструкция переписана 12.07.2026 узкими статьями по темам («резать по вопросу»,
|
||
// требование владельца) — их сильно больше, чем прежних 17 обзорных.
|
||
->and(DB::table('knowledge_chunks')->distinct('source_path')->count('source_path'))->toBeGreaterThanOrEqual(30);
|
||
});
|