← Углубления  ·  Университет

DD · Ремесло стройки: промпт-инжиниринг, версионирование, worktree

Углублённый модуль поверх курса. Продолжает Модуль 1 (Урок 1.4 — Skills), Модуль 2 (Урок 2.1 — критик), Модуль 3 (Урок 3.3 — git-память) и Модуль 9 (Урок 9.2 — «harness для кода»). Метки честности как в курсе: 🟢 проверено по первоисточнику, 🟡 иллюстративно/эвристика, 🔴 исправлено.

0. Зачем это отдельный модуль

Прошлые модули курса объясняют, ЧТО строить — оркестратор, память, guardrails, критика. Этот — про другое: КАК руками писать и не сломать. Это ремесло в буквальном смысле — привычки, отличающие хирурга, который двадцать лет ставит катетер не глядя, от того, кто вчера прочитал учебник. Оба знают анатомию — разница в технике руки.

Три навыка, без которых архитектурные модули курса остаются схемой на бумаге:

  1. Как писать промпт агента/критика/CLAUDE.md, чтобы он реально работал — prompt/context engineering.
  2. Как менять промпт, скилл, hook или конфиг оркестратора, не рискуя сломать фабрику ночью — безопасное версионирование.
  3. Как параллельно пробовать несколько вариантов кода (веер MVP, Модуль 2.3), не наступая друг другу на файлы — git worktree.

Медицинская аналогия модуля: рецепт, история болезни, параллельные операционные. Рецепт должен исполняться без вопросов у аптекаря — расплывчатый рецепт хуже отсутствия рецепта. История болезни должна позволять откатить лечение к прошлой версии, не стирая память о пациенте. Параллельные операционные — пробовать разные протоколы на разных «версиях» пациента, не путая инструменты между палатами.

🔧 Три ремесленных навыка — кликни блок
Нажми на навык, чтобы увидеть, что он решает.

1. Prompt/context engineering как ремесло

1.1 Системный промпт — структура, а не поэзия

По-человечески. Плохой рецепт — «дать что-нибудь от температуры». Хороший — «парацетамол 500 мг каждые 6 часов, не больше 4 раз в сутки, при аллергии — ибупрофен». Разница не в длине, а в том, что хороший рецепт исполняется без уточняющих вопросов и сам задаёт границы.

Как называется по-настоящему. System prompt задаёт роль, границы и формат поведения на всю сессию. Anthropic формулирует правило структуры прямо: искать «золотую середину» между жёстким кодированием сложной логики (хрупко) и расплывчатостью, рассчитывающей на общий контекст (модель домысливает не то) — «достаточно конкретно, чтобы направить поведение, но достаточно гибко, чтобы дать модели сильную эвристику». 🟢 [дословно, Effective context engineering for AI agents, Anthropic].

Рабочая структура, переносимая на любого агента завода (channel-forge, requirements-агент, критик видео): Роль (узкая, не «ассистент») → Контекст (минимум фактов) → Что делать (шаги) → Формат вывода (структура, не свободный текст) → Чего не делать (конкретные ограничения, не «будь аккуратен») → Few-shot примеры. Секции размечаются заголовками/XML-тегами — это облегчает модели навигацию так же, как человеку. 🟢 [тот же источник].

Пять ошибок, которые ловятся сразу. Роль-«ассистент» вместо узкой роли; инструкция без явного «чего не делать» (критик без запрета переписывать текст рано или поздно начинает его чинить вместо оценки); свободный формат вывода (источник тихих сбоев — парсер молча получит пустоту при малейшем отклонении формата, см. DD-nabludaemost.md §5); раздутый набор инструментов с пересекающимися названиями — «если разработчик не может однозначно выбрать инструмент, не сможет и агент» 🟢 [Anthropic, тот же источник]; промпт, проверенный на одном удачном примере вместо бенчмарка (§2.2).

🔧 Структура системного промпта — кликни шаг цепочки
Нажми на прямоугольник — цепочка идёт слева направо.

1.2 Few-shot и CLAUDE.md

