О проблемах найма я узнал не из аналитических отчётов — а потому что сам оказался внутри рынка труда. С одной стороны — как кандидат, с другой — как человек, работавший с HR и процессами найма.
Так же читая новости и статьи, в том числе на Хабре, как стремительно развивается AI в разработке, решил реализовать инженерный эксперимент и создать MVP рекомендательной системы для HR.
В этой статье делаю разбор того что получилось в итоге:
как архитектура и BDD стали “ограничителями” для агента
как я формировал и тестировал требования с помощью AI
как сформировал RAG/контекст для AI агента
с какими проблемами столкнулся и что сработало
где мое место в процессе разработки
какие skills потребовались мне и какие в итоге сформировал для AI агента
Со стороны всё выглядит так, будто AI уже оптимизировал рынок труда: вакансии закрываются, резюме фильтруются, автоматические отклики растут, а подходящие кандидаты находятся по тегам, паттернам и ключевым словам.
Защита: Но когда оказываешься внутри, картина резко меняется. Ты отправляешь десятки откликов — а ответов единицы. Чаще всего это автоматические отказы без объяснений.
Параллельно я продолжал общаться с HR — и с другой стороны всё выглядело не лучше. Сотни откликов на одну вакансию, значительная часть нерелевантная, а времени на вдумчивую проверку просто нет.
В итоге рынок начинает жить «обходными путями»:
личные рекомендации;
закрытые профессиональные чаты;
вендоры с собственными базами кандидатов.
Фактически, рекомендации существуют — но они разрознены, не консолидированы и живут вне систем. Так и появился замысел рекомендательной системы — не как продукта, а как инженерного эксперимента.
BDD? — Но требования в MVP всё равно поменяются.
Архитектура? — Но AI ведь сам её придумает в процессе реализации.
Со стороны кажется, что BDD и архитектура — это просто способ замедлить разработку и усложнить себе жизнь. Особенно если цель — быстро проверить гипотезу.
Защита: Честно говоря, я и сам не могу утверждать, что с заложенной архитектурой и BDD реализовал бы всё быстрее. Ведь я изначально выбрал именно этот путь.
Только начал я не с требований, а с архитектуры. Сначала задал базовые сущности MVP — слой model . Потом подумал, какие изменения над этими сущностями возможны и как они должны контролироваться — контракты и интерфейсы взаимодействия. А оценив примерный объем разработки выбрал Telegram-бот для UI, в связи с чем выбрал модель - state machine.
И только внутри этой архитектуры начал формировать бизнес-требования:
как именно ведёт себя каждая сущность, кто и что может делать, какие переходы допустимы.
Чтобы зафиксировать эти требования — и бизнесовые, и технические — я использовал BDD. По сути, это были BDD-сценарии с заглушками на интерфейсах, которые я писал до реализации.
Хоть это и выглядит как замедление разработки, так как зачем формировать требования, если уже все есть в голове, зачем писать тесты, которые требуется поддерживать. Но это все была подготовка к подключению AI к разработке. Ведь первоначальная идея была в том, что написанные мною требования и тесты - будут ограничителем для AI агента.
Забегая вперёд — когда я пробовал занести не проработанные требования в задаче: AI начал придумывать поведение, «улучшал» то, о чём его не просили. т.е. BDD был нужен не столько мне, сколько AI. А вот выстроенная архитектура помогла мне, лучше контролировать изменения, которые вносил AI агент.
Как только продукт растёт, требования начинают конфликтовать, контекст расползается, а контроль превращается в ад.
Защита: Логичный вопрос: а что будет, если этим займётся AI?
В своей работе я и раньше использовал AI — не для генерации требований, а для их проверки.
Базовый подход выглядел так: я передавал user stories, описание задачи, черновые требования и просил AI провести их тестирование. Базовый промт был таким:
Скрытый текстROLE:
You are a Test Analyst working on a product team.
You analyze requirements, user stories, tasks, or tickets to assess their clarity, consistency, testability and readiness for implementation.
You do NOT design solutions. You do NOT propose new features. You do NOT assume missing details.
INPUT:
One or more of the following:
Requirements (functional / non-functional)
UX requirements
User stories
Jira tasks / tickets
Acceptance criteria
MVP or scope constraints
Contextual notes (if provided)
YOUR TASK:
REQUIREMENTS ANALYSIS Analyze the input and verify it for:
completeness
internal consistency
ambiguity
testability
traceability
UX, operational, and delivery risks
AMBIGUITY HANDLING If ambiguities, contradictions, or gaps are found:
ask clarification questions ONLY
do NOT propose solutions
do NOT infer intent
do NOT add requirements
POST-CLARIFICATION NORMALIZATION After clarification answers are provided:
produce a refined and normalized requirements set
ensure all requirements are:
explicit
testable
auditable
internally consistent
READINESS VERDICT Provide a clear verdict:
READY for implementation
NOT READY for implementation
RECOMMENDATIONS Provide recommendations classified strictly as:
MUST — blockers that prevent implementation
SHOULD — important improvements that reduce risk
OPTIONAL — non-critical enhancements
ANALYSIS RULES (STRICT):
No assumptions
No new features
No design or implementation advice
No optimization suggestions
Respect MVP or scope constraints
If information is missing, ask — do not guess
Prefer explicit, test-oriented wording over descriptive prose
OUTPUT FORMAT (STRICT):
Issues & Risks
Ambiguities
Contradictions
Gaps
Testability concerns
Clarifying Questions (if any)
Refined Requirements (after clarification)
Readiness Verdict (READY / NOT READY)
Recommendations
MUST
SHOULD
OPTIONAL
DEFAULT CONTEXT (APPLY ONLY IF RELEVANT):
Enterprise or production-grade system
Role-based access control
State-dependent behavior
Multi-step or wizard-based UX
Auditability and traceability are required
Тут AI выступал в роли Test Analyst и проверял требования на полноту, логическую согласованность, однозначность и тестируемость, выявляя риски и противоречия. В случае неопределённостей он не предлагал решений, а формулировал уточняющие вопросы, после чего приводил требования в чёткий, проверяемый вид и выносил вердикт — готовы ли они к реализации.
Ключевой момент: решение о том, считать ли требования готовыми, всегда остаётся за человеком. AI лишь подсвечивает слабые места.
И тут важно понимать: сколько вопросов задаст AI — полностью зависит от входных данных и контекста.
Если контекст размыт — вопросов будет много.
Если требования слабые — цикл уточнений будет длинным.
Если контекст нерелевантен или отсутствует — AI сам начнёт «нащупывать» систему вслепую.
Отступление: По сути тут идеально ложится система RAG. Я реализовывал ее так - у задачи в JIRA есть свои теги, у каждого тега, была своя документация. Например, тег payment добавлял в контекст документацию по платёжным сценариям.
Это частично помогало, но проблему полностью не решало. Сейчас мне уже очевидно: Контекст — это не документация. Документация описывает “что есть”. Контекст для AI должен отвечать на “как должно быть” и “где границы”. Поэтому требования оказались эффективнее.
При этом сами требования могут становиться источником документации. А если добавить к ним код — AI уже способен генерировать техническую документацию с привязкой конкретного требования к конкретной реализации.
Я выбрал BDD, потому что хотел, чтобы требования были как контракт между мной и AI агентом.
Этот контракт имел очень конкретную форму:
нумерованный список требований;
без двусмысленностей;
с явными условиями и ограничениями;
пригодный для:
составления плана реализации,
покрытия тестами,
передачи агенту без риска «додумывания» поведения.
В контекст я дополнительно передавал ранее зафиксированные требования, чтобы AI мог выявлять противоречия между новыми и существующими правилами. Именно в таком виде я использовал этот подход на этапе UX :
Скрытый текстROLE:
You are a Test Analyst and UX Requirements Validator for a Java-based
candidate recommendation system (REST + Telegram Bot).
Your job is to validate and normalize UX requirements using ONLY:
documented business and technical rules from business/*,
provided user stories / tasks,
MVP constraints.
You must NOT invent requirements or UX behavior.
If something is unclear or missing in business/*, ask clarifying questions.
INPUT:
User story / tasks
Draft UX requirements
References or summaries from business/*
MVP constraints (if any)
SOURCE OF TRUTH RULES:
business/* is the single source of truth.
User stories and UX drafts may be incomplete or incorrect.
If UX contradicts business/* → UX must be corrected.
If business/* contradicts itself → raise the conflict and ask questions.
If business/* is silent → rely on user story; if both are silent → ask.
Never guess or assume missing rules.
YOUR TASK:
VALIDATE UX REQUIREMENTS
For each UX requirement, check compliance with business/*:
access control and roles,
status lifecycle and transitions,
rate limits and delayed execution behavior,
persistence rules (DB vs memory),
audit and notification rules,
MVP constraints.
IDENTIFY ISSUES
Mark any problem as one of:
Ambiguity (needs clarification)
Contradiction (UX vs business/* or internal rule conflict)
Risk (MVP, data, security, consistency)
Missing requirement (required by business/*)
Acceptable MVP simplification
ASK QUESTIONS (ONLY IF REQUIRED)
Ask only when business/* does not resolve the issue.
Questions only — no solutions, no assumptions.
NORMALIZE UX REQUIREMENTS (CANON)
After clarification (or if none needed):
Rewrite UX requirements so they fully match business/*.
Remove or fix ungrounded or contradictory items.
Each UX requirement must explicitly state (when applicable):
allowed user status,
required access level,
persistence expectations,
rate-limit behavior,
MVP boundaries.
FINAL ANALYSIS
What was fixed by business rules
What remains risky but acceptable for MVP
What is NOT READY due to unresolved conflicts
Post-MVP recommendations (no questions here)
STRICT RULES:
Do NOT invent UX behavior.
Business rules always win over UX ideas.
No assumptions about speed, capacity, or permissions.
Explicit and boring UX is better than smart but fragile UX.
OUTPUT FORMAT:
Detected Issues
Clarifying Questions (if any)
Finalized UX Requirements
Risk & MVP Readiness Analysis
Optional Post-MVP Recommendations
Когда требования стали формализованными и пронумерованными, появился вполне логичный шаг: ставить задачи для AI-агента по принципу: One task = one rule ID
Защита: Звучит логично. Но сразу возникает вопрос: что именно он сделает, какой ценой и сколько токенов сгорит по дороге?
На практике выяснилось, что если просто «скормить требования» агенту, он действительно будет что-то делать, он сам придумает зависимость требований одно от другого, составит план и будет делать что-то свое.
Поэтому для каждого требования пришлось явно сформировать задачи для агента:
с привязкой к одному Rule ID,
с указанием архитектурного слоя,
с ожидаемым покрытием тестами.
- id: DATA-EC-001
description: evaluation_context is a dictionary with unique term (no type in MVP).
logic:
- business/logic/recommendations.md#evaluation_context
code:
- Project/src/main/resources/schema.sql
- Project/src/main/java/org/example/model/EvaluationContext.java
- Project/src/main/java/org/example/repository/EvaluationContextRepository
- Project/src/main/java/org/example/repository/jdbc
tests:
- EvaluationContextRepositoryH2IT#data_ec_001_unique_term
- EvaluationContextRepositoryH2IT#data_ec_001_normalize_term
То есть агенту сразу было видно: что реализуется, где лежит код и какими тестами это должно проверяться. После реализации, ссылается на конкретное место в коде.
Но был нюанс. Код и архитектура уже частично реализована. И прежде чем реализовывать дальше, нужно агенту сказать:
какие требования уже реализованы;
какие из них покрыты тестами;
где есть расхождения между кодом и ожиданиями.
Чтобы он не начал «дописывать» систему поверх неизвестного фундамента.
Т.е. при внедрении AI я провожу аудит кода, и так делаем поэтапно слой за слоем реализации. Так как было понимание, насколько критичен правильный контекст, логично было пойти дальше. Так появился MODULE.md — минимальный, скучный, но крайне полезный документ. Шаблон:
# <module.name>
## 1. Responsibility
Single-sentence description of the module responsibility.
Must NOT include business decisions.
Example:
Telegram UX layer for HR and recommendation flows.
All business logic is delegated to service/policy layers.
---
## 2. Scope
### In Scope
- Explicitly supported responsibilities (bullet list)
- User-visible actions or system roles handled by this module
### Out of Scope
- Explicit exclusions
- Anything delegated to other layers or modules
---
## 3. Entry Points
List ONLY public entry points owned by this module.
### Classes
- ClassName — short responsibility description
Rules:
- No method-level details
- No implementation notes
---
## 4. Dependencies
### Depends On
List modules/services this module calls.
Format:
- Module / Service name — reason
### Used By
List modules or external actors using this module.
---
## 5. Business Rules Implemented
List ONLY Rule IDs that this module directly implements or enforces.
Format:
- RULE-ID — short description
Rules:
- No paraphrasing of logic
- No duplication of business/logic content
- Rule ID is mandatory
---
## 6. Data Interaction
Describe data interaction at table/entity level.
Format:
- entity/table — R / W / R+W
Rules:
- No schema details
- No SQL
- Only ownership and direction
---
## 7. Persistence & State
- Persistent state: YES / NO
- Persistence mechanism: DB / external service
- Session/state handling (if any): short statement
---
## 8. Change Impact
If something changes, what MUST be reviewed next.
Format:
- Change X → review Y (reason)
Keep max 5 rows.
---
## 9. Constraints
- MVP limitations
- UX / performance / security constraints
- Explicit non-goals
---
## 10. Related Documents
List authoritative documents only.
Format:
- path/to/doc.md — reason
В нём фиксировалось:
за что отвечает модуль;
какие у него точки входа;
какие Rule ID он реализует;
с какими данными работает;
что обязательно нужно проверить при изменениях.
Как еще одна точка опоры для AI-агента.
Краткий результат аудита:
у агента появился чёткий маршрут чтения: GENERAL.md → business/* → MODULE.md → code
из описанных 19 бизнес правил с требованиями к ним. 1 реализовано полностью с тестами, 6 частично реализованы, 12 - реализация отсутствует.
появилось 8 MODULE.md, которые впоследствии стали стабильным контекстом для RAG
Дальше я сформировал пул задач по принципу: One task = one rule ID
Для этого использовал промт:
Скрытый текстROLE:
You are an AI Engineering Agent responsible for creating and completing
implementation tasks for a Java-based Telegram Bot system.
You work strictly in a rule-driven system.
Core principle:
ONE TASK = ONE RULE ID
---
MODEL SELECTION GUIDELINE (MANDATORY):
Before working on a task, recommend the appropriate Claude model:
- Claude Haiku 4.5 (0.33x)
Use for:
- infrastructure setup,
- repositories, DTOs, helpers,
- simple logic without deep branching.
- Claude Sonnet 4.5 (1x)
Use for:
- most business logic,
- wizard flows,
- access control enforcement,
- multi-step but linear logic.
- Claude Opus 4.5 (3x)
Use ONLY for:
- complex state machines,
- cross-rule interactions,
- high-risk authorization logic.
Briefly justify the model choice.
---
INPUT:
1) Implementation plan
2) Architecture layers
3) Rules (Rule ID + logic references)
4) MVP constraints
5) Coverage mapping (if present)
6) Module documentation (MODULE.md, if exists)
---
SOURCE OF TRUTH:
- Rules: business/rules/*
- Logic: business/logic/*
- Coverage: business/coverage/*
- Code structure: project modules
- Documentation: MODULE.md
You must NOT invent behavior beyond these sources.
---
TASK DECOMPOSITION RULES:
1) Each task MUST reference exactly ONE Rule ID.
2) Each task MUST belong to exactly ONE architecture layer.
3) If a rule spans multiple layers → create multiple tasks with the SAME Rule ID.
4) If behavior is unclear or contradictory → mark BLOCKED.
5) If rule exceeds MVP constraints → mark DEFERRED.
---
TASK FORMAT (PLANNING PHASE):
For each task, output:
- Task ID
- Rule ID
- Recommended Model (with reason)
- Layer
- Goal
- Must Provide
- Out of Scope
- Acceptance Criteria
- Persistence Impact
- Tests Required
- Dependencies
- Status (READY / BLOCKED / DEFERRED)
---
TASK COMPLETION RULES (MANDATORY):
When a task status changes to DONE, you MUST perform ALL of the following:
### 1) WORKLOG
Write a structured worklog entry containing:
- Task ID
- Rule ID
- Summary of implemented changes
- Files/modules affected
- Decisions made (and why)
- Known limitations (MVP-related or technical)
- Follow-up tasks or risks (if any)
### 2) MODULE.md UPDATE
Update the corresponding MODULE.md file:
- Describe new or changed responsibilities of the module
- Document new classes/services/repositories
- Mention implemented Rule ID(s)
- Note persistence, state, or lifecycle changes if applicable
If MODULE.md does not exist:
- Create it using a minimal standard structure.
### 3) CONTEXT CONSISTENCY CHECK
Verify that:
- Code, tests, and documentation describe the SAME behavior
- No undocumented side effects remain
---
AGENT CONSTRAINTS:
- Do NOT refactor unrelated code.
- Do NOT duplicate logic across layers.
- Do NOT skip documentation updates.
- Do NOT mark DONE if worklog or MODULE.md is missing or incomplete.
---
OUTPUT FORMAT:
Section 1: Model Recommendation Summary
Section 2: Task List / Execution Result
Section 3: Worklog (for completed tasks)
Section 4: MODULE.md Updates (diff or full content)
Section 5: Blocked / Deferred Tasks
Section 6: MVP Readiness Summary
Суть промта для постановки и выполнения задач:
AI работает как инженер-исполнитель, а не генератор идей: он реализует только то, что описано в правилах и требованиях.
Все задачи формируются строго на основе источников истины (rules, logic, coverage, MODULE.md), без домыслов и новых поведений.
Сложность задачи влияет на выбор модели: простые инфраструктурные вещи — дешёвые модели, сложная логика и риски — более мощные.
Если правило неполное или противоречивое, задача помечается как BLOCKED - (требуется уточнение), если выходит за рамки MVP — как DEFERRED (больше как рекомендация)
Каждая задача имеет чёткие критерии приёмки, требования к тестам и влияние на данные.
Завершение задачи обязательно сопровождается:
worklog’ом - что сделано и почему (обращался пару раз к нему в спорных моментах - например, когда покрытие кода тестами увеличилось, а количество тестов уменьшилось - агент решил, что новые интеграционные тесты покрывают тесты из юнит, поэтому он их удалил),
обновлением архитектурного контекста в MODULE.md,
проверкой согласованности кода, тестов и документации.
Задача не считается выполненной, пока не обновлены код, тесты и документация.
В итоге по использованию моделей при написании кода: ~ 70% задач/кода — Haiku, ~20% — Sonnet, ~1%-остальные и 9% - Hand work (ручная работа)
Да, без ручного вмешательства не обошлось. Так как задач получилось около 80 задач, которые разбил на фазы реализации. Первые фазы прошли почти без моего участия. Но чем сложнее становились задачи, тем чаще агент начинал:
писать слишком много комментариев → раздувался контекст;
плодить локальные хелперы → код расползался;
подгонять тесты под реализацию, а не наоборот.
Отдельной болью стали технические нюансы MVP:
H2 vs PostgreSQL — у агента ломались тесты из-за несовместимости → пришлось зафиксировать паттерн (GeneratedKeyHolder / keyHolder)
Нестабильные интеграционные тесты — агент “лечил симптомы” → пришлось создавать базовый H2-класс + транзакционная изоляция
State-machine — агент ходил по кругу → тут написанный мной E2E вскрыл корень проблемы (переключение state вынести выше)
даже команды запуска тестов пришлось зафиксировать — агент упорно пытался использовать Linux-утилиты вместо PowerShell
Теперь у меня есть несколько рекомендаций (больше для себя):
Все повторяющиеся проблемы сразу заносить в правила и промты.
Проблемы, которые нашли вы, а не агент, покрывать тестами, которые напишите сами, а не агент.
На последних этапах реализации, покрыть код E2E тестами используя диаграмму переходов и состояний - как обход графа.
Использовать английский язык в требованиях и промтах, что уменьшает расход токенов.
Делать ограничение, на количество попыток исправления проблемы агентом.
Теперь важен выбор AI — он и архитектуру придумает, и код напишет, и тесты добавит.
Защита: AI развивается очень быстро, какие-то навыки усиливает в реализации ПО, а для других уменьшает значимость. Я лишь могу судить о своих - FullStack QA Lead. Что мне помогало, как
FullStack:
чтение и анализ кода - Если не уметь читать код, вы не понимаете, что именно он сделал.
понимание архитектуры приложений - Без чётких границ слоёв агент начинает смешивать ответственность
написание автотестов - опыт позволял не только решать спорные моменты, но использовать лучшие решения - экономя время.
QA :
тест-анализ и покрытие тестами - Хороший тест - как способ зафиксировать поведение системы. В рамках агента тесты запускаются гораздо чаще и их ценность от этого только увеличивается.
Lead:
декомпозиция - работ, задач, фаз, требований, слоев и т.д.
управление реализацией - распределение задач между мной и различными AI, работа с проблемами, приоритизация задач.
контроль агента - Когда вмешаться, а когда дать ему доработать.
обучение - системное модернизация промтов и правил - как и с людьми цель, чтобы Агент, мог делать большую часть без контроля.
По сути, AI стал ещё одним (во множестве лиц) членом команды.
Какие еще навыки потребовались:
prompt engineering - в малой степени, так как сейчас с этим лучше справляется сам AI, я лишь только дорабатываю.
понимание, как агент читает контекст и что он игнорирует.
Reasoning Engineering - для сложных многоэтапных задач.
проектирование агентной архитектуры и памяти (RAG).
Как интересно меняется мир IT, ты уже не знаешь, что тебе потребуется завтра. И даже мои SKILLS можно загнать в набор действий, описаний для заданного контекста. Именно эта идея появилась, когда я впервые прочитал про skills для AI-агента.
Какие skills для агента у меня есть:
формирование и анализ требований (тут я передаю идею в контексте и с AI пытаемся сформировать все виды требований, определить границы, риски, оценка конкурентов - подход итерационный общение, после каждого получаю документ с описанием идеи, требованиями и списком того что нужно проверить и как)
тестирование требований (тут два шага - формирования промта под определенные проверки, используя базовый промт и только потом тестирование требований)
формирование задач по требованиям, составленную в порядке приоретизации и зависимостей.
аудит - это тоже задачи для агента, но цель ее только оценить и актуализировать информацию для RAG.
обучение - во время работы с Агентом, я нахожу проблемы, описываю их человеческим языком их решение. выполняя эту команду он обновляет правила разработки, формализованным для себя.
Цель моей статьи, не что я сделал и не инструкция "делайте так же", а:
показать, что сегодня один человек с опытом и AI может проверять идеи, которые раньше требовали команды;
где AI реально ускоряет, и что может помочь вам.
поделиться практикой работы с требованиями, тестами и агентом
показать, что требуется держать руку на пульсе своих навыков, чтобы пользоваться новыми подходами в разработке и тестировании
В итоге у меня получился не просто MVP, а работающая система взаимодействия с AI:
требования → тесты → задачи → агент → аудит → обновлённый контекст;
набор повторяемых подходов, которые я уже использую как skills;
и проект, который можно развивать дальше — или адаптировать под другие задачи.
👉 Сам проект
Если вы HR и вам интересна идея консолидации рекомендаций по кандидатам — буду рад обсудить.
Если вы работаете с AI-агентами и требованиями — давайте сравним подходы.
Если вам нужен человек, который умеет держать систему в голове и управлять AI как частью команды — тоже пишите мне в телеграмм @a_wert.
Мир IT меняется быстро. И, кажется, сегодня важнее не знать «что будет завтра», а уметь строить системы, которые быстро адаптируются под изменения. Если вам интересно, а что дальше. Подписывайтесь на мой канал.
Спасибо, что дочитали.
Источник


