The Jerusalem PostIsrael Police arrest Kfar Saba mayor, wife, and 15 others in major municipal corruption probePunchEXPLAINER: Who is Geoff Ogunlesi and why is he trending?RTP DesportoCiclista português Ivo Oliveira conquista Tour de KyushuBollywood HungamaAanand L Rai-backed Nakhrewaalii set to release on October 30, 2026InquirerArticle II’s essence: Sara plays simple but numbers won’t lie — DioknoThe South AfricanWhat’s next for Orlando Pirates after losing MTN8 trophy to Sundowns?ZDF heuteEntdecken Sie das ZDF-NachrichtenstudioCBS NewsSaudi airport stays shut as Houthi attacks kill 20 people in a weekDaily MailWhat to eat to prevent bowel cancer: The science-backed breakfasts, lunches and dinners that help reduce your risk... and the foods to avoidDeadline‘FREEAgent:’ Streetwear Pioneer Jeff Staple Among First Guests On Season Two Of Kenny Annan-Jonathan’s PodcastGolem.deAngriffe auf russische Raffinerien: USA drohen Ukraine mit Stopp von Geheimdienstinfos20 MinutenRaketen gegen Polizisten – und was tut die Politik?
The Daily Newsstand · Free, Always
Monday, October 12, 2026

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

Translate

Я не люблю писать документацию. Чек-листы, планы тестирования, блоки проверок, схемы — вот это всё.
Не люблю, потому что, пока ты это пишешь, теряется время на главное: разбираться и тестировать систему, с которой ты работаешь.

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

Позже я увидел и саму проблему целиком: между аналитиком и тестировщиком нет конвейера. Требования живут в Confluence, тест-план — в голове и Excel, а посередине — ручной труд с копипастой.
Вот этот разрыв я и придумал как закрыть.

Дальше — история того, как я это делал: вскрытием собственного концепта и 58 специализированными блоками в финале.

Я собрал конвейер «ТЗ → канонизация → тест-дизайн → прогон» из 58 специализированных блоков с гейтами доверия: каждый критерий приёмки заземляется цитатой из исходника, серые зоны превращаются в вопросы, а не в угаданную конкретику, повторы бесплатны за счёт кэша. Проверил на синтетическом ТЗ с заложенными болезнями: 9 ловушек из 10 поймал автомат, десятую — человек с вопросником от машины; 26 вопросов стейкхолдерам за 90 секунд, 20 серых зон, 37 BDD-сценариев за 26 минут. Где платформа врёт и что не доработано — тоже в тексте.

Летом щёлкнуло

Идея оформилась буквально летом — как всё-таки зайти на сторону автоматизации документации.
Тут помог и опыт ранее реализованных проектов, и в целом текущая скорость развития и роста моделей.

Первоначальная формулировка была наивно простой: я хочу, чтобы документация писалась автоматически.
Как это реализовать, как продумать и разобрать всё на косточки — на это потребовалось время.

Суть: возложить на модель создание чернового варианта документации, который остаётся валидировать.
Так быстрее погружаешься в задачу и сразу выходишь на границу «тестирование / доработка документации» — процесс становится параллельным, а не последовательным.
Живёшь в последовательной парадигме — попадаешь в цикл: новая задача уже готова, а документацию написать полноценно не успеваешь (говорю исключительно про себя).

Июль: первый блин

Первый подход был сделан в июле: сформировал концепт — как должны работать внутренние агенты, как читать, что выделять из ТЗ, как вообще его обрабатывать.

Главная соль — формировать документацию ДО разработки, а не после.
Взглянуть на задачу раньше, чем ты получаешь её итог в виде готовых кнопок, функций, интеграций.

Тут всё получилось не так радужно, не увидел прямой перспективы в концепте, отложил его "На подумать".

После Конференции: вскрытие

Сходив на очередную Конференцию я увидел, что идеи и задачи в целом схожи в комьюнити, и захотелось попробовать себя: как у меня получится реализовать задуманное.

Был взят июльский концепт, проанализирован, разобран до косточек — и тут я понял его несостоятельность.
Всё было слишком широким и обширным, каждый блок пытался объять необъятное.
По моему опыту подобные решения не приводят к качественному результату — именно поэтому в предыдущем проекте, распознавании фото, я делал около сотни промптов и роутинг ради одной-единственной задачи.

Тут задача была куда нетривиальнее: разобрать на блоки и подблоки техническое задание.
Из первичных четырёх блоков система выросла в 32 блока тестирования и 26 аналитики.

Из четырёх блоков — 58

Каждый блок отвечает за конкретно свою задачу.
Технически это многоагентная наследуемая структура, которая работает как часы, — потому что используется паттерн LangGraph\LangChain.

Структура получилась натурально микросервисной: у каждого модуля собственное назначение, последовательности вызовов для каждой задачи, состояния, ограничения и технический навык. Жить в монолите тут не получилось бы: невозможно добавлять и варьировать блоки, изменять их последовательности обработки.
До этого, впрочем, я тоже дошёл не сразу :)

