[nevr]
· 10 мин чтения

38 фич за одну сессию: как AI Factory строит продукт

AI Factory: 38 features, one session

Звучит как маркетинговый бред: 38 capabilities за одну сессию, 22 коммита, ноль строк написанных руками. Но это реальный лог работы за 6 апреля 2026 года. И самое важное в этой истории — не скорость. А 10 гэпов, найденных при аудите. Потому что агенты ошибаются, и честный разговор об этом важнее хвастовства.

Контекст: что строилось

AICPO — AI-driven платформа для product discovery. В этот день задача была амбициозная: Knowledge Graph v2 (KG2) — четырёхслойный темпоральный граф знаний, который заменяет устаревший KG1. Плюс конкурентная разведка, трендовый мониторинг, и интеграция всего этого в чат и артефакты.

Не прототип. Production-ready код с миграциями, сервисами, джобами, API, ActionCable каналами, и feature flag для instant rollback.

Как выглядит рабочий процесс

Простая петля из четырёх шагов:

  1. CEO думает — декомпозиция фичи на подзадачи, определение файлов, acceptance criteria
  2. Агент строит — получает точный промпт с файлами, задачами, ограничениями. Пишет код
  3. CEO аудирует — читает diff, проверяет архитектуру, гоняет smoke-тесты
  4. Агент исправляет — если найдены проблемы, новый промпт с конкретными багами

CEO не пишет код. Ни строчки. Но CEO читает весь код, который написал агент. Это принципиально: ты не можешь делегировать то, что не понимаешь.

Четыре релиза за один день

Release 1: KG2 Core (v0.7.0)

9 фаз, каждая — отдельный спавн агента:

ФазаЧто сделаноФайлы
ОнтологияYAML-схема: 10 типов узлов, 18 типов связей, constraintsconfig/kg2_ontology.yml
EpisodesИммутабельный слой сырых данных из фактов/файловkg2/episode_service.rb
Entity ExtractionLLM извлекает сущности из эпизодовkg2/entity_extractor.rb
Entity ResolutionДедупликация: exact + fuzzy (Levenshtein) + LLMkg2/entity_resolver.rb
RelationsLLM строит связи с валидацией по онтологииkg2/relation_discoverer.rb
TemporalBi-temporal поля, инвалидация противоречийkg2/temporal_manager.rb
Hybrid SearchVector + BM25 + graph traversal → RRF fusionkg2/hybrid_search.rb
CommunitiesBFS кластеризация + LLM summarieskg2/community_detector.rb
IntegrationDialogueService + ArtifactGenerator ветвление по feature flag12 файлов

22 новых файла. 4 миграции. Всё за один спавн-цикл с промежуточными коммитами.

Release 2: Competitive Intelligence (v0.7.1)

Мониторинг конкурентов: автоматическое обнаружение из чата, скрейпинг сайтов, анализ новостей, еженедельные дайджесты.

Ключевые компоненты:

  • Competitive::AutoDetectService — извлекает имена конкурентов из фактов проекта
  • Competitive::SignalAnalyzerService — дедупликация + оценка релевантности + threat scoring
  • Competitive::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.

Паттерн ошибок

Три категории:

  1. Integration gaps (гэпы 2, 3, 10) — агент отлично пишет изолированные компоненты, но стыки между ними ломаются. Один агент не видит, что написал другой
  2. Edge cases (гэпы 4, 5, 6, 7, 9) — happy path работает, corner cases игнорируются. Агент оптимизирует на “сделать работающее”, а не на “сделать надёжное”
  3. Environment-specific (гэпы 1, 8) — агент пишет для абстрактной среды, не учитывая что dev = SQLite, prod = PostgreSQL

Это не баги “тупого AI”. Это системные паттерны, которые повторяются. И зная их, ты закладываешь проверки в промпт: “убедись, что SQLite fallback есть”, “проверь индексы на каждом новом find_by”.

Метрика дня

ПоказательЗначение
Capabilities (фичи/сервисы/джобы)38
Коммиты22
Новые файлы47
Миграции9
Строк кода (approx)~6,500
Ручной код CEO0 строк
Гэпов найдено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