Few-shot. Few-shot prompting — примеры «вход → правильный выход» в самом промпте, в противоположность zero-shot. Примеры должны быть разнообразными и каноническими, показывающими типичное поведение — редкие edge case лучше выносить в CLAUDE.md/skill, а не раздувать ими промпт. 🟢 [«curate diverse, canonical examples… avoid stuffing edge cases» — Anthropic]. У критика (thumbnail-studio, будущий критик кода) 2-3 примера прошлых вердиктов заметно устойчивее к дрейфу оценки, чем абстрактное «найди проблемы».

CLAUDE.md. Персистентные инструкции, читаемые в начале каждой сессии — в отличие от auto memory (заметки, которые агент пишет о себе сам). 🟢 [официальная документация Claude Code]. Три правила: размер — держать под 200 строк, длиннее — хуже адherence, разбивать по .claude/rules/ с загрузкой по типу файла; конкретность — «отступ 2 пробела» вместо «форматируй аккуратно»; CLAUDE.md — это контекст, НЕ принудительная конфигурация — модель старается следовать, но гарантии нет. Правило, которое обязано выполняться железно (денежная красная линия), — задача hook (PreToolUse), исполняемого как код, а не промпт-инструкции. 🟢 [«use a PreToolUse hook instead» — официальная документация]. Это техническое обоснование решения Модуля 4.1: денежный гейт — hook, а не промпт.

Правило добавления в CLAUDE.md: агент дважды ошибся в одном месте / код-ревью поймало то, что он должен был знать / ты дважды вписал одну поправку в чат — совпадает с законом «повторил дважды → оформи», только для факта/конвенции, а не процедуры (та идёт в skill). _STYLE_PLAYBOOK.md и per-channel profile.json из memory-bank — это уже CLAUDE.md его завода, просто не названные так.

Для любопытных. Субагенты наследуют собственный system prompt, project CLAUDE.md и определения инструментов — но НЕ историю разговора и tool-результаты родителя. 🟢 [официальная таблица «What subagents inherit», Claude Agent SDK docs]. Изоляция критика от рассуждений генератора (Модуль 2.1) — поведение субагентов по умолчанию, а не то, что приходится специально настраивать; эхо-камера возникает именно когда её создают вручную, вставляя рассуждения генератора текстом в промпт критика.

1.3 Контекст-инжиниринг: что класть, чего не класть

По-человечески. Врачу перед операцией не нужна вся история болезни с рождения — нужна выжимка: диагноз, аллергии, план. Дать всю папку «на всякий случай» не поможет — либо время на просеивание, либо важное потеряется в неважном.

Как называется по-настоящему. Context engineering — управление тем, что попадает в контекстное окно, в отличие от prompt engineering (что написано в промпте один раз). Правило: минимальный набор информации, полностью описывающий ожидаемое поведение — минимальный не значит короткий, значит без лишнего. 🟢 [«smallest possible set of high-signal tokens» — Anthropic]. Калибровка: начинать с минимального промпта на сильной модели, добавлять инструкции только когда конкретный отказ реально проявился — не защищаться заранее от гипотетических кейсов. 🟢 [тот же источник].

Прямая связь с токеномикой (Модуль 5) и не то же самое, что Git Context Controller (GCC, 🟢 верное название вместо «OneContext», verify/corrections-1.md №13, ~13.6% прирост SWE-bench) из Модуля 3.3: GCC — про рантайм-память ОДНОГО агента внутри долгой сессии; здесь — про то, что физически писать в промпт/CLAUDE.md ДО начала сессии. Конкретный пример: критику даётся только финальный артефакт + чек-лист, без черновиков и рассуждений генератора («я решил сделать так, потому что...») — иначе критик получает возможность согласиться с логикой генератора вместо проверки результата.

1.4 Промпт критика — особый случай

Промпт хирурга («сделай операцию») и промпт эксперта консилиума, проверяющего запись операции («оцени, всё ли правильно»), структурно разные документы. Три обязательных отличия от промпта-исполнителя: явный взвешенный чек-лист вместо «find bugs» (веса под слабые места модели — фактчек весит больше, потому что дороже по репутации канала); запрет на исправление — только вердикт и список проблем, иначе критик частично подменяет генератора; явное указание, что промпту НЕ показывают — черновики и рассуждения генератора, даже если технически субагент и так их не наследует. Структурированный вывод обязателен сильнее, чем для любого другого агента — от него зависит программное решение «фикс vs релиз»:

