1 апреля 2026
Классический SDLC построен вокруг передачи задачи между ролями: аналитик формулирует требования, разработчик пишет код, QA проверяет результат. Каждый handoff - потеря контекста и время ожидания. AI-агенты инвертируют эту модель: агент ведёт задачу от спецификации до готового кода, а инженеры подключаются на контрольных точках. Но попытка вставить агента в существующий пайплайн "вместо разработчика" не работает - нужен другой процесс. Статья описывает как его построить, какие фреймворки существуют, и как внедрить это в организацию с уже выстроенным SDLC.
Почему классический SDLC не работает с агентами
Стандартный процесс разработки - это конвейер с передачей ответственности:
| Этап | Роль | Артефакт | Время ожидания |
|---|---|---|---|
| Анализ | Аналитик/PM | Требования в Jira | Часы-дни |
| Приёмочные критерии | QA / Аналитик | Acceptance criteria, тест-кейсы | Часы-дни |
| Дизайн | Архитектор | Техническое решение | Часы-дни |
| Разработка | Разработчик | Pull Request | Дни-недели |
| Тестирование | QA | Тест-репорт | Часы-дни |
| Релиз | DevOps/Release manager | Deployment | Часы |
Проблема не в самих этапах - они логичны. Проблема в handoffs. Каждая передача задачи между людьми означает: ожидание в очереди, потерю контекста при передаче, синхронизацию через митинги и комментарии. На типичной задаче 70-80% lead time - это время ожидания, а не работы.
Даже если каждый участник ускоряет свою работу с помощью AI - аналитик быстрее пишет требования, разработчик генерирует код с Copilot, QA автоматизирует тест-кейсы - это не решает системную проблему. Handoffs остаются. Очереди остаются. Задача по-прежнему ждёт в backlog разработчика, потом в очереди на review, потом в очереди QA. AI ускоряет работу внутри каждого этапа, но не устраняет ожидание между ними.
AI-агенты работают иначе. За одну сессию агент читает спецификацию, анализирует кодовую базу, пишет код, создаёт тесты, запускает линтер, исправляет ошибки и формирует PR. Время выполнения — минуты, не дни.
Но у агентов есть ограничение: они stateless. Каждая сессия начинается с нуля. Агент не помнит предыдущих решений, не знает контекст проекта, не понимает бизнес-логику - если ему это не передали явно.
Попытка вставить агента в существующий пайплайн "вместо разработчика" - антипаттерн. Агент получает задачу из Jira, написанную для человека (с неявными допущениями, ссылками на устные договорённости, контекстом из предыдущих спринтов) - и генерирует код, который формально соответствует описанию, но не учитывает реальные constraints проекта.
DORA 2025 подтверждает: при 90% adoption AI-инструментов в команде зафиксировано +9% багов и +91% времени code review. Агенты генерируют код быстрее, но если процесс не адаптирован - качество падает, а нагрузка на review растёт.
Инвертированная модель: агенты работают, люди проверяют
В классическом SDLC человек - исполнитель, инструменты - средства. IDE подсвечивает ошибки, CI запускает тесты, Jira трекает прогресс. Но решения принимает и код пишет человек.
В AI-driven SDLC агент - исполнитель, человек - валидатор и архитектор контекста. Агент пишет код, запускает тесты, итерирует до зелёного билда. Человек определяет что делать (спецификация), обеспечивает контекст (rules, memory, knowledge base) и проверяет результат (review).
Что меняется для организации:
Раньше: 5-7 человек в команде. Аналитик пишет требования, 2-3 разработчика реализуют, QA тестирует, тимлид координирует. Пропускная способность - количество разработчиков × их скорость.
Теперь: пропускная способность определяется не количеством людей, а качеством спецификаций и контекста. Один инженер с хорошей инфраструктурой контекста может запускать несколько агентных сессий параллельно.
Spec-driven development как фундамент
Все зрелые AI-driven SDLC фреймворки сходятся в одном: спецификация до кода - обязательное условие. Причина проста: агент, получивший размытое описание, генерирует код, который формально соответствует запросу, но не решает реальную задачу.
OpenSpec формулирует это так: "AI coding assistants are powerful but unpredictable when requirements live only in chat history". SPECTRE идёт дальше: "Ambiguity is death" (SPECTRE) - чем точнее спецификация, тем дольше агент работает автономно без эскалации.
Ниже - детальный разбор шести фреймворков: что они добавляют в проект, как организованы артефакты, где стоят контрольные точки и как на основе накопленных артефактов строится экспертиза.
BMAD Method
Самый комплексный фреймворк. 12+ агентных ролей (PM, Architect, Developer, UX, QA, Scrum Master), 34+ workflows, модульная система расширений.
Что добавляется в проект
your-project/
├── _bmad/ # Конфигурация: агенты, workflows, skills
└── _bmad-output/
├── planning-artifacts/
│ ├── PRD.md # Product Requirements Document
│ ├── architecture.md # Архитектурные решения
│ └── epics/ # Эпики и user stories
├── implementation-artifacts/
│ └── sprint-status.yaml # Трекинг прогресса по спринтам
└── project-context.md # Общий контекст проекта
Фазы и контрольные точки
- Analysis (опционально) - product brief, PRFAQ, исследования. Контрольная точка: нет, фаза опциональна.
- Planning - PRD через workflow
bmad-create-prd. Контрольная точка: PRD должен существовать до перехода к solutioning. - Solutioning - architecture.md, эпики и stories. Контрольная точка:
bmad-check-implementation-readinessвалидирует когерентность всех документов. - Implementation - sprint-status.yaml, код. Контрольная точка: sprint planning должен пройти до начала build-цикла.
Развитие артефактов
PRD обновляется при изменении scope. Architecture.md дополняется при архитектурных решениях в ходе реализации. Sprint-status.yaml - живой документ, отражающий текущее состояние. Scale-adaptive intelligence автоматически регулирует глубину каждого артефакта: для bug fix - минимальный набор, для enterprise feature - полный цикл.
Экспертиза по артефактам
Накопленные PRD и architecture.md формируют историю product decisions. Sprint-status.yaml даёт данные о velocity и паттернах. Party Mode позволяет запустить несколько агентных ролей в одной сессии для кросс-функциональной ревизии артефактов.
Несколько команд и sustainability
43K+ stars, активная ежедневная разработка, за фреймворком стоит BMad Code, LLC. Модульная система (BMM, TEA, BMGD, CIS) позволяет разным командам использовать разные модули. Party Mode и Cross Platform Agent Team поддерживают кросс-командное взаимодействие. Однако явной поддержки monorepo с team-level конфигурацией нет - каждая команда работает со своим набором агентов и workflows.
OpenSpec
Философия: "fluid not rigid, iterative not waterfall, built for brownfield not just greenfield". Минимальная церемония, максимальная итеративность.
Что добавляется в проект
your-project/
└── openspec/
├── config.yml # Конфигурация, профиль
└── changes/
├── add-dark-mode/ # Папка на каждое изменение
│ ├── proposal.md # Зачем делаем, что меняется
│ ├── specs/ # Требования и сценарии
│ ├── design.md # Техническое решение
│ └── tasks.md # Чеклист реализации
└── archive/
└── 2026-03-15-add-dark-mode/ # Завершённые изменения
Фазы и контрольные точки
- Propose (
/opsx:propose) - AI генерирует proposal.md, specs/, design.md, tasks.md за один проход. Контрольная точка: человек ревьюит и правит артефакты до перехода к реализации. Нет rigid gates - любой артефакт можно обновить в любой момент. - Apply (
/opsx:apply) - агент реализует tasks последовательно. Контрольная точка: каждый task отмечается как выполненный. - Archive (
/opsx:archive) - завершённая работа перемещается в archive/ с датой.
Расширенный workflow добавляет: /opsx:new (новая фича), /opsx:continue (продолжить прерванную работу), /opsx:verify (валидация), /opsx:sync (синхронизация артефактов с кодом).
Развитие артефактов
Ключевое отличие OpenSpec - "update any artifact anytime, no rigid phase gates". Proposal обновляется если scope изменился в ходе реализации. Design.md правится если реальность разошлась с планом. Specs дополняются новыми сценариями. После завершения - archive сохраняет финальное состояние для будущей референции.
Экспертиза по артефактам
Archive формирует историю всех изменений с контекстом (proposal = зачем, specs = что именно, design = как). Можно анализировать паттерны: какие типы изменений проходят гладко, где чаще расходятся plan и реальность, какие домены требуют больше итераций.
Несколько команд и sustainability
36K+ stars, за фреймворком Fission AI (организация с коммерческим Teams-предложением). Есть /opsx:onboard для onboarding новых участников. Команды поддерживаются через отдельный Slack-канал. Однако team-level конфигурация в monorepo не документирована - каждый проект получает свою директорию openspec/.
Spec Kit (GitHub)
Слоган Spec Kit: «specifications become executable — code serves specifications, not the other way around». Python CLI (Specify), 25+ поддерживаемых AI-агентов, расширяемая экосистема с 40+ community extensions.
Несмотря на принадлежность GitHub, Spec Kit - tool-agnostic. Поддерживает Claude Code, Cursor, Gemini CLI, Codex CLI, GitHub Copilot, Windsurf, Kiro CLI, Qwen Code, OpenCode, Amp, Roo Code и другие. Установка через specify init . --ai claude (или любой другой агент). Для неподдерживаемых агентов есть --ai generic.
Что добавляется в проект
your-project/
├── constitution.md # Принципы и стандарты проекта
└── specs/
└── 003-chat-system/ # Автонумерация + semantic name
├── spec.md # Спецификация (что и зачем)
├── plan.md # Технический план (как)
├── tasks.md # Декомпозированные задачи
├── data-model.md # Схема данных
├── contracts/ # API контракты
├── research.md # Исследование: библиотеки, бенчмарки
└── quickstart.md # Ключевые сценарии валидации
Фазы и контрольные точки
- Constitution (
/speckit.constitution) - принципы проекта: quality standards, performance requirements, UX consistency, архитектурные ограничения. Constitution - "законы", которым подчиняются все последующие артефакты. Обновляется редко. - Specification (
/speckit.specify) - описание что и зачем, без деталей реализации. Шаблон явно запрещает агенту писать про технический стек: "Focus on WHAT users need and WHY, avoid HOW to implement". Неопределённости маркируются[NEEDS CLARIFICATION]вместо угадывания. Автоматически создаётся feature branch и директория. Контрольная точка: spec.md ревьюится человеком, все[NEEDS CLARIFICATION]должны быть разрешены. - Planning (
/speckit.plan) - технический план: стек, архитектура, ключевые решения. Генерирует дополнительные артефакты: data-model.md, contracts/, research.md, quickstart.md. Каждый технический выбор ссылается на конкретное требование из spec. Контрольная точка: plan.md может быть заблокирован через extension Plan Review Gate - требует PR/MR approval до перехода к tasks. - Task Breakdown (
/speckit.tasks) - анализирует plan.md, data-model.md и contracts/ для генерации задач. Независимые задачи маркируются[P](параллелизуемые). Контрольная точка: tasks.md ревьюится. - Implementation (
/speckit.implement) - агент реализует задачи. Контрольная точка: extensions для post-implementation review (Verify, Staff Review, QA Testing).
Как артефакты эволюционируют
Spec Kit рассматривает спецификации как "living documents", а код - как "continuously regenerated output":
- Constitution - стабильный фундамент. Обновляется при стратегических изменениях (новый стек, новые архитектурные принципы). Все спецификации автоматически проверяются на соответствие constitution.
- Spec → Plan - однонаправленная зависимость. Изменение в spec.md автоматически флагирует затронутые технические решения в plan.md. Extension Iterate позволяет обновить spec mid-implementation и сразу вернуться к реализации.
- Drift detection - extension Reconcile обнаруживает расхождения между спецификацией и реализацией. Extension Spec Sync предлагает AI-assisted resolution с human approval.
- Post-implementation - extension Retrospective анализирует spec adherence (насколько код соответствует спецификации), предлагает обновления. Extension Archive перемещает завершённые фичи в project memory.
- Production feedback - метрики и инциденты из production становятся входными данными для обновления спецификаций. Баг в production - обновление acceptance criteria в spec, не просто hotfix.
Экспертиза по артефактам
Самая развитая экосистема для аналитики:
| Extension | Категория | Что делает |
|---|---|---|
| Understanding | docs | 31 метрика качества спецификаций по IEEE/ISO + energy-based ambiguity detection |
| Spec Critique | docs | Двойной анализ: product strategy + engineering risk |
| V-Model | docs | Парная генерация: dev spec → test spec с полной traceability |
| Verify Tasks | code | Обнаружение "phantom completions": задачи [X], но реализации нет |
| Staff Review | code | Staff-engineer-level review: spec compliance, security, performance |
| MAQA | process | Multi-Agent QA: параллельная реализация через worktree + автоматический QA |
| Fleet Orchestrator | process | Full lifecycle orchestration с human-in-the-loop gates |
| Jira / Linear / GitHub Projects | integration | Синхронизация спецификаций с task trackers |
Несколько команд и sustainability
84K+ stars - крупнейший фреймворк в категории. Принадлежит GitHub (Microsoft), ежедневная активная разработка. Самая богатая экосистема для multi-team: MAQA для параллельной реализации, Fleet Orchestrator для lifecycle, интеграции с пятью task trackers. Enterprise/air-gapped installation. Brownfield walkthroughs документированы: ASP.NET CMS (307K строк C#), Jakarta EE runtime (420K строк Java), Go/React dashboard. Де-факто стандарт в пространстве spec-driven development.
cc-sdd
Kiro-inspired workflow с явным brownfield path. 8 AI-агентов, 13 языков, кастомизируемые шаблоны.
Что добавляется в проект
your-project/
└── .kiro/
├── settings/
│ ├── templates/ # Кастомизируемые шаблоны
│ │ ├── requirements.md # Шаблон требований
│ │ ├── design.md # Шаблон дизайна
│ │ └── tasks.md # Шаблон задач
│ └── rules/ # Правила генерации для AI
├── steering.md # Контекст проекта (brownfield)
├── memory.md # Память между сессиями
└── specs/
└── photo-albums-en/
├── requirements.md # EARS-format требования
├── design.md # Архитектура + Mermaid-диаграммы
└── tasks.md # Задачи с зависимостями
Фазы и контрольные точки
Greenfield path:
spec-init- создать скелет спецификацииspec-requirements- сгенерировать требования в EARS-формате (Exceptional, Alternative, Real world, Specification)spec-design- архитектура с Mermaid-диаграммамиspec-tasks- декомпозиция с dependency trackingspec-impl- реализация
Brownfield path (ключевое отличие):
steering- описать существующий проект, стек, conventionsspec-init- создать спецификацию измененияvalidate-gap- агент анализирует gap между текущим состоянием и требованиями. Контрольная точка: результат валидации ревьюится человеком.spec-design- дизайн с учётом существующей архитектурыvalidate-design- агент проверяет что дизайн не ломает существующий код. Контрольная точка: результат ревьюится.spec-tasks- задачиspec-impl- реализация
Развитие артефактов
Шаблоны в templates/ кастомизируются под процессы команды один раз - дальше все агенты генерируют артефакты в едином формате. Memory.md накапливает контекст между сессиями: архитектурные решения, паттерны, стандарты. Steering.md обновляется при значительных изменениях в проекте.
Экспертиза по артефактам
EARS-формат требований (стандарт из automotive/aerospace) делает требования формально проверяемыми. Mermaid-диаграммы в design.md дают визуальную архитектуру. Dependency tracking в tasks.md показывает критический путь. Кастомизация шаблонов позволяет встроить специфичные для команды чеклисты и критерии.
Несколько команд и sustainability
3K stars, за фреймворком gotalab (японский разработчик, автор книги на Amazon). Явная поддержка команд: "Team-aligned templates - customize once, all agents output docs that fit your approval process." Шаблоны в .kiro/settings/templates/ кастомизируются под процесс команды. 8 AI-агентов с единым workflow. Последняя активность - март 2026. Совместим с Kiro IDE спецификациями (миграция между инструментами).
SPECTRE
Семь фаз по акрониму. Философия: "Great Inputs → Great Outputs" и "Ambiguity is Death". Создан за 12+ месяцев ежедневного использования Claude Code. Протестирован на кодовых базах до 250K строк.
Что добавляется в проект
your-project/
├── .spectre/
│ └── manifest.json
├── docs/tasks/
│ └── rate-limiting/ # Папка на каждую фичу
│ ├── specs/
│ │ ├── scope.md # Что делаем и что НЕ делаем
│ │ ├── ux.md # User flows и компоненты
│ │ ├── plan.md # Технический дизайн
│ │ ├── tasks.md # Задачи для исполнения
│ │ ├── code_review.md # Результаты code review
│ │ └── gaps.md # Обнаруженные пробелы
│ └── session_logs/ # Логи сессий (handoff)
│ ├── 2026-04-01_01.md
│ └── 2026-04-01_02.md
└── .claude/skills/
└── rate-limiting/
└── skill.md # Captured knowledge для будущих сессий
Фазы и контрольные точки
| Фаза | Команда | Что делает | Контрольная точка |
|---|---|---|---|
| Scope | /spectre:scope |
Интерактивный скоупинг: что строим, что НЕ строим, constraints | scope.md ревьюится человеком |
| Plan | /spectre:plan |
Исследование кодовой базы, технический дизайн | plan.md ревьюится, /spectre:handoff для чистого контекста |
| Execute | /spectre:execute |
Параллельная реализация через субагентов (wave-based delivery) | /spectre:validate верифицирует каждую задачу |
| Clean | /spectre:clean |
Deep cleanup: dead code, дубликаты, lint, logical commits | Все изменения коммитятся |
| Test | /spectre:test |
Risk-aware тестирование, субагенты пишут тесты | Test coverage |
| Rebase | /spectre:rebase |
Подготовка к merge с обработкой конфликтов | Clean merge |
| Evaluate | /spectre:evaluate |
Архитектурный review + knowledge capture | skill.md создан и зарегистрирован |
Развитие артефактов
Session logs - ключевой механизм. /spectre:handoff сохраняет snapshot текущей сессии. Субагент @spectre:sync объединяет последние 3 session logs в единую memory. При /clear новая сессия автоматически получает контекст предыдущих.
Skills - кумулятивная экспертиза. /spectre:evaluate после каждой фичи генерирует skill.md с gotchas, decisions, patterns, procedures. SessionStart hook при каждом запуске проверяет registry и инжектирует релевантные skills в контекст. Каждая следующая сессия умнее предыдущей.
Экспертиза по артефактам
Пять категорий captured knowledge:
- Gotchas - "websocket reconnect silently fails if..."
- Decisions - "chose SQLite over Postgres because..."
- Features - архитектурные досье: ключевые файлы, flows, типичные задачи
- Patterns - переиспользуемые решения, установленные в кодовой базе
- Procedures - deploy, release, migrate
/spectre:recall auth находит и загружает всё, что известно про auth. Gaps.md после validate - явный список того, что агент пропустил. Это данные для улучшения scope и спецификаций.
Несколько команд и sustainability
119 stars, автор - ex-Meta/Amazon PM, проект создавался как личный daily driver. Не рассчитан на multi-team из коробки: session logs и skills привязаны к одному пользователю. Однако skills в .claude/skills/ коммитятся в git и доступны всей команде. Session memory - индивидуальная. Для команды потребуется адаптация: shared skills + индивидуальные session logs.
IDD (Intent-Driven Development)
Не инструмент, а процессный фреймворк. Заменяет Agile-артефакты (Epic/Story/Task) на четырёхуровневую иерархию, оптимизированную для AI-агентов.
Что добавляется в проект (концептуально)
your-project/
└── specs/
├── products/
│ └── payment-system.md # Product (заменяет Epic)
├── intentions/
│ └── add-rate-limiting.md # Intention (заменяет Feature)
├── expectations/
│ └── rate-limit-429.md # Expectation (заменяет Acceptance Criteria)
└── specs/
└── impl-rate-limit.md # Spec (заменяет Story+Tasks, AI-ready)
Четыре уровня "chain of context"
| Уровень IDD | Заменяет в Agile | Назначение | Частота обновления |
|---|---|---|---|
| Product | Epic | Описание продукта/подсистемы на бизнес-языке | Редко |
| Intention | Feature | Что хотим изменить и зачем (intent, не реализация) | При новой фиче |
| Expectation | Acceptance Criteria | Конкретные ожидания с edge cases, testable утверждения | По мере обнаружения edge cases |
| Spec | Story + Tasks | AI-ready инструкция с явными Boundaries (что агент НЕ должен делать) | Одноразовый: написал → реализовал → закрыл |
Развитие артефактов
Products и Intentions - стабильные документы, обновляются при стратегических изменениях. Expectations дополняются по мере обнаружения edge cases (в том числе по результатам агентных сессий). Specs - одноразовые: написал → агент реализовал → spec закрыт. Но накопленные specs формируют базу знаний о том, как устроен каждый домен.
Экспертиза по артефактам
Spec quality - основная метрика производительности. Не velocity, не story points, а качество спецификаций. Измеряется: процент specs, выполненных агентом без эскалации; количество iterations до merge; частота boundary violations. Вводится continuous flow вместо спринтов, WIP limits вместо sprint capacity.
Несколько команд и sustainability
3 stars - концептуальный фреймворк, а не популярный инструмент. IDD не требует установки: это набор принципов и формат артефактов. Именно поэтому он легко масштабируется на несколько команд - каждая команда адаптирует четырёхуровневую иерархию под свой домен. Риск: автор может перестать поддерживать. Но поскольку IDD - процесс, а не код, зависимость от репозитория минимальна.
Сравнение и выбор
| Фреймворк | Порог входа | Brownfield | Артефакты | Контрольные точки | Knowledge capture |
|---|---|---|---|---|---|
| BMAD Method | Высокий | Scale detection | _bmad/, _bmad-output/ |
Implementation readiness check | Party Mode, project-context.md |
| OpenSpec | Низкий | Явная поддержка | openspec/changes/ |
Нет rigid gates, human review | Archive с полным контекстом |
| Spec Kit | Средний | Через extensions | constitution.md, specs/ |
Extension-based gates | 40+ extensions для аналитики |
| cc-sdd | Средний | validate-gap, validate-design | .kiro/specs/ |
Validation checkpoints | memory.md, steering.md |
| SPECTRE | Средний | Codebase research | docs/tasks/, skills/ |
validate + code_review | Skills auto-loading, session logs |
| IDD | Низкий | Overlay | specs/ (4 уровня) |
Spec quality | Накопленные specs |
Как выбрать:
- Быстрый старт с минимальным overhead → OpenSpec. Три команды (propose/apply/archive), итеративность, brownfield из коробки.
- Контроль на brownfield с legacy → cc-sdd. Validation checkpoints не дают агенту сломать существующий код.
- Расширяемая платформа → Spec Kit. Core минимален, 40+ extensions. Интеграции с Jira, Azure DevOps, GitHub Projects.
- Полный lifecycle для enterprise → BMAD Method. Модульная система, 34+ workflows, scale-adaptive.
- Ежедневный workflow для product builder → SPECTRE. Session memory, knowledge capture, субагенты.
- Изменить процесс, а не инструменты → IDD. Накладывается на любой стек. Spec quality как метрика.
Анатомия AI-driven задачи: от идеи до merge
Разберём полный жизненный цикл продуктовой задачи. Пример: в Rails-приложении с парольной аутентификацией нужно добавить вход по passkey (WebAuthn). Задача нетривиальная: криптография, клиентский JavaScript, серверная валидация, миграции, обратная совместимость с существующими пользователями. Подробнее о самой технологии - в статье о passkey-аутентификации.
Шаг 1: Спецификация (Spec Author)
Spec Author создаёт структурированную спецификацию по шаблону фреймворка:
Feature: Passkey Authentication (WebAuthn)
Issue: PROJ-892
## What
Добавить вход по passkey как альтернативу паролю.
Регистрация passkey в настройках профиля, вход через
биометрию или PIN. Существующий парольный вход остаётся.
Fallback: если браузер не поддерживает WebAuthn или
пользователь потерял устройство - одноразовый код на email.
## Why
Фишинг-атаки на пользователей участились. Passkey устраняет
фишинг как вектор: приватный ключ привязан к домену и
не передаётся по сети.
## Constraints
- Аутентификация через собственный session controller
(без Devise, без Warden)
- PostgreSQL для хранения credentials
- Stimulus для клиентского JS (не React)
- Поддержка: Chrome, Safari, Firefox (последние 2 версии)
- Email-отправка через ActionMailer + существующий SMTP
## Acceptance Criteria
- Пользователь регистрирует passkey в профиле
- Вход по passkey с биометрией/PIN
- Парольный вход продолжает работать
- Один пользователь - несколько passkeys (ноутбук + телефон)
- Удаление passkey из профиля
- Fallback: кнопка "Войти по email" отправляет одноразовый
код (6 цифр, TTL 10 минут, одноразовый)
- Если у пользователя нет passkey - показывать только
пароль + email fallback
## Boundaries
- НЕ удалять парольную аутентификацию
- НЕ менять существующую модель User (добавить связанные)
- НЕ добавлять OAuth
- НЕ использовать Devise/Warden
- Только серверная валидация, НЕ полагаться на клиентские проверки
Спецификация сохраняется как файл в репозитории. Это источник правды для агента. Boundaries критичны: без них агент может "улучшить" существующий auth flow, сломав его для текущих пользователей.
Шаг 2: Валидация спецификации (Context Engineer)
Context Engineer проверяет готовность контекста:
- Есть ли в rules описание текущего session controller и auth flow? Если нет - дополнить, иначе агент может переизобрести аутентификацию.
- Знает ли агент про структуру Stimulus-контроллеров в проекте? Есть ли примеры?
- Описан ли формат миграций и conventions для новых таблиц?
- Описана ли конфигурация ActionMailer? Агенту нужно знать как отправлять email.
Пробелы закрываются до запуска агента. Каждый пробел, обнаруженный после провала агентной сессии - это потраченные токены и время.
Шаг 3: Агентная сессия (Agent)
Агент получает спецификацию и работает автономно. Вот что он реально делает на каждом этапе:
Анализ существующего кода:
- Читает session controller, находит паттерн аутентификации (bcrypt,
authenticate_by) - Изучает модель User, связи, callbacks
- Анализирует маршруты - находит
login,logout,profile - Смотрит существующие Stimulus-контроллеры для понимания паттернов
Миграции и модели:
- Создаёт
db/migrate/..._create_webauthn_credentials.rb- таблицаwebauthn_credentialsс полямиexternal_id,public_key,sign_count,nickname - Создаёт
db/migrate/..._create_email_auth_codes.rb- таблица для одноразовых кодов с полямиcode_digest,expires_at,used_at - Создаёт модели
WebauthnCredentialиEmailAuthCodeс валидациями иbelongs_to :user
Серверная логика:
WebauthnRegistrationsController- challenge generation, credential verification, сохранение public keyWebauthnSessionsController- authentication challenge, signature verification, session creationEmailAuthCodesController- генерация 6-значного кода, отправка через ActionMailer, верификация с проверкой TTL и одноразовости- Маршруты добавлены по паттерну проекта
Клиентская часть:
webauthn_registration_controller.js(Stimulus) - вызовnavigator.credentials.create(), передача attestation на серверwebauthn_auth_controller.js(Stimulus) - вызовnavigator.credentials.get(), передача assertion на сервер- Проверка
PublicKeyCredentialв браузере для показа/скрытия passkey-кнопки
Тесты:
- Request specs: регистрация passkey, вход по passkey, удаление, email fallback, edge cases (просроченный код, повторное использование кода)
- Model specs: валидации WebauthnCredential, EmailAuthCode, scope для неиспользованных кодов
Финализация:
- Запуск
bundle exec rspec- 3 падения, исправление (неправильный формат challenge в тесте) - Запуск
bundle exec rubocop- 2 замечания (длинный метод, неиспользуемая переменная), исправление - PR с описанием: что сделано, как тестировать вручную, ссылка на spec
Точка эскалации: агент спросил, нужно ли отправлять email через Sidekiq (async) или inline. Спецификация не описывала это. Context Engineer ответил: Sidekiq, как все остальные email в проекте. Это пробел в контексте - после задачи в rules добавили "email отправляется через deliver_later".
Шаг 4: Review (Reviewer)
Reviewer фокусируется на том, что агент не может оценить сам:
- Security - challenge generation действительно случайный? Origin validation корректна? Replay protection работает? Email-код хранится как digest, не plaintext?
- Обратная совместимость - существующие пользователи с паролями не затронуты? Новые миграции не ломают существующие данные?
- Edge cases - что если пользователь удалит единственный passkey и забудет пароль? (fallback на email работает). Rate limiting на отправку email-кодов? (агент не добавил - reviewer запрашивает доработку)
- Соответствие spec - не добавил ли агент OAuth "для удобства" в нарушение boundaries?
Шаг 5: Merge и обновление контекста
После merge в knowledge base добавляется: паттерн интеграции WebAuthn, структура Stimulus-контроллера для browser API, правило "email через deliver_later". Следующая задача с криптографией или browser APIs пройдёт быстрее - агент уже знает паттерны проекта.
Инфраструктура контекста: что нужно агенту для работы
Агент не помнит ничего между сессиями. Без подготовленного контекста он каждый раз начинает с нуля: не знает архитектуру, не знает conventions, не знает ограничения. Инфраструктура контекста - это набор файлов в репозитории, которые загружаются в контекстное окно агента при каждой сессии. Подробнее - в статье об инфраструктуре контекста и context engineering.
Минимальный пример на Claude Code (аналогичные механизмы есть в Cursor, Windsurf и других):
your-project/
├── CLAUDE.md # Конституция (загружается всегда)
└── .claude/
└── rules/
├── api-conventions.md # Загружается при работе с app/controllers/api/
├── migration-rules.md # Загружается при работе с db/migrate/
└── testing-patterns.md # Загружается при работе с spec/
Конституция: CLAUDE.md
Загружается в контекст каждой сессии. Содержит только то, что агент не может вывести из кода самостоятельно:
# Project
Ruby 3.1.2, Rails 7.0.4+, PostgreSQL 15, Redis 7.
Puma + Nginx. Docker Compose для деплоя.
## Architecture
- Controllers: `Web::` (HTML), `Api::V1::` (JSON), `Telegram::` (bot)
- Auth: собственный session controller, bcrypt, без Devise
- JS: Stimulus + Turbo, importmap (не webpack)
- Background jobs: Sidekiq
## Commands
```
bundle exec rspec # тесты
bundle exec rubocop # стиль
bundle exec rubocop -A # автофикс
bin/rails server # dev server
```
## Critical constraints
- SimpleCov requires 100% line coverage
- RuboCop max AbcSize is 17
- Email отправляется через deliver_later (Sidekiq)
- Не использовать raw SQL в контроллерах
Это ~30 строк. Правило: чем меньше конституция, тем больше места для рабочего контекста задачи. Если инструкцию можно вывести из кода (gem-версии, структура директорий) - не дублируй.
Rules: доменные правила
Загружаются автоматически, когда агент открывает файл в соответствующей директории. Пример .claude/rules/api-conventions.md:
---
paths:
- app/controllers/api/**
---
# API Conventions
- Namespace: `Api::V1::`
- Inherit from `Api::V1::BaseController`
- Response: JSON, camelCase keys
- Auth: API key в header `X-Api-Key`
- Errors: `{ error: "message" }`, HTTP status codes
- Pagination: Kaminari, `page` и `per_page` params
- Тесты: request specs в `spec/requests/api/v1/`
Когда агент работает с файлом в app/controllers/api/, harness автоматически инжектирует это правило в контекст. Агент не знает о существовании правила до момента инжекции - и не может его проигнорировать.
Несколько команд в одной кодовой базе
Если в организации уже работает domain ownership, инфраструктура контекста повторяет существующую структуру:
monorepo/
├── CLAUDE.md # Platform conventions (стек, CI/CD)
├── .claude/rules/
│ └── shared-conventions.md # Общие правила
├── payments/
│ ├── CLAUDE.md # Team conventions payments-команды
│ └── .claude/rules/
│ └── payment-rules.md # Правила домена
├── notifications/
│ ├── CLAUDE.md # Team conventions notifications-команды
│ └── .claude/rules/
│ └── notification-rules.md
└── shared/
└── .claude/rules/
└── shared-code-rules.md # Правила для кода без владельца
Агент, работающий в payments/, видит: корневой CLAUDE.md + payments/CLAUDE.md + payment-rules.md. Правила notifications-команды он не видит. Это те же границы, в которых работают люди - просто формализованные в файлах.
Управление задачами и контекстом снаружи
Инфраструктура контекста живёт в репозитории. Но задачи живут снаружи - в Jira, Linear, GitHub Issues. Разрыв между внешним backlog и spec-driven workflow - главная нерешённая проблема большинства фреймворков.
Текущее состояние
Большинство spec-driven фреймворков игнорируют внешние системы управления задачами. OpenSpec, SPECTRE, cc-sdd работают с артефактами в репозитории. Backlog management - "вне скоупа". На практике это создаёт две системы правды: менеджмент смотрит в Jira, агент работает со спецификациями в репозитории.
Исключение - Spec Kit: extensions для интеграции с Jira, Azure DevOps, GitHub Projects, Linear, Trello. Но даже они решают задачу синхронизации статусов, а не полной интеграции workflow.
Что предлагают task trackers
Трекеры задач двигаются навстречу AI-driven разработке:
- Jira - с февраля 2026 AI-агенты в Jira стали first-class team members. Агент может быть assignee на issue, его работа видна на sprint/kanban board рядом с человеческой. Rovo Dev превращает Jira work items в код. AI Work Breakdown декомпозирует эпики в подзадачи. Для spec-driven workflow: Spec Kit extensions (spec-kit-jira, spec-kit-maqa-jira) синхронизируют спецификации с Jira Epics, Stories и Tasks.
- Linear - CEO Linear объявил "issue tracking is dead". Linear Agent (март 2026): агенты - полноценные участники workspace, их можно assign на issues, упоминать в тредах. Code Intelligence позволяет нетехническим участникам спрашивать о фичах и системе. Интеграции с GitHub Copilot, Devin для цикла issue → code → tested PR. Активность агента видна в тех же project views, что и человеческая.
- GitHub Projects v2 - наиболее естественная интеграция: issues, PR и project board в одном месте. Spec Kit extension (spec-kit-maqa-github-projects) синхронизирует draft issues и статусы. Для команд, уже использующих GitHub - минимальный gap между spec workflow и task tracking.
Visibility для менеджмента
Ключевая проблема: менеджмент привык видеть прогресс через статусы задач в трекере. В AI-driven процессе задача может перейти из "To Do" в "Done" за час. Привычные сигналы прогресса (daily updates, sprint burndown) перестают работать.
Что работает вместо них:
- Spec → PR → Merge pipeline - автоматическое обновление статуса issue в трекере при каждом событии. Менеджмент видит не "задача в работе", а "спецификация написана → PR создан → review пройден → merged".
- Dashboard с метриками - lead time, spec quality score, количество задач в день. Заменяет velocity и burndown charts.
- Spec review как checkpoint - менеджмент может участвовать в review спецификаций (не кода). Это точка, где бизнес-контекст проверяется до начала работы агента.
Паттерн интеграции
- Issue в трекере - описание задачи на бизнес-языке, приоритет, привязка к эпику. Для менеджмента и планирования.
- Spec в репозитории - техническая спецификация, созданная по шаблону фреймворка. Ссылка на issue. Для агента.
- Агентная сессия - агент работает со спецификацией, формирует PR.
- PR - ссылка на issue и на spec. Review происходит здесь.
- Обновление issue - статус, время, метрики. Автоматизируется через CI/CD hooks.
Что автоматизируется
- Создание скелета spec из issue (шаблон + metadata из трекера)
- Обновление статуса issue при создании PR
- Линковка PR → issue → spec
- Сбор метрик (время от spec до merge, количество эскалаций)
Что остаётся ручным
- Написание самой спецификации (интеллектуальная работа)
- Приоритизация backlog
- Review результатов агента
- Архитектурные решения
Роли в новом SDLC
AI-driven SDLC не отменяет роли - он трансформирует их. Масштаб трансформации зависит от размера организации.
Solo Operator (1 человек)
Один инженер совмещает все роли: пишет спецификации, поддерживает инфраструктуру контекста, запускает агентов, ревьюит результат. Подходит для side-проектов, внутренних инструментов, MVP. Фреймворки SPECTRE и OpenSpec спроектированы именно под эту модель.
Ограничение: при росте сложности solo operator становится bottleneck на review и спецификациях. Один человек не может качественно ревьюить 10+ PR в день и одновременно писать спецификации для следующих задач.
Minimal Team (2 человека)
PM/Spec Author + Engineer/Operator. PM формулирует что делать и пишет бизнес-часть спецификации. Engineer дополняет технической частью, поддерживает контекст, ревьюит.
IDD Framework построен вокруг этой модели: Spec Author пишет Intentions и Expectations, Engineer переводит их в Specs с Boundaries и запускает агента.
Scaled Team (3-5 человек)
Spec Authors + Context Engineers + Reviewers. Каждый Context Engineer управляет несколькими агентными сессиями параллельно. Модель OpenAgentsControl: "Propose → Approve → Execute" с чёткими approval gates.
Enterprise (существующая оргструктура)
Существующие роли трансформируются:
| Классическая роль | Новая роль | Что меняется |
|---|---|---|
| Бизнес-аналитик | Spec Author | Структурированные спецификации вместо описаний в свободной форме |
| Разработчик | Context Engineer + Reviewer | Поддержка инфраструктуры контекста, review кода агента |
| Senior Developer | Context Architect | Проектирование rules, skills, knowledge base |
| QA | Acceptance Criteria Author + Validator | Testable criteria до реализации, валидация результата после |
| Tech Lead | Operator | Управление агентными сессиями, мониторинг метрик |
| DevOps | Без изменений | CI/CD + автоматизация spec → PR pipeline |
Внедрение в существующую организацию
Переход на AI-driven SDLC - не переключатель, а градиент. Попытка перевести всю команду на новый процесс за спринт закончится откатом.
Шаг 1: Аудит текущего SDLC
Зафиксировать текущий процесс и найти точку входа:
- Value stream mapping - проследить 5-10 последних задач от идеи до production. Зафиксировать время на каждом этапе и между этапами. Где самые длинные ожидания?
- Типизация задач - какие категории задач повторяются? CRUD, интеграции, bug fixes, рефакторинги? Какой процент задач достаточно формализуем для спецификации?
- Handoff analysis - сколько раз задача переходит между людьми? Какой контекст теряется при каждой передаче?
- Текущий инструментарий - какие AI-инструменты уже используются? Copilot в IDE? ChatGPT для вопросов? Как это влияет на метрики?
На этом этапе важно договориться о базовых метриках: lead time, change failure rate, время review. Они понадобятся для сравнения "до" и "после".
Шаг 2: Инфраструктура контекста
До первой агентной задачи должна быть базовая инфраструктура:
- Конституция проекта - CLAUDE.md (или эквивалент) с описанием стека, архитектурных соглашений, команд сборки и тестирования
- Rules для критических доменов - минимум для тех директорий, где будет работать агент на пилоте
- Шаблон спецификации - согласованный формат, который будут использовать все участники
- Определение Definition of Done - что считается завершённой агентной задачей: тесты зелёные, rubocop чистый, PR создан, spec requirements выполнены
Обсудить с командой: какие conventions не зафиксированы в коде и существуют только в головах? Именно они должны попасть в rules первыми.
Шаг 3: Пилот на одном типе задач
Выбрать категорию задач с двумя свойствами: повторяемость и чёткие boundaries. Примеры: CRUD-эндпоинты, стандартные миграции, bug fixes с воспроизводимым сценарием, добавление валидаций или бизнес-правил.
Один-два инженера работают по новому процессу, остальная команда - по старому. Фиксировать: lead time каждой задачи, количество эскалаций от агента, время review, количество итераций до merge, причины каждой эскалации (пробел в контексте? неточная спецификация? ограничение агента?).
Шаг 4: Расширение scope
По результатам пилота провести ретроспективу:
- Какие типы задач показали наибольшее ускорение?
- Какие спецификации работали, какие приводили к эскалациям?
- Где агент эскалировал чаще всего? Каждая эскалация - пробел в контексте или спецификации, который нужно закрыть.
- Как изменился lead time по сравнению с базовыми метриками из шага 1?
- Какие concerns у команды: качество кода, скорость review, понимание сгенерированного кода?
На основе ретроспективы: расширять scope задач, дополнять инфраструктуру контекста, формализовать шаблоны спецификаций для новых типов задач.
Шаг 5: Масштабирование на организацию
Когда процесс стабилен на одной команде и метрики подтверждают эффект:
- Организационные стандарты - shared rules и conventions, общий шаблон конституции проекта
- Обучение - program для Spec Authors (как писать спецификации) и Context Engineers (как поддерживать инфраструктуру контекста)
- Метрики на уровне организации - dashboard с lead time, spec quality score, agent autonomy rate по командам
- Governance - кто владеет организационными rules? Как разрешаются конфликты между командными и организационными conventions?
- Бюджетирование - прогноз расходов на API токены при масштабе, сравнение со стоимостью инженерного времени
Барьеры внедрения и как с ними работать
Потеря прозрачности. Менеджмент привык видеть прогресс через Jira-статусы и standup-отчёты. Когда агент делает работу за минуты вместо дней, привычные сигналы прогресса исчезают. PR появляется "из ниоткуда", и непонятно что за ним стоит - час работы или пять минут.
Как работать: spec-driven workflow создаёт более прозрачный audit trail, чем классический процесс. Каждая задача имеет спецификацию (что делаем и зачем), PR с diff (что сделано), и метрики (время, эскалации). Dashboard с этими данными даёт менеджменту больше visibility, чем Jira-статусы.
Страх потери контроля над кодом. Код пишет агент, а не человек. Кто отвечает за качество? Кто понимает что в нём происходит? Если агент сгенерировал 500 строк - кто-то вообще их читал?
Как работать: в spec-driven процессе review - обязательный gate. Но review AI-generated кода отличается от review человеческого. Код структурно чистый (агент следует rules), проблемы - в логике и edge cases. Это другой навык review, и его нужно развивать. Автоматизированные проверки (тесты, линтер, security scanning) закрывают механические аспекты. Человек фокусируется на том, что автоматизация не ловит: архитектурная корректность, бизнес-логика, security implications.
Неопределённость ролей. "Я senior developer, теперь я Context Engineer - это повышение или понижение? Что конкретно я делаю каждый день?" Без ответа на этот вопрос люди саботируют процесс или уходят.
Как работать: начинать с пилота, где 1-2 инженера пробуют новую модель добровольно. Они становятся internal champions и показывают команде как это выглядит на практике. Явно описать ежедневные задачи для каждой роли: Context Engineer утром проверяет очередь спецификаций, запускает агентные сессии, ревьюит результаты, дополняет knowledge base. Это не абстрактная трансформация - это конкретный рабочий день.
Compliance и security concerns. В регулируемых отраслях (финтех, медтех) код должен проходить аудит. AI-generated код вызывает вопросы: можно ли его сертифицировать? Кто несёт ответственность за уязвимости?
Как работать: spec-driven процесс упрощает аудит, а не усложняет. Каждый фрагмент кода имеет спецификацию (требования), PR (review), тесты (верификация). Traceability от требования до реализации полнее, чем в классическом SDLC. Security scanning в CI ловит типовые уязвимости. Permission system ограничивает что агент может делать (нет доступа к production, нет push без approval).
Сопротивление "это не мой код". Инженеры, которые гордятся craftsmanship, воспринимают AI-generated код как чужеродный. "Я бы написал это иначе" - частая реакция на review.
Как работать: правила в rules и constitution определяют стиль кода. Если команда хочет определённые паттерны - они описываются в rules, и агент им следует. Код становится "кодом команды, написанным по правилам команды" - просто написанным быстрее. Review - момент, где инженер влияет на результат.
Метрики: как понять, что работает
DORA в контексте AI-driven SDLC
Четыре метрики DORA остаются релевантными, но их интерпретация меняется:
- Deployment Frequency - должна расти. Агенты генерируют код быстрее, merge cycle короче.
- Lead Time for Changes - ключевая метрика. В классическом SDLC основная часть lead time - ожидание. В AI-driven - время спецификации + агентная сессия + review. Если lead time не сократился - процесс не работает.
- Change Failure Rate - индикатор качества спецификаций. Высокий CFR означает: спецификации не покрывают edge cases, или review пропускает проблемы.
- Time to Restore Service - агенты могут помогать с hotfixes (быстрая диагностика + fix по спецификации инцидента).
Специфичные метрики AI-driven SDLC
| Метрика | Что измеряет | Целевой показатель |
|---|---|---|
| Spec Quality Score | Процент агентных сессий без эскалации | 70-80% (100% = задачи слишком простые) |
| Agent Autonomy Rate | Соотношение автономной работы к общему времени | Растёт по мере улучшения контекста |
| Context Coverage | Процент кодовой базы, покрытый rules и knowledge base | Покрывать частые домены, не стремиться к 100% |
| Cost per Task | Токены + инженерное время vs. классический SDLC | Ниже полной стоимости задачи без агентов |
Риски и ограничения
Что агенты не умеют
- Архитектурные решения - агент может предложить решение, но не может оценить его в контексте roadmap, бизнес-стратегии, team capabilities. Архитектура остаётся за людьми.
- Product decisions - "что делать" - задача людей. "Как делать" - задача агента с хорошей спецификацией.
- Нестандартные интеграции - чем уникальнее задача, тем хуже работает агент. Внутренние API без документации, legacy-системы с неявными контрактами.
- Cross-system reasoning - агент работает в рамках одного репозитория. Задачи, требующие понимания взаимодействия 5 сервисов - пока для людей.
Security
Агент имеет доступ к кодовой базе и может выполнять команды. Это attack surface: prompt injection через данные, которые агент читает (issue descriptions, API responses); случайное включение секретов в commits; генерация кода с уязвимостями (SQL injection, XSS).
Минимизация: permission system (агент не может push без approval), security-focused rules в инфраструктуре контекста, automated security scanning в CI.
"Чёрный ящик": код, который никто не понимает
Через несколько месяцев активной генерации кода агентами команда может обнаружить, что никто не понимает, как работают отдельные модули. AI генерирует код, который проходит тесты и review, но при отладке оказывается сложнее, чем написанный человеком: неочевидные зависимости, неявные контракты между компонентами, пропущенные edge cases.
Spec-driven подход снижает этот риск: спецификация документирует зачем код написан, boundaries определяют scope, review фокусируется на логике. Но риск остаётся, особенно если review формальный. Практика: после merge сложных фич обновлять knowledge base с описанием архитектурных решений и нетривиальных паттернов.
Стоимость при масштабе
Агентная сессия на крупной задаче - тысячи вызовов API, миллионы токенов. При команде из 10 context engineers, каждый из которых запускает 5-10 сессий в день, счёт за API измеряется тысячами долларов в месяц. Это дешевле зарплат, но требует бюджетирования и мониторинга.
Качество кода при масштабном adoption
Данные из индустрии за 2025-2026:
- AI-generated код вносит в 1.7x больше issues, чем написанный человеком (Sonar)
- Static analysis warnings растут на 30% после adoption AI, сложность кода - на 41%
- Change failure rate увеличивается на 30%, инциденты на PR - на 23.5%
- DORA 2025: +9% багов и +91% времени code review при 90% adoption
Эти цифры — следствие плохого процесса, а не агентов как таковых. Команды, которые «просто включили Copilot» без spec-driven workflow, получили больше кода и больше проблем. Spec-driven подход работает в обратную сторону: спецификация ограничивает scope, rules обеспечивают conventions, тесты и линтер ловят механические ошибки.
Практический пример
Hublix - платформа процессных AI-агентов в Telegram. Python-монорепозиторий с OpenSpec. Разберём как выглядит реальная задача в spec-driven процессе.
Инфраструктура проекта
hublix/
├── CLAUDE.md # Конституция: стек, архитектура, trigger tables
├── .claude/agents/ # Специализированные агенты по доменам
│ ├── orchestration-specialist.md
│ ├── identity-specialist.md
│ ├── state-engine-specialist.md
│ ├── frontend-specialist.md
│ ├── infra-specialist.md
│ └── pr-reviewer.md
├── .claude/rules/
│ ├── testing.md # 100% coverage, pytest conventions
│ ├── design.md # OpenSpec proposal до кода
│ └── security.md # 152-ФЗ, валидация, секреты
├── openspec/
│ ├── specs/ # Tier 3: холодная память по подсистемам
│ │ ├── auth-flows/
│ │ ├── orchestration-pipeline/
│ │ ├── tenant-isolation/
│ │ └── ...
│ └── changes/ # Активные и архивные изменения
│ ├── yookassa-payments/ # В работе
│ └── archive/
│ └── 2026-04-01-tenant-balance-credits/
├── services/ # 4 микросервиса
│ ├── identity/ # Auth, tenants, balance
│ ├── messaging/ # Webhook gateway
│ ├── orchestration/ # FSM + LLM
│ └── scheduler/ # Cron jobs
├── libs/ # Shared code
│ ├── db/ # SQLAlchemy, Alembic, repos
│ └── shared/ # Pydantic types
└── apps/ # React UI
├── admin/ # Tenant admin
└── backstage/ # Platform admin
Конституция (CLAUDE.md) содержит trigger tables - автоматическую маршрутизацию агентов: при изменении файлов в services/orchestration/ подключается orchestration-specialist, при работе с services/identity/ - identity-specialist. Правило #9: "Use OpenSpec for planning - /opsx:propose before implementing non-trivial changes".
Реальная задача: Tenant Balance & Credits
Задача: добавить систему баланса в рублях, чтобы контролировать расход LLM-токенов по тенантам. Каждый вызов YandexGPT стоит денег, и тенанты должны работать только пока баланс положительный.
1. Proposal (/opsx:propose)
OpenSpec сгенерировал proposal.md с ключевыми решениями:
- Рубли, не абстрактные кредиты - тенанты видят "у вас 500₽ на балансе", не "у вас 500 credits"
- Immutable transaction ledger - баланс = SUM(credits) - SUM(debits), никогда мутабельный счётчик
- Materialized balance с CHECK constraint -
balance >= 0на уровне БД, предотвращает овердрафт даже при конкурентных запросах - Pre-check + post-deduct - проверка до вызова LLM (не тратить токены впустую), списание после (по реальному расходу)
- Identity owns the ledger - баланс принадлежит домену тенантов, orchestration вызывает internal API
Proposal также определил scope (11 пунктов) и out of scope (YooKassa, per-tool pricing, analytics - будущие фазы). Это те самые boundaries, которые не дают агенту "улучшить" задачу.
2. Design
Агент сгенерировал design.md с полной технической спецификацией. Ключевые артефакты:
Схема данных - две таблицы в identity schema:
balance_transactions (append-only ledger)
───────────────────────────────────────────
id UUID PK
tenant_id UUID FK → tenants.id
type VARCHAR(20) -- initial_grant | topup | usage | adjustment
amount INTEGER -- копейки: положительное = credit, отрицательное = debit
reference_type VARCHAR(50) -- turn | manual | system
reference_id VARCHAR(255) -- turn_id, admin user_id, etc.
memo TEXT -- "Ручное пополнение", "LLM usage: 347 tokens"
created_at TIMESTAMPTZ
tenant_balances (materialized cache)
───────────────────────────────────────────
tenant_id UUID PK FK → tenants.id
balance INTEGER DEFAULT 0 -- копейки
updated_at TIMESTAMPTZ
CHECK (balance >= 0) -- предотвращает овердрафт на уровне БД
API контракты - два уровня доступа:
Internal (без JWT, K8s network trust):
POST /internal/balance/check {tenant_id, estimated_kopecks: 40}
→ {allowed: true, balance: 48500}
POST /internal/balance/deduct {tenant_id, amount_kopecks: 28, turn_id}
→ {balance: 48472}
Backstage (JWT required):
GET /backstage/tenants/{id}/balance → {balance_rub: "484.72", ...}
POST /backstage/tenants/{id}/topup {amount_rub: "100.00", memo: "..."}
GET /backstage/tenants/{id}/transactions → paginated list
Sequence diagram - агент создал docs/diagrams/balance-credit-flow.puml с четырьмя сценариями:
Сценарий 2: Входящее сообщение — balance check + deduct
User → Telegram → Messaging → Orchestration Worker → Identity Service → PostgreSQL
1. User отправляет "Привет" в Telegram
2. Webhook → Messaging → ARQ job → Orchestration Worker
3. Worker → Identity: POST /internal/balance/check {estimated_kopecks: 40}
4. Identity → DB: SELECT balance FROM tenant_balances
5. Identity → Worker: {allowed: true, balance: 48000}
6. Worker: FSM + LLM processing (tokens_used = 347)
7. Worker → Identity: POST /internal/balance/deduct {amount_kopecks: 28, turn_id}
8. Identity → DB: INSERT balance_transaction (-28) + UPDATE tenant_balances
9. Worker → Telegram: ответ пользователю
Сценарий 3: Баланс исчерпан
...шаги 1-4...
5. Identity → Worker: {allowed: false, balance: 0}
6. Worker → Telegram: "Баланс исчерпан" (LLM не вызывается)
Design также описал error handling (fail-open при недоступности Identity), конфигурацию (4 env variables) и future extensibility (YooKassa, per-tool pricing, analytics - без изменения схемы).
3. Tasks (/opsx:apply)
tasks.md - 11 задач. Каждая - атомарная единица работы для одной агентной сессии. Порядок определён зависимостями:
- [x] 1. ORM-модели BalanceTransaction + TenantBalance + Alembic-миграция
(включая initial_grant для существующих тенантов) + тесты
- [x] 2. BalanceTransactionRepository + TenantBalanceRepository
+ wire в BackstageUnitOfWork и APIUnitOfWork + тесты
- [x] 3. BalanceService: get_balance, get_balance_summary, create_initial_grant,
topup (₽ string → копейки), record_usage, list_transactions + тесты
- [x] 4. Internal API: POST /internal/balance/check, POST /internal/balance/deduct
(копейки, без JWT) + тесты
- [x] 5. Backstage API: GET balance (₽), POST topup (₽ input → копейки),
GET transactions (paginated) + тесты
- [x] 6. Wire initial_grant в tenant creation flow (auth_service +
backstage_auth_service) + IdentityConfig + тесты
- [x] 7. BalanceChecker protocol + HttpBalanceChecker в Orchestration +
balance gate в IncomingMessageProcessor (pre-check + post-deduct,
token → копейки conversion) + config + тесты
- [x] 8. Backstage UI: баланс в ₽ на tenant detail, topup modal,
transaction history tab
- [x] 9. PlantUML sequence diagram: docs/diagrams/balance-credit-flow.puml
- [x] 10. Update ERD: docs/diagrams/erd-data-model.puml
- [x] 11. Full quality gates: ruff check + ruff format + pytest --cov-fail-under=100
Агент выполнял задачи последовательно. Задачи 1-3 - фундамент (модели, репозитории, сервис). Задачи 4-6 - API слой. Задача 7 - интеграция между сервисами (Orchestration вызывает Identity). Задача 8 - UI. Задачи 9-11 - документация и quality gates.
В процессе выполнения задачи 7 агент обнаружил, что IncomingMessageProcessor не имел injection point для внешних зависимостей. Агент добавил BalanceChecker protocol и HttpBalanceChecker implementation, следуя dependency injection паттерну, который уже использовался в проекте для других internal clients. Это решение не требовало эскалации - агент нашёл паттерн в кодовой базе самостоятельно.
4. Результат и архивация
После completion - /opsx:archive:
openspec/changes/archive/2026-04-01-tenant-balance-credits/
├── proposal.md # Зачем, scope, out of scope, key decisions, future phases
├── design.md # Схема данных, API контракты, sequence diagram, config
└── tasks.md # 11 задач, все [x]
Артефакты сохранены для будущей референции. Когда через месяц нужно понять почему баланс в копейках, а не рублях - ответ в proposal.md, ключевое решение #1: "Rubles, not credits - no abstract unit conversion. Tenants see real money."
Следующая задача в pipeline - YooKassa payments - уже в openspec/changes/yookassa-payments/. Её proposal ссылается на Phase 2 из balance proposal. Design использует balance_transactions с reference_type='yookassa' - расширение, которое было заложено в design предыдущей задачи (раздел "Future Extensibility"). Контекст передаётся через артефакты, не через чат-историю.
Что показывает этот пример
- Proposal определяет boundaries - без раздела "Out of Scope" агент мог бы сразу добавить YooKassa, per-tool pricing и аналитику. Proposal явно ограничил scope, и агент работал в рамках.
- Design фиксирует решения до кода - "копейки вместо float", "CHECK constraint на уровне БД", "Identity owns the ledger". Эти решения приняты человеком, агент реализовал.
- Tasks - атомарные единицы - каждая задача выполнима за одну агентную сессию. Агент не должен удерживать контекст всей фичи - только текущей задачи + design.
- Archive сохраняет контекст - когда через месяц нужно понять почему баланс в копейках, а не рублях - ответ в proposal.md, ключевое решение #1.
- Фичи связаны через phases - YooKassa payments ссылается на Phase 2 из balance proposal. Цепочка задач формируется из артефактов, не из Jira-описаний.
- Quality gates обязательны - каждая задача завершается
ruff check + ruff format + pytest --cov --cov-fail-under=100. Без зелёного CI задача не закрыта.