Files
portal/app/tests/Feature/Bot/HelpRebuildKnowledgeCommandTest.php
T
Дмитрий 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>
@
2026-07-12 12:56:22 +03:00

27 lines
1.6 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?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);
});