QA.GURU
AI-first QA · словарь на каноне wrong password
50 · словарь
← листы

Один сценарий — два пояснения у термина

Промышленный AI-стек звучит чужим, пока его не посадить на уже знакомый канон. Слева — что это вообще. Справа — тот же смысл на LoginTests: промпт «добавь автотест на неуспешный логин с неправильным паролем» и метод shouldShowErrorWhenPasswordIsWrong.

якорь · LoginTests + API-близнец

// e2e · текст на форме
loginPage.openPage()
        .typeUsername("user1")
        .typePassword("wrongpassword")
        .submitExpectingError()
        .shouldHaveErrorMessage("Wrong login or password");

// не fillAndSubmitForm — тот ждёт HomePage
// не @Tag("smoke") — это не prod slice
// JSON 401 уже в AuthApiTests#loginWithInvalidPassword

Ничего не нашлось. Попробуйте «граф», «Allure» или «токен».

Модель

LLM

модель · large language model

Общее

Программа, которая предсказывает следующий кусок текста. Не «знает репозиторий» и не запускает Gradle сама — только генерирует токены, пока ей не дадут инструменты и файлы.

На LoginTests

Модель может написать метод с fillAndSubmitForm, потому что так выглядит соседний happy path. Правильный sad path она не «помнит из интернета» — его держат skill, RAG и открытый канон.

Prompt

промпт · запрос в чат

Общее

Текст, с которого начинается работа модели. Живёт в чате и умирает вместе с ним. Стабильные правила лучше класть в git (rule / skill), а не повторять в каждом промпте.

На LoginTests

«Добавь автотест на неуспешный логин с неправильным паролем». Фразу «не коммить» в чат не пишут — это rule. Без слоёв этого промпта хватает, чтобы скопировать happy path.

Token

токен · единица биллинга

Общее

Кусок текста, которым модель читает и пишет. Платят и ограничивают окно не «страницами», а токенами. Чем больше файлов запихнули в контекст, тем дороже и ближе потолок окна.

На LoginTests

Весь класс + qa-write-test + четыре чанка RAG — уже заметный чек. Поэтому skill говорит «прочитай 2–4 файла», а не всю папку docs/agent-skills/rag/.

Context window

окно контекста · сколько модель видит

Общее

Жёсткий лимит токенов на один запрос: промпт + открытые файлы + история чата + ответ. Что не влезло — для модели не существует. Что влезло лишнего — часто побеждает нужный факт.

На LoginTests

Лист 35: открытый shouldLoginWithValidCredentials занимает окно и кормит копипаст fillAndSubmitForm на sad path. Это не «глупость модели», а переполнение сцены.

Temperature

температура · случайность

Общее

Ручка «насколько модель вольна выбирать редкие слова». Высокая — разнообразный текст. Низкая — более стабильный, повторяемый ответ. Для канона обычно держат низкой.

На LoginTests

Нужен один и тот же PO-путь: typeUsernamesubmitExpectingError. «Креативный» @DisplayName безвреден; креативный локатор $("input") — уже баг.

Hallucination

галлюцинация · выдуманный факт

Общее

Модель выдаёт уверенный текст, которого нет в источниках: несуществующий API, команда, файл. Это не ложь «с намерением» — статистика следующего токена без якоря.

На LoginTests

Листы 32–34: Gradle-task testE2e (его нет) — без rule; CSS в *Tests / копия happy path — без RAG; второй e2e «на JSON 401» — без ADR 009; commit без OK — без rule.

Агент

Agent

агент · не чатбот

Общее

Цикл: подумать → вызвать инструмент → посмотреть результат → снова подумать. Чатбот только пишет текст. Агент читает файлы, запускает команды, правит код.

На LoginTests

Cursor: Read LoginTests.java → прочитать skill → Write метод → Shell Gradle → если красный, править PO. Если остановился после «вот код, сами гоняйте» — это ещё не агент по DoD курса.

Agent loop

think → act → observe

Общее

Повтор шагов, пока не выполнен DoD или не сработал стоп (лимит итераций, человек, ошибка). Без петли получается одноразовая цепочка.

На LoginTests

Skill qa-write-test: слой → RAG → PO → метод → -Dtest=LoginTests#shouldShowErrorWhenPasswordIsWrong → exit code. Упал селектор — ещё круг, не «ну ок».

Tools / function calling

инструменты · вызов функций

Общее

Модель не ходит в файлы сама: IDE даёт ей список функций (прочитать, найти, выполнить команду). Модель выбирает имя и аргументы; среда исполняет и возвращает результат.

