QA.GURU

Rule · Skill · RAG · ADR

Листы A4 курса AI-first QA. Кликни строку — лист ниже на этой же странице.

По одной на слой + общая

00 · Общая картачетыре вопроса · чайник = прогон e2e · quiz 01 · Skillмаршрутный лист · пак · глагол+объект 02 · RuleПДД · пять файлов takeaway 03 · RAG2–4 карточки · диета · кофемашина 04 · ADRпочему A не B · 009 логин · 005 slice

Login · без слоя / со слоем

20 · loginодин промпт · что уже в репо 21 · без skill / со skillChromeDriver vs qa-write-test 22 · без rule / с rulefull suite vs tags + -Denv 23 · без RAG / с RAG$("input") vs data-testid 24 · без ADR / с ADRe2e на 401 vs api

Login · живой опыт

30 · микропроектдве вкладки · один промпт 31 · полный стекканон wrong password 32 · полный − 1своя галлюцинация у слоя 33 · пары2 из 4 · дыры складываются 34 · одиночки / пусто1 из 4 · учебный интернет 35 · context ≠ слойпятая опция · сцена, не скрипт 36 · лабораториявкл/выкл слоёв · галлюцинация live

Наращивание

10 · skillsесть маршрут, нет тормозов 11 · skills + rulesзанятие 2 · канон 12 · skills + rules + ragзанятие 3 13 · полный стекзанятие 4

Домашка

40 · ДЗ · main → developдва промпта · блок сдачи

Словарь

50 · словарь AI-стекатермин · общее · на LoginTests

README.md · пак: PACK.md · словарь: 50-glossary.html

QA.GURU
AI-first QA · takeaway Java / Gradle / Selenide
Skill Rule RAG ADR
00 · общая карта

Четыре файла вместо одного промпта

Промпт умирает вместе с чатом. Rule, skill, RAG и ADR лежат в git — следующий агент читает их, а не вашу память. Один файл на 500 строк — антипаттерн.

SkillКак сделать задачу?

Маршрутный лист: When → шаги → DoD.

docs/agent-skills/<name>/SKILL.md
Читают по промпту. 80–200 строк.

RuleЧто нельзя всегда?

ПДД: лимиты и defaults на каждый чат.

.clinerules/ · AGENTS.md
Авто (toggle). 10–80 строк.

RAGОткуда факт?

Карточка знания: команда, якорь, контракт.

docs/agent-skills/rag/<id>.md
2–4 файла на задачу. Один id = файл.

ADRПочему A, не B?

Решение, которое дорого откатывать.

docs/adr/NNN-*.md
Skill ссылается. ≤ ~40 строк.

простой мир · чайник

Человек: «Сделай чай»
        ↓
Rule  → не включать пустой; не оставлять без присмотра
Skill → вода до метки → кнопка → клик → чашка
RAG   → на 4 этаже кнопка СЛЕВА; кипяток ≈ 100 °C
ADR   → электрический, не самовар: скорость > ритуал

прогон e2e slice

Вы: «Прогони e2e»
        ↓
Rule  → tags e2e, не full suite; не commit; всегда -Denv
Skill → qa-smoke-debug: app UP → Gradle → Allure → flaky
RAG   → ci-gradle-args · cfg-stands · po-fluent
ADR   → screenshot — slice, не @Layer  (005)

мини-quiz · куда класть

СитуацияSkillRuleRAGADR
Не коммитить без OK
Порядок: слой → PO → прогон
Селекторы только в Page Object
Screenshot не ярус пирамиды
401 JSON не новый e2e-клик
DoD после прогона
E2e = -DincludeTags=e2e

Как агент это видит

В IDE rule включается сам. Skill читают фразой «прочитай SKILL.md». RAG — 2–4 пути, которые назвал skill. ADR — цитата «почему так».

Наращивание: skill → + rule → + RAG (занятие 3) → + ADR (занятие 4). Листы 10–13 — тот же сюжет с выключенными слоями. Живой login: 30–35 (Context — сцена, не слой). main — логин / items, без note. develop — заметка влита, ярусы takeaway 6/6.

QA.GURU
AI-first QA · takeaway Java / Gradle / Selenide
Skill Rule RAG ADR
01 · skill

Skill — маршрутный лист на одну задачу

Не энциклопедия и не ПДД. Skill отвечает: когда вызывать, какие шаги, когда считать готовым. Имя: qa-<глагол>-<объект>. Раннер CI и Sonar — не имя skill, а RAG.

docs/agent-skills/qa-write-test/SKILL.md

Каркас

  • When — триггеры («напиши e2e», «покрой API»)
  • Do not — CSS в тесте, ChromeDriver (commit / URL — rule)
  • Steps — слой → стенды → PO → прогон
  • DoD — чеклист, не «ну вроде ок»
  • RAG (2–4 id) — факты рядом, не внутри

