<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>The Spec Compiler</title><description>Постановка как цель компиляции</description><link>https://nikitakitaychik.com/</link><item><title>Контракты, а не задачи</title><link>https://nikitakitaychik.com/ru/contracts-not-tasks/</link><guid isPermaLink="true">https://nikitakitaychik.com/ru/contracts-not-tasks/</guid><description>Я часами декомпозировал фичи на задачи, которые разработчик вставлял в Claude. Когда постановка дороже производства, владелец — постоянное горлышко. Выход: вручать обещания вместо планов — и выравнивать gate исполнителя вверх, чтобы куски могли укрупняться.</description><pubDate>Thu, 30 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Я замерил, куда на самом деле уходит моя неделя. Декомпозиция одной фичи на точные задачи — какие файлы, какие методы, в каком порядке — стоит мне часов. Потом я посмотрел, что разработчик сделал с моей декомпозицией.&lt;/p&gt;
&lt;p&gt;Он вставил её в Claude.&lt;/p&gt;
&lt;p&gt;Задержись на этом на секунду — мне понадобилось стыдно долго. Подробный список задач — это, по функции, промпт. Я руками писал промпты самыми дорогими часами в команде — для модели, которая сидит рядом с кодом и перегенерирует тот же план за минуты.&lt;/p&gt;
&lt;h2&gt;Дубль&lt;/h2&gt;
&lt;p&gt;У репозитория, из которого релизится моя команда, есть собственный агентный тулинг: по хорошо оформленному требованию он в порядке вещей выдаёт план имплементации — файлы, слои, порядок.&lt;/p&gt;
&lt;p&gt;Так что каждая моя пофайловая задача была &lt;em&gt;дублем&lt;/em&gt;: моей догадкой о плане имплементации, произведённой дальше от кода, чем инструмент, который всё равно его переделает.&lt;/p&gt;
&lt;p&gt;Два прохода по одной работе. И из двух дорогим был мой.&lt;/p&gt;
&lt;h2&gt;Математика горлышка&lt;/h2&gt;
&lt;p&gt;Вот почему это не косметическая неэффективность:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Шаг&lt;/th&gt;
&lt;th&gt;Кто платит&lt;/th&gt;
&lt;th&gt;Типичная цена&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Мелкозернистая декомпозиция&lt;/td&gt;
&lt;td&gt;владелец&lt;/td&gt;
&lt;td&gt;часы на фичу&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Реализация по ней&lt;/td&gt;
&lt;td&gt;разработчик + агент&lt;/td&gt;
&lt;td&gt;часто меньше&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Когда постановка стоит дороже производства, очередь выстраивается перед владельцем. Не изредка — структурно. Фичи перестают ждать рук и начинают ждать моей писанины.&lt;/p&gt;
&lt;p&gt;И у ловушки жестокий поворот: чем я усерднее — чем мельче декомпозирую, — тем хуже. Каждый лишний час прожёвывания ложится на дорогую сторону баланса и ничего не снимает с дешёвой. Усердие копает яму глубже.&lt;/p&gt;
&lt;p&gt;Значит, лечение не может быть «декомпозируй лучше». Оно обязано быть «декомпозируй &lt;em&gt;меньше&lt;/em&gt; — и всё равно оставайся в безопасности». Вот как это выглядит.&lt;/p&gt;
&lt;h2&gt;Одна фича, две передачи&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Как список задач:&lt;/strong&gt; добавь колонку, поправь хэндлер, расширь валидацию, не забудь миграцию, обнови вызов на клиенте. Пять прогнозов о том, &lt;em&gt;как&lt;/em&gt;, — каждый из них тулинг рядом с кодом выведет заново, и ни один я не могу проверить.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Как контракт:&lt;/strong&gt; операция переименования существует; дубль имени отклоняется отдельной ошибкой; вызвать может только владелец scope; когда родительский объект умирает, запись умирает с ним; «готово» — это три проходящие проверки.&lt;/p&gt;
&lt;p&gt;Пять обещаний о том, &lt;em&gt;что должно стать истинным&lt;/em&gt;, — каждое проверяемо, и ни одно не является моей догадкой о чужом файле.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;В этом вся замена. Единица передачи — больше не изменение, которое надо сделать, а &lt;strong&gt;обещание, которое надо сдержать.&lt;/strong&gt; Из чего оно состоит:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Секция&lt;/th&gt;
&lt;th&gt;На какой вопрос отвечает&lt;/th&gt;
&lt;th&gt;Почему переживает встречу с реальностью&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Интерфейс&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Что существует, когда ты закончил?&lt;/td&gt;
&lt;td&gt;Абстрактная схема, именованная конвенциями самого API — ничего выдуманного&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Поведение&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Что происходит при успехе, при отказе, на границах?&lt;/td&gt;
&lt;td&gt;Текстом, не кодом — перевод берёт на себя имплементатор&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Доступ&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Кто может вызвать, под какой привилегией и в каком scope?&lt;/td&gt;
&lt;td&gt;Включая случаи, о которых забывают: обход админа, машинная идентичность&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Жизненный цикл&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Что происходит при удалении / обновлении / отвязке родителя?&lt;/td&gt;
&lt;td&gt;«Мы забыли про каскад» — самый скучный продакшн-инцидент на свете&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Приёмка&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Что значит «готово»?&lt;/td&gt;
&lt;td&gt;Прогоняемо без вопросов автору, что он имел в виду&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Радар воздействия&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Что нельзя сломать и что от этого зависит?&lt;/td&gt;
&lt;td&gt;Порядок становится данными, а не племенным знанием&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Что контракт намеренно опускает: пути к файлам, имена методов, SQL, пошаговые инструкции. Это юрисдикция имплементатора, это лучше перегенерируется ближе к коду — и каждая такая строка в спеке — строка, за которую я заплатил дважды.&lt;/p&gt;
&lt;h2&gt;Страх — и закон, который на него отвечает&lt;/h2&gt;
&lt;p&gt;Отдать крупное обещание вместо пяти прожёванных шагов — страшно, похоже на безрассудство. Страх легитимен — и у него есть точный ответ:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Гранулярность декомпозиции должна быть обратно пропорциональна силе твоего приёмочного gate.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Если gate исполнителя силён — ревью против контракта, тесты, которые пишет автор как норму, скрипт, проверяющий саму структуру контракта, — крупные единицы &lt;em&gt;безопасны&lt;/em&gt;: один контракт упаковывает то, что было бы шестью задачами, а gate ловит, что пошло не так.&lt;/p&gt;
&lt;p&gt;Если gate слаб, крупные куски и правда безрассудство. Приходится мельчить — не навсегда, а пока gate не вырастет.&lt;/p&gt;
&lt;p&gt;Я гоняю оба режима одновременно, поэтому и знаю, что закон держится:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Трек&lt;/th&gt;
&lt;th&gt;Gate сегодня&lt;/th&gt;
&lt;th&gt;Размер единицы сегодня&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Backend&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Силён: сеньор ревьюит против контракта, автор пишет тесты, скрипт проверяет структуру&lt;/td&gt;
&lt;td&gt;Крупный — один контракт вместо шести задач&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Frontend&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Слабее, ещё растёт&lt;/td&gt;
&lt;td&gt;Мелкозернистый, послойный&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Backend-контракты со временем стали &lt;em&gt;жёстче&lt;/em&gt;, а не мягче: сеньор, который их потребляет, раз за разом возвращал их — недостающий пункт жизненного цикла, имя поля, уплывшее от API-дока, строка доступа без админского случая. Каждый его рулинг становился постоянной проверкой. Это gate буквально усиливается — и каждый раз, когда это происходило, я мог позволить себе отдать кусок чуть крупнее.&lt;/p&gt;
&lt;p&gt;Frontend остаётся мелкозернистым не потому, что фронтенд сложнее, а потому, что тот gate моложе. Тот же закон, другой конец шкалы.&lt;/p&gt;
&lt;h2&gt;Куда делись часы&lt;/h2&gt;
&lt;p&gt;Выигрыш замыкает петлю, с которой этот текст начался:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Было&lt;/th&gt;
&lt;th&gt;Стало&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Мои часы на фичу&lt;/td&gt;
&lt;td&gt;прожёвывание плана имплементации&lt;/td&gt;
&lt;td&gt;написание обещаний + суждение по приёмке&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Разработчик получает&lt;/td&gt;
&lt;td&gt;мой прогноз, чтобы вставить его в модель&lt;/td&gt;
&lt;td&gt;право владеть «как» — с gate, который ловит провал&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Очередь&lt;/td&gt;
&lt;td&gt;выстраивается передо мной&lt;/td&gt;
&lt;td&gt;выстраивается перед gate — а он масштабируется&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Два контракта, делящие граничный интерфейс, могут даже идти параллельно — фронтенд против схемы, бэкенд против поведения, — потому что источник истины на границе — контракт, а не совещание. Прожёванные задачи так не умеют: они сериализуются на общих файлах, даже когда обещания независимы.&lt;/p&gt;
&lt;p&gt;Честный prior art, с датой: design-by-contract существует сорок лет — предусловия и постусловия принадлежат Мейеру, не мне, — а работы 2026-го оживляют его &lt;em&gt;под&lt;/em&gt; задачной декомпозицией, чтобы верифицировать кодогенерацию. Ход здесь другой: контракт &lt;strong&gt;заменяет&lt;/strong&gt; задачу как единицу передачи на границе человек↔агент, и приходящего с ним закона гранулярности я нигде сформулированным не видел. По состоянию на середину июля 2026-го — сверься с датой, прежде чем цитировать.&lt;/p&gt;
&lt;p&gt;Неуютное следствие — дальше в серии возьмусь за него всерьёз: если гранулярность — функция силы gate, то улучшение твоих gate — а не промптов и не моделей — самая рычажная инвестиция в команде, работающей с AI. Gate — это и есть продукт.&lt;/p&gt;
&lt;p&gt;Владелец перестаёт быть горлышком в тот день, когда единица передачи — обещание, которое может проверить gate исполнителя, а не план, который владелец был вынужден написать дважды.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Дальше: The Two-Layer Compiler — почему тупой процедурный слой плюс обучающийся слой компаундятся, а ручная сообразительность — нет.&lt;/em&gt;&lt;/p&gt;
</content:encoded></item><item><title>The Oracle Lens: три вида истины</title><link>https://nikitakitaychik.com/ru/the-oracle-lens/</link><guid isPermaLink="true">https://nikitakitaychik.com/ru/the-oracle-lens/</guid><description>Верификация — три ортогональные оси: Truth, Coherence, Intent. Спека бывает связной и ложной; ловит это только проверка, направленная на мир, а не на документ. У Intent машинного оракула нет — нужен человек.</description><pubDate>Fri, 03 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;В прошлом тексте я сказал, что спецификация заслуживает компилятора — gate, который &lt;em&gt;падает&lt;/em&gt;, когда на входе ошибка. Звучит чисто, пока не начнёшь его строить: тут же упираешься в вопрос, который слово «ошибка» прятало. Ошибка — &lt;em&gt;в каком смысле&lt;/em&gt;?&lt;/p&gt;
&lt;p&gt;Верификация — не одно действие, хотя ощущается именно так. Проверяя спеку, план или кусок сгенерированного кода, ты на самом деле задаёшь до трёх разных вопросов — они кажутся одним и тем же, но одним и тем же не являются.&lt;/p&gt;
&lt;p&gt;Их смешение — самая частая ошибка, которую я вижу в AI-инструментах для продуктов, включая инструменты в остальном очень хорошие. Поэтому прежде любого gate — линза. Осей три, и они ортогональны.&lt;/p&gt;
&lt;h2&gt;Truth, Coherence, Intent&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Ось&lt;/th&gt;
&lt;th&gt;Вопрос&lt;/th&gt;
&lt;th&gt;С чем сверяется&lt;/th&gt;
&lt;th&gt;Как проверить&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Truth&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Так ли это на самом деле?&lt;/td&gt;
&lt;td&gt;Мир за пределами документа — код, работающая система, данные&lt;/td&gt;
&lt;td&gt;Пойти и посмотреть: grep, вызов endpoint&apos;а, запрос к базе&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Coherence&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Держится ли это вместе?&lt;/td&gt;
&lt;td&gt;Сам документ&lt;/td&gt;
&lt;td&gt;Читать против себя: противоречия, дыры, термин в двух смыслах&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Intent&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;То ли это самое?&lt;/td&gt;
&lt;td&gt;Голова человека&lt;/td&gt;
&lt;td&gt;Механической проверки не существует&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Truth&lt;/strong&gt; — заземлённость в реальности. «API возвращает это поле». «В этой таблице есть колонка &lt;code&gt;status&lt;/code&gt;». «Консьюмер переживёт лишний параметр».&lt;/p&gt;
&lt;p&gt;Каждое утверждение истинно или ложно относительно мира, существующего независимо от документа. У Truth есть внешний референт — именно поэтому из всех трёх осей она механизируется лучше всего.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Coherence&lt;/strong&gt; — внутренняя согласованность. Не противоречит ли документ сам себе? Нет ли дыр — поведение описано для одних входов и умолчено для других? Не используется ли один термин в двух смыслах?&lt;/p&gt;
&lt;p&gt;Coherence не нуждается в мире за пределами документа. Это ось, до которой тулинг спецификаций реально добрался: когда Kiro помечает двусмысленную фразу или два требования, которые не могут выполняться одновременно, или когда чеклист Spec Kit спрашивает, покрыты ли все случаи, — это оракул когерентности. Он действительно полезен, и я не хочу его принижать.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Intent&lt;/strong&gt; — совпадение с тем, чего на самом деле хотели. Не «согласовано ли» и не «правда ли» — а «то ли это самое».&lt;/p&gt;
&lt;p&gt;Спека может быть безупречно когерентной, идеально заземлённой в реальности — и описывать фичу, которая никому не нужна. Или не ту фичу. Или ту, но с чуть неверным дефолтом, который распознает как неверный только тот, кто просил. Intent живёт в голове человека. У него нет внешнего референта, по которому можно сделать grep, и нет внутреннего теста, который документ мог бы пройти.&lt;/p&gt;
&lt;p&gt;Называть все три стоит потому, что они расходятся, — в этом вся польза линзы.&lt;/p&gt;
&lt;h2&gt;Они расходятся — и в этом суть&lt;/h2&gt;
&lt;p&gt;Спека бывает &lt;strong&gt;когерентной и ложной.&lt;/strong&gt; Она прекрасно держится, каждое требование согласовано с каждым — а построена на утверждении о системе, которое не соответствует действительности. Ничто внутреннее её не поймает: документ в мире с самим собой. Поймает только проверка истины, выходящая за пределы документа.&lt;/p&gt;
&lt;p&gt;Спека бывает &lt;strong&gt;истинной и некогерентной.&lt;/strong&gt; Каждое отдельное утверждение сходится с кодовой базой, но два требования тихо противоречат друг другу, или половина пространства входов не описана. Grounding проходит утверждение за утверждением; когерентность рвётся на швах.&lt;/p&gt;
&lt;p&gt;И спека бывает &lt;strong&gt;истинной, когерентной — и не той.&lt;/strong&gt; Самый тяжёлый случай. Она ни о чём не врёт, ничему не противоречит и описывает нечто иное, чем то, чего хотели. Никакой механический оракул этого не поймает — потому что проверять механически не с чем.&lt;/p&gt;
&lt;p&gt;А вот аккуратное доказательство из реального мира, что эти оси действительно разделимы, а не выдуманы философом: посмотри, где остановилась индустрия.&lt;/p&gt;
&lt;p&gt;Все, кто поднялся до слоя спецификации — Kiro, Spec Kit, — построили оракул когерентности и воткнули флаг. Они скажут тебе, что твоя спека противоречит сама себе. Ни один не скажет, что твоя спека &lt;em&gt;врёт&lt;/em&gt; про API, — это совсем другая ось, и ей нужна другая машинерия: та, что выходит из документа и идёт смотреть.&lt;/p&gt;
&lt;p&gt;Gate когерентности и gate истины — это не один gate разной строгости. Это разные gate. Рынок нечаянно поставил эксперимент и подтвердил линзу.&lt;/p&gt;
&lt;h2&gt;Живой пример: когерентность без истины&lt;/h2&gt;
&lt;p&gt;Приведу один случай из работы над этой самой серией — самая чистая иллюстрация, какая у меня есть, и произошла она со мной на прошлой неделе.&lt;/p&gt;
&lt;p&gt;Я проверял, не опубликовал ли кто-нибудь уже таксономию оракулов в духе Truth/Coherence/Intent.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Что сообщил агент.&lt;/strong&gt; Статья 2026 года делит оракулы верификации ровно по этим линиям и &lt;em&gt;объявляет проверку намерения принципиально немеханизируемой&lt;/em&gt; — с цитатой. По теме, хорошо сформулировано, и в мой тезис легло так гладко, что я почти это использовал.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Что нашёл второй проход.&lt;/strong&gt; Слово «intent» встречается в статье дважды, в несвязанных предложениях. Процитированной строки не существует. Цитата сфабрикована.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Coherence — зелёный.&lt;/strong&gt; Саммари было безупречно: гладко, правдоподобно, внутренне согласованно. Оно прошло бы любую проверку, которую читатель мог бы применить &lt;em&gt;к самому саммари&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Truth — красный.&lt;/strong&gt; Оно провалило единственную проверку, которая имела значение: пойди и прочитай источник.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Будь у меня gate когерентности, который я принимал бы за gate истины, эта фальшивка сейчас стояла бы цитатой в этой статье.&lt;/p&gt;
&lt;p&gt;Это и есть весь аргумент за линзу в одном анекдоте. Опасные ошибки — не бессвязные: те выглядят неправильно. Опасные ошибки — когерентные-но-ложные, потому что они выглядят правильно, и остановит их только оракул, направленный на &lt;em&gt;мир&lt;/em&gt;, а не на &lt;em&gt;документ&lt;/em&gt;.&lt;/p&gt;
&lt;h2&gt;Градиент силы — и ось, которую не механизировать&lt;/h2&gt;
&lt;p&gt;Три оси различаются не только по сути, но и по тому, насколько они поддаются механизации, — и это упорядочение должно определять, куда вкладывать усилия.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Truth механизируется лучше всех.&lt;/strong&gt; У неё есть внешний референт, значит проверку можно автоматизировать: grep, компиляция, исполнение, запрос. Строй самый жёсткий, самый автоматический gate здесь — тут компилятор спецификаций отрабатывает свой хлеб, и тут же, как показывает рынок, построено меньше всего.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Coherence механизируется частично.&lt;/strong&gt; Проверки согласованности и полноты автоматизируются в заметной степени, и LLM неплохо ловят противоречия. Отдача убывает, но задача решаемая. Рынок до этой оси уже дошёл.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Intent механическому оракулу не поддаётся — и притворяться, что это не так, — ловушка.&lt;/strong&gt; Нет ни внешнего референта, ни внутреннего теста. Эталон — намерение в чьей-то голове, часто недоопределённое даже для самого носителя и меняющееся, когда он видит результат.&lt;/p&gt;
&lt;p&gt;Его можно &lt;em&gt;приближать&lt;/em&gt;: приёмочные тесты кодируют его срез, примеры фиксируют крайние случаи, накопленные человеческие рулинги (об этом отдельный текст — case law) дают слабый дрейфующий прокси. Но приближение — потолок.&lt;/p&gt;
&lt;p&gt;Поэтому честный инженерный ход — не подделывать оракул Intent уверенным LLM-судьёй, а &lt;em&gt;назвать&lt;/em&gt; Intent осью, требующей человека, поставить человека ровно туда — и механизировать Truth и Coherence настолько жёстко, чтобы дефицитное внимание человека тратилось только на вопрос, на который не может ответить ни одна машина.&lt;/p&gt;
&lt;p&gt;Вот что даёт линза. Не новый gate — а понимание, на какой из трёх вопросов на самом деле отвечает каждый твой gate.&lt;/p&gt;
&lt;p&gt;Чтобы проверка когерентности больше не караулила дыру, которую способна закрыть только проверка истины, — и чтобы машина не делала вид, будто закрывает тот единственный вопрос, что всегда оставался за человеком.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Дальше в серии — сам gate истины: как заземлять спецификацию против реальности и почему самые интересные провалы не про ложь, а про слои. Об этом — в одном из следующих текстов.&lt;/em&gt;&lt;/p&gt;
</content:encoded></item><item><title>Спецификация — это цель компиляции</title><link>https://nikitakitaychik.com/ru/specification-is-a-compile-target/</link><guid isPermaLink="true">https://nikitakitaychik.com/ru/specification-is-a-compile-target/</guid><description>Когда имплементацию пишут агенты, спецификация становится целью компиляции — исходником, которому нужен гейт, падающий на вранье. Существующие инструменты проверяют связность; почти никто — истину.</description><pubDate>Fri, 03 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Большую часть моей карьеры спецификация была дешёвой частью работы. Ты писал абзац, ну может тикет, — а дорогая, требующая мастерства, незаменимая работа происходила ниже по течению: превратить этот абзац в правильный код. Спека была пожеланием. Имплементация была истиной.&lt;/p&gt;
&lt;p&gt;Это соотношение перевернулось — а переоценить свою работу под новый расклад не успел почти никто.&lt;/p&gt;
&lt;p&gt;Когда агент берёт точное описание изменения и за минуты выдаёт рабочую, протестированную имплементацию, имплементация перестаёт быть узким местом. Перестаёт быть местом, где живёт мастерство.&lt;/p&gt;
&lt;p&gt;Мастерство поднимается выше — в единственное оставшееся место, которое машина не может сделать за тебя: решить, что строить, и сформулировать это настолько точно, что всё остальное становится механикой. Сеньор не исчезает. Его выталкивает на ступеньку вверх по лестнице — на спецификацию.&lt;/p&gt;
&lt;p&gt;И вот часть, до которой тулинг ещё не дотянулся: если имплементация теперь — шаг компиляции, то &lt;strong&gt;спецификация — это цель компиляции.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Это больше не проза, которую ты вручаешь человеку, а он заполнит пробелы своим здравым смыслом. Это исходный артефакт, который компилируется в систему, — и, как любой исходник, поданный компилятору, он заслуживает тайп-чекера, линтера и сборки, которая &lt;em&gt;падает&lt;/em&gt;, когда на входе ошибка.&lt;/p&gt;
&lt;p&gt;Вот и весь тезис. Остальная серия — о том, как это выглядит, если отнестись к нему буквально.&lt;/p&gt;
&lt;h2&gt;Чего на самом деле требует «компиляция»&lt;/h2&gt;
&lt;p&gt;Компилятор беспощаден — и именно этим полезен. Ему всё равно, хороша ли твоя программа как замысел. Он проверяет другое: &lt;em&gt;стоит ли она на реальности&lt;/em&gt; — существуют ли эти символы, сходятся ли типы, совпадает ли вызов с настоящей сигнатурой.&lt;/p&gt;
&lt;p&gt;И если нет — отказывается работать дальше. Отказ здесь не издержка, а суть: компилятор, который вежливо предупреждал бы и всё равно собирал бинарь, был бы никому не нужен.&lt;/p&gt;
&lt;p&gt;Приложи этот стандарт к продуктовой спецификации — и большинство из них рассыпается мгновенно. Типичная спека набита утверждениями о реальности:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;«API уже возвращает это поле»&lt;/li&gt;
&lt;li&gt;«это чисто UI-изменение»&lt;/li&gt;
&lt;li&gt;«консьюмер переживёт лишний параметр»&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Каждое истинно или ложно относительно настоящей кодовой базы — и почти ни одно не проверено. Их записывают в план, они проходят ревью, потому что &lt;em&gt;правдоподобны&lt;/em&gt;, — и детонируют через три недели в разработке, когда кто-то обнаруживает, что поля там никогда не было.&lt;/p&gt;
&lt;p&gt;Пока имплементацию писал человек, беда была поправимой: враньё он ловил, уже когда писал код, — ругался и правил спеку у себя в голове. Когда имплементацию пишет агент, враньё проходит насквозь. Агент доверяет спеке. Спека врала. Теперь у тебя уверенно неправильная система — собранная быстро.&lt;/p&gt;
&lt;p&gt;Вот форма провала, которую я вижу постоянно.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Утверждение.&lt;/strong&gt; В системе уже есть спящий механизм под то, что ты собрался строить: флаг, закомментированный блок или функция с ровно подходящим именем. Предложение сводится к «оно уже есть, просто включи».&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Почему проходит ревью.&lt;/strong&gt; Символ существует. Ленивая проверка — встречается ли имя в коде? — загорается зелёным.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Что находит настоящий gate.&lt;/strong&gt; Не принимай совпадение имени за доказательство, открой тело — и код с правильным именем делает совсем другое: охраняет другой ресурс, на другом слое, чем предполагает утверждение.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Цена.&lt;/strong&gt; Правильное имя, не та сущность — и на этом строилось бы целое направление работ.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Когда каждое утверждение принудительно доведено до цитаты и перечитано в контексте, проваливаются почти никогда не абсурдные выдумки. Проваливаются правдоподобные утверждения, случайно истинные про &lt;em&gt;другую часть системы&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Поэтому первое, что нужно спеке-как-цели-компиляции, — ключевой ход компилятора: &lt;strong&gt;блокирующий gate, который отказывается впускать непроверенное утверждение.&lt;/strong&gt; Не ревьюер, который может заметить. Gate, который требует доказательств:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;УТВЕРЖДЕНИЕ   «API уже возвращает это поле»
ДОКАЗАТЕЛЬСТВО  обязательно — файл:строка и фактическая форма в этой строке
ВЕРДИКТ       принято          утверждение входит в спеку
              отклонено        утверждение вычёркивается или уходит в открытые вопросы
              не тот слой      символ есть, но охраняет другое → назад автору
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Сделай grep, приведи файл и строку — или утверждение в спеку не входит. Этому будет посвящён отдельный текст: как выглядит &lt;em&gt;leak-rate&lt;/em&gt; непроверенных утверждений, когда его действительно измеряешь, и почему самые интересные провалы — не ложь, а &lt;strong&gt;путаница слоёв&lt;/strong&gt;: утверждения истинные, но истинные про другой слой системы.&lt;/p&gt;
&lt;h2&gt;Комната, в которой никто не стоит&lt;/h2&gt;
&lt;p&gt;А теперь утверждение неудобное — но я готов его защищать: я проверил, и почти все строят компилятор этажом ниже, чем нужно.&lt;/p&gt;
&lt;p&gt;Движение spec-driven development уже реально. Spec Kit от GitHub, Kiro от AWS, Tessl — существует внятная карта, кто что занимает, и её стоит прочитать.&lt;/p&gt;
&lt;p&gt;У некоторых даже есть gate &lt;em&gt;на слое спецификации&lt;/em&gt; — больше, чем я ожидал, когда пошёл проверять. Kiro проводит тебя от требований через дизайн к задачам и по ходу проверяет документ требований. Spec Kit поставляет Review &amp;amp; Acceptance Checklist, который ты валидируешь перед генерацией.&lt;/p&gt;
&lt;p&gt;Так что комната не пуста. Но посмотри, &lt;em&gt;что именно проверяют эти gate&lt;/em&gt; — в этом вся суть:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Где стоит gate&lt;/th&gt;
&lt;th&gt;Что проверяет&lt;/th&gt;
&lt;th&gt;Заземляет утверждения спеки в коде?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Kiro&lt;/strong&gt; — требования → дизайн → задачи&lt;/td&gt;
&lt;td&gt;Неоднозначность, противоречия, неполноту, уровень детализации&lt;/td&gt;
&lt;td&gt;Нет&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Spec Kit&lt;/strong&gt; — чеклист перед генерацией&lt;/td&gt;
&lt;td&gt;Полна ли спека и хорошо ли оформлена&lt;/td&gt;
&lt;td&gt;Нет&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Spec Kit&lt;/strong&gt; — проверка против реальности&lt;/td&gt;
&lt;td&gt;Собранный код против спеки&lt;/td&gt;
&lt;td&gt;После имплементации, не до&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Исследования grounding&lt;/strong&gt; (2026: блокирующие gate, типизированные доказательства, проверка цитат)&lt;/td&gt;
&lt;td&gt;Утверждения против исходников&lt;/td&gt;
&lt;td&gt;Этажом ниже — код и фрагменты, не требования&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Тулинг дизайн-систем&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Какие компоненты реально использованы&lt;/td&gt;
&lt;td&gt;Заземляет имплементацию, не спеку&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Render-оракулы&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Скриншоты результата&lt;/td&gt;
&lt;td&gt;Судят результат, не спеку&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Каждая из этих проверок на слое спеки проверяет &lt;strong&gt;когерентность&lt;/strong&gt;. Согласован ли документ сам с собой? Полон ли он? Не противоречит ли себе? Настоящие, полезные вопросы.&lt;/p&gt;
&lt;p&gt;Ни одна не задаёт другой: &lt;strong&gt;а это правда?&lt;/strong&gt; Переживёт ли «API уже возвращает это поле» встречу с настоящим API? Ничто в этой таблице не заземляет утверждения спеки о реальности в кодовой базе &lt;em&gt;до&lt;/em&gt; генерации.&lt;/p&gt;
&lt;p&gt;Вот комната, которая действительно пуста, — и она очерчена резче, чем «ни у кого нет gate на спеке». Все, кто добрался до слоя спецификации, построили &lt;strong&gt;оракул когерентности.&lt;/strong&gt; Почти никто не построил &lt;strong&gt;оракул истины&lt;/strong&gt; для спеки: gate, который отклоняет требование, потому что его утверждение о существующей системе ложно.&lt;/p&gt;
&lt;p&gt;«Отклони мою спеку, когда она врёт» — а не «когда она расплывчата». Это различие между когерентностью и истиной окажется хребтом всей серии, и в следующем тексте я разберу его явно.&lt;/p&gt;
&lt;p&gt;Так почему комната пуста? Льстивое объяснение тут же и неверное. Она пуста не потому, что это хитрая ниша, которую разглядел я один. Она пуста, потому что &lt;strong&gt;рано.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Гибрид, которого она требует, — человек, который решает, что строить, &lt;em&gt;и&lt;/em&gt; умеет заинженерить верификацию этого решения, — редок, а внимание всей индустрии направлено на автоматизацию имплементации: того, что как раз стало лёгким.&lt;/p&gt;
&lt;p&gt;Моя ставка — что это временно, и мой же собственный аргумент это предсказывает: по мере автоматизации имплементации каждого сеньора выталкивает на слой постановки, и придут они туда, нуждаясь ровно в этих инструментах. Эта серия — playbook, написанный изнутри комнаты, до прихода толпы.&lt;/p&gt;
&lt;p&gt;Это ставка, а не гарантия. «Рано» — синоним «риска». Аудитория, которой компилятор спецификаций нужен &lt;em&gt;сегодня&lt;/em&gt;, мала, и справедливый читатель скажет, что это просто хорошая инженерная гигиена в пафосной рамке. Может быть. Я пишу для той версии тебя, которая через полгода будет стоять на ступеньке, на которую тебя вот-вот вытолкнут.&lt;/p&gt;
&lt;h2&gt;Серия: карта, а не территория&lt;/h2&gt;
&lt;p&gt;То, что я построил, — реальный пайплайн, который это делает: компилятор спецификаций, в ежедневной работе на продакшн-кодовой базе.&lt;/p&gt;
&lt;p&gt;Я отдам &lt;strong&gt;карту&lt;/strong&gt;: фреймворки, словарь, паттерны, рассуждения и честные цифры. Я оставлю себе &lt;strong&gt;территорию&lt;/strong&gt;: сами промпты, всю обвязку, накопленные рулинги, датасеты. Карта — то, что вербует тебя в идею. Территория — то, что всё равно не копируется из блог-поста.&lt;/p&gt;
&lt;p&gt;Что дальше:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The Oracle Lens.&lt;/strong&gt; Прежде чем строить gate, нужно понять, какую истину он вообще способен проверить. Я разделяю оракулы верификации на три оси — &lt;em&gt;Truth&lt;/em&gt; (заземлено ли это в реальности), &lt;em&gt;Coherence&lt;/em&gt; (согласовано ли внутри себя) и &lt;em&gt;Intent&lt;/em&gt; (то ли это, чего на самом деле хотели) — и показываю их ортогональность: вот почему спека может пройти grounding и всё равно оказаться не тем.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Grounding спеки.&lt;/strong&gt; Тот самый блокирующий gate, целиком: «доказательство или не считается», метрика leak-rate и путаница слоёв как главный враг.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Contracts, Not Tasks.&lt;/strong&gt; Как ты передаёшь работу агенту, важнее, чем какому агенту, — и принцип под этим: гранулярность декомпозиции должна быть обратно пропорциональна силе твоего приёмочного gate.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;За ними стоит больше — почему всё это компаундится со временем, что делать с той осью, которую не проверит ни одна машина, и честные цифры от измерения собственного пайплайна. Серия до этого доберётся.&lt;/p&gt;
&lt;p&gt;Но начинается она с рефрейма, потому что он переустраивает всё остальное: &lt;strong&gt;имплементация никогда не была сложной частью. Сформулировать истину достаточно точно, чтобы её можно было скомпилировать, — вот теперь работа. Стройте компилятор для этого.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Дальше: &lt;a href=&quot;https://nikitakitaychik.com/ru/the-oracle-lens/&quot;&gt;The Oracle Lens&lt;/a&gt; — три вида истины, которые gate может проверить, и один, который не может.&lt;/em&gt;&lt;/p&gt;
</content:encoded></item><item><title>Хватит промптить. Пиши циклы</title><link>https://nikitakitaychik.com/ru/hvatit-promptit-pishi-cikly/</link><guid isPermaLink="true">https://nikitakitaychik.com/ru/hvatit-promptit-pishi-cikly/</guid><description>Цикл закрывается без человека только там, где есть дешёвый объективный оракул. Тесты-до-кода делают его независимым от кода. Циклы стирают оракул-покрываемую середину роли и выталкивают всех вверх — туда, где оракула нет.</description><pubDate>Tue, 09 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;«Вы больше не должны промптить кодящих агентов. Вы должны проектировать циклы, которые промптят их за вас.» — Peter Steinberger&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;В ноябре Boris Cherny — создатель Claude Code — удалил IDE. Не пользовался. В свежем интервью он говорит прямо: &lt;em&gt;«Я больше не промпчу Claude. У меня крутятся циклы, которые промптят его и сами решают, что делать. Моя работа — писать циклы»&lt;/em&gt;. И добавляет: это переход, который рынок будет проживать весь оставшийся год.&lt;/p&gt;
&lt;p&gt;Сдвиг простой на словах и огромный по последствиям. &lt;strong&gt;Раньше&lt;/strong&gt; ты в чате: промпт → ответ → правка → снова промпт. Человек — горлышко в каждой итерации. &lt;strong&gt;Теперь&lt;/strong&gt; ты один раз проектируешь систему, которая сама находит работу, раздаёт агентам, проверяет результат, пишет что сделано и решает, что дальше. И тыкает агентов вместо тебя.&lt;/p&gt;
&lt;h2&gt;Лестница абстракций&lt;/h2&gt;
&lt;p&gt;Daniel Demmel разложил это в лестницу, где промптинг — нижняя ступень:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Prompt engineering&lt;/strong&gt; — как сформулировать запрос.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Context engineering&lt;/strong&gt; — что дать в контекст.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Feedback-loop engineering&lt;/strong&gt; — дать агенту &lt;em&gt;увидеть последствия&lt;/em&gt; своей работы: тесты, логи, реальные API.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Harness engineering&lt;/strong&gt; — управление всем аппаратом: что запускается, что проверяет, когда зовёт человека.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Тренд — это переезд вверх по лестнице. Ты перестаёшь точить деталь и начинаешь проектировать конвейер. Почему совпало именно сейчас: модели стали достаточно надёжны, чтобы доверить им шаг без проверки на каждой итерации; параллелизм стал дёшев; и инфраструктура въехала прямо в инструменты.&lt;/p&gt;
&lt;h2&gt;Анатомия цикла&lt;/h2&gt;
&lt;p&gt;Цикл закрывается без человека по одной причине: у кода есть &lt;strong&gt;дешёвый объективный оракул&lt;/strong&gt; — компиляция, тесты, линт, запуск. Агент сам видит, что соврал. Так строят «closed-loop»: агенты компилируют, гоняют, скриншотят, бьются о реальные ключи — верифицируют себя.&lt;/p&gt;
&lt;p&gt;Сам цикл сводится к формуле: &lt;strong&gt;найти работу → ограниченное действие → верификация → отчёт → эскалация.&lt;/strong&gt; Это формализуют как одностраничный контракт на каждый цикл:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;trigger:  когда запускается
scope:    что трогает / что нет
budget:   max попыток / время / файлов
stop:     условия эскалации к человеку
report:   куда писать итог
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Шесть примитивов оркестрации&lt;/h3&gt;
&lt;p&gt;Anthropic описал шесть паттернов, из которых агент собирает себе harness под конкретную задачу — как из деталей конструктора:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Classify-and-act&lt;/strong&gt; — роутинг по типу. Входящее (issue, письмо, тикет, ошибка) классифицируется, и каждый тип уходит своему обработчику. Это «диспетчер» на входе цикла: не делать всё одинаково, а сначала понять, что именно пришло.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fan-out-and-synthesize&lt;/strong&gt; — задача дробится на независимые куски, каждый решается параллельно в &lt;em&gt;чистом&lt;/em&gt; контексте, потом результаты сводятся в одно. Так агент анализирует большую кодовую базу десятком под-агентов сразу, а синтезатор собирает общую картину. Параллелизм там, где куски не зависят друг от друга.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Adversarial-verify&lt;/strong&gt; — отдельный агент-скептик проверяет результат против рубрики, и его задача — &lt;em&gt;опровергнуть&lt;/em&gt;, а не подтвердить. Это снимает self-preferential bias: автор не должен сам ставить себе зачёт. Ключевой паттерн доверия — проверяет не тот, кто делал.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generate-and-filter&lt;/strong&gt; — нагенерить много кандидатов, отфильтровать по качеству, выкинуть дубли. Полезно, когда дешевле произвести десять вариантов и отобрать, чем пытаться угадать один правильный с первого раза.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tournament&lt;/strong&gt; — несколько агентов решают одну и ту же задачу &lt;em&gt;разными&lt;/em&gt; подходами, судьи сравнивают их попарно, пока не останется победитель. Это для случаев, где пространство решений широкое и заранее не ясно, какой путь лучше.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Loop-until-done&lt;/strong&gt; — спавнить агентов, пока не выполнится стоп-условие: ничего нового не находится, ноль ошибок, цель достигнута. Так делают исчерпывающий обход — например, ищут баги, пока два прохода подряд не вернут пусто.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Обрати внимание на главное: почти каждый примитив держится на шаге &lt;strong&gt;верификации&lt;/strong&gt; — adversarial-verify проверяет, filter отбирает, until-done смотрит на «ноль ошибок». То есть все они снова упираются в оракул. Без способа объективно сказать «это верно» примитивы превращаются в красивую видимость работы.&lt;/p&gt;
&lt;h3&gt;Порядок имеет значение: тесты до кода&lt;/h3&gt;
&lt;p&gt;И тут нюанс, который решает точность. Если агент пишет код, а потом тесты — он проверяет сам себя: тесты наследуют то же непонимание, что и код, они сходятся, и зелёная сборка ничего не значит. Если &lt;strong&gt;тесты идут перед кодом&lt;/strong&gt; — оракул становится независимым от реализации: тест кодирует намерение до того, как есть решение. Тогда «тесты прошли» — настоящий сигнал. Test-first превращает тест из проверки в спецификацию-оракул, и точность цикла резко растёт.&lt;/p&gt;
&lt;p&gt;Ловушка: агент может писать слабые тесты или подгонять их под код, лишь бы позеленело. Поэтому тест должен выводиться из контракта и критериев приёмки, а не сочиняться агентом, и быть защищён от переписывания. С этой дисциплиной цикл сходится к правильному, а не к удобному.&lt;/p&gt;
&lt;p&gt;А где оракула нет вовсе — дизайн, продуктовое решение, спецификация — цикл не сходится сам, и человек обязан стоять на гейте.&lt;/p&gt;
&lt;h3&gt;Трезвый риск&lt;/h3&gt;
&lt;p&gt;Addy Osmani бьёт честно: цикл делает ошибки &lt;strong&gt;без присмотра&lt;/strong&gt; — и они так и остаются незамеченными. Растёт comprehension debt: код едет быстрее, чем твоё понимание. И «cognitive surrender» — когда перестаёшь формировать мнение и принимаешь всё, что выдала машина. Его формула: &lt;em&gt;«Строй цикл. Но строй как тот, кто намерен остаться инженером, а не просто нажать &amp;quot;пуск&amp;quot;».&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Как это выглядит на практике: от контракта к дев-loop&lt;/h2&gt;
&lt;p&gt;Если код-агенты работают циклами, узкое место смещается: оно &lt;strong&gt;не в написании кода, а в качестве контракта, против которого цикл себя проверяет.&lt;/strong&gt; Цикл ровно настолько хорош, насколько чётко определено «готово».&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Шаг 0. Заказчик отдаёт контракт, а не таску.&lt;/strong&gt; В нём три вещи, делающие его пригодным для цикла:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;утверждения о коде &lt;strong&gt;заземлены&lt;/strong&gt; — метод/поле реально существует, проверено, а не «вроде есть»;&lt;/li&gt;
&lt;li&gt;критерии приёмки &lt;strong&gt;наблюдаемы&lt;/strong&gt; — их можно прогнать, а не оценить «на глаз»;&lt;/li&gt;
&lt;li&gt;зафиксировано &lt;strong&gt;почему&lt;/strong&gt; — чтобы решение переносилось, а не пересочинялось каждый раз.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Шаг 1. Дев-loop стартует от приёмки, не от кода.&lt;/strong&gt; Агент читает критерии → пишет тесты, кодирующие их (test-first, из контракта) → реализует → гоняет тесты и линт → красное чинит сам в пределах budget → повторяет до зелёного.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Шаг 2. Эскалация — только настоящие развилки.&lt;/strong&gt; Цикл зовёт человека, когда «контракт говорит X, а в коде Y» или «критерий неоднозначен». Не зовёт на «забыл скобку».&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Шаг 3. Выход — PR и прогон тестов.&lt;/strong&gt; Ревью идёт по PR и контракту, а не пошагово за агентом.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Что меняется для разработчика, конкретно:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;рутинные &lt;strong&gt;верифицируемые&lt;/strong&gt; куски перестают писаться руками — их ведёт loop;&lt;/li&gt;
&lt;li&gt;роль смещается от исполнителя к &lt;strong&gt;владельцу loop&apos;а и ревьюеру PR&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;суждение инженера уходит туда, где &lt;strong&gt;оракула нет&lt;/strong&gt; — архитектурная развилка, неочевидный тредофф, — а не на «реализовать ясное».&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Честная граница.&lt;/strong&gt; Это едет там, где приёмка объективна и контракт заземлён. Где оракула нет — дизайн, продуктовый выбор «ту ли вещь строим» — человек на гейте, цикл не сходится сам. И test-first обязателен: без него агент грейдит сам себя.&lt;/p&gt;
&lt;h2&gt;А зачем тогда senior-инженер?&lt;/h2&gt;
&lt;p&gt;Доведём логику до конца, не отводя глаз. Если заказчик отдаёт &lt;strong&gt;проверяемый&lt;/strong&gt; контракт, а цикл реализует и верифицирует — зачем senior-инженер?&lt;/p&gt;
&lt;p&gt;В вопросе спрятана ошибка. Он предполагает, что &lt;strong&gt;архитектура, удовлетворяющая контракт, сама по себе однозначна.&lt;/strong&gt; Для простого — да. Для сложного — нет. Контракт задаёт &lt;strong&gt;ЧТО&lt;/strong&gt; и приёмку. Он не задаёт &lt;strong&gt;КАК&lt;/strong&gt;: модель данных, границы транзакций, где встаёт блокировка, маршрутизацию, поведение при разрыве сети, стратегию миграции. В этом зазоре между «что» и «здравым как» нет test-first-оракула, потому что пространство решений открыто, а тредоффы глубоки.&lt;/p&gt;
&lt;p&gt;Поэтому контракт не передаётся одним актом — это &lt;strong&gt;цепочка обогащения:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://nikitakitaychik.com/images/enrichment-chain.png&quot; alt=&quot;Цепочка обогащения: контракт → senior → технический контракт → дев-loop&quot;&gt;&lt;/p&gt;
&lt;p&gt;Три вещи делают это рабочим.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Технический контракт — тоже проверяемый, и его критерии и есть оракул.&lt;/strong&gt; Сеньор обогащает не прозой: технические критерии приёмки наблюдаемы и становятся теми самыми тестами-до-кода. Сеньор &lt;em&gt;договаривает оракул&lt;/em&gt; — после чего цикл может ехать.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Валидация работает вверх.&lt;/strong&gt; Если контракт неоднозначен или непостроим — сеньор возвращает его заказчику, а не молча латает. Контракт не «спускается», он согласовывается между двумя гейтами.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Объём обогащения пропорционален архитектурной новизне.&lt;/strong&gt; Тривиальная фича — обогащать нечего, loop едет почти прямо от контракта, сеньор едва касается. Сложная — обогащение и есть основная ценность сеньора. Участие масштабируется сложностью, а не числом фич.&lt;/p&gt;
&lt;p&gt;Отсюда симметрия, в которой весь вывод. &lt;strong&gt;Заказчик владеет гейтом замысла&lt;/strong&gt; — у «та ли это фича» нет оракула. &lt;strong&gt;Senior владеет гейтом архитектуры&lt;/strong&gt; — у «тот ли дизайн, верен ли он под нагрузкой, гонкой, атакой» оракула тоже нет. &lt;strong&gt;Цикл заполняет проверяемую середину.&lt;/strong&gt; Убери любой гейт — получишь confident-wrong в масштабе: либо не ту фичу, либо красиво описанную фичу на наивной небезопасной архитектуре, что прошла мелкие тесты.&lt;/p&gt;
&lt;p&gt;Честно про неудобное: &lt;strong&gt;число рук падает.&lt;/strong&gt; Инженер-«исполнитель ясных спек» — в зоне риска. Инженер-«архитектор и владелец loop&apos;а» — нужнее, чем когда-либо. Для бизнеса это и есть смысл: то же количество людей даёт кратно больше. Рычаг.&lt;/p&gt;
&lt;p&gt;Вывод одной строкой: &lt;strong&gt;loop поднимает всех вверх — туда, где оракула нет, — и стирает середину, покрытую оракулом. Он удаляет не роль, а оракул-покрываемую часть роли.&lt;/strong&gt; Заказчик — на замысле. Senior — на архитектуре. Цикл — посередине, и едет ровно настолько далеко, насколько проверяем контракт с обоих концов.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;По мотивам Boris Cherny, Peter Steinberger, Addy Osmani и Anthropic Engineering.&lt;/em&gt;&lt;/p&gt;
</content:encoded></item></channel></rss>