На макроуровне — экосистема из двух платформ и общей инфраструктуры, конвейер «ТЗ → тесты».

Рисунок 1 — Экосистема МАЯК: пять контуров, 32 блока тестирования и 26 блоков аналитики

Рисунок 1 — Экосистема МАЯК: пять контуров, 32 блока тестирования и 26 блоков аналитики

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

Путь одного документа по конвейеру — артефакт за артефактом:

Рисунок 2 — Путь одного ТЗ по конвейеру: артефакты на стрелках переходов

Рисунок 2 — Путь одного ТЗ по конвейеру: артефакты на стрелках переходов

В разрезе — та самая микросервисность. Те самые 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 — крупным планом:

Рисунок 3 — Петля Self-Healing: повторная генерация с трейсбеком, лимит итераций

Рисунок 3 — Петля Self-Healing: повторная генерация с трейсбеком, лимит итераций

Контракты данных всех узлов — типобезопасные Pydantic v2-схемы, порядок вызовов зафиксирован инвариантами (осознанный выбор: предсказуемость конвейера важнее «гибкости на бегу»), ответы LLM проходят обязательную очистку и валидацию. Добавлять новые блоки и собирать из них разные сценарии (block1, block2, combo, full) можно без риска для остального конвейера — реестр плагинов толерантен даже к сломанным модулям (они попадают в load_errors, не убивая процесс). Ровно та наращиваемость, которой не хватало монолиту.

Каждый запуск пишет артефакты в изолированную папку сессии (дата_Название_ТЗ), прогоны не затирают друг друга.
Если LLM недоступен — платформа честно сообщает об этом и работает на кэше, а не выдумывает результат.

Как МАЯК говорит «не знаю»

Собственно, чего я жду от машины, которой не доверяю: чтобы она честно говорила, что именно проверено, а что нет. Платформа никогда не говорит «100% подтверждено» — и вот чем это обеспечивается:

  • заземление требований: каждый критерий приёмки обязан подтверждаться цитатой из исходного текста ТЗ. Цитата не нашлась — требование помечается, а не молча пропускается;

  • серые зоны не маскируются: неоднозначные места ТЗ превращаются в вопросы к стейкхолдеру, а не в угаданную конкретику;

  • изоляция серых зон от автоматизации: тест-кейсы, построенные на неоднозначных требованиях, физически не допускаются к генерации автотестов. Автоматизация не должна «угадывать» поведение за аналитиков;

  • строгий режим: при сбоях LLM запрещены синтетические fallback-данные; пустой ввод — гарантированная ошибка вместо «успеха с пустыми результатами».

Барьеры до кода — как устроены гейты:

Рисунок 4 — Гейты доверия до кода: заземление, серые зоны, строгий режим

Рисунок 4 — Гейты доверия до кода: заземление, серые зоны, строгий режим

Статусы прогона — это то, как Маяк взаимодействует с человеком:

Статус

Что это значит

Что делаю я

PASSED

все исполненные тесты зелёные

читаю как результат прогона, а не как полноту покрытия

FAILED

есть упавшие, трассировка до критериев — в отчёте

разбираю через триаж

HEALED

тест упал и восстановлен контуром Self-Healing

помню: «исправлено автоматически» ≠ «всегда было зелёным»

BLOCKED

исполнение невозможно (нет рантайма/окружения)

чиню окружение, а не делаю вид, что прогон был

SKIPPED_NO_RUNTIME

тест осознанно пропущен

не даю ему засчитаться молча

Появление статусов — от исхода исполнения:

Рисунок 5 — Статусы прогона: исход исполнения → статус

Рисунок 5 — Статусы прогона: исход исполнения → статус

Проверка на себе: ТЗ с секретиками

Прежде чем писать это, я прогнал платформу на себе.
Взял синтетическое ТЗ «Система заказа гостевых пропусков» — написал с нуля, без клиентских данных, 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+ реальных ТЗ через платформу — счёт набит не синтетикой, а папками сессий: каждое честное «не сошлось» оборачивалось правкой, и версии платформы итерировались по живым проколам;

  • пилот на коллегах внутри компании — по итогам внесены коррективы. Это не цифра зрелости кода, а проверка на людях: где платформа удобна и где мешает, знаю не из догадок.

Кто что получает

  1. Аналитик — вопросы, а не загадку. Белые пятна и противоречия ТЗ собираются в опросный лист — на созвон с Product Owner выходишь с конкретикой.

  2. QA-инженер — исключения, а не всё подряд. Серые зоны помечены, трассируемость «критерий → кейс» есть у каждого пункта, покрытие чек-листа считается отдельной метрикой и не подменяет покрытие тест-кейсами.

  3. Руководитель — портфель целиком. Мульти-ТЗ анализ: коллизии между системами, оборванные цепочки, сводный Master Test Plan по десяткам документов.

  4. Новый участник — онбординг за вечер. Онбординг-паспорт и глоссарий проекта генерируются из тех же ТЗ.

  5. Интегратор — без ритуалов. Артефакты публикуются в 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

View the original on Хабр →

KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.