{"verdict":"fail","score":0.61,
 "criteria_scores":{"hook_strength":0.8,"fact_accuracy":0.3},
 "issues":[{"severity":"critical","criterion":"fact_accuracy","location":"00:42","detail":"дата события неверна"}]}
🔧 Промпт-исполнитель vs промпт-критик

2. Безопасное версионирование и откат самой фабрики

2.1 Промпты, hooks, конфиг оркестратора — это код

По-человечески. Больница не выбрасывает старый протокол лечения при вводе нового — он остаётся в архиве, доступный для возврата, если новый окажется хуже.

Промпты, скиллы (.claude/skills/*/SKILL.md), hooks (JSON + скрипты), конфиг оркестратора — текстовые файлы, значит на них работает та же git-дисциплина: коммит с осмысленным сообщением на каждое изменение, тег на выпущенную версию, git diff/git log для видимости изменений.

git add prompts/critic-video/v3-current.md
git commit -m "critic-video: ужесточить порог фактчека (score>=0.8)"
git tag critic-video-v3.1

# новая версия оказалась хуже
git log --oneline -- prompts/critic-video/
git diff critic-video-v3.1 HEAD -- prompts/critic-video/v3-current.md
git checkout critic-video-v3.1 -- prompts/critic-video/v3-current.md
git commit -m "rollback critic-video to v3.1: v3.2 пропустил 3 видео без фактчека"

Откат — через явный checkout <tag> -- <файл> + новый коммит, НЕ через reset --hard (стирает историю, риск зацепить параллельные изменения). Именование: не полноценный semver, а v<major> (смена подхода — требует полного прогона бенчмарка) / v<major>.<minor> (точечная правка). Hooks заслуживают более строгого цикла, чем промпты, — ошибка в hook может не заблокировать деньги, которые обязан был заблокировать; изменения в budget-gate.json проходят synthetic-канал без исключений даже для «однострочной правки».

🔧 Откат: checkout <tag> vs reset --hard

2.2 Стадии вместо «сразу в бой»

Индустриальная практика — прогон через dev → staging → production, сравнение версий side-by-side на тестовом наборе ПЕРЕД тем, как версия становится действующей. 🟡 [практика описана вторичным источником, не Anthropic — общая методология индустрии]. На масштабе одного человека: новая версия критика прогоняется на том же бенчмарке 30-50 эталонных видео (Модуль 4.2), сравнивается со старой; если расхождение хуже хотя бы на паре эталонов — не в прод. Конфиг оркестратора проходит через synthetic-канал (Модуль 3.2), не сразу боевой.

Если регрессия обнаруживается ночью, а не утром — откат не ждёт человека: это частный случай стоп-крана (Модуль 4.3, 5.3). Оркестратору нужна явная переменная последней рабочей версии (CRITIC_PROMPT_VERSION=critic-video-v3.1), откатываемая скриптом, а не просьбой к агенту «откатись».

Что НЕ версионировать вместе с промптами. Секреты (.env, OAuth, ключи) никогда не в том же репозитории — только .gitignore, независимо от размера репозитория фабрики.

🔧 Мини-симулятор staging-гейта

На скольких эталонных видео из 30-50 новая версия критика показала расхождение хуже старой?


3. Git worktree для параллельного веера MVP

По-человечески. Три протокола лечения нужно попробовать параллельно на одном пациенте (веер MVP: A — склад-фокус, B — брони-фокус, C — дашборд-фокус) — каждый в своей операционной со своими инструментами, но с общим доступом к истории болезни.

Как называется по-настоящему. Git worktree — отдельная рабочая директория со своими файлами и веткой, использующая ОДНУ историю репозитория и remote, что и основной чекаут. 🟢 [официальная документация Claude Code]. Прямое решение проблемы «параллельные агенты в одной директории ломают сборку друг другу» (orkestratsiya.md, «Missions»): у каждого explorer-агента физически своя папка.

git worktree add ../mvp-cafe-variant-a -b variant-a
git worktree list
git worktree remove ../mvp-cafe-variant-a

# в Claude Code — то же одним флагом
claude --worktree variant-a-warehouse-focus

По умолчанию worktree создаётся под .claude/worktrees/<имя>/ на ветке worktree-<имя>; можно также попросить Claude «работай в отдельном worktree» — он создаст его инструментом EnterWorktree сам. 🟢 [официальная документация].

Секреты и уборка. Worktree — чистый чекаут: .env не копируется автоматически. Файл .worktreeinclude (синтаксис .gitignore) явно указывает, какие gitignored-файлы копировать — секрет по-прежнему нигде не закоммичен. 🟢 [«only files that match a pattern and are also gitignored are copied» — официальная документация]. Без незакоммиченных изменений worktree удаляется автоматически при выходе; с изменениями — Claude спрашивает. Для ночных -p-прогонов автоматической уборки при выходе нет — воркер обязан сам вызвать git worktree remove после вердикта, иначе ветки копятся до утра (риск диска, Модуль 8.3/11.3). Subagents умеют isolation: worktree — временный worktree создаётся и удаляется автоматически по завершении субагента без изменений. 🟢 [официальная документация].

После турнира. Победитель НЕ обязан мёржиться в main сразу — для демо клиенту достаточно рабочей ветки; слияние имеет смысл, когда вариант становится продолжаемым продуктом. Ценная часть проигравшего варианта переносится точечно (git checkout mvp-cafe-booking-focus -- src/warehouse/), а не вся ветка. Проигравшие ветки не удаляются мгновенно по вердикту критика — остаются до утра (5-й закон, применённый к веткам), удаляются после подтверждения человеком. В память (LEARNING, Модуль 3.4) пишется коммит-хэш победителя, не только текстовое описание — иначе восстановить код через месяц нельзя.

🔧 Одна папка vs git worktree — кликни вариант

Чек-лист внедрения

  1. Вынести системные промпты агентов/критиков в отдельные версионируемые файлы со структурой роль/контекст/шаги/формат/ограничения/few-shot.
  2. Добавить 2-3 канонических few-shot примера в промпт критика — типичные вердикты, не edge case.
  3. Проверить существующие CLAUDE.md-подобные файлы (_STYLE_PLAYBOOK.md, profile.json) на длину (<200 строк) и конкретность.
  4. Разграничить: мягкое правило → CLAUDE.md; жёсткая проверка (деньги, необратимое действие) → hook.
  5. Создать репозиторий/раздел prompts/, skills/, hooks/, orchestrator-config/ с тегами на промоутнутые версии.
  6. Внедрить staging-шаг: прогон новой версии на бенчмарке/synthetic-канале, сравнение со старой side-by-side.
  7. Прописать и один раз вручную прогнать процедуру отката (checkout <tag> -- <файл> + коммит) — до того, как понадобится ночью.
  8. Никогда не класть секреты в репозиторий промптов/конфигов; для worktree — .worktreeinclude.
  9. Перевести первый веер MVP на git worktree/claude --worktree вместо параллельных агентов в одной директории.
  10. Настроить автоматическую уборку worktree после вердикта судейской панели.

Мини-проверка себя. (1) Критик неделю в проде начал пропускать брак — переписывать с нуля или откатывать? (откат по тегу, правка вслепую под давлением сломанной ночи — риск.) (2) Правило про деньги — в CLAUDE.md или hook? (hook — CLAUDE.md не даёт гарантии.) (3) Три explorer-агента работают в одной папке — что сломается? (конфликт записи, «ломает сборку — блокирует всех»; решение — worktree.)

Куда это в курсе

Ремесленное дополнение Модуля 1 (Урок 1.4 — как физически писать SKILL.md/промпт), Модуля 2 (Урок 2.1 — few-shot и структура критика как реализация Verifier Pattern; изоляция субагентов по умолчанию) и Модуля 2.3 (worktree — техническая реализация «изолированных directory/branch» веера MVP). Продолжает Модуль 3.3 (git-память/GCC — не путать: GCC про рантайм-память сессии, этот модуль про версионирование инструкций между сессиями). Даёт техническое обоснование Модуля 4.1 (денежный гейт — hook, не промпт) через официальную документацию. Питает Модуль 6.3 (ночь без человека — уборка worktree) и Модуль 9.2 (harness для кода — конкретный git-layout) и 9.3 (сквозной сценарий ночи — §3 даёт исполняемые команды для шага «Ночь, генерация»). Кормит Модуль 11.3 (roadmap: изолированные worktree на веере MVP) и 11.4 (план первой недели — рецепт §2.1-2.2 внедряется в первый день без ожидания остальной архитектуры).