chimera-thin-vertical-slice
Сначала постройте один узкий путь, который проходит через все слои и работает, и только потом стройте любой слой целиком — интеграция, которая ни разу не выполнялась, это догадка.
Присвоено человеком, который прочитал карточку, а не заявлено файлом о самом себе. Карточка, которую агент выводит во время запуска, поглотившего недоверенное содержимое, рождается заражённой и удерживается на разбор, прежде чем её вообще извлекут.
Когда это вспоминается
- начинаю новую фичу
- нужны CLI, сервис и хранилище
- сначала строю абстракцию
- пока ничего не запускается
- поднимаю каркас подсистемы
Ценность обычно лежит в разделах «Избегать» и «Проверить». «Делать» — это раздел, который пишут все.
Текст карточки выше — перевод. Английский оригинал — это то, что импортирует командная строка, что читает агент во время работы и что подтверждает хеш ниже.
Повод
Вы начинаете работу, пронизывающую слои — команда, доходящая до оркестратора, который вызывает провайдера, который пишет в хранилище, — и решаете, что строить первым. Соблазн — построить нижний слой целиком, затем следующий, а связать всё в конце.
Это не относится к работе, которая действительно глубиной в один слой: парсер, форматтер, чистая функция. Вертикали там нет, и выдумывать её — обряд. Не относится это и к изменению внутри системы, которая уже работает от края до края: этот путь существует, и за срез уже заплачено.
Делать
- Назовите наблюдаемое, которое даст срез, — как команду, которую мог бы набрать кто-то другой,
и один конкретный вывод. Не «конвейер работает», а
chimera run "hi"печатает одну строку, пришедшую от настоящего провайдера. - Напишите этот вызов первым, скриптом или тестом, и посмотрите, как он падает по правильной причине.
- Реализуйте кратчайший путь через все слои, вырожденно на каждом: один провайдер, без повторов, без файла конфигурации, без кэша, без параллелизма. Там, где со временем поселится политика, поставьте константу.
- Держите настоящим тот слой, который несёт собственно неизвестное. Если вы ещё не знаете, что возвращает провайдер, то провайдер — единственное, что в первом срезе не должно быть заглушкой.
- Коммитьте в тот момент, когда оно заработало, до обобщения. Этот коммит и есть свидетельство, что слои сходятся.
- Расширяйте по одной оси за раз — второй провайдер, потом конфигурация, потом кэширование, — и следите, чтобы команда из шага 1 продолжала работать после каждого расширения. Если сломалась, подозреваемое — это расширение.
Избегать
Проектировать интерфейс при нуле вызывающих. Горизонтальный порядок выдаёт базовый класс, шесть адаптеров, реестр и политику повторов в первый же день, а на этапе связывания выясняется, что форма неверна, — потому что ничто до сих пор не задало ей настоящего вопроса.
class BaseProvider(ABC): ...
class ProviderRegistry: ...
class RetryPolicy: ...
# Day 1, vertical: ugly, hardcoded, and it answers the question.
def complete(prompt: str) -> str:
return _post(URL, {"model": MODEL, "prompt": prompt})["choices"][0]["text"]
Также избегайте среза, который тонок не в том измерении: замокать внешний вызов и прогнать всё остальное от края до края. Это доказывает, что ваши собственные слои согласны друг с другом, — а сомнительным было вовсе не это. Интеграция, которую вы не задействовали, и есть та интеграция, которая окажется неверной.
Проверить
Задайте двоичный вопрос: может ли человек, который это не писал, на чистом клоне запустить одну команду и увидеть, как функция делает свою работу насквозь? Если ответу нужно «ну, если ещё заглушить X» или «после того как вставишь токен в ту константу» — второе честно отметьте как настройку, а любую оговорку про код считайте доказательством, что среза ещё нет.
Затем посмотрите git log: есть ли коммит, где команда работала, а абстракций ещё не существовало?
Если первый рабочий коммит — он же коммит, вводящий реестр, срез был пропущен.
Риск
Срез хардкодит решения, а хардкоды живучи. Обычный провал в том, что шаги 5 и 6 так и не случаются, потому что первый срез «работает», и остаётся система с намертво вваренным единственным провайдером и швами, оказавшимися там, где на втором часу было удобно. Планируйте расширение как работу в той же партии, а не как продолжение, которое никто не оплатит.
Вторая цена настоящая: прогон первого среза через живую внешнюю зависимость делает этот первый тест медленным, платным и временами нестабильным. Записывайте и воспроизводите его после того, как он появился: записать вызов, которого вы ни разу не делали, невозможно, — в чём и весь смысл порядка.
Как применить
Карточка — это данные. Склонируйте репозиторий и импортируйте её по пути: всё, что приходит по сети, считается заражённым и удерживается до одобрения — это и есть желаемое поведение, и поэтому здесь нет установщика в одну строку.
git clone https://github.com/brcampidelli/chimera-agent.gitchimera skills-import chimera-agent/skills/chimera-thin-vertical-slice/SKILL.mdЦелостность
SHA-256 файла в опубликованном виде. Импортёр может проверить, что полученное совпадает с показанным на этой странице.
cc2b4e8524f6a9a839d70effa69a32287a69eb70dba16321bffb74ae39c302e6