МАЯК: сначала документация, потом кнопки

Я не люблю писать документацию. Чек-листы, планы тестирования, блоки проверок, схемы — вот это всё.
Не люблю, потому что, пока ты это пишешь, теряется время на главное: разбираться и тестировать систему, с которой ты работаешь.
Идея её автоматизации жила у меня с первого дня в ИТ — тогда мне её жизненно не хватало.
Но понятного пути, как это реализовать, не было ни в голове, ни в OSS, нигде.
Ну или я не нашёл — такой вариант тоже не отметаю.
Позже я увидел и саму проблему целиком: между аналитиком и тестировщиком нет конвейера. Требования живут в Confluence, тест-план — в голове и Excel, а посередине — ручной труд с копипастой.
Вот этот разрыв я и придумал как закрыть.
Дальше — история того, как я это делал: вскрытием собственного концепта и 58 специализированными блоками в финале.
Я собрал конвейер «ТЗ → канонизация → тест-дизайн → прогон» из 58 специализированных блоков с гейтами доверия: каждый критерий приёмки заземляется цитатой из исходника, серые зоны превращаются в вопросы, а не в угаданную конкретику, повторы бесплатны за счёт кэша. Проверил на синтетическом ТЗ с заложенными болезнями: 9 ловушек из 10 поймал автомат, десятую — человек с вопросником от машины; 26 вопросов стейкхолдерам за 90 секунд, 20 серых зон, 37 BDD-сценариев за 26 минут. Где платформа врёт и что не доработано — тоже в тексте.
Летом щёлкнуло
Идея оформилась буквально летом — как всё-таки зайти на сторону автоматизации документации.
Тут помог и опыт ранее реализованных проектов, и в целом текущая скорость развития и роста моделей.
Первоначальная формулировка была наивно простой: я хочу, чтобы документация писалась автоматически.
Как это реализовать, как продумать и разобрать всё на косточки — на это потребовалось время.
Суть: возложить на модель создание чернового варианта документации, который остаётся валидировать.
Так быстрее погружаешься в задачу и сразу выходишь на границу «тестирование / доработка документации» — процесс становится параллельным, а не последовательным.
Живёшь в последовательной парадигме — попадаешь в цикл: новая задача уже готова, а документацию написать полноценно не успеваешь (говорю исключительно про себя).
Июль: первый блин
Первый подход был сделан в июле: сформировал концепт — как должны работать внутренние агенты, как читать, что выделять из ТЗ, как вообще его обрабатывать.
Главная соль — формировать документацию ДО разработки, а не после.
Взглянуть на задачу раньше, чем ты получаешь её итог в виде готовых кнопок, функций, интеграций.
Тут всё получилось не так радужно, не увидел прямой перспективы в концепте, отложил его "На подумать".
После Конференции: вскрытие
Сходив на очередную Конференцию я увидел, что идеи и задачи в целом схожи в комьюнити, и захотелось попробовать себя: как у меня получится реализовать задуманное.
Был взят июльский концепт, проанализирован, разобран до косточек — и тут я понял его несостоятельность.
Всё было слишком широким и обширным, каждый блок пытался объять необъятное.
По моему опыту подобные решения не приводят к качественному результату — именно поэтому в предыдущем проекте, распознавании фото, я делал около сотни промптов и роутинг ради одной-единственной задачи.
Тут задача была куда нетривиальнее: разобрать на блоки и подблоки техническое задание.
Из первичных четырёх блоков система выросла в 32 блока тестирования и 26 аналитики.
Из четырёх блоков — 58
Каждый блок отвечает за конкретно свою задачу.
Технически это многоагентная наследуемая структура, которая работает как часы, — потому что используется паттерн LangGraph\LangChain.
Структура получилась натурально микросервисной: у каждого модуля собственное назначение, последовательности вызовов для каждой задачи, состояния, ограничения и технический навык. Жить в монолите тут не получилось бы: невозможно добавлять и варьировать блоки, изменять их последовательности обработки.
До этого, впрочем, я тоже дошёл не сразу :)
На макроуровне — экосистема из двух платформ и общей инфраструктуры, конвейер «ТЗ → тесты».