Промпт

Rules ON. Прочитай docs/agent-skills/qa-write-test/SKILL.md и чанки po-locators, po-step, test-negative, cfg-stands. Добавь автотест на неуспешный логин с неправильным паролем. Укажи pipeline/stage/prod.

Это skill

  • Один глагол, один объект
  • Живые команды takeaway
  • Один Cline task = один skill

Не skill

  • GitHub vs Jenkins — чанки ci-*
  • TMS / AllureId — tms-meta
  • JaCoCo / Sonar — quality-gates
  • Хост (DNS) ≠ стенд (qa-run-stand)

пак курса · тот же список на занятиях 2, 3 и 4

Занятие 2

qa-smoke-debug qa-write-test qa-review-framework qa-run-stand qa-homework-check qa-coverage-audit qa-pyramid-plan qa-bootstrap-framework

Занятие 3

qa-review-ci qa-create-ci qa-fix-ci qa-run-ci qa-stop-ci qa-pull-takeaway qa-setup-host опц.

Занятие 4 · пирамида

qa-coverage-auditqa-pyramid-planqa-write-test

qa-make-full-pyramid — ярус за ярусом уже влитой фичи, потом STOP. Не план и не «один автотест».

qa-run-ciqa-run-stand: workflow/build vs Gradle на app.

DoWhen · якорь в проекте · RAG id · DoD. После смены skill — новый task.
Don'tТаблица HTTP-глаголов внутри generic skill (это RAG crud-http). Не «почини всё» одним skill.
QA.GURU
AI-first QA · takeaway Java / Gradle / Selenide
Skill Rule RAG ADR
02 · rule

Rule — ПДД, которые всегда в силе

Rule не учит «как пройти маршрут». Он говорит: этого не делать / вот default. Короткий, always-on, срабатывает в каждом новом task, если toggle включён.

.clinerules/01-qa-java-gradle.md

## E2e slice
cd tests/java/tests-java-gradle-junit5-allure3-selenide
./gradlew test -Denv=ci -DincludeTags=e2e -DexcludeTags=screenshot,mock

## Запреты
- Не git commit без явной просьбы
- Не удалять allure-results
- Не ./gradlew test без -DincludeTags «на smoke»

Загрузка

