Перейти к содержимому

Навыки

chimera-thin-vertical-slice

Сначала постройте один узкий путь, который проходит через все слои и работает, и только потом стройте любой слой целиком — интеграция, которая ни разу не выполнялась, это догадка.

ПаттернПроисхождение: cleanСостояние: activev0.1.0 · Apache-2.0

Присвоено человеком, который прочитал карточку, а не заявлено файлом о самом себе. Карточка, которую агент выводит во время запуска, поглотившего недоверенное содержимое, рождается заражённой и удерживается на разбор, прежде чем её вообще извлекут.

Когда это вспоминается

  • начинаю новую фичу
  • нужны CLI, сервис и хранилище
  • сначала строю абстракцию
  • пока ничего не запускается
  • поднимаю каркас подсистемы

Ценность обычно лежит в разделах «Избегать» и «Проверить». «Делать» — это раздел, который пишут все.

Текст карточки выше — перевод. Английский оригинал — это то, что импортирует командная строка, что читает агент во время работы и что подтверждает хеш ниже.

Повод

Вы начинаете работу, пронизывающую слои — команда, доходящая до оркестратора, который вызывает провайдера, который пишет в хранилище, — и решаете, что строить первым. Соблазн — построить нижний слой целиком, затем следующий, а связать всё в конце.

Это не относится к работе, которая действительно глубиной в один слой: парсер, форматтер, чистая функция. Вертикали там нет, и выдумывать её — обряд. Не относится это и к изменению внутри системы, которая уже работает от края до края: этот путь существует, и за срез уже заплачено.

Делать

  1. Назовите наблюдаемое, которое даст срез, — как команду, которую мог бы набрать кто-то другой, и один конкретный вывод. Не «конвейер работает», а chimera run "hi" печатает одну строку, пришедшую от настоящего провайдера.
  2. Напишите этот вызов первым, скриптом или тестом, и посмотрите, как он падает по правильной причине.
  3. Реализуйте кратчайший путь через все слои, вырожденно на каждом: один провайдер, без повторов, без файла конфигурации, без кэша, без параллелизма. Там, где со временем поселится политика, поставьте константу.
  4. Держите настоящим тот слой, который несёт собственно неизвестное. Если вы ещё не знаете, что возвращает провайдер, то провайдер — единственное, что в первом срезе не должно быть заглушкой.
  5. Коммитьте в тот момент, когда оно заработало, до обобщения. Этот коммит и есть свидетельство, что слои сходятся.
  6. Расширяйте по одной оси за раз — второй провайдер, потом конфигурация, потом кэширование, — и следите, чтобы команда из шага 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.git
chimera skills-import chimera-agent/skills/chimera-thin-vertical-slice/SKILL.md

Целостность

SHA-256 файла в опубликованном виде. Импортёр может проверить, что полученное совпадает с показанным на этой странице.

cc2b4e8524f6a9a839d70effa69a32287a69eb70dba16321bffb74ae39c302e6

Читать карточку в репозитории