BA Co-Pilot — инструменты бизнес-аналитика: канонизация требований в EARS, User Stories (INVEST) и Use Cases, матрица CRUD с аудитом жизненного цикла сущностей, стресс-тест противоречий между разделами ТЗ, поиск «белых пятен» с готовым опросным листом для стейкхолдера, мастер-глоссарий и онбординг-паспорт для новых участников.
QA Platform — четыре ступени: Requirements Hub (критерии приёмки, серые зоны) → Test Design Hub (тест-кейсы, чек-листы, Gherkin BDD, трассируемость) → Automation Hub (Playwright TS/Python, AST-линтер, контур Self-Healing) → Execution & Triage (прогон в песочнице, триаж, черновики действий для Jira).
Сверху это скреплено мостом и обвязкой:
мост BA → QA: канонизированная спецификация запускается в QA-конвейер без ручного переноса; мульти-ТЗ режим — анализ портфеля из 2–10+ ТЗ с выявлением межсистемных коллизий и «оборванных» цепочек;
интеграции: Confluence (двунаправленная конвертация Wiki/XHTML ⇄ Markdown, публикация артефактов), Jira (черновики задач с маппингом приоритетов), Mattermost-бот, экспорт в Excel и Word (тест-планы в фирменном стиле), REST-шлюз на FastAPI с асинхронными задачами — всё это умеет подниматься в Docker одной командой;
любая модель через OpenAI-совместимый API: облачные провайдеры или полностью локальный контур (Ollama / vLLM) — данные наружу не уходят в принципе;
кэш ответов LLM: повторный анализ того же документа не расходует токены, прогоны воспроизводимы;
плагины: новые блоки конвейера добавляются как отдельные модули, без правки ядра — платформу можно наращивать под любую специфику.
Форматы на входе: .docx, .doc, .txt, .md, .rtf, .pdf, для BA — ещё и веб-архивы Confluence (.mhtml). Запуск — двойным кликом по батнику, drag&drop файла на батник, консолью или через Docker.
В архиве версий теперь целый выводок предшественников; на каком по счёту «МАЯК» я остановился, честно, уже не скажу — имя осталось, потому что задача та же:
быть ориентиром в тумане требований.
Почему я не верю одному промпту
Зачем конвейер, если можно скормить ТЗ модели и попросить тест-план?
А потому что в этой задаче LLM галлюцинирует уверенно и красиво:
модель «додумывает» требование, которого в ТЗ нет, и строит на него полноценный тест-кейс — выглядит безупречно;
в сводке красуется «покрытие 100%», хотя часть критериев вообще не извлеклась, а часть извлеклась из воздуха;
неоднозначность («система должна отвечать быстро» — это 500 миллисекунд или 5 секунд?) молча превращается в конкретику — угаданную. Потом тест падает на проде не потому, что код плохой, а потому что поведение никто так и не определил;
один и тот же промпт в двух сессиях даёт разные наборы кейсов, и понять, что изменилось, невозможно.
Отсюда принцип, на котором стоит вся платформа:
LLM предлагает — гейты проверяют — человек смотрит только то, что не сошлось.
Это моя вторая статья про недоверие к моделям: в ScanReader я не верил модели на чтении документов; МАЯК — про то же недоверие, но на создании.
Конвейер: сверху и в разрезе
Сверху — пять ступеней:
ТЗ (.docx/.pdf/.mhtml/...)
→ BA Co-Pilot: канонизация EARS, глоссарий, CRUD, вопросники
→ мост BA → QA
→ QA: Блок 1 (требования) → Блок 2 (тест-дизайн) → Блок 3 (автотесты) → Блок 4 (прогон и триаж)
→ артефакты: Markdown, Word, Excel, Gherkin .feature, версии для Confluence
Путь одного документа по конвейеру — артефакт за артефактом:

В разрезе — та самая микросервисность. Те самые 32 блока тестирования и 26 аналитики раскрываются в узлы графов и их суб-шаги: у каждого — собственная задача, собственное состояние, собственный контракт данных.
Фрагменты зафиксированных последовательностей (топологии графов):
Блок 1: scout → reader (map-reduce слияние чанков) → ambiguity_checker → package_assembler
Блок 2: architect → traceability → checklist → bdd → e2e_journey → assembler
Блок 3: generator → linter (AST) → self-healing роутер → assembler
Блок 4: runner → triage → rag_embedder → git_manager → jira_slack → assembler
BA: gap_detector → ears_standardizer → domain_clustering → glossary →
story_usecase → consistency_guard → process_visualizer → assembler
Петля Self-Healing из Блока 3 — крупным планом:

Контракты данных всех узлов — типобезопасные Pydantic v2-схемы, порядок вызовов зафиксирован инвариантами (осознанный выбор: предсказуемость конвейера важнее «гибкости на бегу»), ответы LLM проходят обязательную очистку и валидацию. Добавлять новые блоки и собирать из них разные сценарии (block1, block2, combo, full) можно без риска для остального конвейера — реестр плагинов толерантен даже к сломанным модулям (они попадают в load_errors, не убивая процесс). Ровно та наращиваемость, которой не хватало монолиту.
Каждый запуск пишет артефакты в изолированную папку сессии (дата_Название_ТЗ), прогоны не затирают друг друга.
Если LLM недоступен — платформа честно сообщает об этом и работает на кэше, а не выдумывает результат.
Как МАЯК говорит «не знаю»
Собственно, чего я жду от машины, которой не доверяю: чтобы она честно говорила, что именно проверено, а что нет. Платформа никогда не говорит «100% подтверждено» — и вот чем это обеспечивается:
заземление требований: каждый критерий приёмки обязан подтверждаться цитатой из исходного текста ТЗ. Цитата не нашлась — требование помечается, а не молча пропускается;
серые зоны не маскируются: неоднозначные места ТЗ превращаются в вопросы к стейкхолдеру, а не в угаданную конкретику;
изоляция серых зон от автоматизации: тест-кейсы, построенные на неоднозначных требованиях, физически не допускаются к генерации автотестов. Автоматизация не должна «угадывать» поведение за аналитиков;
строгий режим: при сбоях LLM запрещены синтетические fallback-данные; пустой ввод — гарантированная ошибка вместо «успеха с пустыми результатами».
Барьеры до кода — как устроены гейты:

Статусы прогона — это то, как Маяк взаимодействует с человеком:
Статус | Что это значит | Что делаю я |
|---|---|---|
| все исполненные тесты зелёные | читаю как результат прогона, а не как полноту покрытия |
| есть упавшие, трассировка до критериев — в отчёте | разбираю через триаж |
| тест упал и восстановлен контуром Self-Healing | помню: «исправлено автоматически» ≠ «всегда было зелёным» |
| исполнение невозможно (нет рантайма/окружения) | чиню окружение, а не делаю вид, что прогон был |
| тест осознанно пропущен | не даю ему засчитаться молча |
Появление статусов — от исхода исполнения:

Проверка на себе: ТЗ с секретиками
Прежде чем писать это, я прогнал платформу на себе.
Взял синтетическое ТЗ «Система заказа гостевых пропусков» — написал с нуля, без клиентских данных, 3,3 тысячи символов — и заложил туда болезни живых ТЗ: противоречие по времени отмены (один пункт разрешает отмену «до начала визита», другой блокирует её за 15 минут), «быстро», «по возможности», «несколько» и безразмерный «большой поток».
Такое ТЗ не жалко показать целиком, поэтому дальше — живые фрагменты вывода, а не пересказ.
Прогон | На выходе | Время | Токены |
|---|---|---|---|
QA: анализ и тест-дизайн (Блоки 1+2) | 32 критерия, 20 серых зон, 54 кейса, 120 пунктов чек-листа, 37 BDD | 26,5 мин | ~270k |
BA: опросный лист | 26 вопросов по четырём ролям | 90 сек | ~14k |
BA: стресс-тест противоречий | 10 коллизий, CRUD-аудит 4 сущностей | 13,4 мин | ~194k |
Все 32 критерия заземлены цитатами из исходника — ни один не выдуман.
Покрытие критериев тест-кейсами — 81,2%, и платформа сама предупреждает о шести непокрытых, вместо «100% готово».
Коллизия по отмене — как её видит платформа (AMB-12 из отчёта, дословно):
В окне 15 мин–2 часа отмена требует подтверждения администратора, но не определено: что происходит при молчании администратора до начала визита (заявка активна, гость приезжает — дедлок); может ли администратор аннулировать пропуск в последние 15 минут, когда отмена «блокируется системой»; и то, что блокировка «на уровне интерфейса» не защищает от прямого вызова API — ограничение обходится на серверной стороне.
Вопрос стейкхолдеру:
Утвердите финальную матрицу отмены: (а) более 2 ч — сотрудник отменяет сам; 15 мин–2 ч — подтверждение администратора, при молчании N минут — эскалация или автоматическая отмена; менее 15 мин — только аннулирование администратором? (б) Подтвердите, что правило 15 минут валидируется на сервере.
BDD из границы «2 часа» (дословно из .feature):
Сценарий: [TC-3] Отмена за 1 ч 59 мин до визита: заявка переходит в «Отменена» только после подтверждения администратора
Дано Заявка №103 (гость Сидоров Сидор Сидорович, визит сегодня в 15:00, статус «Новая»). Системное время — 13:01 (до визита 1 час 59 минут — верхняя граница класса «менее 2 часов»). Доступен администратор системы.
Когда Сотрудник открывает «Мои заявки» и нажимает «Отменить заявку» для №103
Тогда Система отображает сообщение «Отмена менее чем за 2 часа до визита требует подтверждения администратора»
И До подтверждения администратором статус заявки №103 не меняется на «Отменена»
И После подтверждения администратором статус заявки №103 — «Отменена»
Не «проверить отмену заявки», а верхняя граница класса, конкретные данные и наблюдаемое поведение — такое можно отдавать автоматизации и стейкхолдеру на подпись.
Два вопроса из опросного листа (из 26, дословно):
Архитектору (SLA): Каковы точные числовые NFR: целевое время отклика API (P95/P99, мс), число одновременных пользователей и пиковый RPS в дни конференций? — «быстро» и «устойчиво при большом потоке» неизмеримы: проектировать инфраструктуру не на что.
Юристу/DPO: Какие ПДн гостей обрабатываются, на каком правовом основании, где хранятся и включена ли система в реестр операторов ПДн? — обработка без основания — прямой риск по 152-ФЗ.
А теперь честное, без чего цифры выше — враньё.
Первое: закладка «большой поток» QA-блоком не поймана — формулировка не выглядит неоднозначной, пока не спросишь «сколько именно»; поднял её опросный лист.
Считаю честно: 9 ловушек из 10 — автомат, десятая — человек с вопросником от машины на руках.
Второе: BA-канонизация местами обогащает текст — в коллизию SLA доставки письма она сама дописала «1 минуту», которой в ТЗ нет (в исходнике только «не позднее 5 минут»), а нумерация требований местами поехала (дубли REQ-26/27).
Я нашёл это только сверкой с исходником.
Вывод тот же, что во всей статье: машина ускоряет, финальная истина — ревью человеком.
Цифры без фанфар
862 автоматических теста с гейтом покрытия ≥ 85% (фактически 87.69%) на четырёх зонах платформы. Важно: это покрытие кода самого инструмента — оно говорит о том, что платформа не разваливается при рефакторингах, а не о «правильности» ваших тест-планов;
полный сьют прогоняется за 20 минут; каждый старый баг в платформе закрыт регресс-тестом;
это внутренние измерения зрелости кода, а не сравнение с рынком — открытого бенчмарка «ТЗ → тест-дизайн» в природе нет;
экономию токенов даёт кэш: повторный анализ неизменённого документа бесплатен;
200+ реальных ТЗ через платформу — счёт набит не синтетикой, а папками сессий: каждое честное «не сошлось» оборачивалось правкой, и версии платформы итерировались по живым проколам;
пилот на коллегах внутри компании — по итогам внесены коррективы. Это не цифра зрелости кода, а проверка на людях: где платформа удобна и где мешает, знаю не из догадок.
Кто что получает
Аналитик — вопросы, а не загадку. Белые пятна и противоречия ТЗ собираются в опросный лист — на созвон с Product Owner выходишь с конкретикой.
QA-инженер — исключения, а не всё подряд. Серые зоны помечены, трассируемость «критерий → кейс» есть у каждого пункта, покрытие чек-листа считается отдельной метрикой и не подменяет покрытие тест-кейсами.
Руководитель — портфель целиком. Мульти-ТЗ анализ: коллизии между системами, оборванные цепочки, сводный Master Test Plan по десяткам документов.
Новый участник — онбординг за вечер. Онбординг-паспорт и глоссарий проекта генерируются из тех же ТЗ.
Интегратор — без ритуалов. Артефакты публикуются в Confluence, приоритеты маппятся в Jira, отчёты уходят тредами в Mattermost.
Роль | С чего начать |
|---|---|
Бизнес-аналитик | канонизация ТЗ → вопросник стейкхолдеру → глоссарий → Confluence |
QA (ручное) | комбо Блоков 1+2 → чек-лист и тест-план → Excel/Word |
QA (автоматизация) | полный конвейер 1→4 → ревью спек → линтер → прогон |
Ведущий QA | Master Test Plan по портфелю + Delta Diff при обновлении ТЗ |
DevOps / интегратор | Docker-шлюз, асинхронные задачи, REST API |
И сразу про ожидания, чтобы никто не иллюзировал: «замены аналитика», «замены QA», «100% качества требований», «готовых к продакшену автотестов без ревью» и «работы на любом ТЗ» — не будет.
Реалистичная картина: машина извлекает, канонизирует и проверяет согласованность, человек разбирает серые зоны и принимает решения.
А что у соседей
Прямого аналога — системы, которая идёт от ТЗ через канонизацию требований к тест-дизайну с гейтами доверия — я не нашёл ни в open source, ни в SaaS.
Искал честно; звёздность GitHub указана на октябрь 2026, проверяется руками.
Соседи по задачам:
Категория | Примеры | Что дают | Чего не хватает нам |
|---|---|---|---|
Enterprise ALM-сьюты | Tricentis (Tosca + qTest + Copilot), Siemens Polarion, Jama Connect | полный цикл «требования → тесты → прогон», трассируемость, governance | единственные закрывают сопоставимый объём — но это облачные enterprise-лицензии «ценник по запросу», и LLM-моста от ТЗ там нет |
Test management | TestRail, Zephyr, qTest | хранение кейсов, трассируемость | не генерируют ничего, всё руками |
AI test automation (SaaS) | Testim, mabl, Functionize, testRigor | запись/самолечение UI-тестов, кейсы из plain English | работают от кода приложения, а не от ТЗ; данные наружу; нет BA-контура |
Spec-driven OSS | GitHub spec-kit (139k звёзд, MIT), Kiro (AWS) | канонизация требований в спеку и задачи для кодинг-агента | останавливаются на «задачах»: ни тест-дизайна, ни исполнения, ни интеграций |
Браузер-агенты OSS | browser-use (117k звёзд), Stagehand, Playwright MCP | живой агент ходит по реальному приложению и верифицирует поведение | не работают от ТЗ: нет канонизации, трассируемости, честных статусов |
Кодинг-агенты | Claude Code и подобные | билет Jira → готовые Playwright-тесты | нет методологии тест-дизайна и трассируемости до требований |
«Спросить у ChatGPT» | любой чат | быстрый черновик | нет конвейера, статусов, гейтов, трассируемости и экспортов; результат невоспроизводим |
Каркасы | LangGraph, MetaGPT (70k звёзд) и прочие | конструктор для сборки своего | это субстрат, а не решение — МАЯК собран как раз из такого субстрата, но сам им не является |
Картина, в общем, забавная.
Аналоги продают тот же объём, но за заоблачные деньги и без генерации от ТЗ.
Свежая волна OSS — spec-kit, browser-use — сильнее нас каждый в своей вертикали (спеки, живое исполнение), но решает соседние задачи и останавливается там, где начинается наша работа.
Пустой остаётся именно связка: ТЗ → канонизация → тест-дизайн → прогон, с честными статусами и локальным контуром.
Вклад проекта — не «ещё одна GPT-обёртка», а эта связка плюс enterprise-интеграции. При этом внутри — обычные открытые компоненты.
Каков итог всего этого?
Пробуйте, дерзайте - самые сумасбродные мысли реализуемы)
Вопрос лишь в вашем упорстве и желании получить результат - но результат не просто для галочки, а воспроизводимый, контролируемый
Так же прикладываю 2 своих открытых библиотеки:
Отрисовка схем, починка, контроль - через неё собственно и отрисованы все схемы, которые вы видите https://github.com/Riper21/MermaidGuard
Создание матриц трассируемости, тест-дизайна - он так же есть внутри проекта, его результаты вы видите ниже https://github.com/Riper21/TestCraft
KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.