.clinerules/*.md и AGENTS.md — авто, тумблер Rules в Cline.

Сменили rule или skill → новый task. Старый чат старый контекст не подхватит.

Размер

10–80 строк. Если появились шаги и DoD — это уже skill: вынесите.

пять rules takeaway

ФайлЛимитНе путать с
01-qa-java-gradlee2e-команда, не full suite; нет task testE2eworkflow Allure → skill qa-smoke-debug
02-git-safetyнет commit / push / reset --hard без OK«закоммить вот это» — явная просьба
03-env-and-standвсегда -Denv; URL не в Java; pipeline / stage / prodфакты стендов → RAG cfg-stands
04-one-task-one-layerодин task = один ярусплан дыр → skill qa-pyramid-plan
05-homework-checkself-check: таблица + статус, без commitрубрика → RAG hw-check-*
DoЛимиты и канон-команда. @Tag("smoke") в rule — как предостережение: prod slice, не эта команда (ADR 005).
Don'tРоман на 200 строк. Не класть в rule таблицу CRUD или список всех skills — агент утонет, 7b выдумает testE2e.
QA.GURU
AI-first QA · takeaway Java / Gradle / Selenide
Skill Rule RAG ADR
03 · rag

RAG — факт, не маршрут

Skill говорит как идти. RAG — карточка с полки: команда, селектор, стенд, контракт. Агент читает 2–4 файла, которые назвал skill. Не всю папку, не monorepo из ~96 чанков.

простой мир · библиотека

Человек: «Доклад про чайник»
        ↓
Skill → тема → 2–4 карточки → черновик
RAG   → кнопка слева · 100 °C · 4 этаж

«Прочитай весь стеллаж» → 7b тонет
и ставит $("input") в *Tests.

кофемашина · глагол ≠ инструкция

Одна машина, разные действия. Не «skill DeLonghi» vs «skill Nespresso».

Что умеет?qa-review-ci
Поставь и включиqa-create-ci
Течёт / красныйqa-fix-ci
Ещё чашку / стопqa-run-ci / qa-stop-ci
Кнопки, YAML, jobRAG ci-github-actions / ci-jenkins

диета · docs/agent-skills/rag/<id>.md

КогдаidНе это
Какой ярус / slicetest-pyramid · test-layersJaCoCo 100% ≠ пирамида 100%
Пишешь e2epo-fluent · po-locators · po-stepСелектор в классе *Tests
Стенд и URLcfg-stands · cfg-env-profile · cfg-base-urllocalhost в Java
Контракт HTTPcrud-httpТаблица глаголов в qa-write-test
CI YAML / Gradleci-github-actions · ci-gradle-argsИмя skill qa-*-github
DoSkill пишет: «прочитай docs/agent-skills/rag/po-fluent.md». Один чанк = один id = один файл.
Don'tКормить модель всей папкой «на всякий». SSOT паттернов преподавателя — docs/rag/ monorepo; студенту — диета в паке.
QA.GURU
AI-first QA · takeaway Java / Gradle / Selenide
Skill Rule RAG ADR
04 · adr

ADR — почему выбрали A, а не B

Пишем, когда решение дорого откатывать: все этажи закупили один тип чайника. Не пишем: «сегодня Earl Grey» (это промпт) и «поставь JDK 21» (это RAG / rule).

каркас · ≤ 40 строк · docs/adr/NNN-*.md

# ADR NNN: короткий заголовок-решение
Статус: предложено | принято | отменено
Контекст: какая развилка (A vs B).
Решение: что выбрали (1–5 пунктов).
Последствия: что теперь нельзя / что стало проще.
RAG: id чанков, которые держат «как», не «почему».

Чайник

Электрический, не самовар: скорость важнее ритуала. Без ADR стажёр каждый раз спорит «а давайте самовар».

Автотест на логин

401 JSON — слой api, не новый e2e-клик. Это ADR 009. Факт селектора — RAG, не ADR.

005 · screenshot — slice, не слой

Хочется «ярус скриншотов». Пиксельный diff — тот же браузерный сценарий, другой отбор.

  • *ScreenshotTests остаются @Layer("e2e")
  • Отбор: @Tag("screenshot") + job mock/stage
  • @Tag("smoke") — тоже slice, не ярус

006 · одна заметка, HTTP как RFC

Продукт: одна заметка на пользователя, /api/note. Глаголы — как в RFC, таблица статусов — RAG crud-http.

Номер 006 — только пак takeaway. Не путать с monorepo ADR 006 (allurerc).

DoЯрус vs slice (005) · Rest Assured vs e2e на 401 (009) · DS header не форк (008). URL из properties — rule, не ADR.
Don'tДублировать skill внутри ADR. Не писать ADR на каждый новый тест. Не менять таблицу @Layer без ADR.
QA.GURU
AI-first QA · пример: login / wrong password
Skill Rule RAG ADR
20 · login · сценарий

Один промпт — четыре слоя

Дальше четыре листа: что агент пишет без слоя и что — с ним. Сценарий один. В takeaway канон уже лежит, не выдумываем. Живой опыт с двумя вкладками и абляцией — листы 30–35.

Добавь автотест на неуспешный логин с неправильным паролем

уже в репо · UI, текст ошибки

tests/e2e/LoginTests.java
  @Layer("e2e") @Tag("e2e") @Tag("negative")
  shouldShowErrorWhenPasswordIsWrong()

loginPage.openPage()
        .typeUsername("user1")
        .typePassword("wrongpassword")
        .submitExpectingError()
        .shouldHaveErrorMessage("Wrong login or password");

уже в репо · HTTP 401

tests/api/AuthApiTests.java
  @Layer("api") @Tag("api")
  loginWithInvalidPassword()

POST /api/auth/login
body { user1, wrongpassword }
→ 401 + schemas/error.json
   message = "Wrong login or password"

если дать промпт «с нуля» — куда ломается

СлойБез него агентС нимЛист
SkillChromeDriver, CSS в *Tests, нет DoDqa-write-test: слой → PO → -Dtest=21
Rulefull suite, testE2e, commit, localhosttags e2e, всегда -Denv, не commit22
RAGкопирует happy path, $("input"), неверный текстpo-locators · po-step · test-negative · cfg-stands23
ADRвторой e2e на JSON 401контракт → api; форма → e2e24
QA.GURU
AI-first QA · пример: login / wrong password
Skill Rule RAG ADR
21 · login · skill

Skill: маршрутный лист vs «просто напиши тест»

Промпт тот же. Без skill агент изобретает драйвер и селекторы. Со skill qa-write-test — слой, PO, один метод, изолированный прогон.

без skill

@Test
void testWrongPassword() {
  WebDriver d = new ChromeDriver();          // свой драйвер
  d.findElement(By.cssSelector("input"))     // CSS в *Tests
      .sendKeys("user1");
  d.findElement(By.cssSelector("input[type=password]"))
      .sendKeys("wrong");
  d.findElement(By.cssSelector("button")).click();
  assertEquals("error",
      d.findElement(By.className("err")).getText());
}

./gradlew test          // нет -Dtest=Class#method

со skill qa-write-test

@Layer("e2e") @Epic("Authentication") @Feature("Login")
class LoginTests extends TestBase {

  @Test @Tag("e2e") @Tag("negative")
  @DisplayName("Wrong password shows readable error")
  void shouldShowErrorWhenPasswordIsWrong() {
    loginPage.openPage()
            .typeUsername("user1")
            .typePassword("wrongpassword")
            .submitExpectingError()
            .shouldHaveErrorMessage(
                "Wrong login or password");
  }
}

cd tests/java/tests-java-gradle-junit5-allure3-selenide
./gradlew test -Denv=ci -DincludeTags=e2e \
  -Dtest=LoginTests#shouldShowErrorWhenPasswordIsWrong
// слой e2e · стенды ci/stage/prod · exit code
Без skill теряетWhen / шаги / DoD. Нет запрета на CSS в тесте и на новый ChromeDriver. Нет ответа «какой слой, какие стенды». URL в Java и commit — лист 22.
Skill заставляетПрочитать SKILL.md → один @Layer → расширить LoginPage, не класть локатор в тест → прогон -Dtest=Class#method → чеклист DoD.
QA.GURU
AI-first QA · пример: login / wrong password
Skill Rule RAG ADR
22 · login · rule

Rule: ПДД, даже если skill уже прочитан

Skill знает как написать метод. Rule не даёт выехать за лимиты: не весь suite, не localhost в Java, не commit без OK. Это always-on, не «ещё один абзац в skill».

skill есть, rules выключены

// метод уже похож на канон…
loginPage.openPage()
        .typeUsername("user1")
        .typePassword("wrongpassword")
        .submitExpectingError();

// но агент в том же чате:
open("http://localhost:9821/login");   // 03-env
./gradlew test                         // 01: без tags
./gradlew testE2e                      // 01: нет такого task
git add -A && git commit -m "login"    // 02-git-safety
«ещё api заодно»          // 04-one-task

Rules ON · пять файлов takeaway

01  cd tests/java/tests-java-…-selenide
    ./gradlew test -Denv=ci -DincludeTags=e2e \
      -DexcludeTags=screenshot,mock
    // нет task testE2e
    // -Dtest=Class#method — skill qa-write-test

02  не commit / push без явного OK

03  URL только из properties; всегда -Denv=
    open("/login") в PO, не localhost в тесте

04  этот task = этот ярус

05  homework-check — другой task
Без ruleХороший PO не спасает: агент гоняет полчаса test, коммитит «чтобы не потерялось», зелёный только на localhost.
С ruleКанон-команда и запреты на каждый новый task. Workflow Allure/flaky по-прежнему в skill qa-smoke-debug, не в rule.
QA.GURU
AI-first QA · пример: login / wrong password
Skill Rule RAG ADR
23 · login · rag

RAG: факты с полки, не догадки 7b

Skill говорит «прочитай 2–4 чанка». Без RAG модель выдумывает $("input") и копирует happy path. С RAGdata-testid, submitExpectingError, текст ошибки, стенды.

без чанков · «на глаз»

// в LoginTests.java
$("#login").setValue("user1");
$("#pass").setValue("123");
$(".btn-primary").click();
$(".alert").shouldHave(text("Invalid"));

// или с вкладки happy path:
fillAndSubmitForm("user1", "wrongpassword")
  .shouldHaveWelcomeMessage("…");  // ждёт HomePage

@Step("Type password: {password}")
@Step() на классе LoginPage

skill назвал чанки · агент их прочитал

po-locators   LoginPage:
  $("[data-testid='login-input']")
  $("[data-testid='error-message']")

po-step       @Step на методах, не на классе
              Type password  // не {password}

test-negative typeUsername → typePassword
              → submitExpectingError
              «Wrong login or password»

cfg-stands    URL из config; user1 есть на
              pipeline / stage / prod
              (wrong password сид не сносит)
Не RAGСкармливать всю папку rag/. «Прочитай стеллаж» → 7b тонет. Task testE2e — это rule 01, не карточка факта.
2–4 idДля этого промпта: po-locators · po-step · test-negative · cfg-stands. JSON 401 — ADR 009 (лист 24); факт api-кейса — test-api-layer, его читают после ADR.
QA.GURU
AI-first QA · пример: login / wrong password
Skill Rule RAG ADR
24 · login · adr

ADR 009: 401 — не новый e2e

Skill+RAG умеют как кликнуть. ADR фиксирует почему A, не B, иначе каждый чат снова закрывает JSON браузером.

без ADR · «на всякий e2e»

// ещё один браузерный тест «на 401»
open("/login"); fill; submit;
$("pre").shouldHave(text("401"));   // нет такого UI

class Login401Tests { … }           // второй файл
// AuthApiTests#loginWithInvalidPassword
// уже лежит в репо — не открыли ADR

с ADR 009 · развилка закрыта

Контракт 401 JSON
  AuthApiTests#loginWithInvalidPassword
  @Layer("api")  ← RAG test-api-layer

Текст ошибки на форме
  LoginTests#shouldShowErrorWhenPasswordIsWrong
  @Layer("e2e")  ← это UI-состояние, e2e ок

Не $("pre") «401» — нет такого UI
Не ADR«В этом тесте опечатка в тексте ошибки» — поправь константу. «Поставь JDK 21» — RAG/rule. Не писать ADR на каждый новый метод LoginTests.
Это ADR401 не закрываем кликом, если нет UI-состояния. Факт селектора остаётся RAG, не копируется в ADR. Screenshot = slice — другой промпт, ADR 005, лист 04.
QA.GURU
AI-first QA · живой опыт: wrong password
Context Skill Rule RAG ADR
30 · микропроект

Две вкладки и один промпт

Сцена занятия: открыты LoginTests (успешный логин) и LoginPage. HomePage (Welcome), TestBase и Gradle — не третья вкладка, агент их «видит» сам. Это project context, не слой. Слои включаем со следующего листа.

Добавь автотест на неуспешный логин с неправильным паролем

вкладка 1 · LoginTests.java

@Layer("e2e") @Epic("Authentication") @Feature("Login")
class LoginTests extends TestBase {

  @Test @Tag("e2e") @Tag("smoke") @Tag("positive")
  @DisplayName("User is logged in with valid credentials")
  void shouldLoginWithValidCredentials() {
    loginPage.openPage()
            .fillAndSubmitForm("user1", "password1")
            .shouldHaveWelcomeMessage("Welcome, user1!");
  }
}

вкладка 2 · LoginPage.java

loginInput    = $("[data-testid='login-input']");
passwordInput = $("[data-testid='password-input']");
submitButton  = $("[data-testid='submit-button']");

LoginPage openPage()
HomePage  fillAndSubmitForm(String username, String password)  // только happy path
LoginPage typeUsername(String username)
LoginPage typePassword(String password)

условно · HomePage.java

welcomeMessage = $("[data-testid='welcome-message']");

HomePage shouldHaveWelcomeMessage(String message)
  // fillAndSubmitForm возвращает сюда

условно · TestBase.java

protected LoginPage loginPage = new LoginPage();
Configuration.baseUrl = config.baseUrl();
// chrome / remote — из config
// не new ChromeDriver() в тесте

test { includeTags из -DincludeTags; -Denv= }
// task testE2e — нет
./gradlew test -Denv=ci -DincludeTags=e2e \
  -Dtest=LoginTests#<method>
Перед liveЗакомментируй shouldShowErrorWhenPasswordIsWrong — в takeaway метод уже лежит. Иначе skill честно скажет «не дублируй». Промпт на 31–35 тот же (жёлтая плашка только здесь). «Не коммить» в чат не писать — это Rule.
QA.GURU
AI-first QA · живой опыт: wrong password
Context Skill Rule RAG ADR
31 · полный стек

Правильный ответ: слои не дают скопировать happy path

Те же две вкладки, тот же промпт. Context даёт образец. Skill / rule / RAG / ADR не дают взять fillAndSubmitForm на sad path, выдумать task и закрыть 401 кликом.

канон · LoginTests

@Test @Tag("e2e") @Tag("negative")
@DisplayName("Wrong password shows readable error")
void shouldShowErrorWhenPasswordIsWrong() {
  loginPage.openPage()
          .typeUsername("user1")
          .typePassword("wrongpassword")
          .submitExpectingError()
          .shouldHaveErrorMessage(
              "Wrong login or password");
}

// не @Tag("smoke") — это не prod slice
// не fillAndSubmitForm — тот ждёт HomePage

прогон · ответ агента

cd tests/java/tests-java-gradle-junit5-allure3-selenide
./gradlew test -Denv=ci -DincludeTags=e2e \
  -Dtest=LoginTests#shouldShowErrorWhenPasswordIsWrong

слой     e2e  (текст на форме)
стенды   pipeline / stage / prod
         user1 есть; сид не сносим
401 JSON уже в AuthApiTests — не трогаем
exit code 0 · нет commit
Skillкак

Один @Layer → PO → -Dtest= → DoD.

Ruleнельзя

Не suite, не commit, всегда -Denv, один ярус.

RAGфакт

po-locators · po-step · test-negative · cfg-stands.

ADRпочему

UI = e2e · 401 = api.

QA.GURU
AI-first QA · живой опыт: wrong password
Context Skill Rule RAG ADR
32 · полный − 1

Убрали один слой — сломалось своё

Вкладки те же. Стек почти полный. Каждый слой закрывает свою галлюцинацию — остальные три её не дублируют.

− Skill · нет When / DoD

Метод может получиться (ctx + RAG).
Ломается маршрут:
  новый LoginSadPathTests.java     // не расширил LoginTests
  ./gradlew test -DincludeTags=e2e // весь срез, не -Dtest=
  нет ответа «слой / стенды / exit»

− Rule · нет ПДД на каждый чат

Тело уже канон. В том же чате:
  ./gradlew test     // full suite
  ./gradlew testE2e  // такого task нет
  git commit         // без OK
  localhost · «ещё api заодно»

− RAG · факты с вкладки happy path

// скопировал вкладку 1 на sad path
loginPage.openPage()
        .fillAndSubmitForm("user1", "wrongpassword")
        .shouldHaveWelcomeMessage("…"); // ждёт HomePage

$("#password").setValue("123");    // или выдумал селектор
$(".alert").shouldHave(text("Invalid credentials"));
@Step("Type password: {password}")
@Step() на классе LoginPage

− ADR · спор снова открыт

UI-ошибка ок. Плюс:
  $("pre") «401»          // нет такого UI
  class Login401Tests     // второй e2e
  «на всякий e2e на JSON»
Читать таблицу−RAG на этом промпте самый зрелищный: агент честно смотрит на открытый happy path и применяет его к неверному паролю. Context не лечит, он кормит эту ошибку.
QA.GURU
AI-first QA · живой опыт: wrong password
Context Skill Rule RAG ADR
33 · пары · 2 из 4

Осталось два слоя: дыры складываются

C(4,2) = 6. Не все live — таблица на экран. Context по-прежнему открыт. Промпт тот же.

что ещё умеет · чего уже нет

ОсталосьВыключилиЕщё держитТипичная галлюцинация
Skill+Rule RAG ADR слой → PO → не commit, tags+env fillAndSubmitForm(wrong) · «Invalid» · e2e на 401
Skill+RAG Rule ADR fluent error-path, data-testid, DoD ./gradlew test · testE2e · git commit · «ещё 401 кликом»
Skill+ADR Rule RAG 401 → api $("input") · localhost · commit · testE2e
Rule+RAG Skill ADR команда канона, селекторы, текст ошибки новый класс вместо LoginTests · нет DoD · e2e на 401
Rule+ADR Skill RAG не commit · 401 не кликом ChromeDriver · fillAndSubmitForm · «Invalid credentials»
RAG+ADR Skill Rule error-path PO · 401 = AuthApiTests full suite · git commit · нет -Dtest= · нет слоя в ответе
Пара ≠ половина стекаSkill+Rule без RAG на этом промпте выглядит «почти канон», пока не нажмёшь Submit: happy-path API на форме ошибки. Зелёный на ревью кода, красный на прогоне.
На занятииLive достаточно Skill+Rule и Skill+RAG — две разные дыры (факт vs ПДД). Остальные четыре — с листа, не шесть New Agent.
QA.GURU
AI-first QA · живой опыт: wrong password
Context Skill Rule RAG ADR
34 · 1 из 4 · пусто

Один слой не тянет. Ноль — учебный интернет

Один файл отвечает на один вопрос. Остальные три дыры открыты. Ничего (кроме вкладок) — то, что студент получит в чужом репо без пака.

четыре одиночки

ТолькоВопрос, на который отвечаетВсё равно
Skill порядок: слой → PO → прогон → DoD выдуманный селектор / текст · commit · e2e на 401
Rule не suite, не commit, всегда -Denv new ChromeDriver() · $("input") · «Invalid» · e2e на 401
RAG data-testid, submitExpectingError, точный текст full suite · commit · нет DoD · второй тест на 401
ADR 401 ≠ новый клик ChromeDriver · localhost · testE2e · CSS в *Tests

0 слоёв · вкладки открыты

как лист 21 слева, плюс учебный интернет:
  ChromeDriver · localhost:9821 · CSS input
  assertEquals("Invalid credentials", …)
./gradlew test
git commit -am "add login test"
Почему так, если канон на вкладкеМодель дописывает «как обычно в интернете»: Selenium 3, localhost, полный suite, сама коммитит. Открытый Selenide-тест — намёк, не запрет.
Live на зачётеОдин прогон «полного стека» и один прогон «ничего». Пары и одиночки — с листа, иначе занятие съест New Agent.
QA.GURU
AI-first QA · живой опыт: wrong password
Context Skill Rule RAG ADR
35 · context ≠ слой

Пятая опция: сцена, не скрипт

Project context — открытые вкладки, индекс репо, TestBase, build.gradle. Его включают всегда (лист 30). Это не пятый слой: он не отвечает ни на «как», ни на «нельзя», ни на «факт», ни на «почему».

Что такое Contextсцена
  • Вкладки: LoginTests, LoginPage
  • Недавно открытый TestBase
  • Поиск по репо / @codebase
  • Сигнатуры Gradle, если агент дошёл

Примеры «как уже сделано». Нет When, нет запрета, нет точного текста ошибки, нет развилки 401.

Чего Context не делаетне слой
  • Не skill — не заставляет выбрать один @Layer и DoD
  • Не rule — не держит «не commit» на следующем ходе
  • Не RAG — happy path на вкладке ≠ error path
  • Не ADR — не помнит, почему 401 не кликают

только Context · самая тихая галлюцинация

// выглядит как канон — скопировал вкладку 1
loginPage.openPage()
        .fillAndSubmitForm("user1", "wrongpassword")
        .shouldHaveWelcomeMessage("Welcome, user1!");

// или «чуть поправил» assert, но всё ещё HomePage
        .shouldHaveErrorMessage("Wrong password");

./gradlew test          // или testE2e
git commit -am "login"

эксперимент на занятии

Контроль   две вкладки + один промпт
           Context всегда ON  ← не переменная

Лечение    Skill · Rule · RAG · ADR
           включаем / выключаем по одному

Зависимая  тело теста · команда · commit · слой

Вывод      открытый канон кормит копипаст
           happy → sad. Слои это запрещают.
QA.GURU
AI-first QA · наращивание слоёв
Skill Rule RAG ADR
10 · skills

Только skill: есть маршрут, нет тормозов

Агент знает порядок шагов и DoD. Не знает, чего нельзя. Без rule он может включить пустой чайник, запустить full suite и закоммитить «чтобы не потерялось».

чайник

Skill → 1) вода  2) кнопка  3) клик  4) чашка
DoD   → чай в чашке

Ломается:
  · чайник пустой (нет rule)
  · кнопка справа — другая кухня (нет RAG)
  · «а давайте самовар» (нет ADR)

прогон e2e slice · qa-smoke-debug

1. App UP (:8800 / UI :9821)
2. Gradle slice → exit code
3. Allure results
4. Flaky → -Dtest=Class#method × 3

Ломается:
  · ./gradlew test без tags
  · git commit «для истории»
  · URL localhost в новом тесте

Прочитай docs/agent-skills/qa-smoke-debug/SKILL.md. E2e slice. (Rules выключены — так не оставляем на зачёте.)

Зачем следующий слойSkill без rule — хороший чеклист в мире без запретов. На курсе сразу включаем Rules ON. Следующий лист: + ПДД.
QA.GURU
AI-first QA · наращивание слоёв
Skill Rule RAG ADR
11 · skills + rules

Skill + rule: маршрут внутри ПДД

Rule — фон каждого чата. Skill — по запросу. Вместе: агент идёт по шагам, но не выезжает на полный suite и не коммитит сам. Это канон занятия 2.

как они стыкуются

RULES (фон, toggle ON)
  e2e = includeTags=e2e + env ci
  не коммить · не трогать allure-results · один task = один ярус
        ↓ ограничивают
SKILL (по запросу)
  1. App UP (:8800 / UI :9821)
  2. Gradle slice → exit code
  3. Allure results
  4. Flaky → -Dtest=Class#method × 3
ЧайникНе включать пустой. Вода → кнопка → чашка. Ещё не знаем, что кнопка слева на 4 этаже.
Прогон e2eКоманда канона из rule. Workflow из qa-smoke-debug. Ещё нет чанков PO и стендов — их допишет занятие 3.

Rules включены. Прочитай docs/agent-skills/qa-smoke-debug/SKILL.md. E2e slice. Не коммить.

Ожидание:

./gradlew test -Denv=ci -DincludeTags=e2e -DexcludeTags=screenshot,mock

QA.GURU
AI-first QA · наращивание слоёв
Skill Rule RAG ADR
12 · skills + rules + rag

+ RAG: 2–4 карточки, не весь стеллаж

Теперь skill называет факты. Агент не угадывает селектор и не путает pipeline с prod. Занятие 3: какие чанки брать; CI = та же пирамида.

цепочка

RULES (фон)
  e2e tags · не коммить · всегда -Denv
        ↓
SKILL qa-write-test
  слой → стенды → PO/клиент → -Dtest=…
        ↓ факты (2–4 файла)
RAG   po-locators · po-step · test-negative · cfg-stands
Чайник

Кнопка слева на 4 этаже. Кипяток ≈ 100 °C. Без RAG приносят чайник с другой кухни.

e2e логина

Селекторы в PO, не в *Tests. Тест едет на pipeline / stage / prod — URL из properties. CI: глагол в skill, раннер в ci-github-actions / ci-jenkins.

Rules ON. Прочитай docs/agent-skills/qa-review-ci/SKILL.md и чанки ci-github-actions, test-pyramid, ci-gradle-args. Код не меняй. Не коммить.

Ещё нет ADRАгент знает как закрыть 401, но может снова предложить e2e «на всякий». «Почему api, не браузер» — следующий лист.
QA.GURU
AI-first QA · наращивание слоёв
Skill Rule RAG ADR
13 · skills + rules + rag + adr

Полный стек: как, нельзя, откуда, почему

ADR закрывает спор, который иначе вспыхивает в каждом чате. Занятие 4: пишем ADR и закрываем пирамиду без «e2e на всё».

Skillqa-coverage-audit → pyramid-plan → write-test
Ruleодин task = один ярус · не commit
RAGtest-pyramid · test-layers · crud-http
ADR009 401≠клик · 005 slice · 006 заметка

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

Rule  не пустой, не без присмотра
Skill вода → кнопка → клик → чашка
RAG   кнопка слева, 4 этаж, ~100 °C
ADR   электрический, не самовар

wrong password · полный ответ

Rule  не full suite; URL не в Java
Skill qa-write-test: слой → PO → -Dtest
RAG   po-locators · po-step · test-negative · cfg-stands
ADR   009: 401 JSON — api, не новый e2e-клик

Rules ON. Прочитай docs/agent-skills/qa-coverage-audit/SKILL.md и rag/test-pyramid.md. Таблица сценариев × ярусы + 3 дыры. Код не меняй. Не коммить.

Ожидание: таблица, не 15 новых e2e. Дальше — отдельный task qa-pyramid-plan. Закрыть 401 новым e2e = нарушение ADR 009.

QA.GURU
AI-first QA · два промпта · сдача одним блоком
Skill Rule RAG ADR
40 · ДЗ · main → develop

Два промпта: стенд, потом план — не тесты

main — логин / items, без note. develop — заметка влита, ярусы takeaway на upstream 6/6. Промпты: HOMEWORK.md. В чат курса — только блок «Сдача ДЗ».

ДЗ-1 · main · живой стенд

Форк (не clone qa-guru) → git checkout main → compose → e2e. Note не писать.

Skill qa-smoke-debug RAG ci-gradle-args · cfg-stands · allure-attach Не всю папку rag/. Не prod. Не commit.

Сдача ДЗ (в чат курса)

Форк / originсвой репо, не qa-guru
Веткаmain
Healthcurl -sf :8800/api/health → 2xx
UIhttp://localhost:9821/ (не :9811)
Команда-Denv=ci -DincludeTags=e2e -DexcludeTags=screenshot,mock
Прогонexit 0, failed 0, allure-results не пустой
Статуссдано / не сдано

ДЗ-2 · develop · note + план

После ДЗ-1, новый чат. Checkout develop → rebuild. Фичу и тесты note не писать (существующие не трогать). План = inventory; если 6/6 — дыр нет.

Skills qa-coverage-audit · qa-pyramid-plan ADR 006 · RAG test-pyramid · crud-http · cfg-stands qa-make-full-pyramid — только после «следующий ярус».

Сдача ДЗ (в чат курса)

Веткаdevelop, не merge в main
Фича живаGET /api/note без токена → 401 (не 404)
КодNoteController + note-panel — да
Покрытиеtakeaway note: факт из дерева (upstream 6/6)
Плантаблица сценарий × ярус; не копировать отчёт слепо
Дырынет, если 6/6; иначе ярус + якорь + стенды
Следующийn/a если 6/6 · тесты в этом ДЗ не писались

канон плана · иначе незачёт

ТакНе так
Синглтон /api/note: PUT 201/200, PATCH только api, один e2e happy-pathPOST+409 «already exists»; e2e на все глаголы
Slice smoke / screenshot / mock — не колонка яруса (ADR 005)@Layer("screenshot"), @Layer("smoke")
Delete на prod — фабрика+teardown (ADR 006), не сид user1if (prod) в тесте; снести витрину
«100% пирамиды» = сценарий на своём @Layer100% строк JaCoCo; добивать все ярусы одним чатом
DoОдин блок сдачи в конце ответа. Origin = форк. Compose с --build после смены ветки. Дальше отдельные чаты: unit → integration → component → api → e2e → manual.
Don'tClone qa-guru. Писать note на main. Реализовывать фичу на develop. Писать тесты note в ДЗ-2. Commit / push / reset --hard. Prod без remoteUrl.