38 фич за одну сессию: как AI Factory строит продукт
Звучит как маркетинговый бред: 38 capabilities за одну сессию, 22 коммита, ноль строк написанных руками. Но это реальный лог работы за 6 апреля 2026 года. И самое важное в этой истории — не скорость. А 10 гэпов, найденных при аудите. Потому что агенты ошибаются, и честный разговор об этом важнее хвастовства.
Контекст: что строилось
AICPO — AI-driven платформа для product discovery. В этот день задача была амбициозная: Knowledge Graph v2 (KG2) — четырёхслойный темпоральный граф знаний, который заменяет устаревший KG1. Плюс конкурентная разведка, трендовый мониторинг, и интеграция всего этого в чат и артефакты.
Не прототип. Production-ready код с миграциями, сервисами, джобами, API, ActionCable каналами, и feature flag для instant rollback.
Как выглядит рабочий процесс
Простая петля из четырёх шагов:
- CEO думает — декомпозиция фичи на подзадачи, определение файлов, acceptance criteria
- Агент строит — получает точный промпт с файлами, задачами, ограничениями. Пишет код
- CEO аудирует — читает diff, проверяет архитектуру, гоняет smoke-тесты
- Агент исправляет — если найдены проблемы, новый промпт с конкретными багами
CEO не пишет код. Ни строчки. Но CEO читает весь код, который написал агент. Это принципиально: ты не можешь делегировать то, что не понимаешь.
Четыре релиза за один день
Release 1: KG2 Core (v0.7.0)
9 фаз, каждая — отдельный спавн агента:
| Фаза | Что сделано | Файлы |
|---|---|---|
| Онтология | YAML-схема: 10 типов узлов, 18 типов связей, constraints | config/kg2_ontology.yml |
| Episodes | Иммутабельный слой сырых данных из фактов/файлов | kg2/episode_service.rb |
| Entity Extraction | LLM извлекает сущности из эпизодов | kg2/entity_extractor.rb |
| Entity Resolution | Дедупликация: exact + fuzzy (Levenshtein) + LLM | kg2/entity_resolver.rb |
| Relations | LLM строит связи с валидацией по онтологии | kg2/relation_discoverer.rb |
| Temporal | Bi-temporal поля, инвалидация противоречий | kg2/temporal_manager.rb |
| Hybrid Search | Vector + BM25 + graph traversal → RRF fusion | kg2/hybrid_search.rb |
| Communities | BFS кластеризация + LLM summaries | kg2/community_detector.rb |
| Integration | DialogueService + ArtifactGenerator ветвление по feature flag | 12 файлов |
22 новых файла. 4 миграции. Всё за один спавн-цикл с промежуточными коммитами.
Release 2: Competitive Intelligence (v0.7.1)
Мониторинг конкурентов: автоматическое обнаружение из чата, скрейпинг сайтов, анализ новостей, еженедельные дайджесты.
Ключевые компоненты:
Competitive::AutoDetectService— извлекает имена конкурентов из фактов проектаCompetitive::SignalAnalyzerService— дедупликация + оценка релевантности + threat scoringCompetitive::SchedulerJob— каждые 6 часов: скрейп + новости + анализ- Интеграция в system prompt через
DialogueService#competitive_context_block
8 файлов, 2 миграции, ActionCable канал для real-time алертов.
Release 3: Trend Monitoring (v0.7.2)
Еженедельный мониторинг трендов по нише, кластеризация сигналов, три новых артефакта (trend_radar, opportunity_map, roadmap_recommendations).
Release 4: KG1 Deprecation + Migration
Самый рискованный шаг: переключение всех writes с KG1 на KG2. Competitive и Trends мигрированы на episode pipeline. Feature flag KG2_ENABLED для rollback.
Паттерн спавна агента
Каждый агент получает промпт из трёх блоков:
[1] Preamble — универсальные правила (~/.factory/rules/agent_preamble.md)
[2] Role — роль Builder с моделью и ограничениями (~/.factory/roles/builder-v2.md)
[3] Task — конкретная задача:
- Список файлов для чтения
- Таблица задач с acceptance criteria
- STOP-условия ("не трогай X, не меняй Y")
- Контекст из DNA проекта
- Предыдущие ошибки (если re-work)
Критически важно: агент НЕ получает расплывчатое “сделай Knowledge Graph”. Он получает: “создай файл app/services/kg2/entity_resolver.rb с методами resolve(candidates, project), используй Levenshtein distance > 0.85 для fuzzy match, потом LLM confirm через Groq, тесты в test/services/kg2/entity_resolver_test.rb”.
Чем точнее промпт, тем меньше переделок. Но даже с идеальным промптом — аудит обязателен.
10 гэпов: что нашёл аудит
После каждого релиза — полный аудит. Не “пробежался глазами”, а чтение каждого файла, проверка миграций, запуск smoke-тестов. Вот что нашлось:
Гэп 1: Миграция без индекса
kg2_nodes имела canonical_key для дедупликации, но агент не создал составной индекс [project_id, canonical_key]. Каждый find_or_create — full table scan. На 10K узлов это смерть.
Фикс: Отдельная миграция add_index :kg2_nodes, [:project_id, :canonical_key].
Гэп 2: ActionCable channel name mismatch
Kg2::BuilderJob бродкастил в kg2_update_#{project_id}, а фронтенд подписывался на kg_update_#{project_id} (без “2”). Классический integration bug, который юнит-тесты не ловят.
Фикс: Единое имя канала, задокументировано в CLAUDE.md.
Гэп 3: Bulk ingest не парсил файлы
BulkIngestService принимал файлы, но вызывал FileParser с file.path, который на Windows возвращал Tempfile path без расширения. Парсер не мог определить тип файла.
Фикс: Передача original_filename отдельным параметром, content type detection по расширению оригинала.
Гэп 4: Temporal Manager не обрабатывал nil valid_at
Новые edge-записи без valid_at падали в TemporalManager#invalidate_contradictions с NoMethodError: undefined method '<' for nil.
Гэп 5: Community Detector бесконечный цикл
BFS без проверки visited set на двунаправленных рёбрах. На графе с 50+ узлами — зависание.
Гэп 6: Entity Resolver дублировал при race condition
Два параллельных BuilderJob для одного проекта создавали дубли, потому что find_or_create_by без DB-level unique constraint.
Гэп 7: DecayService удалял узлы с рёбрами
Confidence ниже 10 → delete, но foreign key на edges не каскадировался. Orphaned edges.
Гэп 8: HybridSearch не фоллбечил на SQLite
Vector search требовал PostgreSQL. На SQLite (dev/test) — молчаливый return пустого массива вместо BM25 fallback.
Гэп 9: PromotionService создавал org-level дубли
Промоция сущности в org-level при отсутствии организации у проекта — nil organization_id, невалидная запись.
Гэп 10: Competitive signals не каскадировались в KG2
После миграции с KG1 на KG2, SignalAnalyzerService всё ещё вызывал KgBuilderService (v1) напрямую, минуя episode pipeline.
Паттерн ошибок
Три категории:
- Integration gaps (гэпы 2, 3, 10) — агент отлично пишет изолированные компоненты, но стыки между ними ломаются. Один агент не видит, что написал другой
- Edge cases (гэпы 4, 5, 6, 7, 9) — happy path работает, corner cases игнорируются. Агент оптимизирует на “сделать работающее”, а не на “сделать надёжное”
- Environment-specific (гэпы 1, 8) — агент пишет для абстрактной среды, не учитывая что dev = SQLite, prod = PostgreSQL
Это не баги “тупого AI”. Это системные паттерны, которые повторяются. И зная их, ты закладываешь проверки в промпт: “убедись, что SQLite fallback есть”, “проверь индексы на каждом новом find_by”.
Метрика дня
| Показатель | Значение |
|---|---|
| Capabilities (фичи/сервисы/джобы) | 38 |
| Коммиты | 22 |
| Новые файлы | 47 |
| Миграции | 9 |
| Строк кода (approx) | ~6,500 |
| Ручной код CEO | 0 строк |
| Гэпов найдено | 10 |
| Гэпов исправлено | 10 |
| Время сессии | ~8 часов |
Уроки
1. Скорость без аудита = технический долг. 38 фич за день звучит впечатляюще. Но без аудита это было бы 38 фич с 10 скрытыми багами, каждый из которых стрельнул бы в production. Аудит — не опция, а часть pipeline.
2. Агенты отлично пишут компоненты, плохо — интеграции. Каждый сервис в изоляции работал. Проблемы начинались на стыках: channel names, file paths, cascade calls. Это значит, что integration testing после каждого агента — обязательно.
3. Промпт — это спецификация. “Сделай Knowledge Graph” даст мусор. “Создай entity_resolver.rb с тремя уровнями дедупликации, вот сигнатуры методов, вот acceptance criteria” — даст рабочий код с первого раза в 80% случаев.
4. Rules накапливаются.
Каждый найденный гэп превращается в правило: feedback_*.md. В следующей сессии агент уже знает: “проверь SQLite fallback”, “добавь составной индекс”. Система учится через ошибки.
5. CEO без кода — это нормально. CEO без понимания кода — это катастрофа. Я не написал ни строчки. Но я прочитал каждую строчку. Делегирование ≠ абдикация. Ты должен понимать, что делает агент, чтобы найти то, что он пропустил.
Итог
AI Factory — не магия и не серебряная пуля. Это production pipeline, где AI делает механическую работу, а человек делает то, что AI пока не умеет: системное мышление, проверку стыков, и принятие архитектурных решений.
38 фич за день — это не про скорость. Это про то, что bottleneck переместился с написания кода на принятие решений. И это, возможно, самое важное изменение в разработке за последние 10 лет.
Посмотрите результат — AICPO или напишите nevr@aicpo.com