На LoginTests

Read / Grep / Write / Shell. Shell — это ./gradlew test -Denv=ci -DincludeTags=e2e -Dtest=LoginTests#shouldShowErrorWhenPasswordIsWrong, не «весь suite».

MCP

Model Context Protocol · розетка для tools

Общее

Стандарт, как подключить внешний инструмент к агенту: не писать драйвер с нуля, а воткнуть сервер (браузер, тикеты, дизайн). Это не модель и не оркестратор.

На LoginTests

В takeaway канон закрывается файлами репо и Gradle. MCP пригодился бы, если агент ходил в Allure-сервер, TMS или стенд по API без вашего Shell. Для wrong password не обязателен.

Chain

цепочка · линейный пайплайн

Общее

Фиксированный порядок шагов без развилки и без возврата: A → B → C → стоп. Просто и хрупко: ошибка в B не умеет «вернуться и перечитать факт».

На LoginTests

«Прочитай вкладку → напиши тест как соседний метод → готово». Так рождается sad path через fillAndSubmitForm. Цепочка закончилась до проверки ошибки на форме.

LangChain

библиотека кирпичей · LLM + tools + RAG

Общее

Набор готовых кусков: вызвать модель, собрать промпт, подключить инструмент, достать чанк из RAG. Сам по себе не решает, когда зациклиться и когда остановиться — это уже граф.

На LoginTests

Аналог: «умею прочитать LoginPage, умею вызвать Gradle, умею вставить шаблон теста». Без маршрутного листа skill это те же кирпичи, из которых легко сложить неверный happy-path-клон.

LangGraph

граф состояний · циклы · ветки

Общее

Оркестрация агента как граф: узлы (шаги), рёбра (что дальше), состояние (что уже сделали), петли (retry), ожидание человека. Берут, когда логика не линейная цепочка.

На LoginTests

qa-write-test уже граф: выбрать @Layer → RAG → расширить PO → метод → Gradle → красный? triage. Ветка ADR: UI-текст → e2e; JSON 401 → AuthApiTests, не второй e2e.

Orchestration

оркестрация · кто решает следующий шаг

Общее

Слой, который говорит «теперь это». Либо жёсткий workflow (всегда одни и те же шаги), либо агент (модель выбирает инструмент). На практике часто смесь.

На LoginTests

Skill задаёт маршрут, rule режет запретное, модель выбирает, читать ли ещё po-fluent. Gradle в CI — тоже оркестрация, только без LLM: всегда -Denv и tags.

State

состояние · память шага

Общее

Данные, которые граф таскает между узлами: какие файлы тронули, что уже прогнали, ждали ли человека. Потеряли state — начали с нуля или сделали дубль.

На LoginTests

«Метод уже добавлен, Gradle ещё красный, submitExpectingError есть в PO». Новый чат без этого state снова пишет второй shouldShowErrorWhenPasswordIsWrong.

Guardrail

ограждение · «нельзя всегда»

Общее

Жёсткий запрет вокруг модели: не этот URL, не эти секреты, не этот action. Срабатывает независимо от того, «убедительно» ли модель просит исключение.

На LoginTests

Rules: не commit без OK, всегда -Denv, не full suite, не localhost в Java, один task — один ярус. Skill говорит как; guardrail говорит нельзя.

Human-in-the-loop

HITL · стоп и ждать человека

Общее

Граф умеет остановиться и не идти дальше без подтверждения: деплой, платёж, публикация. Иначе агент делает необратимое сам.

На LoginTests

«Нет commit без OK». Агент дописывает метод и показывает diff. Кнопка commit — ваша. Temporal как раз умеет узел «wait for approval» часами; чат Cursor — нет.

Слои курса

Skill

как сделать задачу · маршрутный лист

Общее

Workflow под один глагол: когда звать, шаги, DoD. Читают по промпту, не на каждый чат. В AI-стеке это готовый граф «как работать», часто поверх LangGraph.

На LoginTests

docs/agent-skills/qa-write-test/SKILL.md: один @Layer → PO → -Dtest= → стенды в ответе. Без skill типично встаёт свой ChromeDriver.

Rule

что нельзя всегда · ПДД

Общее

Лимиты на каждый чат. В стеке — guardrail. Короткий файл; не маршрут задачи и не факт про локатор.

На LoginTests

.cursor/rules/: tags e2e, не suite, не commit, всегда -Denv. Без rule агент после wrong password гоняет всё и предлагает commit.

RAG (слой курса)

карточка факта · 2–4 файла

Общее

См. ниже RAG как технология. В курсе это ещё и дисциплина: один id = один файл в docs/agent-skills/rag/, не скармливать всю папку.

На LoginTests

test-negative · po-step · po-locators · cfg-stands. Без них — $("input"), копия fillAndSubmitForm, «Invalid credentials».

ADR

почему A, не B · решение

Общее

Зафиксированный выбор, который дорого откатывать. Не skill (как) и не RAG (факт). В стеке ближе к policy: развилка графа уже решена заранее.

На LoginTests

Контракт 401 → api-ярус, не второй e2e (ADR 009). Screenshot — slice, не @Layer (005, другой промпт). Без 009 агент закрывает JSON кликом по форме.

Context (вкладки)

сцена · не пятый слой

Общее

То, что модель видит прямо сейчас: открытые файлы, кусок чата. Это не skill и не rule. Может помочь — и может перекричать канон.

На LoginTests

Две вкладки на занятии: happy path в LoginTests и LoginPage. Лаборатория 36: context включён — копипаст; выключен — другой набор галлюцинаций.

Память и факты

RAG

retrieval-augmented generation · достать, потом генерировать

Общее

Сначала ищут куски знаний (retrieval), потом подставляют их в промпт и просят модель ответить. Модель не «вспоминает репозиторий» — ей показывают карточки.

На LoginTests

Skill прямо пишет: прочитай test-negative и po-step до кода. Тогда error-path берётся из чанка, а не из соседнего shouldLoginWithValidCredentials.

Chunk

чанк · единица retrieval

Общее

Небольшой документ, который индексируют и подтягивают целиком. Слишком большой — жрёт окно. Слишком мелкий — нет смысла.

На LoginTests

Файл docs/agent-skills/rag/test-negative.md — один чанк с каноном empty login / wrong password. Не «весь PACK.md на 80 строк про все skills».

Embedding

эмбеддинг · вектор смысла

Общее

Числовой отпечаток текста. Поиск идёт не по точному слову, а по «похожему смыслу». Удобно — и можно достать соседнюю, но не ту карточку.

На LoginTests

Запрос «negative login» должен попасть в test-negative. Если индекс кривой, подтянется po-fluent с примером fillAndSubmitForm — retrieval miss, дальше галлюцинация уже «логичная».

Retrieval miss

не тот чанк · плохой поиск

Общее

RAG сработал, но принёс не тот документ. Модель честно опирается на мусор. Лечится диетой чанков и явными путями в skill, не «более умной» моделью.

На LoginTests

Как неверный локатор: искали error-path, нашли happy-path fluent. На занятии 3 путь к файлу пишут явно, как раз чтобы не ловить miss.

Время и стоимость

Latency

задержка · сколько ждали

Общее

Время от запроса до ответа. Для LLM смотрят отдельно первый токен и полный ответ. Агент с кучей шагов почти всегда медленнее одной генерации.

На LoginTests

Две разные задержки. Продукт: Submit → текст «Wrong login or password». Агент: промпт → зелёный Gradle. Rule запрещает suite, потому что latency агента взлетает на минуты.

TTFT

time to first token · первый кусок ответа

Общее

Когда пользователь впервые видит текст (или первый токен стрима). Полный ответ может прийти сильно позже. Для чата TTFT важнее «средней» latency.

На LoginTests

Первый абзац в чате «пишу e2e на wrong password» — TTFT. Зелёный -Dtest=…PasswordIsWrong — total latency агента. На форме аналог TTFT — момент, когда появился текст ошибки, не когда анимация закончилась.

p50 / p95 / p99

процентили · хвост, не среднее

Общее

p50 — типичный случай. p95/p99 — редкие, но живые: почти все быстро, каждый сотый очень медленно. По среднему хвост не видно.

На LoginTests

Обычный прогон wrong password — секунды. p99 — холодный браузер, compose не успел, flaky wait. Для агента p99 — «прочитал весь репозиторий вместо 4 чанков».

Timeout

таймаут · перестать ждать

Общее

Лимит ожидания шага. Без него агент или тест висит, пока не упрётся в лимит среды. Таймаут — тоже вид guardrail.

На LoginTests

Selenide ждёт элемент ошибки конечное время. Gradle в CI не крутится вечно. Агент не должен «ещё чуть-чуть» гонять весь модуль без -Dtest=.

SLA

service level · договор по времени/качеству

Общее

Цифра, с которой сравнивают latency и ошибки: «p95 ответа < 2 с». Без SLA latency — просто число в дашборде.

На LoginTests

Неформально: форма логина не должна крутиться десятки секунд; агент на один метод — минуты, не полчаса suite. Homework-check — SLA по качеству сдачи, не по миллисекундам.

Cost

стоимость · токены + минуты CI

Общее

Деньги на токены плюс время людей и пайплайна. Агент с десятью e2e на каждую правку дороже «глупой» модели с узким skill.

На LoginTests

Канон гоняет один метод, не LoginTests целиком и не ./gradlew test. Лишний браузерный прогон — и счёт модели, и очередь CI.

Долгие процессы

Temporal

durable workflow · не LLM

Общее

Движок долгих процессов: шаги пишутся в историю, рестарт сервера не обнуляет работу, есть таймеры, retry и ожидание человека. Это Jenkins-идея для кода, не библиотека промптов.

На LoginTests

Сценарий «напиши тест → дождись compose :8800 → прогони → подожди OK на commit» не обязан умереть вместе с чатом. Для одного метода на занятии Temporal избыточен; для ночного агента — нет.

Durable workflow

процесс, который переживает рестарт

Общее

Состояние шагов лежит не в RAM чата, а в журнале. Упал воркер — продолжили с того же узла. Temporal, Cadence, часто CI job — из этого семейства.

На LoginTests

GitHub Actions гоняет Gradle, даже если ноут закрыт. Allure results остаются в build/allure-results. Чат Cursor после Reload — уже не тот workflow.

Checkpoint

снимок состояния графа

Общее

Сохранили state после узла, чтобы resume не начинал с промпта. LangGraph умеет чекпоинты; Temporal пишет события истории.

На LoginTests

«PO уже расширен, метод в файле, Gradle не запускали». Новый Agent после смены слоёв (лаборатория 36) как раз без чекпоинта — иначе старый state смешает слои.

Idempotency

идемпотентность · повтор без дубля

Общее

Повторный запуск не создаёт второй эффект: второй платёж, второй пользователь, второй такой же тест. Нужна, когда retry и рестарты — норма.

На LoginTests

Второй прогон промпта не должен добавить shouldShowErrorWhenPasswordIsWrong2. Канон уже в репо — агент говорит «есть», а не плодит метод. POST login сам по себе не идемпотентен: каждый вызов — новая попытка входа.

Stateless / stateful

без сессии на сервере / с памятью

Общее

Stateless: сервер не помнит вас между запросами (токен в каждом). Stateful: помнит (сессия, граф агента). Путают с «есть ли логин».

На LoginTests

API логина takeaway — stateless: токен живёт у клиента. Агент, который пишет тест, stateful: помнит, что метод уже добавлен. Потеряли память чата — поведение как у нового агента.

Наблюдаемость

Observability

логи · метрики · трейсы

Общее

Способ понять, почему система себя так ведёт: что вызвали, сколько заняло, где упало, сколько стоило. Без этого агент — чёрный ящик.

На LoginTests

Для продукта: Gradle + Allure (steps PO, 401, скрин). Для агента: какой чанк RAG пришёл, какой tool, сколько токенов. Листы 30–36 — ручная observability слоёв.

Tracing / span

трейс · шаг с временем

Общее

Трейс — одна операция целиком. Span — кусок внутри: вызов модели, tool, retrieval. По ним считают latency узла, не «всё вместе».

На LoginTests

Allure @Step на typePassword / submitExpectingError — spans e2e. У агента span «прогон Gradle» обычно длиннее span «написать метод».

Langfuse

Allure для LLM · трейсы, токены, cost

Общее

Observability специально для промптов и агентов: какой промпт ушёл, какой чанк RAG, какие tools, latency, стоимость, оценки. Соседи: LangSmith, Phoenix, Helicone.

На LoginTests

Показал бы: подтянулся test-negative или случайно po-fluent с fillAndSubmitForm; вызвали Write и Shell; 12 с; где поставили @Tag("smoke") на negative. Лаборатория 36 делает это глазами преподавателя.

Eval

evaluation · проверка качества ответа

Общее

Набор кейсов и рубрика: ответ агента pass/fail. Не то же самое, что e2e продукта. Без eval вы «нравится в чате», а не измеряете регресс промпта.

На LoginTests

qa-homework-check + рубрика: слой выбран, нет URL в тесте, есть -Denv, нет commit. Канон wrong password — золотой эталон eval: fluent error-path, не клон happy path.

Канон сценария: лист 20 · live-абляция: лаборатория 36